[
  {
    "path": ".gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: BarRaider\npatreon: BarRaider\ncustom: paypal.me/BarRaider\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"[BUG]\"\nlabels: ''\nassignees: ''\n\n---\n\n**Issue Type** \n# Only keep ONE of the options below:\n- Bug \n- Feature Request\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Versions**\nOBS Version:\nOBS WebSocket Version:\nOBS WebSocket Dotnet (this library) Version:\nOS: [e.g. Windows 10]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feedback-or-support-request.md",
    "content": "---\nname: Feedback or Support request\nabout: Anything that ISN'T a bug\ntitle: \"[ISSUE]\"\nlabels: ''\nassignees: ''\n\n---\n\n**Issue Type** \n# Only keep ONE of the options below:\n- Bug \n- Feature Request\n- Support Issue\n\n**Describe the issue**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Versions**\nOBS Version:\nOBS WebSocket Version:\nOBS WebSocket Dotnet (this library) Version:\nOS: [e.g. Windows 10]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/workflows/dotnet-core-desktop.yml",
    "content": "# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n# separate terms of service, privacy policy, and support\n# documentation.\n\n# This workflow will build, test, sign and package a WPF or Windows Forms desktop application\n# built on .NET Core.\n# To learn how to migrate your existing application to .NET Core,\n# refer to https://docs.microsoft.com/en-us/dotnet/desktop-wpf/migration/convert-project-from-net-framework\n#\n# To configure this workflow:\n#\n# 1. Configure environment variables\n# GitHub sets default environment variables for every workflow run.\n# Replace the variables relative to your project in the \"env\" section below.\n#\n# 2. Signing\n# Generate a signing certificate in the Windows Application\n# Packaging Project or add an existing signing certificate to the project.\n# Next, use PowerShell to encode the .pfx file using Base64 encoding\n# by running the following Powershell script to generate the output string:\n#\n# $pfx_cert = Get-Content '.\\SigningCertificate.pfx' -Encoding Byte\n# [System.Convert]::ToBase64String($pfx_cert) | Out-File 'SigningCertificate_Encoded.txt'\n#\n# Open the output file, SigningCertificate_Encoded.txt, and copy the\n# string inside. Then, add the string to the repo as a GitHub secret\n# and name it \"Base64_Encoded_Pfx.\"\n# For more information on how to configure your signing certificate for\n# this workflow, refer to https://github.com/microsoft/github-actions-for-desktop-apps#signing\n#\n# Finally, add the signing certificate password to the repo as a secret and name it \"Pfx_Key\".\n# See \"Build the Windows Application Packaging project\" below to see how the secret is used.\n#\n# For more information on GitHub Actions, refer to https://github.com/features/actions\n# For a complete CI/CD sample to get started with GitHub Action workflows for Desktop Applications,\n# refer to https://github.com/microsoft/github-actions-for-desktop-apps\n\nname: obs-websocket-dotnet Tests\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\njobs:\n\n  build:\n\n    strategy:\n      matrix:\n        configuration: [ Release ]\n\n    runs-on: windows-latest  # For a list of available runner types, refer to\n                             # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on\n\n    env:\n      Solution_Name: obs-websocket-dotnet.sln                         # Replace with your solution name, i.e. MyWpfApp.sln.\n      Test_Project_Path: obs-websocket-dotnet-tests\\obs-websocket-dotnet-tests.csproj                 # Replace with the path to your test project, i.e. MyWpfApp.Tests\\MyWpfApp.Tests.csproj.\n      #Wap_Project_Directory: your-wap-project-directory-name    # Replace with the Wap project directory relative to the solution, i.e. MyWpfApp.Package.\n      #Wap_Project_Path: your-wap-project-path                   # Replace with the path to your Wap project, i.e. MyWpf.App.Package\\MyWpfApp.Package.wapproj.\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v2\n      with:\n        fetch-depth: 0\n\n    # Install the .NET Core workload\n    - name: Install .NET Core\n      uses: actions/setup-dotnet@v4\n      with:\n        dotnet-version: 9.0.x\n\n    # Add  MSBuild to the PATH: https://github.com/microsoft/setup-msbuild\n    - name: Setup MSBuild.exe\n      uses: microsoft/setup-msbuild@v1.0.2\n\n    # Execute all unit tests in the solution\n    - name: Execute unit tests\n      run: dotnet test\n\n    # Restore the application to populate the obj folder with RuntimeIdentifiers\n    - name: Restore the application\n      run: msbuild $env:Solution_Name /t:Restore /p:Configuration=$env:Configuration\n      env:\n        Configuration: ${{ matrix.configuration }}\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.rsuser\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Mono auto generated files\nmono_crash.*\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\n[Aa][Rr][Mm]/\n[Aa][Rr][Mm]64/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n[Ll]ogs/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUnit\n*.VisualState.xml\nTestResult.xml\nnunit-*.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_h.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*_wpftmp.csproj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# NuGet Symbol Packages\n*.snupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n*.appxbundle\n*.appxupload\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!?*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n*- [Bb]ackup.rdl\n*- [Bb]ackup ([0-9]).rdl\n*- [Bb]ackup ([0-9][0-9]).rdl\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# CodeRush personal settings\n.cr/personal\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n# Local History for Visual Studio\n.localhistory/\n\n# BeatPulse healthcheck temp database\nhealthchecksdb\n\n# Backup folder for Package Reference Convert tool in Visual Studio 2017\nMigrationBackup/\n\n# Ionide (cross platform F# VS Code tools) working folder\n.ionide/\n\n.idea/\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 BarRaider\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"
  },
  {
    "path": "README.md",
    "content": "# obs-websocket-dotnet\n![Build status](https://github.com/Palakis/obs-websocket-dotnet/workflows/obs-websocket-dotnet%20Tests/badge.svg)  Releases: [![NuGet](https://img.shields.io/nuget/v/obs-websocket-dotnet.svg?style=flat)](https://www.nuget.org/packages/obs-websocket-dotnet)  \n\nOfficial .NET library (written in C#) to communicate with an obs-websocket server.\n\nThis library is available on the [NuGet gallery](https://www.nuget.org/packages/obs-websocket-dotnet)  \nSee the `TestClient` project for a working example.  \n\n## New in v5.0.1  \n* Fixes for deserialization issues in MediaInputStatus\n* Allow OBSVideoSettings to be updated via the API\n* New ILogger support instead of writing to console\n* New UnsupportedEvent event\n* Updated to netstandard 2.1\n\nPlease report issues/bugs via the [Issues Tracker](https://github.com/BarRaider/obs-websocket-dotnet/issues) or discuss in our [Discord](http://discord.barraider.com)\n\n## Dev Discussions\n**Discord:** Discuss in #developers-chat in [Bar Raiders](http://discord.barraider.com)\n\n## EOL for v4.x branch\nNOTE: We will no longer be updating the v4.x branch as we move towards v5.0 (which is NOT backwards compatible).\n"
  },
  {
    "path": "TestClient/AdvancedWindow.Designer.cs",
    "content": "﻿namespace TestClient\n{\n    partial class AdvancedWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.tbLog = new System.Windows.Forms.TextBox();\n            this.btnEvents = new System.Windows.Forms.Button();\n            this.btnSourceFilters = new System.Windows.Forms.Button();\n            this.groupBox1 = new System.Windows.Forms.GroupBox();\n            this.label2 = new System.Windows.Forms.Label();\n            this.tbSourceName = new System.Windows.Forms.TextBox();\n            this.label1 = new System.Windows.Forms.Label();\n            this.tbSceneName = new System.Windows.Forms.TextBox();\n            this.btnInputInfo = new System.Windows.Forms.Button();\n            this.tabControl1 = new System.Windows.Forms.TabControl();\n            this.tabPage1 = new System.Windows.Forms.TabPage();\n            this.btnSourceInfo = new System.Windows.Forms.Button();\n            this.btnGetMonitorList = new System.Windows.Forms.Button();\n            this.btnTransitions = new System.Windows.Forms.Button();\n            this.btnGetGroupList = new System.Windows.Forms.Button();\n            this.btnGetInputList = new System.Windows.Forms.Button();\n            this.btnSourcesList = new System.Windows.Forms.Button();\n            this.tabPage2 = new System.Windows.Forms.TabPage();\n            this.btnStopRecord = new System.Windows.Forms.Button();\n            this.btnRename = new System.Windows.Forms.Button();\n            this.btnToggleVidCapDvc = new System.Windows.Forms.Button();\n            this.btnTracks = new System.Windows.Forms.Button();\n            this.btnCreateScene = new System.Windows.Forms.Button();\n            this.btnDoNothing = new System.Windows.Forms.Button();\n            this.groupBox1.SuspendLayout();\n            this.tabControl1.SuspendLayout();\n            this.tabPage1.SuspendLayout();\n            this.tabPage2.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tbLog\n            // \n            this.tbLog.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbLog.Location = new System.Drawing.Point(12, 80);\n            this.tbLog.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.tbLog.Multiline = true;\n            this.tbLog.Name = \"tbLog\";\n            this.tbLog.ReadOnly = true;\n            this.tbLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n            this.tbLog.Size = new System.Drawing.Size(874, 600);\n            this.tbLog.TabIndex = 0;\n            // \n            // btnEvents\n            // \n            this.btnEvents.Location = new System.Drawing.Point(896, 20);\n            this.btnEvents.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnEvents.Name = \"btnEvents\";\n            this.btnEvents.Size = new System.Drawing.Size(156, 36);\n            this.btnEvents.TabIndex = 1;\n            this.btnEvents.Text = \"Events Subscribe\";\n            this.btnEvents.UseVisualStyleBackColor = true;\n            this.btnEvents.Click += new System.EventHandler(this.btnEvents_Click);\n            // \n            // btnSourceFilters\n            // \n            this.btnSourceFilters.Location = new System.Drawing.Point(4, 343);\n            this.btnSourceFilters.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnSourceFilters.Name = \"btnSourceFilters\";\n            this.btnSourceFilters.Size = new System.Drawing.Size(149, 36);\n            this.btnSourceFilters.TabIndex = 4;\n            this.btnSourceFilters.Text = \"Get Source\\'s Filters\";\n            this.btnSourceFilters.UseVisualStyleBackColor = true;\n            this.btnSourceFilters.Click += new System.EventHandler(this.btnSourceFilters_Click);\n            // \n            // groupBox1\n            // \n            this.groupBox1.Controls.Add(this.label2);\n            this.groupBox1.Controls.Add(this.tbSourceName);\n            this.groupBox1.Controls.Add(this.label1);\n            this.groupBox1.Controls.Add(this.tbSceneName);\n            this.groupBox1.Location = new System.Drawing.Point(12, 12);\n            this.groupBox1.Name = \"groupBox1\";\n            this.groupBox1.Size = new System.Drawing.Size(879, 61);\n            this.groupBox1.TabIndex = 13;\n            this.groupBox1.TabStop = false;\n            this.groupBox1.Text = \"Inputs (for buttons):\";\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(267, 25);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(141, 20);\n            this.label2.TabIndex = 3;\n            this.label2.Text = \"Source/Input Name:\";\n            // \n            // tbSourceName\n            // \n            this.tbSourceName.Location = new System.Drawing.Point(414, 25);\n            this.tbSourceName.Name = \"tbSourceName\";\n            this.tbSourceName.Size = new System.Drawing.Size(121, 27);\n            this.tbSourceName.TabIndex = 2;\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(7, 25);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(95, 20);\n            this.label1.TabIndex = 1;\n            this.label1.Text = \"Scene Name:\";\n            // \n            // tbSceneName\n            // \n            this.tbSceneName.Location = new System.Drawing.Point(107, 25);\n            this.tbSceneName.Name = \"tbSceneName\";\n            this.tbSceneName.Size = new System.Drawing.Size(121, 27);\n            this.tbSceneName.TabIndex = 0;\n            // \n            // btnInputInfo\n            // \n            this.btnInputInfo.Location = new System.Drawing.Point(4, 386);\n            this.btnInputInfo.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnInputInfo.Name = \"btnInputInfo\";\n            this.btnInputInfo.Size = new System.Drawing.Size(149, 36);\n            this.btnInputInfo.TabIndex = 15;\n            this.btnInputInfo.Text = \"Get Input Settings\";\n            this.btnInputInfo.UseVisualStyleBackColor = true;\n            this.btnInputInfo.Click += new System.EventHandler(this.btnInputInfo_Click);\n            // \n            // tabControl1\n            // \n            this.tabControl1.Controls.Add(this.tabPage1);\n            this.tabControl1.Controls.Add(this.tabPage2);\n            this.tabControl1.Location = new System.Drawing.Point(897, 63);\n            this.tabControl1.Name = \"tabControl1\";\n            this.tabControl1.SelectedIndex = 0;\n            this.tabControl1.Size = new System.Drawing.Size(162, 621);\n            this.tabControl1.TabIndex = 17;\n            // \n            // tabPage1\n            // \n            this.tabPage1.Controls.Add(this.btnDoNothing);\n            this.tabPage1.Controls.Add(this.btnSourceInfo);\n            this.tabPage1.Controls.Add(this.btnGetMonitorList);\n            this.tabPage1.Controls.Add(this.btnInputInfo);\n            this.tabPage1.Controls.Add(this.btnTransitions);\n            this.tabPage1.Controls.Add(this.btnGetGroupList);\n            this.tabPage1.Controls.Add(this.btnGetInputList);\n            this.tabPage1.Controls.Add(this.btnSourcesList);\n            this.tabPage1.Controls.Add(this.btnSourceFilters);\n            this.tabPage1.Location = new System.Drawing.Point(4, 29);\n            this.tabPage1.Name = \"tabPage1\";\n            this.tabPage1.Padding = new System.Windows.Forms.Padding(3);\n            this.tabPage1.Size = new System.Drawing.Size(154, 588);\n            this.tabPage1.TabIndex = 0;\n            this.tabPage1.Text = \"1\";\n            this.tabPage1.UseVisualStyleBackColor = true;\n            // \n            // btnSourceInfo\n            // \n            this.btnSourceInfo.Location = new System.Drawing.Point(4, 300);\n            this.btnSourceInfo.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnSourceInfo.Name = \"btnSourceInfo\";\n            this.btnSourceInfo.Size = new System.Drawing.Size(149, 36);\n            this.btnSourceInfo.TabIndex = 21;\n            this.btnSourceInfo.Text = \"Get Source Info\";\n            this.btnSourceInfo.UseVisualStyleBackColor = true;\n            this.btnSourceInfo.Click += new System.EventHandler(this.btnSourceInfo_Click);\n            // \n            // btnGetMonitorList\n            // \n            this.btnGetMonitorList.Location = new System.Drawing.Point(4, 139);\n            this.btnGetMonitorList.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnGetMonitorList.Name = \"btnGetMonitorList\";\n            this.btnGetMonitorList.Size = new System.Drawing.Size(149, 36);\n            this.btnGetMonitorList.TabIndex = 19;\n            this.btnGetMonitorList.Text = \"List Monitors\";\n            this.btnGetMonitorList.UseVisualStyleBackColor = true;\n            this.btnGetMonitorList.Click += new System.EventHandler(this.btnGetMonitorList_Click);\n            // \n            // btnTransitions\n            // \n            this.btnTransitions.Location = new System.Drawing.Point(4, 183);\n            this.btnTransitions.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnTransitions.Name = \"btnTransitions\";\n            this.btnTransitions.Size = new System.Drawing.Size(149, 36);\n            this.btnTransitions.TabIndex = 18;\n            this.btnTransitions.Text = \"List Transitions\";\n            this.btnTransitions.UseVisualStyleBackColor = true;\n            this.btnTransitions.Click += new System.EventHandler(this.btnTransition_Click);\n            // \n            // btnGetGroupList\n            // \n            this.btnGetGroupList.Location = new System.Drawing.Point(4, 95);\n            this.btnGetGroupList.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnGetGroupList.Name = \"btnGetGroupList\";\n            this.btnGetGroupList.Size = new System.Drawing.Size(149, 36);\n            this.btnGetGroupList.TabIndex = 17;\n            this.btnGetGroupList.Text = \"List Groups\";\n            this.btnGetGroupList.UseVisualStyleBackColor = true;\n            this.btnGetGroupList.Click += new System.EventHandler(this.btnGetGroupList_Click);\n            // \n            // btnGetInputList\n            // \n            this.btnGetInputList.Location = new System.Drawing.Point(4, 51);\n            this.btnGetInputList.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnGetInputList.Name = \"btnGetInputList\";\n            this.btnGetInputList.Size = new System.Drawing.Size(149, 36);\n            this.btnGetInputList.TabIndex = 16;\n            this.btnGetInputList.Text = \"List Inputs\";\n            this.btnGetInputList.UseVisualStyleBackColor = true;\n            this.btnGetInputList.Click += new System.EventHandler(this.btnGetInputList_Click);\n            // \n            // btnSourcesList\n            // \n            this.btnSourcesList.Location = new System.Drawing.Point(4, 7);\n            this.btnSourcesList.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnSourcesList.Name = \"btnSourcesList\";\n            this.btnSourcesList.Size = new System.Drawing.Size(149, 36);\n            this.btnSourcesList.TabIndex = 15;\n            this.btnSourcesList.Text = \"List Sources\";\n            this.btnSourcesList.UseVisualStyleBackColor = true;\n            this.btnSourcesList.Click += new System.EventHandler(this.btnSourcesList_Click);\n            // \n            // tabPage2\n            // \n            this.tabPage2.Controls.Add(this.btnStopRecord);\n            this.tabPage2.Controls.Add(this.btnRename);\n            this.tabPage2.Controls.Add(this.btnToggleVidCapDvc);\n            this.tabPage2.Controls.Add(this.btnTracks);\n            this.tabPage2.Controls.Add(this.btnCreateScene);\n            this.tabPage2.Location = new System.Drawing.Point(4, 29);\n            this.tabPage2.Name = \"tabPage2\";\n            this.tabPage2.Padding = new System.Windows.Forms.Padding(3);\n            this.tabPage2.Size = new System.Drawing.Size(154, 588);\n            this.tabPage2.TabIndex = 1;\n            this.tabPage2.Text = \"2\";\n            this.tabPage2.UseVisualStyleBackColor = true;\n            // \n            // btnStopRecord\n            // \n            this.btnStopRecord.Location = new System.Drawing.Point(2, 230);\n            this.btnStopRecord.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);\n            this.btnStopRecord.Name = \"btnStopRecord\";\n            this.btnStopRecord.Size = new System.Drawing.Size(149, 36);\n            this.btnStopRecord.TabIndex = 25;\n            this.btnStopRecord.Text = \"Stop Record\";\n            this.btnStopRecord.UseVisualStyleBackColor = true;\n            this.btnStopRecord.Click += new System.EventHandler(this.btnStopRecord_Click);\n            // \n            // btnRename\n            // \n            this.btnRename.Location = new System.Drawing.Point(2, 51);\n            this.btnRename.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnRename.Name = \"btnRename\";\n            this.btnRename.Size = new System.Drawing.Size(149, 36);\n            this.btnRename.TabIndex = 24;\n            this.btnRename.Text = \"Source Rename\";\n            this.btnRename.UseVisualStyleBackColor = true;\n            // \n            // btnToggleVidCapDvc\n            // \n            this.btnToggleVidCapDvc.Location = new System.Drawing.Point(2, 186);\n            this.btnToggleVidCapDvc.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);\n            this.btnToggleVidCapDvc.Name = \"btnToggleVidCapDvc\";\n            this.btnToggleVidCapDvc.Size = new System.Drawing.Size(149, 36);\n            this.btnToggleVidCapDvc.TabIndex = 23;\n            this.btnToggleVidCapDvc.Text = \"Toggle VidCapDvc\";\n            this.btnToggleVidCapDvc.UseVisualStyleBackColor = true;\n            this.btnToggleVidCapDvc.Click += new System.EventHandler(this.btnToggleVidCapDvc_Click);\n            // \n            // btnTracks\n            // \n            this.btnTracks.Location = new System.Drawing.Point(2, 141);\n            this.btnTracks.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnTracks.Name = \"btnTracks\";\n            this.btnTracks.Size = new System.Drawing.Size(149, 36);\n            this.btnTracks.TabIndex = 22;\n            this.btnTracks.Text = \"Tracks\";\n            this.btnTracks.UseVisualStyleBackColor = true;\n            this.btnTracks.Click += new System.EventHandler(this.btnTracks_Click);\n            // \n            // btnCreateScene\n            // \n            this.btnCreateScene.Location = new System.Drawing.Point(2, 7);\n            this.btnCreateScene.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnCreateScene.Name = \"btnCreateScene\";\n            this.btnCreateScene.Size = new System.Drawing.Size(149, 36);\n            this.btnCreateScene.TabIndex = 21;\n            this.btnCreateScene.Text = \"Create Scene\";\n            this.btnCreateScene.UseVisualStyleBackColor = true;\n            this.btnCreateScene.Click += new System.EventHandler(this.btnCreateScene_Click);\n            // \n            // btnDoNothing\n            // \n            this.btnDoNothing.Location = new System.Drawing.Point(2, 545);\n            this.btnDoNothing.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnDoNothing.Name = \"btnDoNothing\";\n            this.btnDoNothing.Size = new System.Drawing.Size(149, 36);\n            this.btnDoNothing.TabIndex = 22;\n            this.btnDoNothing.Text = \"Do Nothing\";\n            this.btnDoNothing.UseVisualStyleBackColor = true;\n            this.btnDoNothing.Click += new System.EventHandler(this.btnDoNothing_Click);\n            // \n            // AdvancedWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(1111, 692);\n            this.Controls.Add(this.tabControl1);\n            this.Controls.Add(this.groupBox1);\n            this.Controls.Add(this.btnEvents);\n            this.Controls.Add(this.tbLog);\n            this.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"AdvancedWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\n            this.Text = \"AdvancedWindow\";\n            this.Load += new System.EventHandler(this.AdvancedWindow_Load);\n            this.groupBox1.ResumeLayout(false);\n            this.groupBox1.PerformLayout();\n            this.tabControl1.ResumeLayout(false);\n            this.tabPage1.ResumeLayout(false);\n            this.tabPage2.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TextBox tbLog;\n        private System.Windows.Forms.Button btnEvents;\n        private System.Windows.Forms.Button btnSourceFilters;\n        private System.Windows.Forms.GroupBox groupBox1;\n        private System.Windows.Forms.TextBox tbSceneName;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.TextBox tbSourceName;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Button btnInputInfo;\n        private System.Windows.Forms.TabControl tabControl1;\n        private System.Windows.Forms.TabPage tabPage1;\n        private System.Windows.Forms.TabPage tabPage2;\n        private System.Windows.Forms.Button btnTransitions;\n        private System.Windows.Forms.Button btnGetGroupList;\n        private System.Windows.Forms.Button btnGetInputList;\n        private System.Windows.Forms.Button btnSourcesList;\n        private System.Windows.Forms.Button btnSourceInfo;\n        private System.Windows.Forms.Button btnGetMonitorList;\n        private System.Windows.Forms.Button btnToggleVidCapDvc;\n        private System.Windows.Forms.Button btnTracks;\n        private System.Windows.Forms.Button btnCreateScene;\n        private System.Windows.Forms.Button btnRename;\n        private System.Windows.Forms.Button btnStopRecord;\n        private System.Windows.Forms.Button btnDoNothing;\n    }\n}"
  },
  {
    "path": "TestClient/AdvancedWindow.cs",
    "content": "﻿using Newtonsoft.Json.Linq;\nusing OBSWebsocketDotNet;\nusing OBSWebsocketDotNet.Types;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\nusing OBSWebsocketDotNet.Types.Events;\n\nnamespace TestClient\n{\n    public partial class AdvancedWindow : Form\n    {\n#pragma warning disable IDE1006 // Naming Styles\n        // Source to test on\n        private readonly Random random = new Random();\n\n        protected OBSWebsocket obs;\n\n        public void SetOBS(OBSWebsocket obs)\n        {\n            this.obs = obs;\n        }\n\n        public AdvancedWindow()\n        {\n            InitializeComponent();\n        }\n\n        private void AdvancedWindow_Load(object sender, EventArgs e)\n        {\n\n        }\n\n        private void btnEvents_Click(object sender, EventArgs e)\n        {\n            if (obs == null)\n            {\n                LogMessage(\"Error: OBS is null!\");\n                return;\n            }\n\n\n            obs.StreamStateChanged += Obs_StreamStateChanged;\n            obs.RecordStateChanged += Obs_RecordStateChanged;\n            obs.Disconnected += Obs_Disconnected;\n\n            obs.CurrentProgramSceneChanged += Obs_CurrentProgramSceneChanged;\n            obs.CurrentPreviewSceneChanged += Obs_CurrentPreviewSceneChanged;\n            obs.CurrentSceneCollectionChanged += Obs_CurrentSceneCollectionChanged;\n            obs.CurrentSceneTransitionChanged += Obs_CurrentSceneTransitionChanged;\n            obs.CurrentSceneTransitionDurationChanged += Obs_CurrentSceneTransitionDurationChanged;\n            obs.CurrentProfileChanged += Obs_CurrentProfileChanged;\n\n            obs.InputActiveStateChanged += Obs_InputActiveStateChanged;\n            obs.InputMuteStateChanged += Obs_InputMuteStateChanged;\n            obs.InputVolumeChanged += OBS_onInputVolumeChanged;\n\n            obs.ProfileListChanged += Obs_ProfileListChanged;\n            obs.ReplayBufferStateChanged += Obs_ReplayBufferStateChanged;\n            obs.ReplayBufferSaved += Obs_ReplayBufferSaved;\n\n            obs.SceneCollectionListChanged += Obs_SceneCollectionListChanged;\n\n            obs.SceneItemCreated += Obs_SceneItemCreated;\n            obs.SceneItemRemoved += Obs_SceneItemRemoved;\n            obs.SceneItemSelected += Obs_SceneItemSelected;\n            obs.SceneItemLockStateChanged += OBS_onSceneItemLockStateChanged;\n            obs.SceneItemEnableStateChanged += OBS_onSceneItemEnableStateChanged;\n            obs.SceneItemTransformChanged += Obs_SceneItemTransformChanged;\n\n            obs.SceneItemListReindexed += OBS_onSceneItemListIndexingChanged;\n            obs.SceneListChanged += Obs_SceneListChanged;\n\n            obs.SceneTransitionStarted += OBS_onSceneTransitionStarted;\n            obs.SceneTransitionEnded += OBS_onSceneTransitionEnded;\n            obs.SceneTransitionVideoEnded += OBS_onSceneTransitionVideoEnded;\n\n            obs.SourceFilterCreated += OBS_onSourceFilterCreated;\n            obs.SourceFilterEnableStateChanged += OBS_onSourceFilterEnableStateChanged;\n            obs.SourceFilterRemoved += OBS_onSourceFilterRemoved;\n            obs.SourceFilterListReindexed += OBS_onSourceFilterListReindexed;\n\n            obs.StudioModeStateChanged += Obs_StudioModeStateChanged;\n\n            obs.VirtualcamStateChanged += Obs_VirtualcamStateChanged;\n        }\n\n        private void Obs_InputActiveStateChanged(object sender, InputActiveStateChangedEventArgs args)\n        {\n            LogMessage($\"[InputActiveStateChanged] Name: {args.InputName} Video Active: {args.VideoActive}\");\n        }\n\n        private void Obs_InputMuteStateChanged(object sender, InputMuteStateChangedEventArgs args)\n        {\n            LogMessage($\"[InputMuteStateChanged] Name: {args.InputName} Muted: {args.InputMuted}\");\n        }\n\n        private void Obs_SceneItemTransformChanged(object sender, SceneItemTransformEventArgs args)\n        {\n            LogMessage($\"[SceneItemTransformChanged] Scene: {args.SceneName} ItemId: {args.SceneItemId} Transform: {args.Transform.X},{args.Transform.Y}\");\n        }\n\n        private void Obs_SceneItemSelected(object sender, SceneItemSelectedEventArgs args)\n        {\n            LogMessage($\"[SceneItemSelected] Scene: {args.SceneName} ItemId: {args.SceneItemId}\");\n        }\n\n        private void Obs_Disconnected(object sender, OBSWebsocketDotNet.Communication.ObsDisconnectionInfo e)\n        {\n            LogMessage($\"[OBS DISCONNECTED] CloseCode: {e.ObsCloseCode} Reason: {e.DisconnectReason} Type: {e.WebsocketDisconnectionInfo?.Type} Exception: {e.WebsocketDisconnectionInfo?.Exception?.Message}\");\n        }\n\n        private void Obs_StudioModeStateChanged(object sender, StudioModeStateChangedEventArgs args)\n        {\n            LogMessage($\"[Preview/Studio ModeChanged] Enabled: {args.StudioModeEnabled}\");\n        }\n\n        private void Obs_ReplayBufferSaved(object sender, ReplayBufferSavedEventArgs args)\n        {\n            LogMessage($\"[ReplayBufferSaved] Save Location: {args.SavedReplayPath}\");\n        }\n\n        private void Obs_ReplayBufferStateChanged(object sender, ReplayBufferStateChangedEventArgs args)\n        {\n            LogMessage($\"[ReplayBufferStateChanged] Active: {args.OutputState.IsActive} State: {args.OutputState.StateStr} {args.OutputState.State}\");\n        }\n\n        private void Obs_RecordStateChanged(object sender, RecordStateChangedEventArgs args)\n        {\n            LogMessage($\"[RecordingStateChanged] Active: {args.OutputState.IsActive} Output: {args.OutputState.OutputPath} State: {args.OutputState.StateStr} {args.OutputState.State}\");\n        }\n\n        private void Obs_StreamStateChanged(object sender, StreamStateChangedEventArgs args)\n        {\n            LogMessage($\"[StreamStateChanged] Active: {args.OutputState.IsActive} State: {args.OutputState.StateStr} {args.OutputState.State}\");\n        }\n\n        private void Obs_VirtualcamStateChanged(object sender, VirtualcamStateChangedEventArgs args)\n        {\n            LogMessage($\"[VirtualcamStateChanged] Active: {args.OutputState.IsActive} State: {args.OutputState.StateStr} {args.OutputState.State}\");\n        }\n\n        private void Obs_ProfileListChanged(object sender, ProfileListChangedEventArgs args)\n        {\n            LogMessage($\"[ProfileListchanged] Count: {args.Profiles.Count}\");\n            foreach (var profile in args.Profiles)\n            {\n                LogMessage($\"\\t{profile}\");\n            }\n        }\n\n        private void Obs_CurrentProfileChanged(object sender, CurrentProfileChangedEventArgs args)\n        {\n            LogMessage($\"[CurrentProfileChanged] Current: {args.ProfileName}\");\n        }\n\n        private void Obs_CurrentSceneTransitionDurationChanged(object sender, CurrentSceneTransitionDurationChangedEventArgs args)\n        {\n            LogMessage($\"[CurrentSceneTransitionDurationChanged] Current: {args.TransitionDuration}\");\n        }\n\n        private void Obs_CurrentSceneTransitionChanged(object sender, CurrentSceneTransitionChangedEventArgs args)\n        {\n            LogMessage($\"[CurrentSceneTransitionChanged] Current: {args.TransitionName}\");\n        }\n\n        private void Obs_SceneCollectionListChanged(object sender, SceneCollectionListChangedEventArgs args)\n        {\n            LogMessage($\"[SceneCollectionListChanged] Count: {args.SceneCollections.Count}\");\n            foreach (var sc in args.SceneCollections)\n            {\n                LogMessage($\"\\t{sc}\");\n            }\n        }\n\n        private void Obs_CurrentSceneCollectionChanged(object sender, CurrentSceneCollectionChangedEventArgs args)\n        {\n            LogMessage($\"[CurrentSceneCollectionChanged] Current: {args.SceneCollectionName}\");\n        }\n\n        private void Obs_SceneItemRemoved(object sender, SceneItemRemovedEventArgs args)\n        {\n            LogMessage($\"[SceneItemRemoved] Scene: {args.SourceName} Source: {args.SourceName} ItemId: {args.SceneItemId}\");\n        }\n\n        private void Obs_SceneItemCreated(object sender, SceneItemCreatedEventArgs args)\n        {\n            LogMessage($\"[SceneItemCreated] Scene: {args.SourceName} Source: {args.SourceName} ItemId: {args.SceneItemId} ItemIndex: {args.SceneItemIndex}\");\n        }\n\n        private void Obs_SceneListChanged(object sender, SceneListChangedEventArgs args)\n        {\n            LogMessage($\"[SceneListChanged] Count: {args.Scenes.Count}\");\n            foreach (var scene in args.Scenes)\n            {\n                LogMessage($\"\\n{scene}\");\n            }\n        }\n\n        private void Obs_CurrentProgramSceneChanged(object sender, ProgramSceneChangedEventArgs args)\n        {\n            LogMessage($\"[SceneChanged] Current: {args.SceneName}\");\n        }\n\n        private void Obs_CurrentPreviewSceneChanged(object sender, CurrentPreviewSceneChangedEventArgs args)\n        {\n            LogMessage($\"[Preview/Studio SceneChanged] Current: {args.SceneName}\");\n        }\n\n        private void OBS_onInputVolumeChanged(object sender, InputVolumeChangedEventArgs args)\n        {\n            LogMessage($\"[SourceVolumeChanged] Source: {args.Volume.InputName} Volume: {args.Volume.InputVolumeMul} VolumeDB: {args.Volume.InputVolumeDb}\");\n        }\n\n        private void OBS_onSceneItemEnableStateChanged(object sender, SceneItemEnableStateChangedEventArgs args)\n        {\n            LogMessage($\"[SceneItemEnableStateChanged] Scene: {args.SceneName} ItemId: {args.SceneItemId} Enabled?: {args.SceneItemEnabled}\");\n        }\n\n        private void OBS_onSceneItemLockStateChanged(object sender, SceneItemLockStateChangedEventArgs args)\n        {\n            LogMessage($\"[SceneItemLockStateChanged] Scene: {args.SceneName} ItemId: {args.SceneItemId} IsLocked: {args.SceneItemLocked}\");\n        }\n\n        private void OBS_onSourceFilterListReindexed(object sender, SourceFilterListReindexedEventArgs args)\n        {\n            LogMessage($\"[SourceFilterListReindexed] Source: {args.SourceName}\");\n            foreach (var filter in args.Filters)\n            {\n                LogMessage($\"\\t{filter.Name}\");\n            }\n        }\n\n        private void OBS_onSceneItemListIndexingChanged(object sender, SceneItemListReindexedEventArgs args)\n        {\n            LogMessage($\"[SceneItemListReindexed] Scene: {args.SceneName}{Environment.NewLine}\\tSceneItems: {args.SceneItems}\");\n        }\n\n        private void OBS_onSourceFilterEnableStateChanged(object sender, SourceFilterEnableStateChangedEventArgs args)\n        {\n            LogMessage($\"[SourceFilterEnableStateChanged] Source: {args.SourceName} Filter: {args.FilterName} Enabled: {args.FilterEnabled}\");\n        }\n\n        private void OBS_onSourceFilterRemoved(object sender, SourceFilterRemovedEventArgs args)\n        {\n            LogMessage($\"[SourceFilterRemoved] Source: {args.SourceName} Filter: {args.FilterName}\");\n        }\n\n        private void OBS_onSourceFilterCreated(object sender, SourceFilterCreatedEventArgs args)\n        {\n            LogMessage($\"[SourceFilterCreated] Source: {args.SourceName} Filter: {args.FilterName} FilterKind: {args.FilterKind} FilterIndex: {args.FilterIndex}{Environment.NewLine}\\tSettings: {args.FilterSettings}{Environment.NewLine}\\tDefaultSettings: {args.DefaultFilterSettings}\");\n        }\n\n        private void OBS_onSceneTransitionVideoEnded(object sender, SceneTransitionVideoEndedEventArgs args)\n        {\n            LogMessage($\"[SceneTransitionVideoEnded] Name: {args.TransitionName}\");\n        }\n\n        private void OBS_onSceneTransitionEnded(object sender, SceneTransitionEndedEventArgs args)\n        {\n            LogMessage($\"[SceneTransitionEnded] Name: {args.TransitionName}\");\n        }\n\n        private void OBS_onSceneTransitionStarted(object sender, SceneTransitionStartedEventArgs args)\n        {\n            LogMessage($\"[SceneTransitionStarted] Name: {args.TransitionName}\");\n        }\n\n        private void LogMessage(string message)\n        {\n            if (InvokeRequired)\n            {\n                this.Invoke(new MethodInvoker(() =>\n                {\n                    tbLog.AppendText($\"{Environment.NewLine}[{DateTime.Now:HH:mm:ss}]{message}\");\n                }));\n            }\n            else\n            {\n                tbLog.AppendText($\"{Environment.NewLine}[{DateTime.Now:HH:mm:ss}]{message}\");\n            }\n        }\n\n        private void btnRename_Click(object sender, EventArgs e)\n        {\n            if (String.IsNullOrEmpty(tbSourceName.Text))\n            {\n                MessageBox.Show(\"Enter name of Source in input box\");\n                return;\n            }\n            string source = tbSourceName.Text;\n\n            var active = obs.GetSourceActive(source).VideoActive;\n            LogMessage($\"GetSourceActive for {source}: {active}. Renaming source\");\n            obs.SetInputName(source, source + random.Next(100));\n        }\n\n\n        private void btnSourceInfo_Click(object sender, EventArgs e)\n        {\n            if (String.IsNullOrEmpty(tbSceneName.Text))\n            {\n                MessageBox.Show(\"Enter name of Scene in input box\");\n                return;\n            }\n\n            if (String.IsNullOrEmpty(tbSourceName.Text))\n            {\n                MessageBox.Show(\"Enter name of Source in input box\");\n                return;\n            }\n\n            string scene = tbSceneName.Text;\n            string source = tbSourceName.Text;\n\n            int itemId = obs.GetSceneItemId(scene, source, 0);\n            LogMessage($\"Item Id for {source} is {itemId}\");\n\n            bool isEnabled = obs.GetSceneItemEnabled(scene, itemId);\n            LogMessage($\"Source Enabled: {isEnabled}\");\n\n            bool isLocked = obs.GetSceneItemLocked(scene, itemId);\n            LogMessage($\"Source Locked: {isLocked}\");\n\n            JObject data = obs.GetSceneItemTransformRaw(scene, itemId);\n            LogMessage($\"Raw Data: {data}\");\n\n            var transform = obs.GetSceneItemTransform(scene, itemId);\n            LogMessage($\"Transform Object: X: {transform.X}, Y: {transform.Y}, ScaleX: {transform.ScaleX}, ScaleY: {transform.ScaleY}, Height: {transform.Height}, Width: {transform.Width}, SourceHeight: {transform.SourceHeight}, SourceWidth: {transform.SourceWidth}, Rotation: {transform.Rotation}, Crop Top: {transform.CropTop}, Crop Bottom: {transform.CropBottom}, Crop Left: {transform.CropLeft}, Crop Right: {transform.CropRight}\");\n            LogMessage($\"Alignment: {transform.Alignnment}, BoundsHeight: {transform.BoundsHeight}, BoundsWidth: {transform.BoundsWidth}, BoundsType: {transform.BoundsType}\");\n        }\n\n        private void btnSourceFilters_Click(object sender, EventArgs e)\n        {\n            try\n            {\n                if (String.IsNullOrEmpty(tbSourceName.Text))\n                {\n                    MessageBox.Show(\"Enter name of Source in input box\");\n                    return;\n                }\n                string source = tbSourceName.Text;\n\n                LogMessage(\"GetSourceFilters:\");\n                var filters = obs.GetSourceFilterList(source);\n\n                foreach (var filter in filters)\n                {\n                    LogFilter(filter);\n                }\n\n                var firstFilter = filters.FirstOrDefault();\n                if (firstFilter == null)\n                {\n                    LogMessage(\"ERROR: No filters found\");\n                    return;\n                }\n\n                LogMessage(\"GetSourceFilterInfo:\");\n                LogFilter(obs.GetSourceFilter(source, firstFilter.Name));\n            }\n            catch (Exception ex)\n            {\n                LogMessage($\"ERROR: {ex}\");\n            }\n        }\n\n        private void LogFilter(FilterSettings filter)\n        {\n            LogMessage($\"Filter: {filter.Name} Type: {filter.Kind} Enabled: {filter.IsEnabled}{Environment.NewLine}Settings: {filter.Settings}\");\n        }\n\n        private void btnCreateScene_Click(object sender, EventArgs e)\n        {\n            if (String.IsNullOrEmpty(tbSceneName.Text))\n            {\n                MessageBox.Show(\"Enter name of Scene in input box\");\n                return;\n            }\n            string newScene = tbSceneName.Text;\n\n            obs.CreateScene(newScene);\n            var createdScene = obs.GetSceneList().Scenes.FirstOrDefault(s => s.Name == newScene);\n            if (createdScene == null)\n            {\n                LogMessage($\"ERROR: Scene was not created!\");\n                return;\n            }\n            LogMessage($\"Created scene: {createdScene.Name}\");\n        }\n\n        private void btnOutputs_Click(object sender, EventArgs e)\n        {\n            // TODO refactor for v5.0.0 if possible\n            /*LogMessage(\"Testing ListOutputs:\");\n            var outputs = obs.ListOutputs();\n            foreach (var output in outputs)\n            {\n                LogOutput(output);\n            }\n\n            LogMessage(\"Testing GetOutputInfo:\");\n            var firstOutput = outputs.Skip(1).FirstOrDefault();\n            if (firstOutput == null)\n            {\n                LogMessage($\"ERROR: No outputs retrieved!\");\n                return;\n            }*/\n\n            // TODO: Reuse when properly works on Windows\n            /* Output information does not work properly on OBS Websocket Window\n\n            string outputName = firstOutput.Name;\n            var retrievedOutput = obs.GetOutputInfo(outputName);\n            LogOutput(retrievedOutput);\n\n            LogMessage(\"Testing StartOutput:\");\n            obs.StartOutput(outputName);\n            retrievedOutput = obs.GetOutputInfo(outputName);\n            LogOutput(retrievedOutput);\n\n            LogMessage(\"Testing StopOutput:\");\n            obs.StopOutput(outputName);\n            retrievedOutput = obs.GetOutputInfo(outputName);\n            LogOutput(retrievedOutput);\n            */\n        }\n\n        private void btnTransition_Click(object sender, EventArgs e)\n        {\n            LogMessage($\"Getting Transitions\");\n            var transitions = obs.GetSceneTransitionList();\n\n            LogMessage($\"Found {transitions.Transitions.Count} transitions. Active: {transitions.CurrentTransition}\");\n            var enteringTransition = obs.GetCurrentSceneTransition();\n            foreach (var transition in transitions.Transitions)\n            {\n                obs.SetCurrentSceneTransition(transition.Name);\n                var activeTransition = obs.GetCurrentSceneTransition();\n                var info = activeTransition.Settings;\n                info ??= new JObject();\n                LogMessage($\"Transition: {transition.Name} has {info.Count} settings\");\n            }\n            obs.SetCurrentSceneTransition(enteringTransition.Name);\n        }\n\n        private void btnTracks_Click(object sender, EventArgs e)\n        {\n            try\n            {\n                if (String.IsNullOrEmpty(tbSourceName.Text))\n                {\n                    MessageBox.Show(\"Enter name of Source in input box\");\n                    return;\n                }\n                string source = tbSourceName.Text;\n\n                LogMessage($\"Getting tracks for source {source}:\");\n                var tracks = obs.GetInputAudioTracks(source);\n\n                if (tracks == null)\n                {\n                    LogMessage(\"ERROR: No tracks returned\");\n                    return;\n                }\n                LogMessage($\"Active Tracks: 1 {tracks.IsTrack1Active}, 2 {tracks.IsTrack2Active}, 3 {tracks.IsTrack3Active}, 4 {tracks.IsTrack4Active}, 5 {tracks.IsTrack5Active}, 6 {tracks.IsTrack6Active}\");\n\n                bool trackToggle = !tracks.IsTrack3Active;\n                LogMessage($\"Setting Track 3 to {trackToggle}\");\n\n                // TODO: Get track settings structure to set track values appropriately\n                //obs.SetInputAudioTracks(SOURCE_NAME, 3, trackToggle);\n                tracks = obs.GetInputAudioTracks(source);\n                LogMessage($\"Active Tracks: 1 {tracks.IsTrack1Active}, 2 {tracks.IsTrack2Active}, 3 {tracks.IsTrack3Active}, 4 {tracks.IsTrack4Active}, 5 {tracks.IsTrack5Active}, 6 {tracks.IsTrack6Active}\");\n                LogMessage($\"Value is {tracks.IsTrack3Active} expected {trackToggle}\");\n\n                if (tracks.IsTrack3Active != trackToggle)\n                {\n                    LogMessage(\"ERROR: FAILED!\");\n                    return;\n                }\n\n                trackToggle = !tracks.IsTrack3Active;\n                LogMessage($\"Setting Track 3 back to to {trackToggle}\");\n\n                // TODO: Get track settings structure to set track values appropriately\n                //obs.SetInputAudioTracks(SOURCE_NAME, 3, trackToggle);\n                tracks = obs.GetInputAudioTracks(source);\n                LogMessage($\"Active Tracks: 1 {tracks.IsTrack1Active}, 2 {tracks.IsTrack2Active}, 3 {tracks.IsTrack3Active}, 4 {tracks.IsTrack4Active}, 5 {tracks.IsTrack5Active}, 6 {tracks.IsTrack6Active}\");\n                LogMessage($\"Value is {tracks.IsTrack3Active} expected {trackToggle}\");\n\n                if (tracks.IsTrack3Active != trackToggle)\n                {\n                    LogMessage(\"ERROR: FAILED!\");\n                    return;\n                }\n            }\n            catch (Exception ex)\n            {\n                LogMessage($\"ERROR: {ex}\");\n            }\n        }\n\n        private void btnToggleVidCapDvc_Click(object sender, EventArgs e)\n        {\n            var sceneName = obs.GetCurrentProgramScene();\n            var sourceItems = obs.GetSceneItemList(sceneName);\n            var vidCapItems = sourceItems.Where(x => x.SourceKind.Equals(\"dshow_input\"));\n            var itemListSettings = new List<InputSettings>();\n            foreach (var vidCapItem in vidCapItems)\n            {\n                var enabled = obs.GetSceneItemEnabled(sceneName, vidCapItem.ItemId);\n                obs.SetSceneItemEnabled(sceneName, vidCapItem.ItemId, enabled ? false : true);\n                LogMessage($\"{vidCapItem.SourceName} active button toggled.\");\n            }\n        }\n\n        private void btnGetInputList_Click(object sender, EventArgs e)\n        {\n            LogMessage(\"Getting OBS Input List...\");\n            var inputList = obs.GetInputList();\n            foreach (var input in inputList)\n            {\n                LogMessage($\"{input.InputName} {input.InputKind} {input.UnversionedKind}\");\n            }\n            LogMessage(\"Getting Input Kind list\");\n            var inputKinds = obs.GetInputKindList();\n            foreach (var kind in inputKinds)\n            {\n                LogMessage($\"{kind}\\n\");\n            }\n        }\n\n        private void btnGetGroupList_Click(object sender, EventArgs e)\n        {\n            LogMessage(\"Getting Group Item List...\");\n            var groupItems = obs.GetGroupList();\n            foreach (var groupItem in groupItems)\n            {\n                LogMessage(groupItem.ToString());\n            }\n        }\n\n        private void btnGetMonitorList_Click(object sender, EventArgs e)\n        {\n            LogMessage(\"Getting Monitor List...\");\n            var monitorList = obs.GetMonitorList();\n            foreach (var monitor in monitorList)\n            {\n                LogMessage($\"{monitor.Index} {monitor.Name} {monitor.Width}x{monitor.Height} {monitor.PositionX},{monitor.PositionY}\");\n            }\n\n        }\n\n        private void btnInputInfo_Click(object sender, EventArgs e)\n        {\n            if (String.IsNullOrEmpty(tbSourceName.Text))\n            {\n                MessageBox.Show(\"Enter name of Input in input box\");\n                return;\n            }\n\n            string input = tbSourceName.Text;\n\n            var inputSettings = obs.GetInputSettings(input);\n            LogMessage($\"Name: {inputSettings.InputName} Kind: {inputSettings.InputKind} \\r\\nSettings: {inputSettings.Settings}\");\n\n            var defaults = obs.GetInputDefaultSettings(inputSettings.InputKind);\n            LogMessage($\"*** Defaults for {inputSettings.InputKind} ***:\\r\\n {defaults}\");\n        }\n\n        private void btnSourcesList_Click(object sender, EventArgs e)\n        {\n            var scenes = obs.GetSceneList();\n            foreach (var scene in scenes.Scenes)\n            {\n                LogMessage($\"Scene: {scene.Name} Index: {scene.Index}\");\n                var sources = obs.GetSceneItemList(scene.Name);\n                LogMessage($\"\\t Total Items: {sources.Count} \\tItems' Names: {String.Join(',', sources.Select(i => i.SourceName).ToArray())}\");\n            }\n        }\n\n        private void btnStopRecord_Click(object sender, EventArgs e)\n        {\n            string output = obs.StopRecord();\n            LogMessage($\"Stop record: Output is {output}\");\n        }\n\n        private void btnDoNothing_Click(object sender, EventArgs e)\n        {\n\n        }\n#pragma warning restore IDE1006 // Naming Styles\n    }\n}\n"
  },
  {
    "path": "TestClient/AdvancedWindow.resx",
    "content": "﻿<root>\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "TestClient/App.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\"/>\n    </startup>\n</configuration>\n"
  },
  {
    "path": "TestClient/LICENSE.md",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    {one line to give the program's name and a brief idea of what it does.}\n    Copyright (C) {year}  {name of author}\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    {project}  Copyright (C) {year}  {fullname}\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>."
  },
  {
    "path": "TestClient/MainWindow.Designer.cs",
    "content": "﻿/*\n    TestClient for obs-websocket-dotnet\n    Copyright (C) 2021\tStéphane Lepin, BarRaider\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nnamespace TestClient\n{\n    partial class MainWindow\n    {\n        /// <summary>\n        /// Variable nécessaire au concepteur.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Nettoyage des ressources utilisées.\n        /// </summary>\n        /// <param name=\"disposing\">true si les ressources managées doivent être supprimées ; sinon, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Code généré par le Concepteur Windows Form\n\n        /// <summary>\n        /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas\n        /// le contenu de cette méthode avec l'éditeur de code.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.btnConnect = new System.Windows.Forms.Button();\n            this.txtServerIP = new System.Windows.Forms.TextBox();\n            this.txtServerPassword = new System.Windows.Forms.TextBox();\n            this.tvScenes = new System.Windows.Forms.TreeView();\n            this.groupBox1 = new System.Windows.Forms.GroupBox();\n            this.btnSetCurrentScene = new System.Windows.Forms.Button();\n            this.btnGetCurrentScene = new System.Windows.Forms.Button();\n            this.btnListScenes = new System.Windows.Forms.Button();\n            this.tbCurrentScene = new System.Windows.Forms.TextBox();\n            this.label1 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.gbControls = new System.Windows.Forms.GroupBox();\n            this.groupBox9 = new System.Windows.Forms.GroupBox();\n            this.lblVirtualCamStatus = new System.Windows.Forms.Label();\n            this.label4 = new System.Windows.Forms.Label();\n            this.btnVirtualCamToggle = new System.Windows.Forms.Button();\n            this.btnVirtualCamStop = new System.Windows.Forms.Button();\n            this.btnVirtualCamStart = new System.Windows.Forms.Button();\n            this.groupBox8 = new System.Windows.Forms.GroupBox();\n            this.btnBrowse = new System.Windows.Forms.Button();\n            this.tbFolderPath = new System.Windows.Forms.TextBox();\n            this.btnSetPath = new System.Windows.Forms.Button();\n            this.btnAdvanced = new System.Windows.Forms.Button();\n            this.groupBox7 = new System.Windows.Forms.GroupBox();\n            this.btnSetTransitionDuration = new System.Windows.Forms.Button();\n            this.btnGetTransitionDuration = new System.Windows.Forms.Button();\n            this.tbTransitionDuration = new System.Windows.Forms.NumericUpDown();\n            this.groupBox6 = new System.Windows.Forms.GroupBox();\n            this.btnSetCurrentTransition = new System.Windows.Forms.Button();\n            this.btnGetCurrentTransition = new System.Windows.Forms.Button();\n            this.tbTransition = new System.Windows.Forms.TextBox();\n            this.btnListTransitions = new System.Windows.Forms.Button();\n            this.tvTransitions = new System.Windows.Forms.TreeView();\n            this.gbStatus = new System.Windows.Forms.GroupBox();\n            this.tabStats = new System.Windows.Forms.TabControl();\n            this.obsPage = new System.Windows.Forms.TabPage();\n            this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();\n            this.lblOutgoingMessages = new System.Windows.Forms.Label();\n            this.lblIncomingMessages = new System.Windows.Forms.Label();\n            this.lblDisk = new System.Windows.Forms.Label();\n            this.lblMemory = new System.Windows.Forms.Label();\n            this.lblCPU = new System.Windows.Forms.Label();\n            this.lblFPS = new System.Windows.Forms.Label();\n            this.lblAvgRender = new System.Windows.Forms.Label();\n            this.lblSkipped = new System.Windows.Forms.Label();\n            this.label26 = new System.Windows.Forms.Label();\n            this.label25 = new System.Windows.Forms.Label();\n            this.label24 = new System.Windows.Forms.Label();\n            this.label23 = new System.Windows.Forms.Label();\n            this.label22 = new System.Windows.Forms.Label();\n            this.lblOutputTotal = new System.Windows.Forms.Label();\n            this.label20 = new System.Windows.Forms.Label();\n            this.label19 = new System.Windows.Forms.Label();\n            this.label18 = new System.Windows.Forms.Label();\n            this.label17 = new System.Windows.Forms.Label();\n            this.label16 = new System.Windows.Forms.Label();\n            this.label15 = new System.Windows.Forms.Label();\n            this.lblMissed = new System.Windows.Forms.Label();\n            this.lblRendered = new System.Windows.Forms.Label();\n            this.streamPage = new System.Windows.Forms.TabPage();\n            this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();\n            this.lblStreamSkippedFrames = new System.Windows.Forms.Label();\n            this.label32 = new System.Windows.Forms.Label();\n            this.label31 = new System.Windows.Forms.Label();\n            this.lblStreamOutputBytes = new System.Windows.Forms.Label();\n            this.lblStreamTotalFrames = new System.Windows.Forms.Label();\n            this.lblStreamCongestion = new System.Windows.Forms.Label();\n            this.lblStreamDuration = new System.Windows.Forms.Label();\n            this.lblStreamTimeCode = new System.Windows.Forms.Label();\n            this.lblStreamReconnect = new System.Windows.Forms.Label();\n            this.lblStreamActive = new System.Windows.Forms.Label();\n            this.label6 = new System.Windows.Forms.Label();\n            this.label7 = new System.Windows.Forms.Label();\n            this.label8 = new System.Windows.Forms.Label();\n            this.label9 = new System.Windows.Forms.Label();\n            this.label10 = new System.Windows.Forms.Label();\n            this.label11 = new System.Windows.Forms.Label();\n            this.recPage = new System.Windows.Forms.TabPage();\n            this.tableLayoutPanel5 = new System.Windows.Forms.TableLayoutPanel();\n            this.lblRecordingBytes = new System.Windows.Forms.Label();\n            this.lblRecordingDuration = new System.Windows.Forms.Label();\n            this.lblRecordingTimeCode = new System.Windows.Forms.Label();\n            this.lblRecordingPaused = new System.Windows.Forms.Label();\n            this.lblRecording = new System.Windows.Forms.Label();\n            this.label30 = new System.Windows.Forms.Label();\n            this.label29 = new System.Windows.Forms.Label();\n            this.label28 = new System.Windows.Forms.Label();\n            this.label27 = new System.Windows.Forms.Label();\n            this.label21 = new System.Windows.Forms.Label();\n            this.groupBox5 = new System.Windows.Forms.GroupBox();\n            this.btnPauseRecording = new System.Windows.Forms.Button();\n            this.btnToggleRecording = new System.Windows.Forms.Button();\n            this.btnToggleStreaming = new System.Windows.Forms.Button();\n            this.groupBox4 = new System.Windows.Forms.GroupBox();\n            this.btnSetCurrentProfile = new System.Windows.Forms.Button();\n            this.btnGetCurrentProfile = new System.Windows.Forms.Button();\n            this.tbProfile = new System.Windows.Forms.TextBox();\n            this.btnListProfiles = new System.Windows.Forms.Button();\n            this.tvProfiles = new System.Windows.Forms.TreeView();\n            this.groupBox2 = new System.Windows.Forms.GroupBox();\n            this.btnSetCurrentSceneCol = new System.Windows.Forms.Button();\n            this.btnGetCurrentSceneCol = new System.Windows.Forms.Button();\n            this.tbSceneCol = new System.Windows.Forms.TextBox();\n            this.btnListSceneCol = new System.Windows.Forms.Button();\n            this.tvSceneCols = new System.Windows.Forms.TreeView();\n            this.groupBox3 = new System.Windows.Forms.GroupBox();\n            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\n            this.tbOBSVersion = new System.Windows.Forms.Label();\n            this.tbPluginVersion = new System.Windows.Forms.Label();\n            this.label3 = new System.Windows.Forms.Label();\n            this.label5 = new System.Windows.Forms.Label();\n            this.button3 = new System.Windows.Forms.Button();\n            this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();\n            this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog();\n            this.label13 = new System.Windows.Forms.Label();\n            this.label14 = new System.Windows.Forms.Label();\n            this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel();\n            this.fileSystemWatcher1 = new System.IO.FileSystemWatcher();\n            this.groupBox1.SuspendLayout();\n            this.gbControls.SuspendLayout();\n            this.groupBox9.SuspendLayout();\n            this.groupBox8.SuspendLayout();\n            this.groupBox7.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.tbTransitionDuration)).BeginInit();\n            this.groupBox6.SuspendLayout();\n            this.gbStatus.SuspendLayout();\n            this.tabStats.SuspendLayout();\n            this.obsPage.SuspendLayout();\n            this.tableLayoutPanel3.SuspendLayout();\n            this.streamPage.SuspendLayout();\n            this.tableLayoutPanel2.SuspendLayout();\n            this.recPage.SuspendLayout();\n            this.tableLayoutPanel5.SuspendLayout();\n            this.groupBox5.SuspendLayout();\n            this.groupBox4.SuspendLayout();\n            this.groupBox2.SuspendLayout();\n            this.groupBox3.SuspendLayout();\n            this.tableLayoutPanel1.SuspendLayout();\n            this.tableLayoutPanel4.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).BeginInit();\n            this.SuspendLayout();\n            // \n            // btnConnect\n            // \n            this.btnConnect.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnConnect.Location = new System.Drawing.Point(681, 8);\n            this.btnConnect.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnConnect.Name = \"btnConnect\";\n            this.btnConnect.Size = new System.Drawing.Size(101, 36);\n            this.btnConnect.TabIndex = 1;\n            this.btnConnect.Text = \"Connect\";\n            this.btnConnect.UseVisualStyleBackColor = true;\n            this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click);\n            // \n            // txtServerIP\n            // \n            this.txtServerIP.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.txtServerIP.Location = new System.Drawing.Point(271, 11);\n            this.txtServerIP.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.txtServerIP.Name = \"txtServerIP\";\n            this.txtServerIP.Size = new System.Drawing.Size(150, 27);\n            this.txtServerIP.TabIndex = 2;\n            this.txtServerIP.Text = \"ws://127.0.0.1:4455\";\n            // \n            // txtServerPassword\n            // \n            this.txtServerPassword.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.txtServerPassword.Location = new System.Drawing.Point(521, 11);\n            this.txtServerPassword.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.txtServerPassword.Name = \"txtServerPassword\";\n            this.txtServerPassword.Size = new System.Drawing.Size(150, 27);\n            this.txtServerPassword.TabIndex = 3;\n            this.txtServerPassword.UseSystemPasswordChar = true;\n            // \n            // tvScenes\n            // \n            this.tvScenes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tvScenes.Location = new System.Drawing.Point(8, 76);\n            this.tvScenes.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.tvScenes.Name = \"tvScenes\";\n            this.tvScenes.Size = new System.Drawing.Size(182, 180);\n            this.tvScenes.TabIndex = 4;\n            this.tvScenes.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.tvScenes_NodeMouseClick);\n            // \n            // groupBox1\n            // \n            this.groupBox1.Controls.Add(this.btnSetCurrentScene);\n            this.groupBox1.Controls.Add(this.btnGetCurrentScene);\n            this.groupBox1.Controls.Add(this.btnListScenes);\n            this.groupBox1.Controls.Add(this.tvScenes);\n            this.groupBox1.Controls.Add(this.tbCurrentScene);\n            this.groupBox1.Location = new System.Drawing.Point(8, 19);\n            this.groupBox1.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox1.Name = \"groupBox1\";\n            this.groupBox1.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox1.Size = new System.Drawing.Size(200, 373);\n            this.groupBox1.TabIndex = 5;\n            this.groupBox1.TabStop = false;\n            this.groupBox1.Text = \"Scene List with Items\";\n            // \n            // btnSetCurrentScene\n            // \n            this.btnSetCurrentScene.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnSetCurrentScene.Location = new System.Drawing.Point(104, 307);\n            this.btnSetCurrentScene.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnSetCurrentScene.Name = \"btnSetCurrentScene\";\n            this.btnSetCurrentScene.Size = new System.Drawing.Size(88, 59);\n            this.btnSetCurrentScene.TabIndex = 1;\n            this.btnSetCurrentScene.Text = \"Set\\r\\nCurScene\";\n            this.btnSetCurrentScene.UseVisualStyleBackColor = true;\n            this.btnSetCurrentScene.Click += new System.EventHandler(this.btnSetCurrentScene_Click);\n            // \n            // btnGetCurrentScene\n            // \n            this.btnGetCurrentScene.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.btnGetCurrentScene.Location = new System.Drawing.Point(8, 307);\n            this.btnGetCurrentScene.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnGetCurrentScene.Name = \"btnGetCurrentScene\";\n            this.btnGetCurrentScene.Size = new System.Drawing.Size(82, 59);\n            this.btnGetCurrentScene.TabIndex = 2;\n            this.btnGetCurrentScene.Text = \"Get\\r\\nCurScene\";\n            this.btnGetCurrentScene.UseVisualStyleBackColor = true;\n            this.btnGetCurrentScene.Click += new System.EventHandler(this.btnGetCurrentScene_Click);\n            // \n            // btnListScenes\n            // \n            this.btnListScenes.Location = new System.Drawing.Point(9, 31);\n            this.btnListScenes.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnListScenes.Name = \"btnListScenes\";\n            this.btnListScenes.Size = new System.Drawing.Size(101, 36);\n            this.btnListScenes.TabIndex = 5;\n            this.btnListScenes.Text = \"ListScenes\";\n            this.btnListScenes.UseVisualStyleBackColor = true;\n            this.btnListScenes.Click += new System.EventHandler(this.btnListScenes_Click);\n            // \n            // tbCurrentScene\n            // \n            this.tbCurrentScene.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbCurrentScene.Location = new System.Drawing.Point(8, 267);\n            this.tbCurrentScene.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.tbCurrentScene.Name = \"tbCurrentScene\";\n            this.tbCurrentScene.Size = new System.Drawing.Size(182, 27);\n            this.tbCurrentScene.TabIndex = 0;\n            // \n            // label1\n            // \n            this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(192, 16);\n            this.label1.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(66, 20);\n            this.label1.TabIndex = 7;\n            this.label1.Text = \"IP:PORT :\";\n            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // label2\n            // \n            this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(440, 16);\n            this.label2.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(77, 20);\n            this.label2.TabIndex = 8;\n            this.label2.Text = \"Password :\";\n            // \n            // gbControls\n            // \n            this.gbControls.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.gbControls.Controls.Add(this.groupBox9);\n            this.gbControls.Controls.Add(this.groupBox8);\n            this.gbControls.Controls.Add(this.btnAdvanced);\n            this.gbControls.Controls.Add(this.groupBox7);\n            this.gbControls.Controls.Add(this.groupBox6);\n            this.gbControls.Controls.Add(this.gbStatus);\n            this.gbControls.Controls.Add(this.groupBox5);\n            this.gbControls.Controls.Add(this.groupBox4);\n            this.gbControls.Controls.Add(this.groupBox2);\n            this.gbControls.Controls.Add(this.groupBox3);\n            this.gbControls.Controls.Add(this.groupBox1);\n            this.gbControls.Enabled = false;\n            this.gbControls.Location = new System.Drawing.Point(15, 52);\n            this.gbControls.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.gbControls.Name = \"gbControls\";\n            this.gbControls.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.gbControls.Size = new System.Drawing.Size(766, 856);\n            this.gbControls.TabIndex = 9;\n            this.gbControls.TabStop = false;\n            // \n            // groupBox9\n            // \n            this.groupBox9.Controls.Add(this.lblVirtualCamStatus);\n            this.groupBox9.Controls.Add(this.label4);\n            this.groupBox9.Controls.Add(this.btnVirtualCamToggle);\n            this.groupBox9.Controls.Add(this.btnVirtualCamStop);\n            this.groupBox9.Controls.Add(this.btnVirtualCamStart);\n            this.groupBox9.Location = new System.Drawing.Point(562, 571);\n            this.groupBox9.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox9.Name = \"groupBox9\";\n            this.groupBox9.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox9.Size = new System.Drawing.Size(194, 89);\n            this.groupBox9.TabIndex = 13;\n            this.groupBox9.TabStop = false;\n            this.groupBox9.Text = \"Virtual Cam\";\n            // \n            // lblVirtualCamStatus\n            // \n            this.lblVirtualCamStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblVirtualCamStatus.Location = new System.Drawing.Point(65, 23);\n            this.lblVirtualCamStatus.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblVirtualCamStatus.Name = \"lblVirtualCamStatus\";\n            this.lblVirtualCamStatus.Size = new System.Drawing.Size(122, 20);\n            this.lblVirtualCamStatus.TabIndex = 8;\n            this.lblVirtualCamStatus.Text = \"Unknown\";\n            this.lblVirtualCamStatus.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label4\n            // \n            this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(7, 23);\n            this.label4.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(52, 20);\n            this.label4.TabIndex = 7;\n            this.label4.Text = \"Status:\";\n            this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // btnVirtualCamToggle\n            // \n            this.btnVirtualCamToggle.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnVirtualCamToggle.Location = new System.Drawing.Point(125, 44);\n            this.btnVirtualCamToggle.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnVirtualCamToggle.Name = \"btnVirtualCamToggle\";\n            this.btnVirtualCamToggle.Size = new System.Drawing.Size(64, 36);\n            this.btnVirtualCamToggle.TabIndex = 3;\n            this.btnVirtualCamToggle.Text = \"Toggle\";\n            this.btnVirtualCamToggle.UseVisualStyleBackColor = true;\n            this.btnVirtualCamToggle.Click += new System.EventHandler(this.btnVirtualCamToggle_Click);\n            // \n            // btnVirtualCamStop\n            // \n            this.btnVirtualCamStop.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnVirtualCamStop.Location = new System.Drawing.Point(67, 44);\n            this.btnVirtualCamStop.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnVirtualCamStop.Name = \"btnVirtualCamStop\";\n            this.btnVirtualCamStop.Size = new System.Drawing.Size(54, 36);\n            this.btnVirtualCamStop.TabIndex = 2;\n            this.btnVirtualCamStop.Text = \"Stop\";\n            this.btnVirtualCamStop.UseVisualStyleBackColor = true;\n            this.btnVirtualCamStop.Click += new System.EventHandler(this.btnVirtualCamStop_Click);\n            // \n            // btnVirtualCamStart\n            // \n            this.btnVirtualCamStart.Location = new System.Drawing.Point(7, 44);\n            this.btnVirtualCamStart.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnVirtualCamStart.Name = \"btnVirtualCamStart\";\n            this.btnVirtualCamStart.Size = new System.Drawing.Size(55, 36);\n            this.btnVirtualCamStart.TabIndex = 1;\n            this.btnVirtualCamStart.Text = \"Start\";\n            this.btnVirtualCamStart.UseVisualStyleBackColor = true;\n            this.btnVirtualCamStart.Click += new System.EventHandler(this.btnVirtualCamStart_Click);\n            // \n            // groupBox8\n            // \n            this.groupBox8.Controls.Add(this.btnBrowse);\n            this.groupBox8.Controls.Add(this.tbFolderPath);\n            this.groupBox8.Controls.Add(this.btnSetPath);\n            this.groupBox8.Location = new System.Drawing.Point(8, 776);\n            this.groupBox8.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);\n            this.groupBox8.Name = \"groupBox8\";\n            this.groupBox8.Padding = new System.Windows.Forms.Padding(3, 4, 3, 4);\n            this.groupBox8.Size = new System.Drawing.Size(482, 68);\n            this.groupBox8.TabIndex = 15;\n            this.groupBox8.TabStop = false;\n            this.groupBox8.Text = \"Recordings Directory\";\n            // \n            // btnBrowse\n            // \n            this.btnBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnBrowse.Enabled = false;\n            this.btnBrowse.Location = new System.Drawing.Point(277, 29);\n            this.btnBrowse.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnBrowse.Name = \"btnBrowse\";\n            this.btnBrowse.Size = new System.Drawing.Size(38, 31);\n            this.btnBrowse.TabIndex = 17;\n            this.btnBrowse.Text = \"...\";\n            this.btnBrowse.UseVisualStyleBackColor = true;\n            this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);\n            // \n            // tbFolderPath\n            // \n            this.tbFolderPath.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbFolderPath.Location = new System.Drawing.Point(9, 29);\n            this.tbFolderPath.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.tbFolderPath.Name = \"tbFolderPath\";\n            this.tbFolderPath.Size = new System.Drawing.Size(265, 27);\n            this.tbFolderPath.TabIndex = 15;\n            // \n            // btnSetPath\n            // \n            this.btnSetPath.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnSetPath.Enabled = false;\n            this.btnSetPath.Location = new System.Drawing.Point(365, 28);\n            this.btnSetPath.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnSetPath.Name = \"btnSetPath\";\n            this.btnSetPath.Size = new System.Drawing.Size(107, 31);\n            this.btnSetPath.TabIndex = 16;\n            this.btnSetPath.Text = \"Set Path\";\n            this.btnSetPath.UseVisualStyleBackColor = true;\n            this.btnSetPath.Click += new System.EventHandler(this.btnSetPath_Click);\n            // \n            // btnAdvanced\n            // \n            this.btnAdvanced.Location = new System.Drawing.Point(657, 799);\n            this.btnAdvanced.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnAdvanced.Name = \"btnAdvanced\";\n            this.btnAdvanced.Size = new System.Drawing.Size(101, 36);\n            this.btnAdvanced.TabIndex = 13;\n            this.btnAdvanced.Text = \"Advanced >>\";\n            this.btnAdvanced.UseVisualStyleBackColor = true;\n            this.btnAdvanced.Click += new System.EventHandler(this.btnAdvanced_Click);\n            // \n            // groupBox7\n            // \n            this.groupBox7.Controls.Add(this.btnSetTransitionDuration);\n            this.groupBox7.Controls.Add(this.btnGetTransitionDuration);\n            this.groupBox7.Controls.Add(this.tbTransitionDuration);\n            this.groupBox7.Location = new System.Drawing.Point(563, 668);\n            this.groupBox7.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox7.Name = \"groupBox7\";\n            this.groupBox7.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox7.Size = new System.Drawing.Size(194, 81);\n            this.groupBox7.TabIndex = 12;\n            this.groupBox7.TabStop = false;\n            this.groupBox7.Text = \"Transition Duration\";\n            // \n            // btnSetTransitionDuration\n            // \n            this.btnSetTransitionDuration.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnSetTransitionDuration.Location = new System.Drawing.Point(129, 33);\n            this.btnSetTransitionDuration.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnSetTransitionDuration.Name = \"btnSetTransitionDuration\";\n            this.btnSetTransitionDuration.Size = new System.Drawing.Size(54, 36);\n            this.btnSetTransitionDuration.TabIndex = 2;\n            this.btnSetTransitionDuration.Text = \"Set\";\n            this.btnSetTransitionDuration.UseVisualStyleBackColor = true;\n            this.btnSetTransitionDuration.Click += new System.EventHandler(this.btnSetTransitionDuration_Click);\n            // \n            // btnGetTransitionDuration\n            // \n            this.btnGetTransitionDuration.Location = new System.Drawing.Point(9, 33);\n            this.btnGetTransitionDuration.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnGetTransitionDuration.Name = \"btnGetTransitionDuration\";\n            this.btnGetTransitionDuration.Size = new System.Drawing.Size(55, 36);\n            this.btnGetTransitionDuration.TabIndex = 1;\n            this.btnGetTransitionDuration.Text = \"Get\";\n            this.btnGetTransitionDuration.UseVisualStyleBackColor = true;\n            this.btnGetTransitionDuration.Click += new System.EventHandler(this.btnGetTransitionDuration_Click);\n            // \n            // tbTransitionDuration\n            // \n            this.tbTransitionDuration.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbTransitionDuration.Increment = new decimal(new int[] {\n            50,\n            0,\n            0,\n            0});\n            this.tbTransitionDuration.Location = new System.Drawing.Point(67, 36);\n            this.tbTransitionDuration.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.tbTransitionDuration.Maximum = new decimal(new int[] {\n            120000,\n            0,\n            0,\n            0});\n            this.tbTransitionDuration.Name = \"tbTransitionDuration\";\n            this.tbTransitionDuration.Size = new System.Drawing.Size(53, 27);\n            this.tbTransitionDuration.TabIndex = 0;\n            // \n            // groupBox6\n            // \n            this.groupBox6.Controls.Add(this.btnSetCurrentTransition);\n            this.groupBox6.Controls.Add(this.btnGetCurrentTransition);\n            this.groupBox6.Controls.Add(this.tbTransition);\n            this.groupBox6.Controls.Add(this.btnListTransitions);\n            this.groupBox6.Controls.Add(this.tvTransitions);\n            this.groupBox6.Location = new System.Drawing.Point(234, 401);\n            this.groupBox6.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox6.Name = \"groupBox6\";\n            this.groupBox6.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox6.Size = new System.Drawing.Size(256, 373);\n            this.groupBox6.TabIndex = 10;\n            this.groupBox6.TabStop = false;\n            this.groupBox6.Text = \"Transitions\";\n            // \n            // btnSetCurrentTransition\n            // \n            this.btnSetCurrentTransition.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnSetCurrentTransition.Location = new System.Drawing.Point(138, 307);\n            this.btnSetCurrentTransition.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnSetCurrentTransition.Name = \"btnSetCurrentTransition\";\n            this.btnSetCurrentTransition.Size = new System.Drawing.Size(107, 59);\n            this.btnSetCurrentTransition.TabIndex = 5;\n            this.btnSetCurrentTransition.Text = \"Set\\r\\nCurTransition\";\n            this.btnSetCurrentTransition.UseVisualStyleBackColor = true;\n            this.btnSetCurrentTransition.Click += new System.EventHandler(this.btnSetCurrentTransition_Click);\n            // \n            // btnGetCurrentTransition\n            // \n            this.btnGetCurrentTransition.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.btnGetCurrentTransition.Location = new System.Drawing.Point(8, 307);\n            this.btnGetCurrentTransition.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnGetCurrentTransition.Name = \"btnGetCurrentTransition\";\n            this.btnGetCurrentTransition.Size = new System.Drawing.Size(114, 59);\n            this.btnGetCurrentTransition.TabIndex = 4;\n            this.btnGetCurrentTransition.Text = \"Get\\r\\nCurTransition\";\n            this.btnGetCurrentTransition.UseVisualStyleBackColor = true;\n            this.btnGetCurrentTransition.Click += new System.EventHandler(this.btnGetCurrentTransition_Click);\n            // \n            // tbTransition\n            // \n            this.tbTransition.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbTransition.Location = new System.Drawing.Point(8, 267);\n            this.tbTransition.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.tbTransition.Name = \"tbTransition\";\n            this.tbTransition.Size = new System.Drawing.Size(237, 27);\n            this.tbTransition.TabIndex = 3;\n            // \n            // btnListTransitions\n            // \n            this.btnListTransitions.Location = new System.Drawing.Point(8, 29);\n            this.btnListTransitions.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnListTransitions.Name = \"btnListTransitions\";\n            this.btnListTransitions.Size = new System.Drawing.Size(114, 36);\n            this.btnListTransitions.TabIndex = 2;\n            this.btnListTransitions.Text = \"ListTransitions\";\n            this.btnListTransitions.UseVisualStyleBackColor = true;\n            this.btnListTransitions.Click += new System.EventHandler(this.btnListTransitions_Click);\n            // \n            // tvTransitions\n            // \n            this.tvTransitions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tvTransitions.Location = new System.Drawing.Point(8, 76);\n            this.tvTransitions.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.tvTransitions.Name = \"tvTransitions\";\n            this.tvTransitions.Size = new System.Drawing.Size(238, 180);\n            this.tvTransitions.TabIndex = 1;\n            this.tvTransitions.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.tvTransitions_NodeMouseClick);\n            // \n            // gbStatus\n            // \n            this.gbStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.gbStatus.Controls.Add(this.tabStats);\n            this.gbStatus.Location = new System.Drawing.Point(453, 19);\n            this.gbStatus.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.gbStatus.Name = \"gbStatus\";\n            this.gbStatus.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.gbStatus.Size = new System.Drawing.Size(305, 269);\n            this.gbStatus.TabIndex = 11;\n            this.gbStatus.TabStop = false;\n            // \n            // tabStats\n            // \n            this.tabStats.Controls.Add(this.obsPage);\n            this.tabStats.Controls.Add(this.streamPage);\n            this.tabStats.Controls.Add(this.recPage);\n            this.tabStats.Location = new System.Drawing.Point(4, 0);\n            this.tabStats.Name = \"tabStats\";\n            this.tabStats.SelectedIndex = 0;\n            this.tabStats.Size = new System.Drawing.Size(294, 262);\n            this.tabStats.TabIndex = 1;\n            // \n            // obsPage\n            // \n            this.obsPage.Controls.Add(this.tableLayoutPanel3);\n            this.obsPage.Location = new System.Drawing.Point(4, 29);\n            this.obsPage.Name = \"obsPage\";\n            this.obsPage.Padding = new System.Windows.Forms.Padding(3);\n            this.obsPage.Size = new System.Drawing.Size(286, 229);\n            this.obsPage.TabIndex = 0;\n            this.obsPage.Text = \"OBS\";\n            this.obsPage.UseVisualStyleBackColor = true;\n            // \n            // tableLayoutPanel3\n            // \n            this.tableLayoutPanel3.ColumnCount = 2;\n            this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 134F));\n            this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tableLayoutPanel3.Controls.Add(this.lblOutgoingMessages, 1, 10);\n            this.tableLayoutPanel3.Controls.Add(this.lblIncomingMessages, 1, 9);\n            this.tableLayoutPanel3.Controls.Add(this.lblDisk, 1, 8);\n            this.tableLayoutPanel3.Controls.Add(this.lblMemory, 1, 7);\n            this.tableLayoutPanel3.Controls.Add(this.lblCPU, 1, 6);\n            this.tableLayoutPanel3.Controls.Add(this.lblFPS, 1, 5);\n            this.tableLayoutPanel3.Controls.Add(this.lblAvgRender, 1, 4);\n            this.tableLayoutPanel3.Controls.Add(this.lblSkipped, 1, 3);\n            this.tableLayoutPanel3.Controls.Add(this.label26, 0, 1);\n            this.tableLayoutPanel3.Controls.Add(this.label25, 0, 10);\n            this.tableLayoutPanel3.Controls.Add(this.label24, 0, 0);\n            this.tableLayoutPanel3.Controls.Add(this.label23, 0, 8);\n            this.tableLayoutPanel3.Controls.Add(this.label22, 0, 9);\n            this.tableLayoutPanel3.Controls.Add(this.lblOutputTotal, 1, 2);\n            this.tableLayoutPanel3.Controls.Add(this.label20, 0, 7);\n            this.tableLayoutPanel3.Controls.Add(this.label19, 0, 5);\n            this.tableLayoutPanel3.Controls.Add(this.label18, 0, 6);\n            this.tableLayoutPanel3.Controls.Add(this.label17, 0, 4);\n            this.tableLayoutPanel3.Controls.Add(this.label16, 0, 2);\n            this.tableLayoutPanel3.Controls.Add(this.label15, 0, 3);\n            this.tableLayoutPanel3.Controls.Add(this.lblMissed, 0, 1);\n            this.tableLayoutPanel3.Controls.Add(this.lblRendered, 1, 0);\n            this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 0);\n            this.tableLayoutPanel3.Name = \"tableLayoutPanel3\";\n            this.tableLayoutPanel3.RowCount = 13;\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel3.Size = new System.Drawing.Size(286, 215);\n            this.tableLayoutPanel3.TabIndex = 0;\n            this.tableLayoutPanel3.Paint += new System.Windows.Forms.PaintEventHandler(this.tableLayoutPanel3_Paint);\n            // \n            // lblOutgoingMessages\n            // \n            this.lblOutgoingMessages.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblOutgoingMessages.AutoSize = true;\n            this.lblOutgoingMessages.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblOutgoingMessages.Location = new System.Drawing.Point(139, 199);\n            this.lblOutgoingMessages.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblOutgoingMessages.Name = \"lblOutgoingMessages\";\n            this.lblOutgoingMessages.Size = new System.Drawing.Size(142, 19);\n            this.lblOutgoingMessages.TabIndex = 23;\n            this.lblOutgoingMessages.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblIncomingMessages\n            // \n            this.lblIncomingMessages.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblIncomingMessages.AutoSize = true;\n            this.lblIncomingMessages.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblIncomingMessages.Location = new System.Drawing.Point(139, 180);\n            this.lblIncomingMessages.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblIncomingMessages.Name = \"lblIncomingMessages\";\n            this.lblIncomingMessages.Size = new System.Drawing.Size(142, 19);\n            this.lblIncomingMessages.TabIndex = 22;\n            this.lblIncomingMessages.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblDisk\n            // \n            this.lblDisk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblDisk.AutoSize = true;\n            this.lblDisk.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblDisk.Location = new System.Drawing.Point(139, 160);\n            this.lblDisk.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblDisk.Name = \"lblDisk\";\n            this.lblDisk.Size = new System.Drawing.Size(142, 19);\n            this.lblDisk.TabIndex = 21;\n            this.lblDisk.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblMemory\n            // \n            this.lblMemory.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblMemory.AutoSize = true;\n            this.lblMemory.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblMemory.Location = new System.Drawing.Point(139, 140);\n            this.lblMemory.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblMemory.Name = \"lblMemory\";\n            this.lblMemory.Size = new System.Drawing.Size(142, 19);\n            this.lblMemory.TabIndex = 20;\n            this.lblMemory.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblCPU\n            // \n            this.lblCPU.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblCPU.AutoSize = true;\n            this.lblCPU.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblCPU.Location = new System.Drawing.Point(139, 120);\n            this.lblCPU.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblCPU.Name = \"lblCPU\";\n            this.lblCPU.Size = new System.Drawing.Size(142, 19);\n            this.lblCPU.TabIndex = 19;\n            this.lblCPU.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblFPS\n            // \n            this.lblFPS.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblFPS.AutoSize = true;\n            this.lblFPS.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblFPS.Location = new System.Drawing.Point(139, 100);\n            this.lblFPS.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblFPS.Name = \"lblFPS\";\n            this.lblFPS.Size = new System.Drawing.Size(142, 19);\n            this.lblFPS.TabIndex = 18;\n            this.lblFPS.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblAvgRender\n            // \n            this.lblAvgRender.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblAvgRender.AutoSize = true;\n            this.lblAvgRender.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblAvgRender.Location = new System.Drawing.Point(139, 80);\n            this.lblAvgRender.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblAvgRender.Name = \"lblAvgRender\";\n            this.lblAvgRender.Size = new System.Drawing.Size(142, 19);\n            this.lblAvgRender.TabIndex = 17;\n            this.lblAvgRender.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblSkipped\n            // \n            this.lblSkipped.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblSkipped.AutoSize = true;\n            this.lblSkipped.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblSkipped.Location = new System.Drawing.Point(139, 60);\n            this.lblSkipped.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblSkipped.Name = \"lblSkipped\";\n            this.lblSkipped.Size = new System.Drawing.Size(142, 19);\n            this.lblSkipped.TabIndex = 16;\n            this.lblSkipped.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label26\n            // \n            this.label26.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label26.AutoSize = true;\n            this.label26.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label26.Location = new System.Drawing.Point(5, 20);\n            this.label26.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label26.Name = \"label26\";\n            this.label26.Size = new System.Drawing.Size(124, 19);\n            this.label26.TabIndex = 15;\n            this.label26.Text = \"Missed:\";\n            this.label26.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label25\n            // \n            this.label25.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label25.AutoSize = true;\n            this.label25.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label25.Location = new System.Drawing.Point(5, 199);\n            this.label25.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label25.Name = \"label25\";\n            this.label25.Size = new System.Drawing.Size(124, 19);\n            this.label25.TabIndex = 14;\n            this.label25.Text = \"OUT Messages:\";\n            this.label25.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label24\n            // \n            this.label24.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label24.AutoSize = true;\n            this.label24.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label24.Location = new System.Drawing.Point(5, 0);\n            this.label24.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label24.Name = \"label24\";\n            this.label24.Size = new System.Drawing.Size(124, 19);\n            this.label24.TabIndex = 13;\n            this.label24.Text = \"Frames Rendered:\";\n            this.label24.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label23\n            // \n            this.label23.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label23.AutoSize = true;\n            this.label23.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label23.Location = new System.Drawing.Point(5, 160);\n            this.label23.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label23.Name = \"label23\";\n            this.label23.Size = new System.Drawing.Size(124, 19);\n            this.label23.TabIndex = 12;\n            this.label23.Text = \"Free Disk:\";\n            this.label23.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label22\n            // \n            this.label22.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label22.AutoSize = true;\n            this.label22.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label22.Location = new System.Drawing.Point(5, 180);\n            this.label22.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label22.Name = \"label22\";\n            this.label22.Size = new System.Drawing.Size(124, 19);\n            this.label22.TabIndex = 11;\n            this.label22.Text = \"IN Messages:\";\n            this.label22.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblOutputTotal\n            // \n            this.lblOutputTotal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblOutputTotal.AutoSize = true;\n            this.lblOutputTotal.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblOutputTotal.Location = new System.Drawing.Point(139, 40);\n            this.lblOutputTotal.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblOutputTotal.Name = \"lblOutputTotal\";\n            this.lblOutputTotal.Size = new System.Drawing.Size(142, 19);\n            this.lblOutputTotal.TabIndex = 10;\n            this.lblOutputTotal.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label20\n            // \n            this.label20.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label20.AutoSize = true;\n            this.label20.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label20.Location = new System.Drawing.Point(5, 140);\n            this.label20.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label20.Name = \"label20\";\n            this.label20.Size = new System.Drawing.Size(124, 19);\n            this.label20.TabIndex = 9;\n            this.label20.Text = \"Memory:\";\n            this.label20.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label19\n            // \n            this.label19.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label19.AutoSize = true;\n            this.label19.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label19.Location = new System.Drawing.Point(5, 100);\n            this.label19.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label19.Name = \"label19\";\n            this.label19.Size = new System.Drawing.Size(124, 19);\n            this.label19.TabIndex = 8;\n            this.label19.Text = \"FPS:\";\n            this.label19.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label18\n            // \n            this.label18.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label18.AutoSize = true;\n            this.label18.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label18.Location = new System.Drawing.Point(5, 120);\n            this.label18.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label18.Name = \"label18\";\n            this.label18.Size = new System.Drawing.Size(124, 19);\n            this.label18.TabIndex = 7;\n            this.label18.Text = \"CPU:\";\n            this.label18.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label17\n            // \n            this.label17.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label17.AutoSize = true;\n            this.label17.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label17.Location = new System.Drawing.Point(5, 80);\n            this.label17.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label17.Name = \"label17\";\n            this.label17.Size = new System.Drawing.Size(124, 19);\n            this.label17.TabIndex = 6;\n            this.label17.Text = \"Avg Render Time:\";\n            this.label17.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            this.label17.Click += new System.EventHandler(this.label17_Click);\n            // \n            // label16\n            // \n            this.label16.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label16.AutoSize = true;\n            this.label16.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label16.Location = new System.Drawing.Point(5, 40);\n            this.label16.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label16.Name = \"label16\";\n            this.label16.Size = new System.Drawing.Size(124, 19);\n            this.label16.TabIndex = 5;\n            this.label16.Text = \"Output Total:\";\n            this.label16.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label15\n            // \n            this.label15.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label15.AutoSize = true;\n            this.label15.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label15.Location = new System.Drawing.Point(5, 60);\n            this.label15.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label15.Name = \"label15\";\n            this.label15.Size = new System.Drawing.Size(124, 19);\n            this.label15.TabIndex = 4;\n            this.label15.Text = \"Skipped:\";\n            this.label15.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblMissed\n            // \n            this.lblMissed.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblMissed.AutoSize = true;\n            this.lblMissed.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblMissed.Location = new System.Drawing.Point(139, 20);\n            this.lblMissed.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblMissed.Name = \"lblMissed\";\n            this.lblMissed.Size = new System.Drawing.Size(142, 19);\n            this.lblMissed.TabIndex = 3;\n            this.lblMissed.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblRendered\n            // \n            this.lblRendered.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblRendered.AutoSize = true;\n            this.lblRendered.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblRendered.Location = new System.Drawing.Point(139, 0);\n            this.lblRendered.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblRendered.Name = \"lblRendered\";\n            this.lblRendered.Size = new System.Drawing.Size(142, 19);\n            this.lblRendered.TabIndex = 2;\n            this.lblRendered.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // streamPage\n            // \n            this.streamPage.Controls.Add(this.tableLayoutPanel2);\n            this.streamPage.Location = new System.Drawing.Point(4, 29);\n            this.streamPage.Name = \"streamPage\";\n            this.streamPage.Padding = new System.Windows.Forms.Padding(3);\n            this.streamPage.Size = new System.Drawing.Size(286, 229);\n            this.streamPage.TabIndex = 1;\n            this.streamPage.Text = \"Stream\";\n            this.streamPage.UseVisualStyleBackColor = true;\n            // \n            // tableLayoutPanel2\n            // \n            this.tableLayoutPanel2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tableLayoutPanel2.ColumnCount = 2;\n            this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 134F));\n            this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel2.Controls.Add(this.lblStreamSkippedFrames, 1, 6);\n            this.tableLayoutPanel2.Controls.Add(this.label32, 0, 1);\n            this.tableLayoutPanel2.Controls.Add(this.label31, 0, 0);\n            this.tableLayoutPanel2.Controls.Add(this.lblStreamOutputBytes, 1, 7);\n            this.tableLayoutPanel2.Controls.Add(this.lblStreamTotalFrames, 1, 5);\n            this.tableLayoutPanel2.Controls.Add(this.lblStreamCongestion, 1, 4);\n            this.tableLayoutPanel2.Controls.Add(this.lblStreamDuration, 1, 3);\n            this.tableLayoutPanel2.Controls.Add(this.lblStreamTimeCode, 1, 2);\n            this.tableLayoutPanel2.Controls.Add(this.lblStreamReconnect, 1, 1);\n            this.tableLayoutPanel2.Controls.Add(this.lblStreamActive, 1, 0);\n            this.tableLayoutPanel2.Controls.Add(this.label6, 0, 2);\n            this.tableLayoutPanel2.Controls.Add(this.label7, 0, 3);\n            this.tableLayoutPanel2.Controls.Add(this.label8, 0, 4);\n            this.tableLayoutPanel2.Controls.Add(this.label9, 0, 5);\n            this.tableLayoutPanel2.Controls.Add(this.label10, 0, 6);\n            this.tableLayoutPanel2.Controls.Add(this.label11, 0, 7);\n            this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 0);\n            this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.tableLayoutPanel2.Name = \"tableLayoutPanel2\";\n            this.tableLayoutPanel2.RowCount = 9;\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel2.Size = new System.Drawing.Size(278, 208);\n            this.tableLayoutPanel2.TabIndex = 1;\n            // \n            // lblStreamSkippedFrames\n            // \n            this.lblStreamSkippedFrames.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblStreamSkippedFrames.AutoSize = true;\n            this.lblStreamSkippedFrames.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblStreamSkippedFrames.Location = new System.Drawing.Point(139, 120);\n            this.lblStreamSkippedFrames.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblStreamSkippedFrames.Name = \"lblStreamSkippedFrames\";\n            this.lblStreamSkippedFrames.Size = new System.Drawing.Size(134, 19);\n            this.lblStreamSkippedFrames.TabIndex = 17;\n            this.lblStreamSkippedFrames.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label32\n            // \n            this.label32.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label32.AutoSize = true;\n            this.label32.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label32.Location = new System.Drawing.Point(5, 20);\n            this.label32.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label32.Name = \"label32\";\n            this.label32.Size = new System.Drawing.Size(124, 19);\n            this.label32.TabIndex = 16;\n            this.label32.Text = \"Reconnecting:\";\n            this.label32.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label31\n            // \n            this.label31.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label31.AutoSize = true;\n            this.label31.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label31.Location = new System.Drawing.Point(5, 0);\n            this.label31.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label31.Name = \"label31\";\n            this.label31.Size = new System.Drawing.Size(124, 19);\n            this.label31.TabIndex = 15;\n            this.label31.Text = \"Streaming:\";\n            this.label31.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblStreamOutputBytes\n            // \n            this.lblStreamOutputBytes.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblStreamOutputBytes.AutoSize = true;\n            this.lblStreamOutputBytes.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblStreamOutputBytes.Location = new System.Drawing.Point(139, 140);\n            this.lblStreamOutputBytes.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblStreamOutputBytes.Name = \"lblStreamOutputBytes\";\n            this.lblStreamOutputBytes.Size = new System.Drawing.Size(134, 19);\n            this.lblStreamOutputBytes.TabIndex = 14;\n            this.lblStreamOutputBytes.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblStreamTotalFrames\n            // \n            this.lblStreamTotalFrames.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblStreamTotalFrames.AutoSize = true;\n            this.lblStreamTotalFrames.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblStreamTotalFrames.Location = new System.Drawing.Point(139, 100);\n            this.lblStreamTotalFrames.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblStreamTotalFrames.Name = \"lblStreamTotalFrames\";\n            this.lblStreamTotalFrames.Size = new System.Drawing.Size(134, 19);\n            this.lblStreamTotalFrames.TabIndex = 13;\n            this.lblStreamTotalFrames.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblStreamCongestion\n            // \n            this.lblStreamCongestion.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblStreamCongestion.AutoSize = true;\n            this.lblStreamCongestion.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblStreamCongestion.Location = new System.Drawing.Point(139, 80);\n            this.lblStreamCongestion.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblStreamCongestion.Name = \"lblStreamCongestion\";\n            this.lblStreamCongestion.Size = new System.Drawing.Size(134, 19);\n            this.lblStreamCongestion.TabIndex = 12;\n            this.lblStreamCongestion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblStreamDuration\n            // \n            this.lblStreamDuration.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblStreamDuration.AutoSize = true;\n            this.lblStreamDuration.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblStreamDuration.Location = new System.Drawing.Point(139, 60);\n            this.lblStreamDuration.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblStreamDuration.Name = \"lblStreamDuration\";\n            this.lblStreamDuration.Size = new System.Drawing.Size(134, 19);\n            this.lblStreamDuration.TabIndex = 11;\n            this.lblStreamDuration.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblStreamTimeCode\n            // \n            this.lblStreamTimeCode.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblStreamTimeCode.AutoSize = true;\n            this.lblStreamTimeCode.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblStreamTimeCode.Location = new System.Drawing.Point(139, 40);\n            this.lblStreamTimeCode.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblStreamTimeCode.Name = \"lblStreamTimeCode\";\n            this.lblStreamTimeCode.Size = new System.Drawing.Size(134, 19);\n            this.lblStreamTimeCode.TabIndex = 10;\n            this.lblStreamTimeCode.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblStreamReconnect\n            // \n            this.lblStreamReconnect.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblStreamReconnect.AutoSize = true;\n            this.lblStreamReconnect.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblStreamReconnect.Location = new System.Drawing.Point(139, 20);\n            this.lblStreamReconnect.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblStreamReconnect.Name = \"lblStreamReconnect\";\n            this.lblStreamReconnect.Size = new System.Drawing.Size(134, 19);\n            this.lblStreamReconnect.TabIndex = 9;\n            this.lblStreamReconnect.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblStreamActive\n            // \n            this.lblStreamActive.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblStreamActive.AutoSize = true;\n            this.lblStreamActive.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblStreamActive.Location = new System.Drawing.Point(139, 0);\n            this.lblStreamActive.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblStreamActive.Name = \"lblStreamActive\";\n            this.lblStreamActive.Size = new System.Drawing.Size(134, 19);\n            this.lblStreamActive.TabIndex = 8;\n            this.lblStreamActive.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label6\n            // \n            this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label6.AutoSize = true;\n            this.label6.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label6.Location = new System.Drawing.Point(5, 40);\n            this.label6.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label6.Name = \"label6\";\n            this.label6.Size = new System.Drawing.Size(124, 19);\n            this.label6.TabIndex = 1;\n            this.label6.Text = \"Time Code:\";\n            this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label7\n            // \n            this.label7.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label7.AutoSize = true;\n            this.label7.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label7.Location = new System.Drawing.Point(5, 60);\n            this.label7.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label7.Name = \"label7\";\n            this.label7.Size = new System.Drawing.Size(124, 19);\n            this.label7.TabIndex = 2;\n            this.label7.Text = \"Duration:\";\n            this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label8\n            // \n            this.label8.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label8.AutoSize = true;\n            this.label8.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label8.Location = new System.Drawing.Point(5, 80);\n            this.label8.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label8.Name = \"label8\";\n            this.label8.Size = new System.Drawing.Size(124, 19);\n            this.label8.TabIndex = 3;\n            this.label8.Text = \"Congestion:\";\n            this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label9\n            // \n            this.label9.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label9.AutoSize = true;\n            this.label9.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label9.Location = new System.Drawing.Point(5, 100);\n            this.label9.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label9.Name = \"label9\";\n            this.label9.Size = new System.Drawing.Size(124, 19);\n            this.label9.TabIndex = 4;\n            this.label9.Text = \"Total Frames:\";\n            this.label9.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label10\n            // \n            this.label10.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label10.AutoSize = true;\n            this.label10.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label10.Location = new System.Drawing.Point(5, 120);\n            this.label10.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label10.Name = \"label10\";\n            this.label10.Size = new System.Drawing.Size(124, 19);\n            this.label10.TabIndex = 5;\n            this.label10.Text = \"Skipped:\";\n            this.label10.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label11\n            // \n            this.label11.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label11.AutoSize = true;\n            this.label11.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label11.Location = new System.Drawing.Point(5, 140);\n            this.label11.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label11.Name = \"label11\";\n            this.label11.Size = new System.Drawing.Size(124, 19);\n            this.label11.TabIndex = 6;\n            this.label11.Text = \"OUT Bytes:\";\n            this.label11.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // recPage\n            // \n            this.recPage.Controls.Add(this.tableLayoutPanel5);\n            this.recPage.Location = new System.Drawing.Point(4, 29);\n            this.recPage.Name = \"recPage\";\n            this.recPage.Size = new System.Drawing.Size(286, 229);\n            this.recPage.TabIndex = 2;\n            this.recPage.Text = \"Recording\";\n            this.recPage.UseVisualStyleBackColor = true;\n            // \n            // tableLayoutPanel5\n            // \n            this.tableLayoutPanel5.ColumnCount = 2;\n            this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 134F));\n            this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tableLayoutPanel5.Controls.Add(this.lblRecordingBytes, 1, 4);\n            this.tableLayoutPanel5.Controls.Add(this.lblRecordingDuration, 1, 3);\n            this.tableLayoutPanel5.Controls.Add(this.lblRecordingTimeCode, 1, 2);\n            this.tableLayoutPanel5.Controls.Add(this.lblRecordingPaused, 1, 1);\n            this.tableLayoutPanel5.Controls.Add(this.lblRecording, 1, 0);\n            this.tableLayoutPanel5.Controls.Add(this.label30, 0, 4);\n            this.tableLayoutPanel5.Controls.Add(this.label29, 0, 3);\n            this.tableLayoutPanel5.Controls.Add(this.label28, 0, 2);\n            this.tableLayoutPanel5.Controls.Add(this.label27, 0, 1);\n            this.tableLayoutPanel5.Controls.Add(this.label21, 0, 0);\n            this.tableLayoutPanel5.Location = new System.Drawing.Point(4, 0);\n            this.tableLayoutPanel5.Name = \"tableLayoutPanel5\";\n            this.tableLayoutPanel5.RowCount = 6;\n            this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel5.Size = new System.Drawing.Size(278, 227);\n            this.tableLayoutPanel5.TabIndex = 0;\n            // \n            // lblRecordingBytes\n            // \n            this.lblRecordingBytes.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblRecordingBytes.AutoSize = true;\n            this.lblRecordingBytes.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblRecordingBytes.Location = new System.Drawing.Point(139, 80);\n            this.lblRecordingBytes.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblRecordingBytes.Name = \"lblRecordingBytes\";\n            this.lblRecordingBytes.Size = new System.Drawing.Size(134, 19);\n            this.lblRecordingBytes.TabIndex = 23;\n            this.lblRecordingBytes.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblRecordingDuration\n            // \n            this.lblRecordingDuration.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblRecordingDuration.AutoSize = true;\n            this.lblRecordingDuration.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblRecordingDuration.Location = new System.Drawing.Point(139, 60);\n            this.lblRecordingDuration.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblRecordingDuration.Name = \"lblRecordingDuration\";\n            this.lblRecordingDuration.Size = new System.Drawing.Size(134, 19);\n            this.lblRecordingDuration.TabIndex = 22;\n            this.lblRecordingDuration.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblRecordingTimeCode\n            // \n            this.lblRecordingTimeCode.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblRecordingTimeCode.AutoSize = true;\n            this.lblRecordingTimeCode.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblRecordingTimeCode.Location = new System.Drawing.Point(139, 40);\n            this.lblRecordingTimeCode.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblRecordingTimeCode.Name = \"lblRecordingTimeCode\";\n            this.lblRecordingTimeCode.Size = new System.Drawing.Size(134, 19);\n            this.lblRecordingTimeCode.TabIndex = 21;\n            this.lblRecordingTimeCode.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblRecordingPaused\n            // \n            this.lblRecordingPaused.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblRecordingPaused.AutoSize = true;\n            this.lblRecordingPaused.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblRecordingPaused.Location = new System.Drawing.Point(139, 20);\n            this.lblRecordingPaused.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblRecordingPaused.Name = \"lblRecordingPaused\";\n            this.lblRecordingPaused.Size = new System.Drawing.Size(134, 19);\n            this.lblRecordingPaused.TabIndex = 20;\n            this.lblRecordingPaused.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // lblRecording\n            // \n            this.lblRecording.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblRecording.AutoSize = true;\n            this.lblRecording.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.lblRecording.Location = new System.Drawing.Point(139, 0);\n            this.lblRecording.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblRecording.Name = \"lblRecording\";\n            this.lblRecording.Size = new System.Drawing.Size(134, 19);\n            this.lblRecording.TabIndex = 19;\n            this.lblRecording.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label30\n            // \n            this.label30.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label30.AutoSize = true;\n            this.label30.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label30.Location = new System.Drawing.Point(5, 80);\n            this.label30.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label30.Name = \"label30\";\n            this.label30.Size = new System.Drawing.Size(124, 19);\n            this.label30.TabIndex = 18;\n            this.label30.Text = \"Bytes:\";\n            this.label30.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label29\n            // \n            this.label29.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label29.AutoSize = true;\n            this.label29.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label29.Location = new System.Drawing.Point(5, 60);\n            this.label29.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label29.Name = \"label29\";\n            this.label29.Size = new System.Drawing.Size(124, 19);\n            this.label29.TabIndex = 17;\n            this.label29.Text = \"Duration:\";\n            this.label29.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label28\n            // \n            this.label28.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label28.AutoSize = true;\n            this.label28.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label28.Location = new System.Drawing.Point(5, 40);\n            this.label28.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label28.Name = \"label28\";\n            this.label28.Size = new System.Drawing.Size(124, 19);\n            this.label28.TabIndex = 16;\n            this.label28.Text = \"Time Code:\";\n            this.label28.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label27\n            // \n            this.label27.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label27.AutoSize = true;\n            this.label27.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label27.Location = new System.Drawing.Point(5, 20);\n            this.label27.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label27.Name = \"label27\";\n            this.label27.Size = new System.Drawing.Size(124, 19);\n            this.label27.TabIndex = 15;\n            this.label27.Text = \"Paused:\";\n            this.label27.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label21\n            // \n            this.label21.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label21.AutoSize = true;\n            this.label21.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label21.Location = new System.Drawing.Point(5, 0);\n            this.label21.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label21.Name = \"label21\";\n            this.label21.Size = new System.Drawing.Size(124, 19);\n            this.label21.TabIndex = 14;\n            this.label21.Text = \"Recording:\";\n            this.label21.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // groupBox5\n            // \n            this.groupBox5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.groupBox5.Controls.Add(this.btnPauseRecording);\n            this.groupBox5.Controls.Add(this.btnToggleRecording);\n            this.groupBox5.Controls.Add(this.btnToggleStreaming);\n            this.groupBox5.Location = new System.Drawing.Point(563, 441);\n            this.groupBox5.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox5.Name = \"groupBox5\";\n            this.groupBox5.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox5.Size = new System.Drawing.Size(193, 121);\n            this.groupBox5.TabIndex = 10;\n            this.groupBox5.TabStop = false;\n            this.groupBox5.Text = \"Streaming / Recording\";\n            // \n            // btnPauseRecording\n            // \n            this.btnPauseRecording.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnPauseRecording.Location = new System.Drawing.Point(157, 75);\n            this.btnPauseRecording.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnPauseRecording.Name = \"btnPauseRecording\";\n            this.btnPauseRecording.Size = new System.Drawing.Size(27, 36);\n            this.btnPauseRecording.TabIndex = 2;\n            this.btnPauseRecording.Text = \"||\";\n            this.btnPauseRecording.UseVisualStyleBackColor = true;\n            this.btnPauseRecording.Click += new System.EventHandler(this.btnPauseRecording_Click);\n            // \n            // btnToggleRecording\n            // \n            this.btnToggleRecording.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnToggleRecording.Location = new System.Drawing.Point(6, 75);\n            this.btnToggleRecording.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnToggleRecording.Name = \"btnToggleRecording\";\n            this.btnToggleRecording.Size = new System.Drawing.Size(151, 36);\n            this.btnToggleRecording.TabIndex = 1;\n            this.btnToggleRecording.Text = \"State unknown\";\n            this.btnToggleRecording.UseVisualStyleBackColor = true;\n            this.btnToggleRecording.Click += new System.EventHandler(this.btnToggleRecording_Click);\n            // \n            // btnToggleStreaming\n            // \n            this.btnToggleStreaming.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnToggleStreaming.Location = new System.Drawing.Point(6, 31);\n            this.btnToggleStreaming.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnToggleStreaming.Name = \"btnToggleStreaming\";\n            this.btnToggleStreaming.Size = new System.Drawing.Size(178, 36);\n            this.btnToggleStreaming.TabIndex = 0;\n            this.btnToggleStreaming.Text = \"State unknown\";\n            this.btnToggleStreaming.UseVisualStyleBackColor = true;\n            this.btnToggleStreaming.Click += new System.EventHandler(this.btnToggleStreaming_Click);\n            // \n            // groupBox4\n            // \n            this.groupBox4.Controls.Add(this.btnSetCurrentProfile);\n            this.groupBox4.Controls.Add(this.btnGetCurrentProfile);\n            this.groupBox4.Controls.Add(this.tbProfile);\n            this.groupBox4.Controls.Add(this.btnListProfiles);\n            this.groupBox4.Controls.Add(this.tvProfiles);\n            this.groupBox4.Location = new System.Drawing.Point(8, 401);\n            this.groupBox4.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox4.Name = \"groupBox4\";\n            this.groupBox4.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox4.Size = new System.Drawing.Size(218, 373);\n            this.groupBox4.TabIndex = 9;\n            this.groupBox4.TabStop = false;\n            this.groupBox4.Text = \"Profiles\";\n            // \n            // btnSetCurrentProfile\n            // \n            this.btnSetCurrentProfile.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnSetCurrentProfile.Location = new System.Drawing.Point(118, 307);\n            this.btnSetCurrentProfile.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnSetCurrentProfile.Name = \"btnSetCurrentProfile\";\n            this.btnSetCurrentProfile.Size = new System.Drawing.Size(91, 59);\n            this.btnSetCurrentProfile.TabIndex = 5;\n            this.btnSetCurrentProfile.Text = \"Set\\r\\nCurProfile\";\n            this.btnSetCurrentProfile.UseVisualStyleBackColor = true;\n            this.btnSetCurrentProfile.Click += new System.EventHandler(this.btnSetCurrentProfile_Click);\n            // \n            // btnGetCurrentProfile\n            // \n            this.btnGetCurrentProfile.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.btnGetCurrentProfile.Location = new System.Drawing.Point(8, 307);\n            this.btnGetCurrentProfile.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnGetCurrentProfile.Name = \"btnGetCurrentProfile\";\n            this.btnGetCurrentProfile.Size = new System.Drawing.Size(91, 59);\n            this.btnGetCurrentProfile.TabIndex = 4;\n            this.btnGetCurrentProfile.Text = \"Get\\r\\nCurProfile\";\n            this.btnGetCurrentProfile.UseVisualStyleBackColor = true;\n            this.btnGetCurrentProfile.Click += new System.EventHandler(this.btnGetCurrentProfile_Click);\n            // \n            // tbProfile\n            // \n            this.tbProfile.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbProfile.Location = new System.Drawing.Point(8, 267);\n            this.tbProfile.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.tbProfile.Name = \"tbProfile\";\n            this.tbProfile.Size = new System.Drawing.Size(201, 27);\n            this.tbProfile.TabIndex = 3;\n            // \n            // btnListProfiles\n            // \n            this.btnListProfiles.Location = new System.Drawing.Point(8, 29);\n            this.btnListProfiles.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnListProfiles.Name = \"btnListProfiles\";\n            this.btnListProfiles.Size = new System.Drawing.Size(106, 36);\n            this.btnListProfiles.TabIndex = 2;\n            this.btnListProfiles.Text = \"ListProfiles\";\n            this.btnListProfiles.UseVisualStyleBackColor = true;\n            this.btnListProfiles.Click += new System.EventHandler(this.btnListProfiles_Click);\n            // \n            // tvProfiles\n            // \n            this.tvProfiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tvProfiles.Location = new System.Drawing.Point(8, 76);\n            this.tvProfiles.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.tvProfiles.Name = \"tvProfiles\";\n            this.tvProfiles.Size = new System.Drawing.Size(202, 180);\n            this.tvProfiles.TabIndex = 1;\n            this.tvProfiles.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.tvProfiles_NodeMouseClick);\n            // \n            // groupBox2\n            // \n            this.groupBox2.Controls.Add(this.btnSetCurrentSceneCol);\n            this.groupBox2.Controls.Add(this.btnGetCurrentSceneCol);\n            this.groupBox2.Controls.Add(this.tbSceneCol);\n            this.groupBox2.Controls.Add(this.btnListSceneCol);\n            this.groupBox2.Controls.Add(this.tvSceneCols);\n            this.groupBox2.Location = new System.Drawing.Point(216, 19);\n            this.groupBox2.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox2.Name = \"groupBox2\";\n            this.groupBox2.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox2.Size = new System.Drawing.Size(213, 373);\n            this.groupBox2.TabIndex = 8;\n            this.groupBox2.TabStop = false;\n            this.groupBox2.Text = \"Scene Collections\";\n            // \n            // btnSetCurrentSceneCol\n            // \n            this.btnSetCurrentSceneCol.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnSetCurrentSceneCol.Location = new System.Drawing.Point(111, 307);\n            this.btnSetCurrentSceneCol.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnSetCurrentSceneCol.Name = \"btnSetCurrentSceneCol\";\n            this.btnSetCurrentSceneCol.Size = new System.Drawing.Size(91, 59);\n            this.btnSetCurrentSceneCol.TabIndex = 5;\n            this.btnSetCurrentSceneCol.Text = \"Set\\r\\nCurSC\";\n            this.btnSetCurrentSceneCol.UseVisualStyleBackColor = true;\n            this.btnSetCurrentSceneCol.Click += new System.EventHandler(this.btnSetCurrentSceneCol_Click);\n            // \n            // btnGetCurrentSceneCol\n            // \n            this.btnGetCurrentSceneCol.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.btnGetCurrentSceneCol.Location = new System.Drawing.Point(8, 307);\n            this.btnGetCurrentSceneCol.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnGetCurrentSceneCol.Name = \"btnGetCurrentSceneCol\";\n            this.btnGetCurrentSceneCol.Size = new System.Drawing.Size(91, 59);\n            this.btnGetCurrentSceneCol.TabIndex = 4;\n            this.btnGetCurrentSceneCol.Text = \"Get\\r\\nCurSC\";\n            this.btnGetCurrentSceneCol.UseVisualStyleBackColor = true;\n            this.btnGetCurrentSceneCol.Click += new System.EventHandler(this.btnGetCurrentSceneCol_Click);\n            // \n            // tbSceneCol\n            // \n            this.tbSceneCol.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbSceneCol.Location = new System.Drawing.Point(8, 267);\n            this.tbSceneCol.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.tbSceneCol.Name = \"tbSceneCol\";\n            this.tbSceneCol.Size = new System.Drawing.Size(194, 27);\n            this.tbSceneCol.TabIndex = 3;\n            // \n            // btnListSceneCol\n            // \n            this.btnListSceneCol.Location = new System.Drawing.Point(8, 29);\n            this.btnListSceneCol.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.btnListSceneCol.Name = \"btnListSceneCol\";\n            this.btnListSceneCol.Size = new System.Drawing.Size(167, 36);\n            this.btnListSceneCol.TabIndex = 2;\n            this.btnListSceneCol.Text = \"ListSceneCollections\";\n            this.btnListSceneCol.UseVisualStyleBackColor = true;\n            this.btnListSceneCol.Click += new System.EventHandler(this.btnListSceneCol_Click);\n            // \n            // tvSceneCols\n            // \n            this.tvSceneCols.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tvSceneCols.Location = new System.Drawing.Point(8, 76);\n            this.tvSceneCols.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.tvSceneCols.Name = \"tvSceneCols\";\n            this.tvSceneCols.Size = new System.Drawing.Size(195, 180);\n            this.tvSceneCols.TabIndex = 1;\n            this.tvSceneCols.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.tvSceneCols_NodeMouseClick);\n            // \n            // groupBox3\n            // \n            this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.groupBox3.Controls.Add(this.tableLayoutPanel1);\n            this.groupBox3.Location = new System.Drawing.Point(536, 297);\n            this.groupBox3.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox3.Name = \"groupBox3\";\n            this.groupBox3.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.groupBox3.Size = new System.Drawing.Size(222, 136);\n            this.groupBox3.TabIndex = 7;\n            this.groupBox3.TabStop = false;\n            this.groupBox3.Text = \"Version Info\";\n            // \n            // tableLayoutPanel1\n            // \n            this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tableLayoutPanel1.ColumnCount = 2;\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 119F));\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel1.Controls.Add(this.tbOBSVersion, 1, 1);\n            this.tableLayoutPanel1.Controls.Add(this.tbPluginVersion, 1, 0);\n            this.tableLayoutPanel1.Controls.Add(this.label3, 0, 0);\n            this.tableLayoutPanel1.Controls.Add(this.label5, 0, 1);\n            this.tableLayoutPanel1.Location = new System.Drawing.Point(9, 29);\n            this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.tableLayoutPanel1.Name = \"tableLayoutPanel1\";\n            this.tableLayoutPanel1.RowCount = 3;\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 31F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 31F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 31F));\n            this.tableLayoutPanel1.Size = new System.Drawing.Size(203, 97);\n            this.tableLayoutPanel1.TabIndex = 1;\n            // \n            // tbOBSVersion\n            // \n            this.tbOBSVersion.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbOBSVersion.AutoSize = true;\n            this.tbOBSVersion.Location = new System.Drawing.Point(124, 36);\n            this.tbOBSVersion.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.tbOBSVersion.Name = \"tbOBSVersion\";\n            this.tbOBSVersion.Size = new System.Drawing.Size(74, 20);\n            this.tbOBSVersion.TabIndex = 5;\n            this.tbOBSVersion.Text = \"???\";\n            this.tbOBSVersion.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // tbPluginVersion\n            // \n            this.tbPluginVersion.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbPluginVersion.AutoSize = true;\n            this.tbPluginVersion.Location = new System.Drawing.Point(124, 5);\n            this.tbPluginVersion.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.tbPluginVersion.Name = \"tbPluginVersion\";\n            this.tbPluginVersion.Size = new System.Drawing.Size(74, 20);\n            this.tbPluginVersion.TabIndex = 3;\n            this.tbPluginVersion.Text = \"???\";\n            this.tbPluginVersion.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // label3\n            // \n            this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label3.AutoSize = true;\n            this.label3.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label3.Location = new System.Drawing.Point(5, 0);\n            this.label3.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(109, 31);\n            this.label3.TabIndex = 0;\n            this.label3.Text = \"OBS WS Version :\";\n            this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // label5\n            // \n            this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label5.AutoSize = true;\n            this.label5.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label5.Location = new System.Drawing.Point(5, 37);\n            this.label5.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label5.Name = \"label5\";\n            this.label5.Size = new System.Drawing.Size(109, 19);\n            this.label5.TabIndex = 2;\n            this.label5.Text = \"OBS Version :\";\n            this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // button3\n            // \n            this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.button3.Location = new System.Drawing.Point(299, 326);\n            this.button3.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);\n            this.button3.Name = \"button3\";\n            this.button3.Size = new System.Drawing.Size(88, 23);\n            this.button3.TabIndex = 15;\n            this.button3.Text = \"Set Path\";\n            this.button3.UseVisualStyleBackColor = true;\n            // \n            // openFileDialog1\n            // \n            this.openFileDialog1.FileName = \"openFileDialog1\";\n            // \n            // label13\n            // \n            this.label13.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label13.AutoSize = true;\n            this.label13.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label13.Location = new System.Drawing.Point(139, 40);\n            this.label13.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label13.Name = \"label13\";\n            this.label13.Size = new System.Drawing.Size(56, 19);\n            this.label13.TabIndex = 23;\n            this.label13.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label14\n            // \n            this.label14.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\n            this.label14.AutoSize = true;\n            this.label14.Font = new System.Drawing.Font(\"Segoe UI\", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);\n            this.label14.Location = new System.Drawing.Point(139, 0);\n            this.label14.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.label14.Name = \"label14\";\n            this.label14.Size = new System.Drawing.Size(56, 19);\n            this.label14.TabIndex = 22;\n            this.label14.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // tableLayoutPanel4\n            // \n            this.tableLayoutPanel4.ColumnCount = 2;\n            this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 134F));\n            this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tableLayoutPanel4.Controls.Add(this.label13, 1, 10);\n            this.tableLayoutPanel4.Location = new System.Drawing.Point(0, 0);\n            this.tableLayoutPanel4.Name = \"tableLayoutPanel4\";\n            this.tableLayoutPanel4.RowCount = 11;\n            this.tableLayoutPanel4.Size = new System.Drawing.Size(200, 100);\n            this.tableLayoutPanel4.TabIndex = 0;\n            // \n            // fileSystemWatcher1\n            // \n            this.fileSystemWatcher1.EnableRaisingEvents = true;\n            this.fileSystemWatcher1.SynchronizingObject = this;\n            // \n            // MainWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(798, 924);\n            this.Controls.Add(this.gbControls);\n            this.Controls.Add(this.label2);\n            this.Controls.Add(this.label1);\n            this.Controls.Add(this.txtServerPassword);\n            this.Controls.Add(this.txtServerIP);\n            this.Controls.Add(this.btnConnect);\n            this.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);\n            this.Name = \"MainWindow\";\n            this.Text = \"obs-websocket client\";\n            this.Load += new System.EventHandler(this.MainWindow_Load);\n            this.groupBox1.ResumeLayout(false);\n            this.groupBox1.PerformLayout();\n            this.gbControls.ResumeLayout(false);\n            this.groupBox9.ResumeLayout(false);\n            this.groupBox9.PerformLayout();\n            this.groupBox8.ResumeLayout(false);\n            this.groupBox8.PerformLayout();\n            this.groupBox7.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.tbTransitionDuration)).EndInit();\n            this.groupBox6.ResumeLayout(false);\n            this.groupBox6.PerformLayout();\n            this.gbStatus.ResumeLayout(false);\n            this.tabStats.ResumeLayout(false);\n            this.obsPage.ResumeLayout(false);\n            this.tableLayoutPanel3.ResumeLayout(false);\n            this.tableLayoutPanel3.PerformLayout();\n            this.streamPage.ResumeLayout(false);\n            this.tableLayoutPanel2.ResumeLayout(false);\n            this.tableLayoutPanel2.PerformLayout();\n            this.recPage.ResumeLayout(false);\n            this.tableLayoutPanel5.ResumeLayout(false);\n            this.tableLayoutPanel5.PerformLayout();\n            this.groupBox5.ResumeLayout(false);\n            this.groupBox4.ResumeLayout(false);\n            this.groupBox4.PerformLayout();\n            this.groupBox2.ResumeLayout(false);\n            this.groupBox2.PerformLayout();\n            this.groupBox3.ResumeLayout(false);\n            this.tableLayoutPanel1.ResumeLayout(false);\n            this.tableLayoutPanel1.PerformLayout();\n            this.tableLayoutPanel4.ResumeLayout(false);\n            this.tableLayoutPanel4.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).EndInit();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n        private System.Windows.Forms.Button btnConnect;\n        private System.Windows.Forms.TextBox txtServerIP;\n        private System.Windows.Forms.TextBox txtServerPassword;\n        private System.Windows.Forms.TreeView tvScenes;\n        private System.Windows.Forms.GroupBox groupBox1;\n        private System.Windows.Forms.Button btnListScenes;\n        private System.Windows.Forms.Button btnGetCurrentScene;\n        private System.Windows.Forms.Button btnSetCurrentScene;\n        private System.Windows.Forms.TextBox tbCurrentScene;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.GroupBox gbControls;\n        private System.Windows.Forms.GroupBox groupBox3;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\n        private System.Windows.Forms.Label tbOBSVersion;\n        private System.Windows.Forms.Label tbPluginVersion;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.Label label5;\n        private System.Windows.Forms.GroupBox groupBox4;\n        private System.Windows.Forms.Button btnSetCurrentProfile;\n        private System.Windows.Forms.Button btnGetCurrentProfile;\n        private System.Windows.Forms.TextBox tbProfile;\n        private System.Windows.Forms.Button btnListProfiles;\n        private System.Windows.Forms.TreeView tvProfiles;\n        private System.Windows.Forms.GroupBox groupBox2;\n        private System.Windows.Forms.Button btnSetCurrentSceneCol;\n        private System.Windows.Forms.Button btnGetCurrentSceneCol;\n        private System.Windows.Forms.TextBox tbSceneCol;\n        private System.Windows.Forms.Button btnListSceneCol;\n        private System.Windows.Forms.TreeView tvSceneCols;\n        private System.Windows.Forms.GroupBox groupBox5;\n        private System.Windows.Forms.Button btnToggleRecording;\n        private System.Windows.Forms.Button btnToggleStreaming;\n        private System.Windows.Forms.GroupBox gbStatus;\n        private System.Windows.Forms.GroupBox groupBox6;\n        private System.Windows.Forms.Button btnSetCurrentTransition;\n        private System.Windows.Forms.Button btnGetCurrentTransition;\n        private System.Windows.Forms.TextBox tbTransition;\n        private System.Windows.Forms.Button btnListTransitions;\n        private System.Windows.Forms.TreeView tvTransitions;\n        private System.Windows.Forms.GroupBox groupBox7;\n        private System.Windows.Forms.Button btnSetTransitionDuration;\n        private System.Windows.Forms.Button btnGetTransitionDuration;\n        private System.Windows.Forms.NumericUpDown tbTransitionDuration;\n        private System.Windows.Forms.Button btnAdvanced;\n        private System.Windows.Forms.Button button3;\n        private System.Windows.Forms.OpenFileDialog openFileDialog1;\n        private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1;\n        private System.Windows.Forms.GroupBox groupBox8;\n        private System.Windows.Forms.Button btnBrowse;\n        private System.Windows.Forms.TextBox tbFolderPath;\n        private System.Windows.Forms.Button btnSetPath;\n        private System.Windows.Forms.GroupBox groupBox9;\n        private System.Windows.Forms.Label lblVirtualCamStatus;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.Button btnVirtualCamToggle;\n        private System.Windows.Forms.Button btnVirtualCamStop;\n        private System.Windows.Forms.Button btnVirtualCamStart;\n        private System.Windows.Forms.TabControl tabStats;\n        private System.Windows.Forms.TabPage obsPage;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;\n        private System.Windows.Forms.TabPage streamPage;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;\n        private System.Windows.Forms.Label lblStreamOutputBytes;\n        private System.Windows.Forms.Label lblStreamTotalFrames;\n        private System.Windows.Forms.Label lblStreamCongestion;\n        private System.Windows.Forms.Label lblStreamDuration;\n        private System.Windows.Forms.Label lblStreamTimeCode;\n        private System.Windows.Forms.Label lblStreamReconnect;\n        private System.Windows.Forms.Label lblStreamActive;\n        private System.Windows.Forms.Label label6;\n        private System.Windows.Forms.Label label7;\n        private System.Windows.Forms.Label label8;\n        private System.Windows.Forms.Label label9;\n        private System.Windows.Forms.Label label10;\n        private System.Windows.Forms.Label label11;\n        private System.Windows.Forms.TabPage recPage;\n        private System.Windows.Forms.Label lblRendered;\n        private System.Windows.Forms.Label label20;\n        private System.Windows.Forms.Label label19;\n        private System.Windows.Forms.Label label18;\n        private System.Windows.Forms.Label label17;\n        private System.Windows.Forms.Label label16;\n        private System.Windows.Forms.Label label15;\n        private System.Windows.Forms.Label lblMissed;\n        private System.Windows.Forms.Label label26;\n        private System.Windows.Forms.Label label25;\n        private System.Windows.Forms.Label label24;\n        private System.Windows.Forms.Label label23;\n        private System.Windows.Forms.Label label22;\n        private System.Windows.Forms.Label lblOutputTotal;\n        private System.Windows.Forms.Label lblOutgoingMessages;\n        private System.Windows.Forms.Label lblIncomingMessages;\n        private System.Windows.Forms.Label lblDisk;\n        private System.Windows.Forms.Label lblMemory;\n        private System.Windows.Forms.Label lblCPU;\n        private System.Windows.Forms.Label lblFPS;\n        private System.Windows.Forms.Label lblAvgRender;\n        private System.Windows.Forms.Label lblSkipped;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel5;\n        private System.Windows.Forms.Label label13;\n        private System.Windows.Forms.Label label14;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4;\n        private System.Windows.Forms.Label lblRecordingBytes;\n        private System.Windows.Forms.Label lblRecordingDuration;\n        private System.Windows.Forms.Label lblRecordingTimeCode;\n        private System.Windows.Forms.Label lblRecordingPaused;\n        private System.Windows.Forms.Label lblRecording;\n        private System.Windows.Forms.Label label30;\n        private System.Windows.Forms.Label label29;\n        private System.Windows.Forms.Label label28;\n        private System.Windows.Forms.Label label27;\n        private System.Windows.Forms.Label label21;\n        private System.Windows.Forms.Button btnPauseRecording;\n        private System.Windows.Forms.Label label32;\n        private System.Windows.Forms.Label label31;\n        private System.Windows.Forms.Label lblStreamSkippedFrames;\n        private System.IO.FileSystemWatcher fileSystemWatcher1;\n    }\n}\n\n"
  },
  {
    "path": "TestClient/MainWindow.cs",
    "content": "﻿/*\n    TestClient for obs-websocket-dotnet\n    Copyright (C) 2021\tStéphane Lepin, BarRaider\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nusing System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing System.Linq;\nusing OBSWebsocketDotNet;\nusing OBSWebsocketDotNet.Types;\nusing OBSWebsocketDotNet.Types.Events;\n\nnamespace TestClient\n{\n    public partial class MainWindow : Form\n    {\n        protected OBSWebsocket obs;\n\n\n        private CancellationTokenSource keepAliveTokenSource;\n        private readonly int keepAliveInterval = 500;\n\n        public MainWindow()\n        {\n            InitializeComponent();\n            obs = new OBSWebsocket();\n\n            obs.Connected += onConnect;\n            obs.Disconnected += onDisconnect;\n\n            obs.CurrentProgramSceneChanged += onCurrentProgramSceneChanged;\n            obs.CurrentSceneCollectionChanged += onSceneCollectionChanged;\n            obs.CurrentProfileChanged += onCurrentProfileChanged;\n            obs.CurrentSceneTransitionChanged += onCurrentSceneTransitionChanged;\n            obs.CurrentSceneTransitionDurationChanged += onCurrentSceneTransitionDurationChanged;\n\n            obs.StreamStateChanged += onStreamStateChanged;\n            obs.RecordStateChanged += onRecordStateChanged;\n\n            obs.VirtualcamStateChanged += onVirtualCamStateChanged;\n        }\n\n        private void onConnect(object sender, EventArgs e)\n        {\n            BeginInvoke((MethodInvoker)(() =>\n            {\n                txtServerIP.Enabled = false;\n                txtServerPassword.Enabled = false;\n                btnConnect.Text = \"Disconnect\";\n\n                gbControls.Enabled = true;\n\n                var versionInfo = obs.GetVersion();\n                tbPluginVersion.Text = versionInfo.PluginVersion;\n                tbOBSVersion.Text = versionInfo.OBSStudioVersion;\n\n                btnListScenes.PerformClick();\n                btnGetCurrentScene.PerformClick();\n\n                btnListSceneCol.PerformClick();\n                btnGetCurrentSceneCol.PerformClick();\n\n                btnListProfiles.PerformClick();\n                btnGetCurrentProfile.PerformClick();\n\n                btnListTransitions.PerformClick();\n                btnGetCurrentTransition.PerformClick();\n\n                btnGetTransitionDuration.PerformClick();\n                tbFolderPath.Text = obs.GetRecordDirectory().ToString();\n\n                var streamStatus = obs.GetStreamStatus();\n                if (streamStatus.IsActive)\n                {\n                    onStreamStateChanged(obs, new StreamStateChangedEventArgs(new OutputStateChanged() { IsActive = true, StateStr = nameof(OutputState.OBS_WEBSOCKET_OUTPUT_STARTED) }));\n                }\n                else\n                {\n                    onStreamStateChanged(obs, new StreamStateChangedEventArgs(new OutputStateChanged() { IsActive = false, StateStr = nameof(OutputState.OBS_WEBSOCKET_OUTPUT_STOPPED) }));\n                }\n\n                var recordStatus = obs.GetRecordStatus();\n                if (recordStatus.IsRecording)\n                {\n                    onRecordStateChanged(obs, new RecordStateChangedEventArgs(new RecordStateChanged() { IsActive = true, StateStr = nameof(OutputState.OBS_WEBSOCKET_OUTPUT_STARTED) }));\n                }\n                else\n                {\n                    onRecordStateChanged(obs, new RecordStateChangedEventArgs(new RecordStateChanged() { IsActive = false, StateStr = nameof(OutputState.OBS_WEBSOCKET_OUTPUT_STOPPED) }));\n                }\n\n                var camStatus = obs.GetVirtualCamStatus();\n                if (camStatus.IsActive)\n                {\n                    onVirtualCamStateChanged(this, new VirtualcamStateChangedEventArgs(new OutputStateChanged() { IsActive = true, StateStr = nameof(OutputState.OBS_WEBSOCKET_OUTPUT_STARTED) }));\n                }\n                else\n                {\n                    onVirtualCamStateChanged(this, new VirtualcamStateChangedEventArgs(new OutputStateChanged() { IsActive = false, StateStr = nameof(OutputState.OBS_WEBSOCKET_OUTPUT_STOPPED) }));\n                }\n\n                keepAliveTokenSource = new CancellationTokenSource();\n                CancellationToken keepAliveToken = keepAliveTokenSource.Token;\n                Task statPollKeepAlive = Task.Factory.StartNew(() =>\n                {\n                    while (true)\n                    {\n                        Thread.Sleep(keepAliveInterval);\n                        if (keepAliveToken.IsCancellationRequested)\n                        {\n                            break;\n                        }\n\n                        BeginInvoke((MethodInvoker)(() =>\n                        {\n                            switch (tabStats.SelectedIndex)\n                            {\n                                case 0: // OBS\n                                    var stats = obs.GetStats();\n                                    UpdateOBSStats(stats);\n                                    break;\n                                case 1: // Stream\n                                    var streamStats = obs.GetStreamStatus();\n                                    UpdateStreamStats(streamStats);\n                                    break;\n\n                                case 2: // Recording\n                                    var recStats = obs.GetRecordStatus();\n                                    UpdateRecordingStats(recStats);\n                                    break;\n                            }\n                        }));\n\n\n\n                    }\n                }, keepAliveToken, TaskCreationOptions.LongRunning, TaskScheduler.Default);\n            }));\n        }\n\n        private void onDisconnect(object sender, OBSWebsocketDotNet.Communication.ObsDisconnectionInfo e)\n        {\n            BeginInvoke((MethodInvoker)(() =>\n            {\n                if (keepAliveTokenSource != null)\n                {\n                    keepAliveTokenSource.Cancel();\n                }\n                gbControls.Enabled = false;\n\n                txtServerIP.Enabled = true;\n                txtServerPassword.Enabled = true;\n                btnConnect.Text = \"Connect\";\n\n                if (e.ObsCloseCode == OBSWebsocketDotNet.Communication.ObsCloseCodes.AuthenticationFailed)\n                {\n                    MessageBox.Show(\"Authentication failed.\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n                    return;\n                }\n                else if (e.WebsocketDisconnectionInfo != null)\n                {\n                    if (e.WebsocketDisconnectionInfo.Exception != null)\n                    {\n                        MessageBox.Show($\"Connection failed: CloseCode: {e.ObsCloseCode} Desc: {e.WebsocketDisconnectionInfo?.CloseStatusDescription} Exception:{e.WebsocketDisconnectionInfo?.Exception?.Message}\\nType: {e.WebsocketDisconnectionInfo.Type}\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n                    }\n                    else\n                    {\n                        MessageBox.Show($\"Connection failed: CloseCode: {e.ObsCloseCode} Desc: {e.WebsocketDisconnectionInfo?.CloseStatusDescription}\\nType: {e.WebsocketDisconnectionInfo.Type}\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); \n                    }\n                }\n                else\n                {\n                    MessageBox.Show($\"Connection failed: CloseCode: {e.ObsCloseCode}\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n                    return;\n                }\n            }));\n\n        }\n\n        private void onCurrentProgramSceneChanged(object sender, ProgramSceneChangedEventArgs args)\n        {\n            BeginInvoke((MethodInvoker)delegate\n            {\n                tbCurrentScene.Text = args.SceneName;\n            });\n        }\n\n        private void onSceneCollectionChanged(object sender, CurrentSceneCollectionChangedEventArgs args)\n        {\n            BeginInvoke((MethodInvoker)delegate\n            {\n                tbSceneCol.Text = obs.GetCurrentSceneCollection();\n            });\n        }\n\n        private void onCurrentProfileChanged(object sender, CurrentProfileChangedEventArgs args)\n        {\n            BeginInvoke((MethodInvoker)delegate\n            {\n                tbProfile.Text = obs.GetProfileList().CurrentProfileName;\n            });\n        }\n\n        private void onCurrentSceneTransitionChanged(object sender, CurrentSceneTransitionChangedEventArgs args)\n        {\n            BeginInvoke((MethodInvoker)delegate\n            {\n                tbTransition.Text = args.TransitionName;\n            });\n        }\n\n        private void onCurrentSceneTransitionDurationChanged(object sender, CurrentSceneTransitionDurationChangedEventArgs args)\n        {\n            BeginInvoke((MethodInvoker)delegate\n            {\n                tbTransitionDuration.Value = args.TransitionDuration;\n            });\n        }\n\n        private void onStreamStateChanged(object sender, StreamStateChangedEventArgs args)\n        {\n            string state = \"\";\n            switch (args.OutputState.State)\n            {\n                case OutputState.OBS_WEBSOCKET_OUTPUT_STARTING:\n                    state = \"Stream starting...\";\n                    break;\n\n                case OutputState.OBS_WEBSOCKET_OUTPUT_STARTED:\n                    state = \"Stop streaming\";\n                    break;\n\n                case OutputState.OBS_WEBSOCKET_OUTPUT_STOPPING:\n                    state = \"Stream stopping...\";\n                    break;\n\n                case OutputState.OBS_WEBSOCKET_OUTPUT_STOPPED:\n                    state = \"Start streaming\";\n                    break;\n\n                default:\n                    state = \"State unknown\";\n                    break;\n            }\n\n            BeginInvoke((MethodInvoker)delegate\n            {\n                btnToggleStreaming.Text = state;\n            });\n        }\n\n        private void onRecordStateChanged(object sender, RecordStateChangedEventArgs args)\n        {\n            string state = \"\";\n            switch (args.OutputState.State)\n            {\n                case OutputState.OBS_WEBSOCKET_OUTPUT_STARTING:\n                    state = \"Recording starting...\";\n                    break;\n\n                case OutputState.OBS_WEBSOCKET_OUTPUT_STARTED:\n                case OutputState.OBS_WEBSOCKET_OUTPUT_RESUMED:\n                    state = \"Stop recording\";\n                    break;\n\n                case OutputState.OBS_WEBSOCKET_OUTPUT_STOPPING:\n                    state = \"Recording stopping...\";\n                    break;\n\n                case OutputState.OBS_WEBSOCKET_OUTPUT_STOPPED:\n                    state = \"Start recording\";\n                    break;\n                case OutputState.OBS_WEBSOCKET_OUTPUT_PAUSED:\n                    state = \"(P) Stop recording\";\n                    break;\n\n                default:\n                    state = \"State unknown\";\n                    break;\n            }\n\n            BeginInvoke((MethodInvoker)delegate\n            {\n                btnToggleRecording.Text = state;\n            });\n        }\n\n        private void btnConnect_Click(object sender, EventArgs e)\n        {\n            if (!obs.IsConnected)\n            {\n                System.Threading.Tasks.Task.Run(() =>\n                {\n                    try\n                    {\n                        obs.ConnectAsync(txtServerIP.Text, txtServerPassword.Text);\n                    }\n                    catch (Exception ex)\n                    {\n                        BeginInvoke((MethodInvoker)delegate\n                        {\n                            MessageBox.Show(\"Connect failed : \" + ex.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n                            return;\n                        });\n                    }\n                });\n            }\n            else\n            {\n                obs.Disconnect();\n            }\n        }\n\n        private void btnListScenes_Click(object sender, EventArgs e)\n        {\n            var scenes = obs.ListScenes();\n\n            tvScenes.Nodes.Clear();\n            foreach (var scene in scenes)\n            {\n                var node = new TreeNode(scene.Name);\n                var sources = new List<SceneItemDetails>();\n                sources.AddRange(obs.GetSceneItemList(scene.Name));\n                foreach (var item in sources)\n                {\n                    node.Nodes.Add(item.SourceName);\n                }\n\n                tvScenes.Nodes.Add(node);\n            }\n        }\n\n        private void btnGetCurrentScene_Click(object sender, EventArgs e)\n        {\n            tbCurrentScene.Text = obs.GetCurrentProgramScene();\n        }\n\n        private void btnSetCurrentScene_Click(object sender, EventArgs e)\n        {\n            obs.SetCurrentProgramScene(tbCurrentScene.Text);\n        }\n\n        private void tvScenes_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)\n        {\n            if (e.Node.Level == 0)\n            {\n                tbCurrentScene.Text = e.Node.Text;\n            }\n        }\n\n        private void btnListSceneCol_Click(object sender, EventArgs e)\n        {\n            var sc = obs.GetSceneCollectionList();\n\n            tvSceneCols.Nodes.Clear();\n            foreach (var sceneCol in sc)\n            {\n                tvSceneCols.Nodes.Add(sceneCol);\n            }\n        }\n\n        private void btnGetCurrentSceneCol_Click(object sender, EventArgs e)\n        {\n            tbSceneCol.Text = obs.GetCurrentSceneCollection();\n        }\n\n        private void btnSetCurrentSceneCol_Click(object sender, EventArgs e)\n        {\n            obs.SetCurrentSceneCollection(tbSceneCol.Text);\n        }\n\n        private void tvSceneCols_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)\n        {\n            if (e.Node.Level == 0)\n            {\n                tbSceneCol.Text = e.Node.Text;\n            }\n        }\n\n        private void btnListProfiles_Click(object sender, EventArgs e)\n        {\n            var profiles = obs.GetProfileList();\n\n            tvProfiles.Nodes.Clear();\n            foreach (var profile in profiles.Profiles)\n            {\n                tvProfiles.Nodes.Add(profile);\n            }\n        }\n\n        private void btnGetCurrentProfile_Click(object sender, EventArgs e)\n        {\n            tbProfile.Text = obs.GetProfileList().CurrentProfileName;\n        }\n\n        private void btnSetCurrentProfile_Click(object sender, EventArgs e)\n        {\n            obs.SetCurrentProfile(tbProfile.Text);\n        }\n\n        private void tvProfiles_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)\n        {\n            if (e.Node.Level == 0)\n            {\n                tbProfile.Text = e.Node.Text;\n            }\n        }\n\n        private void btnToggleStreaming_Click(object sender, EventArgs e)\n        {\n            obs.ToggleStream();\n        }\n\n        private void btnToggleRecording_Click(object sender, EventArgs e)\n        {\n            obs.ToggleRecord();\n        }\n\n        private void btnListTransitions_Click(object sender, EventArgs e)\n        {\n            var transitions = obs.GetSceneTransitionList();\n\n            tvTransitions.Nodes.Clear();\n            foreach (var transition in transitions.Transitions)\n            {\n                tvTransitions.Nodes.Add(transition.Name);\n            }\n        }\n\n        private void btnGetCurrentTransition_Click(object sender, EventArgs e)\n        {\n            tbTransition.Text = obs.GetCurrentSceneTransition().Name;\n        }\n\n        private void btnSetCurrentTransition_Click(object sender, EventArgs e)\n        {\n            obs.SetCurrentSceneTransition(tbTransition.Text);\n        }\n\n        private void tvTransitions_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)\n        {\n            if (e.Node.Level == 0)\n            {\n                tbTransition.Text = e.Node.Text;\n            }\n        }\n\n        private void btnGetTransitionDuration_Click(object sender, EventArgs e)\n        {\n            tbTransitionDuration.Value = obs.GetCurrentSceneTransition().Duration ?? 0;\n        }\n\n        private void btnSetTransitionDuration_Click(object sender, EventArgs e)\n        {\n            obs.SetCurrentSceneTransitionDuration((int)tbTransitionDuration.Value);\n        }\n\n        private void btnAdvanced_Click(object sender, EventArgs e)\n        {\n            AdvancedWindow advanced = new AdvancedWindow();\n            advanced.SetOBS(obs);\n            advanced.Show();\n        }\n\n        private void btnBrowse_Click(object sender, EventArgs e)\n        {\n            DialogResult result = this.folderBrowserDialog1.ShowDialog();\n            if (result == DialogResult.OK)\n            {\n                tbFolderPath.Text = this.folderBrowserDialog1.SelectedPath;\n            }\n        }\n\n        private void btnSetPath_Click(object sender, EventArgs e)\n        {\n            // TODO: Need a method here, or the button must be removed\n            //obs.SetRecordingFolder(tbFolderPath.Text);\n        }\n\n        private void onVirtualCamStateChanged(object sender, VirtualcamStateChangedEventArgs args)\n        {\n            string state = \"\";\n            switch (args.OutputState.State)\n            {\n                case OutputState.OBS_WEBSOCKET_OUTPUT_STARTING:\n                    state = \"VirtualCam starting...\";\n                    break;\n\n                case OutputState.OBS_WEBSOCKET_OUTPUT_STARTED:\n                    state = \"VirtualCam Started\";\n                    break;\n\n                case OutputState.OBS_WEBSOCKET_OUTPUT_STOPPING:\n                    state = \"VirtualCam stopping...\";\n                    break;\n\n                case OutputState.OBS_WEBSOCKET_OUTPUT_STOPPED:\n                    state = \"VirtualCam Stopped\";\n                    break;\n\n                default:\n                    state = \"State unknown\";\n                    break;\n            }\n\n            BeginInvoke((MethodInvoker)delegate\n            {\n                lblVirtualCamStatus.Text = state;\n            });\n        }\n\n        private void btnVirtualCamStart_Click(object sender, EventArgs e)\n        {\n            obs.StartVirtualCam();\n        }\n\n        private void btnVirtualCamStop_Click(object sender, EventArgs e)\n        {\n            obs.StopVirtualCam();\n        }\n\n        private void btnVirtualCamToggle_Click(object sender, EventArgs e)\n        {\n            obs.ToggleVirtualCam();\n        }\n\n        private void UpdateOBSStats(ObsStats data)\n        {\n            BeginInvoke((MethodInvoker)delegate\n            {\n                lblRendered.Text = $\"{data.RenderTotalFrames} frames\";\n                lblMissed.Text = $\"{data.RenderMissedFrames} frames\";\n                lblOutputTotal.Text = $\"{data.OutputTotalFrames} frames\";\n                lblSkipped.Text = $\"{data.OutputSkippedFrames} frames\";\n                lblAvgRender.Text = $\"{data.AverageFrameTime:F2} ms\";\n                lblFPS.Text = $\"{(int)data.FPS}\";\n                lblCPU.Text = $\"{data.CpuUsage:F2}%\";\n                lblMemory.Text = $\"{data.MemoryUsage:F2} MB\";\n                lblDisk.Text = $\"{data.FreeDiskSpace:F2} MB\";\n                lblIncomingMessages.Text = $\"{data.SessionIncomingMessages}\";\n                lblOutgoingMessages.Text = $\"{data.SessionOutgoingMessages}\";\n            });\n        }\n\n        private void UpdateStreamStats(OutputStatus data)\n        {\n            BeginInvoke((MethodInvoker)delegate\n            {\n                lblStreamActive.Text = $\"{(data.IsActive ? \"True\" : \"False\")}\";\n                lblStreamReconnect.Text = $\"{(data.IsReconnecting? \"True\" : \"False\")}\";\n                lblStreamTimeCode.Text = $\"{data.TimeCode}\";\n                lblStreamDuration.Text = $\"{data.Duration} ms\";\n                lblStreamCongestion.Text = $\"{data.Congestion:F2}\";\n                lblStreamTotalFrames.Text = $\"{data.TotalFrames} frames\";\n                lblStreamSkippedFrames.Text = $\"{data.SkippedFrames} frames\";\n                lblStreamOutputBytes.Text = $\"{data.BytesSent} bytes\";\n            });\n        }\n\n        private void UpdateRecordingStats(RecordingStatus data)\n        {\n            BeginInvoke((MethodInvoker)delegate\n            {\n                lblRecording.Text = $\"{(data.IsRecording ? \"True\" : \"False\")}\";\n                lblRecordingPaused.Text = $\"{(data.IsRecordingPaused ? \"True\" : \"False\")}\";\n                lblRecordingTimeCode.Text = $\"{data.RecordTimecode}\";\n                lblRecordingDuration.Text = $\"{data.RecordingDuration} ms\";\n                lblRecordingBytes.Text = $\"{data.RecordingBytes:F2} bytes\";\n            });\n        }\n\n        private void tableLayoutPanel3_Paint(object sender, PaintEventArgs e)\n        {\n\n        }\n\n        private void label17_Click(object sender, EventArgs e)\n        {\n\n        }\n\n        private void MainWindow_Load(object sender, EventArgs e)\n        {\n            // Add the event handler for handling UI thread exceptions to the event.\n            Application.ThreadException += Application_ThreadException;\n\n            // Add the event handler for handling non-UI thread exceptions to the event. \n            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;\n        }\n\n        private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)\n        {\n            MessageBox.Show($\"{((Exception)e.ExceptionObject).Message}\", \"Unhandled Exception\", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n        }\n\n        private void Application_ThreadException(object sender, ThreadExceptionEventArgs e)\n        {\n            MessageBox.Show($\"{((Exception)e.Exception).Message}\", \"Unhandled Exception\", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n        }\n\n        private void btnPauseRecording_Click(object sender, EventArgs e)\n        {\n            obs.PauseRecord();\n        }\n    }\n}"
  },
  {
    "path": "TestClient/MainWindow.resx",
    "content": "﻿<root>\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"openFileDialog1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"folderBrowserDialog1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>87, 17</value>\n  </metadata>\n  <metadata name=\"fileSystemWatcher1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>291, 17</value>\n  </metadata>\n  <metadata name=\"$this.TrayHeight\" type=\"System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>25</value>\n  </metadata>\n</root>"
  },
  {
    "path": "TestClient/Program.cs",
    "content": "﻿/*\n    TestClient for obs-websocket-dotnet\n    Copyright (C) 2021\tStéphane Lepin, BarRaider\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nusing System;\nusing System.Windows.Forms;\n\nnamespace TestClient\n{\n    static class Program\n    {\n        /// <summary>\n        /// Application entry point\n        /// </summary>\n        [STAThread]\n        static void Main()\n        {\n            // Set the unhandled exception mode to force all Windows Forms errors\n            // to go through our handler.\n            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);\n\n            Application.EnableVisualStyles();\n            Application.SetCompatibleTextRenderingDefault(false);\n            Application.Run(new MainWindow());\n        }\n    }\n}\n"
  },
  {
    "path": "TestClient/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace TestClient.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"TestClient.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "TestClient/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "TestClient/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace TestClient.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"16.6.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "TestClient/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>\n"
  },
  {
    "path": "TestClient/TestClient.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n\t<PropertyGroup>\n\t\t<OutputType>WinExe</OutputType>\n\t\t<TargetFramework>net9.0-windows7.0</TargetFramework>\n\t\t<AssemblyName>TestClient</AssemblyName>\n\t\t<RootNamespace>TestClient</RootNamespace>\n\t\t<LangVersion>8</LangVersion>\n\t\t<UseWindowsForms>true</UseWindowsForms>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t  <ProjectReference Include=\"..\\obs-websocket-dotnet\\obs-websocket-dotnet.csproj\" />\n\t</ItemGroup>\n\n</Project>"
  },
  {
    "path": "TestClient/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Newtonsoft.Json\" version=\"12.0.3\" targetFramework=\"net45\" />\n</packages>"
  },
  {
    "path": "obs-websocket-dotnet/Communication/MessageFactory.cs",
    "content": "﻿using Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace OBSWebsocketDotNet.Communication\n{\n    internal static class MessageFactory\n    {\n        internal static JObject BuildMessage(MessageTypes opCode, string messageType, JObject additionalFields, out string messageId)\n        {\n            messageId = Guid.NewGuid().ToString();\n            JObject payload = new JObject()\n            {\n                { \"op\", (int)opCode }\n            };\n\n            JObject data = new JObject();\n            \n            switch (opCode)\n            {\n                case MessageTypes.Request:\n                    data.Add(\"requestType\", messageType);\n                    data.Add(\"requestId\", messageId);\n                    data.Add(\"requestData\", additionalFields);\n                    additionalFields = null;\n                    break;\n                case MessageTypes.RequestBatch:\n                    data.Add(\"requestId\", messageId);\n                    break;\n\n            }\n\n            if (additionalFields != null)\n            {\n                data.Merge(additionalFields);\n            }\n            payload.Add(\"d\", data);\n            return payload;            \n        }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Communication/MessageTypes.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace OBSWebsocketDotNet.Communication\n{\n    internal enum MessageTypes\n    {\n        Hello = 0,\n        Identify = 1,\n        Identified = 2,\n        ReIdentify = 3,\n        Event = 5,\n        Request = 6,\n        RequestResponse = 7,\n        RequestBatch = 8,\n        RequestBatchResponse = 9\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Communication/OBSAuthInfo.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Communication\n{\n    /// <summary>\n    /// Data required by authentication\n    /// </summary>\n    public class OBSAuthInfo\n    {\n        /// <summary>\n        /// Authentication challenge\n        /// </summary>\n        [JsonProperty(PropertyName = \"challenge\")]\n        public readonly string Challenge;\n\n        /// <summary>\n        /// Password salt\n        /// </summary>\n        [JsonProperty(PropertyName = \"salt\")]\n        public readonly string PasswordSalt;\n\n        /// <summary>\n        /// Builds the object from JSON response body\n        /// </summary>\n        /// <param name=\"data\">JSON response body as a <see cref=\"JObject\"/></param>\n        public OBSAuthInfo(JObject data)\n        {\n            JsonConvert.PopulateObject(data.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor for deserialization\n        /// </summary>\n        public OBSAuthInfo() { }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Communication/ObsCloseCodes.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace OBSWebsocketDotNet.Communication\n{\n    /// <summary>\n    /// Close/Error codes sent by OBS Websocket when closing the connection\n    /// </summary>\n    public enum ObsCloseCodes\n    {\n        /// <summary>\n        /// For internal use only to tell the request handler not to perform any close action.\n        /// </summary>\n        DontClose = 0,\n\n        /// <summary>\n        /// Unknown reason, should never be used.\n        /// </summary>\n        UnknownReason = 4000,\n\n        /// <summary>\n        /// The server was unable to decode the incoming websocket message.\n        /// </summary>\n        MessageDecodeError = 4002,\n\n        /// <summary>\n        /// A data field is required but missing from the payload.\n        /// </summary>\n        MissingDataField = 4003,\n\n        /// <summary>\n        /// A data field's value type is invalid.\n        /// </summary>\n        InvalidDataFieldType = 4004,\n\n        /// <summary>\n        /// A data field's value is invalid.\n        /// </summary>\n        InvalidDataFieldValue = 4005,\n\n        /// <summary>\n        /// The specified op was invalid or missing.\n        /// </summary>\n        UnknownOpCode = 4006,\n\n        /// <summary>\n        /// The client sent a websocket message without first sending Identify message.\n        /// </summary>\n        NotIdentified = 4007,\n\n        /// <summary>\n        /// The client sent an Identify message while already identified.\n        /// </summary>\n        AlreadyIdentified = 4008,\n\n        /// <summary>\n        /// The authentication attempt (via Identify) failed.\n        /// </summary>\n        AuthenticationFailed = 4009,\n\n        /// <summary>\n        /// The server detected the usage of an old version of the obs-websocket RPC protocol.\n        /// </summary>\n        UnsupportedRpcVersion = 4010,\n\n        /// <summary>\n        /// The websocket session has been invalidated by the obs-websocket server.\n        /// </summary>\n        SessionInvalidated = 4011,\n\n        /// <summary>\n        /// A requested feature is not supported due to hardware/software limitations.\n        /// </summary>\n        UnsupportedFeature = 4012\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Communication/ObsDisconnectionInfo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Websocket.Client;\nnamespace OBSWebsocketDotNet.Communication\n{\n    /// <summary>\n    /// Disconnection information received from the OBS Websocket server\n    /// </summary>\n    public class ObsDisconnectionInfo\n    {\n        /// <summary>\n        /// Close/Error codes sent by OBS Websocket when closing the connection\n        /// </summary>\n        public ObsCloseCodes ObsCloseCode { get; private set; }\n\n        /// <summary>\n        /// String reason of disconnect\n        /// </summary>\n        public string DisconnectReason { get; set; }\n\n        /// <summary>\n        /// Websocket Client internal information\n        /// </summary>\n        public Websocket.Client.DisconnectionInfo WebsocketDisconnectionInfo { get; private set; }\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"obsCloseCode\">Close/Error codes sent by OBS Websocket when closing the connection</param>\n        /// <param name=\"disconnectReason\">String reason of disconnect</param>\n        /// <param name=\"websocketDisconnectionInfo\">Websocket Client internal information</param>\n        public ObsDisconnectionInfo(ObsCloseCodes obsCloseCode, string disconnectReason, DisconnectionInfo websocketDisconnectionInfo)\n        {\n            ObsCloseCode = obsCloseCode;\n            DisconnectReason = disconnectReason;\n            WebsocketDisconnectionInfo = websocketDisconnectionInfo;\n        }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Communication/ServerMessage.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Communication\n{\n    /// <summary>\n    /// Message received from the server\n    /// </summary>\n    internal class ServerMessage\n    {\n        /// <summary>\n        /// Server Message's operation code\n        /// </summary>\n        [JsonProperty(PropertyName = \"op\")]\n        public MessageTypes OperationCode { set; get; }\n\n        /// <summary>\n        /// Server Data\n        /// </summary>\n        [JsonProperty(PropertyName = \"d\")]\n        public JObject Data { get; set; }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Events.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing OBSWebsocketDotNet.Communication;\nusing OBSWebsocketDotNet.Types;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing OBSWebsocketDotNet.Types.Events;\nusing Microsoft.Extensions.Logging;\n\nnamespace OBSWebsocketDotNet\n{\n    public partial class OBSWebsocket\n    {\n        #region Events\n\n        /// <summary>\n        /// The current program scene has changed.\n        /// </summary>\n        public event EventHandler<ProgramSceneChangedEventArgs> CurrentProgramSceneChanged;\n\n        /// <summary>\n        /// The list of scenes has changed.\n        /// TODO: Make OBS fire this event when scenes are reordered.\n        /// </summary>\n        public event EventHandler<SceneListChangedEventArgs> SceneListChanged;\n\n        /// <summary>\n        /// Triggered when the scene item list of the specified scene is reordered\n        /// </summary>\n        public event EventHandler<SceneItemListReindexedEventArgs> SceneItemListReindexed;\n\n        /// <summary>\n        /// Triggered when a new item is added to the item list of the specified scene\n        /// </summary>\n        public event EventHandler<SceneItemCreatedEventArgs> SceneItemCreated;\n\n        /// <summary>\n        /// Triggered when an item is removed from the item list of the specified scene\n        /// </summary>\n        public event EventHandler<SceneItemRemovedEventArgs> SceneItemRemoved;\n\n        /// <summary>\n        /// Triggered when the visibility of a scene item changes\n        /// </summary>\n        public event EventHandler<SceneItemEnableStateChangedEventArgs> SceneItemEnableStateChanged;\n\n        /// <summary>\n        /// Triggered when the lock status of a scene item changes\n        /// </summary>\n        public event EventHandler<SceneItemLockStateChangedEventArgs> SceneItemLockStateChanged;\n\n        /// <summary>\n        /// Triggered when switching to another scene collection\n        /// </summary>\n        public event EventHandler<CurrentSceneCollectionChangedEventArgs> CurrentSceneCollectionChanged;\n\n        /// <summary>\n        /// Triggered when a scene collection is created, deleted or renamed\n        /// </summary>\n        public event EventHandler<SceneCollectionListChangedEventArgs> SceneCollectionListChanged;\n\n        /// <summary>\n        /// Triggered when switching to another transition\n        /// </summary>\n        public event EventHandler<CurrentSceneTransitionChangedEventArgs> CurrentSceneTransitionChanged;\n\n        /// <summary>\n        /// Triggered when the current transition duration is changed\n        /// </summary>\n        public event EventHandler<CurrentSceneTransitionDurationChangedEventArgs> CurrentSceneTransitionDurationChanged;\n\n        /// <summary>\n        /// Triggered when a transition between two scenes starts. Followed by <see cref=\"CurrentProgramSceneChanged\"/>\n        /// </summary>\n        public event EventHandler<SceneTransitionStartedEventArgs> SceneTransitionStarted;\n\n        /// <summary>\n        /// Triggered when a transition (other than \"cut\") has ended. Please note that the from-scene field is not available in TransitionEnd\n        /// </summary>\n        public event EventHandler<SceneTransitionEndedEventArgs> SceneTransitionEnded;\n\n        /// <summary>\n        /// Triggered when a stinger transition has finished playing its video\n        /// </summary>\n        public event EventHandler<SceneTransitionVideoEndedEventArgs> SceneTransitionVideoEnded;\n\n        /// <summary>\n        /// Triggered when switching to another profile\n        /// </summary>\n        public event EventHandler<CurrentProfileChangedEventArgs> CurrentProfileChanged;\n\n        /// <summary>\n        /// Triggered when a profile is created, imported, removed or renamed\n        /// </summary>\n        public event EventHandler<ProfileListChangedEventArgs> ProfileListChanged;\n\n        /// <summary>\n        /// Triggered when the streaming output state changes\n        /// </summary>\n        public event EventHandler<StreamStateChangedEventArgs> StreamStateChanged;\n\n        /// <summary>\n        /// Triggered when the recording output state changes\n        /// </summary>\n        public event EventHandler<RecordStateChangedEventArgs> RecordStateChanged;\n\n        /// <summary>\n        /// Triggered when state of the replay buffer changes\n        /// </summary>\n        public event EventHandler<ReplayBufferStateChangedEventArgs> ReplayBufferStateChanged;\n\n        /// <summary>\n        /// Triggered when the preview scene selection changes (Studio Mode only)\n        /// </summary>\n        public event EventHandler<CurrentPreviewSceneChangedEventArgs> CurrentPreviewSceneChanged;\n\n        /// <summary>\n        /// Triggered when Studio Mode is turned on or off\n        /// </summary>\n        public event EventHandler<StudioModeStateChangedEventArgs> StudioModeStateChanged;\n\n        /// <summary>\n        /// Triggered when OBS exits\n        /// </summary>\n        public event EventHandler ExitStarted;\n\n        /// <summary>\n        /// Triggered when connected successfully to an obs-websocket server\n        /// </summary>\n        public event EventHandler Connected;\n\n        /// <summary>\n        /// Triggered when disconnected from an obs-websocket server\n        /// </summary>\n        public event EventHandler<ObsDisconnectionInfo> Disconnected;\n\n        /// <summary>\n        /// A scene item is selected in the UI\n        /// </summary>\n        public event EventHandler<SceneItemSelectedEventArgs> SceneItemSelected;\n\n        /// <summary>\n        /// A scene item transform has changed\n        /// </summary>\n        public event EventHandler<SceneItemTransformEventArgs> SceneItemTransformChanged;\n\n        /// <summary>\n        /// The audio sync offset of an input has changed\n        /// </summary>\n        public event EventHandler<InputAudioSyncOffsetChangedEventArgs> InputAudioSyncOffsetChanged;\n\n        /// <summary>\n        /// A filter was added to a source\n        /// </summary>\n        public event EventHandler<SourceFilterCreatedEventArgs> SourceFilterCreated;\n\n        /// <summary>\n        /// A filter was removed from a source\n        /// </summary>\n        public event EventHandler<SourceFilterRemovedEventArgs> SourceFilterRemoved;\n\n        /// <summary>\n        /// Filters in a source have been reordered\n        /// </summary>\n        public event EventHandler<SourceFilterListReindexedEventArgs> SourceFilterListReindexed;\n\n        /// <summary>\n        /// Triggered when the visibility of a filter has changed\n        /// </summary>\n        public event EventHandler<SourceFilterEnableStateChangedEventArgs> SourceFilterEnableStateChanged;\n\n        /// <summary>\n        /// A source has been muted or unmuted\n        /// </summary>\n        public event EventHandler<InputMuteStateChangedEventArgs> InputMuteStateChanged;\n\n        /// <summary>\n        /// The volume of a source has changed\n        /// </summary>\n        public event EventHandler<InputVolumeChangedEventArgs> InputVolumeChanged;\n\n        /// <summary>\n        /// A custom broadcast message was received\n        /// </summary>\n        public event EventHandler<VendorEventArgs> VendorEvent;\n\n        /// <summary>\n        /// These events are emitted by the OBS sources themselves. For example when the media file ends. The behavior depends on the type of media source being used.\n        /// </summary>\n        public event EventHandler<MediaInputPlaybackEndedEventArgs> MediaInputPlaybackEnded;\n\n        /// <summary>\n        /// These events are emitted by the OBS sources themselves. For example when the media file starts playing. The behavior depends on the type of media source being used.\n        /// </summary>\n        public event EventHandler<MediaInputPlaybackStartedEventArgs> MediaInputPlaybackStarted;\n\n        /// <summary>\n        /// This event is only emitted when something actively controls the media/VLC source. In other words, the source will never emit this on its own naturally.\n        /// </summary>\n        public event EventHandler<MediaInputActionTriggeredEventArgs> MediaInputActionTriggered;\n\n        /// <summary>\n        /// The virtual cam state has changed.\n        /// </summary>\n        public event EventHandler<VirtualcamStateChangedEventArgs> VirtualcamStateChanged;\n\n        /// <summary>\n        /// The current scene collection has begun changing.\n        /// </summary>\n        public event EventHandler<CurrentSceneCollectionChangingEventArgs> CurrentSceneCollectionChanging;\n\n        /// <summary>\n        /// The current profile has begun changing.\n        /// </summary>\n        public event EventHandler<CurrentProfileChangingEventArgs> CurrentProfileChanging;\n\n        /// <summary>\n        /// The name of a source filter has changed.\n        /// </summary>\n        public event EventHandler<SourceFilterNameChangedEventArgs> SourceFilterNameChanged;\n\n        /// <summary>\n        /// An input has been created.\n        /// </summary>\n        public event EventHandler<InputCreatedEventArgs> InputCreated;\n\n        /// <summary>\n        /// An input has been removed.\n        /// </summary>\n        public event EventHandler<InputRemovedEventArgs> InputRemoved;\n\n        /// <summary>\n        /// The name of an input has changed.\n        /// </summary>\n        public event EventHandler<InputNameChangedEventArgs> InputNameChanged;\n\n        /// <summary>\n        /// An input's active state has changed.\n        /// When an input is active, it means it's being shown by the program feed.\n        /// </summary>\n        public event EventHandler<InputActiveStateChangedEventArgs> InputActiveStateChanged;\n\n        /// <summary>\n        /// An input's show state has changed.\n        /// When an input is showing, it means it's being shown by the preview or a dialog.\n        /// </summary>\n        public event EventHandler<InputShowStateChangedEventArgs> InputShowStateChanged;\n\n        /// <summary>\n        /// The audio balance value of an input has changed.\n        /// </summary>\n        public event EventHandler<InputAudioBalanceChangedEventArgs> InputAudioBalanceChanged;\n\n        /// <summary>\n        /// The audio tracks of an input have changed.\n        /// </summary>\n        public event EventHandler<InputAudioTracksChangedEventArgs> InputAudioTracksChanged;\n\n        /// <summary>\n        /// The monitor type of an input has changed.\n        /// Available types are:\n        /// - `OBS_MONITORING_TYPE_NONE`\n        /// - `OBS_MONITORING_TYPE_MONITOR_ONLY`\n        /// - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`\n        /// </summary>\n        public event EventHandler<InputAudioMonitorTypeChangedEventArgs> InputAudioMonitorTypeChanged;\n\n        /// <summary>\n        /// A high-volume event providing volume levels of all active inputs every 50 milliseconds.\n        /// </summary>\n        public event EventHandler<InputVolumeMetersEventArgs> InputVolumeMeters;\n\n        /// <summary>\n        /// The replay buffer has been saved.\n        /// </summary>\n        public event EventHandler<ReplayBufferSavedEventArgs> ReplayBufferSaved;\n\n        /// <summary>\n        /// A new scene has been created.\n        /// </summary>\n        public event EventHandler<SceneCreatedEventArgs> SceneCreated;\n\n        /// <summary>\n        /// A scene has been removed.\n        /// </summary>\n        public event EventHandler<SceneRemovedEventArgs> SceneRemoved;\n\n        /// <summary>\n        /// The name of a scene has changed.\n        /// </summary>\n        public event EventHandler<SceneNameChangedEventArgs> SceneNameChanged;\n\n        /// <summary>\n        /// An unsupported event has been received.\n        /// </summary>\n        public event EventHandler<UnsupportedEventArgs> UnsupportedEvent;\n\n        #endregion\n\n        #region EventProcessing\n\n        /// <summary>\n        /// Update message handler\n        /// </summary>\n        /// <param name=\"eventType\">Value of \"event-type\" in the JSON body</param>\n        /// <param name=\"body\">full JSON message body</param>\n        protected void ProcessEventType(string eventType, JObject body)\n        {\n            body = (JObject)body[\"eventData\"];\n\n            switch (eventType)\n            {\n                case nameof(CurrentProgramSceneChanged):\n                    CurrentProgramSceneChanged?.Invoke(this, new ProgramSceneChangedEventArgs((string)body[\"sceneName\"]));\n                    break;\n\n                case nameof(SceneListChanged):\n                    SceneListChanged?.Invoke(this, new SceneListChangedEventArgs(JsonConvert.DeserializeObject<List<JObject>>((string)body[\"scenes\"])));\n                    break;\n\n                case nameof(SceneItemListReindexed):\n                    SceneItemListReindexed?.Invoke(this, new SceneItemListReindexedEventArgs((string)body[\"sceneName\"], JsonConvert.DeserializeObject<List<JObject>>((string)body[\"sceneItems\"])));\n                    break;\n\n                case nameof(SceneItemCreated):\n                    SceneItemCreated?.Invoke(this, new SceneItemCreatedEventArgs((string)body[\"sceneName\"], (string)body[\"sourceName\"], (int)body[\"sceneItemId\"], (int)body[\"sceneItemIndex\"]));\n                    break;\n\n                case nameof(SceneItemRemoved):\n                    SceneItemRemoved?.Invoke(this, new SceneItemRemovedEventArgs((string)body[\"sceneName\"], (string)body[\"sourceName\"], (int)body[\"sceneItemId\"]));\n                    break;\n\n                case nameof(SceneItemEnableStateChanged):\n                    SceneItemEnableStateChanged?.Invoke(this, new SceneItemEnableStateChangedEventArgs((string)body[\"sceneName\"], (int)body[\"sceneItemId\"], (bool)body[\"sceneItemEnabled\"]));\n                    break;\n\n                case nameof(SceneItemLockStateChanged):\n                    SceneItemLockStateChanged?.Invoke(this, new SceneItemLockStateChangedEventArgs((string)body[\"sceneName\"], (int)body[\"sceneItemId\"], (bool)body[\"sceneItemLocked\"]));\n                    break;\n\n                case nameof(CurrentSceneCollectionChanged):\n                    CurrentSceneCollectionChanged?.Invoke(this, new CurrentSceneCollectionChangedEventArgs((string)body[\"sceneCollectionName\"]));\n                    break;\n\n                case nameof(SceneCollectionListChanged):\n                    SceneCollectionListChanged?.Invoke(this, new SceneCollectionListChangedEventArgs(JsonConvert.DeserializeObject<List<string>>((string)body[\"sceneCollections\"])));\n                    break;\n\n                case nameof(CurrentSceneTransitionChanged):\n                    CurrentSceneTransitionChanged?.Invoke(this, new CurrentSceneTransitionChangedEventArgs((string)body[\"transitionName\"]));\n                    break;\n\n                case nameof(CurrentSceneTransitionDurationChanged):\n                    CurrentSceneTransitionDurationChanged?.Invoke(this, new CurrentSceneTransitionDurationChangedEventArgs((int)body[\"transitionDuration\"]));\n                    break;\n\n                case nameof(SceneTransitionStarted):\n                    SceneTransitionStarted?.Invoke(this, new SceneTransitionStartedEventArgs((string)body[\"transitionName\"]));\n                    break;\n\n                case nameof(SceneTransitionEnded):\n                    SceneTransitionEnded?.Invoke(this, new SceneTransitionEndedEventArgs((string)body[\"transitionName\"]));\n                    break;\n\n                case nameof(SceneTransitionVideoEnded):\n                    SceneTransitionVideoEnded?.Invoke(this, new SceneTransitionVideoEndedEventArgs((string)body[\"transitionName\"]));\n                    break;\n\n                case nameof(CurrentProfileChanged):\n                    CurrentProfileChanged?.Invoke(this, new CurrentProfileChangedEventArgs((string)body[\"profileName\"]));\n                    break;\n\n                case nameof(ProfileListChanged):\n                    ProfileListChanged?.Invoke(this, new ProfileListChangedEventArgs(JsonConvert.DeserializeObject<List<string>>((string)body[\"profiles\"])));\n                    break;\n\n                case nameof(StreamStateChanged):\n                    StreamStateChanged?.Invoke(this, new StreamStateChangedEventArgs(new OutputStateChanged(body)));\n                    break;\n\n                case nameof(RecordStateChanged):\n                    RecordStateChanged?.Invoke(this, new RecordStateChangedEventArgs(new RecordStateChanged(body)));\n                    break;\n\n                case nameof(CurrentPreviewSceneChanged):\n                    CurrentPreviewSceneChanged?.Invoke(this, new CurrentPreviewSceneChangedEventArgs((string)body[\"sceneName\"]));\n                    break;\n\n                case nameof(StudioModeStateChanged):\n                    StudioModeStateChanged?.Invoke(this, new StudioModeStateChangedEventArgs((bool)body[\"studioModeEnabled\"]));\n                    break;\n\n                case nameof(ReplayBufferStateChanged):\n                    ReplayBufferStateChanged?.Invoke(this, new ReplayBufferStateChangedEventArgs(new OutputStateChanged(body)));\n                    break;\n\n                case nameof(ExitStarted):\n                    ExitStarted?.Invoke(this, EventArgs.Empty);\n                    break;\n\n                case nameof(SceneItemSelected):\n                    SceneItemSelected?.Invoke(this, new SceneItemSelectedEventArgs((string)body[\"sceneName\"], (string)body[\"sceneItemId\"]));\n                    break;\n\n                case nameof(SceneItemTransformChanged):\n                    SceneItemTransformChanged?.Invoke(this, new SceneItemTransformEventArgs((string)body[\"sceneName\"], (string)body[\"sceneItemId\"], new SceneItemTransformInfo((JObject)body[\"sceneItemTransform\"])));\n                    break;\n\n                case nameof(InputAudioSyncOffsetChanged):\n                    InputAudioSyncOffsetChanged?.Invoke(this, new InputAudioSyncOffsetChangedEventArgs((string)body[\"inputName\"], (int)body[\"inputAudioSyncOffset\"]));\n                    break;\n\n                case nameof(InputMuteStateChanged):\n                    InputMuteStateChanged?.Invoke(this, new InputMuteStateChangedEventArgs((string)body[\"inputName\"], (bool)body[\"inputMuted\"]));\n                    break;\n\n                case nameof(InputVolumeChanged):\n                    InputVolumeChanged?.Invoke(this, new InputVolumeChangedEventArgs(new InputVolume(body)));\n                    break;\n\n                case nameof(SourceFilterCreated):\n                    SourceFilterCreated?.Invoke(this, new SourceFilterCreatedEventArgs((string)body[\"sourceName\"], (string)body[\"filterName\"], (string)body[\"filterKind\"], (int)body[\"filterIndex\"], (JObject)body[\"filterSettings\"], (JObject)body[\"defaultFilterSettings\"]));\n                    break;\n\n                case nameof(SourceFilterRemoved):\n                    SourceFilterRemoved?.Invoke(this, new SourceFilterRemovedEventArgs((string)body[\"sourceName\"], (string)body[\"filterName\"]));\n                    break;\n\n                case nameof(SourceFilterListReindexed):\n                    if (SourceFilterListReindexed != null)\n                    {\n                        List<FilterReorderItem> filters = new List<FilterReorderItem>();\n                        JsonConvert.PopulateObject(body[\"filters\"].ToString(), filters);\n\n                        SourceFilterListReindexed?.Invoke(this, new SourceFilterListReindexedEventArgs((string)body[\"sourceName\"], filters));\n                    }\n                    break;\n\n                case nameof(SourceFilterEnableStateChanged):\n                    SourceFilterEnableStateChanged?.Invoke(this, new SourceFilterEnableStateChangedEventArgs((string)body[\"sourceName\"], (string)body[\"filterName\"], (bool)body[\"filterEnabled\"]));\n                    break;\n\n                case nameof(VendorEvent):\n                    VendorEvent?.Invoke(this, new VendorEventArgs((string)body[\"vendorName\"], (string)body[\"eventType\"], body));\n                    break;\n\n                case nameof(MediaInputPlaybackEnded):\n                    MediaInputPlaybackEnded?.Invoke(this, new MediaInputPlaybackEndedEventArgs((string)body[\"inputName\"]));\n                    break;\n\n                case nameof(MediaInputPlaybackStarted):\n                    MediaInputPlaybackStarted?.Invoke(this, new MediaInputPlaybackStartedEventArgs((string)body[\"sourceName\"]));\n                    break;\n\n                case nameof(MediaInputActionTriggered):\n                    MediaInputActionTriggered?.Invoke(this, new MediaInputActionTriggeredEventArgs((string)body[\"inputName\"], (string)body[\"mediaAction\"]));\n                    break;\n\n                case nameof(VirtualcamStateChanged):\n                    VirtualcamStateChanged?.Invoke(this, new VirtualcamStateChangedEventArgs(new OutputStateChanged(body)));\n                    break;\n\n                case nameof(CurrentSceneCollectionChanging):\n                    CurrentSceneCollectionChanging?.Invoke(this, new CurrentSceneCollectionChangingEventArgs((string)body[\"sceneCollectionName\"]));\n                    break;\n\n                case nameof(CurrentProfileChanging):\n                    CurrentProfileChanging?.Invoke(this, new CurrentProfileChangingEventArgs((string)body[\"profileName\"]));\n                    break;\n\n                case nameof(SourceFilterNameChanged):\n                    SourceFilterNameChanged?.Invoke(this, new SourceFilterNameChangedEventArgs((string)body[\"sourceName\"], (string)body[\"oldFilterName\"], (string)body[\"filterName\"]));\n                    break;\n\n                case nameof(InputCreated):\n                    InputCreated?.Invoke(this, new InputCreatedEventArgs((string)body[\"inputName\"], (string)body[\"inputKind\"], (string)body[\"unversionedInputKind\"], (JObject)body[\"inputSettings\"], (JObject)body[\"defaultInputSettings\"]));\n                    break;\n\n                case nameof(InputRemoved):\n                    InputRemoved?.Invoke(this, new InputRemovedEventArgs((string)body[\"inputName\"]));\n                    break;\n\n                case nameof(InputNameChanged):\n                    InputNameChanged?.Invoke(this, new InputNameChangedEventArgs((string)body[\"oldInputName\"], (string)body[\"inputName\"]));\n                    break;\n\n                case nameof(InputActiveStateChanged):\n                    InputActiveStateChanged?.Invoke(this, new InputActiveStateChangedEventArgs((string)body[\"inputName\"], (bool)body[\"videoActive\"]));\n                    break;\n\n                case nameof(InputShowStateChanged):\n                    InputShowStateChanged?.Invoke(this, new InputShowStateChangedEventArgs((string)body[\"inputName\"], (bool)body[\"videoShowing\"]));\n                    break;\n\n                case nameof(InputAudioBalanceChanged):\n                    InputAudioBalanceChanged?.Invoke(this, new InputAudioBalanceChangedEventArgs((string)body[\"inputName\"], (double)body[\"inputAudioBalance\"]));\n                    break;\n\n                case nameof(InputAudioTracksChanged):\n                    InputAudioTracksChanged?.Invoke(this, new InputAudioTracksChangedEventArgs((string)body[\"inputName\"], (JObject)body[\"inputAudioTracks\"]));\n                    break;\n\n                case nameof(InputAudioMonitorTypeChanged):\n                    InputAudioMonitorTypeChanged?.Invoke(this, new InputAudioMonitorTypeChangedEventArgs((string)body[\"inputName\"], (string)body[\"monitorType\"]));\n                    break;\n\n                case nameof(InputVolumeMeters):\n                    InputVolumeMeters?.Invoke(this, new InputVolumeMetersEventArgs(JsonConvert.DeserializeObject<List<JObject>>((string)body[\"inputs\"])));\n                    break;\n\n                case nameof(ReplayBufferSaved):\n                    ReplayBufferSaved?.Invoke(this, new ReplayBufferSavedEventArgs((string)body[\"savedReplayPath\"]));\n                    break;\n\n                case nameof(SceneCreated):\n                    SceneCreated?.Invoke(this, new SceneCreatedEventArgs((string)body[\"sceneName\"], (bool)body[\"isGroup\"]));\n                    break;\n\n                case nameof(SceneRemoved):\n                    SceneRemoved?.Invoke(this, new SceneRemovedEventArgs((string)body[\"sceneName\"], (bool)body[\"isGroup\"]));\n                    break;\n\n                case nameof(SceneNameChanged):\n                    SceneNameChanged?.Invoke(this, new SceneNameChangedEventArgs((string)body[\"oldSceneName\"], (string)body[\"sceneName\"]));\n                    break;\n\n                default:\n                    var message = $\"Unsupported Event: {eventType}\\n{body}\";\n                    Logger?.LogInformation(message);\n                    UnsupportedEvent?.Invoke(this, new UnsupportedEventArgs(eventType, body));\n                    break;\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Exceptions.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet\n{\n    /// <summary>\n    /// Thrown if authentication fails\n    /// </summary>\n    public class AuthFailureException : Exception\n    {\n    }\n\n    /// <summary>\n    /// Thrown when the server responds with an error\n    /// </summary>\n    public class ErrorResponseException : Exception\n    {\n        /// <summary>\n        /// Error Code of exception\n        /// </summary>\n        public int ErrorCode { get; set; }\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"message\">Exception Message</param>\n        /// /// <param name=\"errorCode\">Error Code</param>\n        public ErrorResponseException(string message, int errorCode) : base(message)\n        {\n            ErrorCode = errorCode;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/IOBSWebsocket.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing Newtonsoft.Json.Linq;\nusing OBSWebsocketDotNet.Communication;\nusing OBSWebsocketDotNet.Types;\nusing OBSWebsocketDotNet.Types.Events;\nusing Websocket.Client;\n\nnamespace OBSWebsocketDotNet\n{\n    /// <summary>\n    /// OBS Websocket Dotnet interface\n    /// </summary>\n    public interface IOBSWebsocket\n    {\n        #region Properties\n\n        /// <summary>\n        /// WebSocket request timeout, represented as a TimeSpan object\n        /// </summary>\n        TimeSpan WSTimeout { get; set; }\n\n        /// <summary>\n        /// Current connection state\n        /// </summary>\n        bool IsConnected { get; }\n\n        #endregion\n\n        #region Requests\n        /// <summary>\n        /// Get basic OBS video information\n        /// </summary>\n        ObsVideoSettings GetVideoSettings();\n\n        /// <summary>\n        /// Saves a screenshot of a source to the filesystem.\n        /// The `imageWidth` and `imageHeight` parameters are treated as \\\"scale to inner\\\", meaning the smallest ratio will be used and the aspect ratio of the original resolution is kept.\n        /// If `imageWidth` and `imageHeight` are not specified, the compressed image will use the full resolution of the source.\n        /// **Compatible with inputs and scenes.**\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source to take a screenshot of</param>\n        /// <param name=\"imageFormat\">Image compression format to use. Use `GetVersion` to get compatible image formats</param>\n        /// <param name=\"imageFilePath\">Path to save the screenshot file to. Eg. `C:\\\\Users\\\\user\\\\Desktop\\\\screenshot.png`</param>\n        /// <param name=\"imageWidth\">Width to scale the screenshot to</param>\n        /// <param name=\"imageHeight\">Height to scale the screenshot to</param>\n        /// <param name=\"imageCompressionQuality\">Compression quality to use. 0 for high compression, 100 for uncompressed. -1 to use \\\"default\\\" (whatever that means, idk)</param>\n        /// <returns>Base64-encoded screenshot string</returns>\n        string SaveSourceScreenshot(string sourceName, string imageFormat, string imageFilePath, int imageWidth = -1, int imageHeight = -1, int imageCompressionQuality = -1);\n\n        /// <summary>\n        /// Saves a screenshot of a source to the filesystem.\n        /// The `imageWidth` and `imageHeight` parameters are treated as \\\"scale to inner\\\", meaning the smallest ratio will be used and the aspect ratio of the original resolution is kept.\n        /// If `imageWidth` and `imageHeight` are not specified, the compressed image will use the full resolution of the source.\n        /// **Compatible with inputs and scenes.**\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source to take a screenshot of</param>\n        /// <param name=\"imageFormat\">Image compression format to use. Use `GetVersion` to get compatible image formats</param>\n        /// <param name=\"imageFilePath\">Path to save the screenshot file to. Eg. `C:\\\\Users\\\\user\\\\Desktop\\\\screenshot.png`</param>\n        /// <returns>Base64-encoded screenshot string</returns>\n        string SaveSourceScreenshot(string sourceName, string imageFormat, string imageFilePath);\n\n        /// <summary>\n        /// Executes hotkey routine, identified by hotkey unique name\n        /// </summary>\n        /// <param name=\"hotkeyName\">Unique name of the hotkey, as defined when registering the hotkey (e.g. \"ReplayBuffer.Save\")</param>\n        void TriggerHotkeyByName(string hotkeyName);\n\n        /// <summary>\n        /// Triggers a hotkey using a sequence of keys.\n        /// </summary>\n        /// <param name=\"keyId\">Main key identifier (e.g. OBS_KEY_A for key \"A\"). Available identifiers are here: https://github.com/obsproject/obs-studio/blob/master/libobs/obs-hotkeys.h</param>\n        /// <param name=\"keyModifier\">Optional key modifiers object. You can combine multiple key operators. e.g. KeyModifier.Shift | KeyModifier.Control</param>\n        void TriggerHotkeyByKeySequence(OBSHotkey keyId, KeyModifier keyModifier = KeyModifier.None);\n\n        /// <summary>\n        /// Get the name of the currently active scene. \n        /// </summary>\n        /// <returns>Name of the current scene</returns>\n        string GetCurrentProgramScene();\n\n        /// <summary>\n        /// Set the current scene to the specified one\n        /// </summary>\n        /// <param name=\"sceneName\">The desired scene name</param>\n        void SetCurrentProgramScene(string sceneName);\n\n        /// <summary>\n        /// Get OBS stats (almost the same info as provided in OBS' stats window)\n        /// </summary>\n        ObsStats GetStats();\n\n        /// <summary>\n        /// List every available scene\n        /// </summary>\n        /// <returns>A <see cref=\"List{SceneBasicInfo}\" /> of <see cref=\"SceneBasicInfo\"/> objects describing each scene</returns>\n        List<SceneBasicInfo> ListScenes();\n\n        /// <summary>\n        /// Get a list of scenes in the currently active profile\n        /// </summary>\n        GetSceneListInfo GetSceneList();\n\n        /// <summary>\n        /// Get the specified scene's transition override info\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to return the override info</param>\n        /// <returns>TransitionOverrideInfo</returns>\n        TransitionOverrideInfo GetSceneSceneTransitionOverride(string sceneName);\n\n        /// <summary>\n        /// Set specific transition override for a scene\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to set the transition override</param>\n        /// <param name=\"transitionName\">Name of the transition to use</param>\n        /// <param name=\"transitionDuration\">Duration in milliseconds of the transition if transition is not fixed. Defaults to the current duration specified in the UI if there is no current override and this value is not given</param>\n        void SetSceneSceneTransitionOverride(string sceneName, string transitionName, int transitionDuration = -1);\n\n        /// <summary>\n        /// If your code needs to perform multiple successive T-Bar moves (e.g. : in an animation, or in response to a user moving a T-Bar control in your User Interface), set release to false and call ReleaseTBar later once the animation/interaction is over.\n        /// </summary>\n        /// <param name=\"position\">\tT-Bar position. This value must be between 0.0 and 1.0.</param>\n        /// <param name=\"release\">Whether or not the T-Bar gets released automatically after setting its new position (like a user releasing their mouse button after moving the T-Bar). Call ReleaseTBar manually if you set release to false. Defaults to true.</param>\n        void SetTBarPosition(double position, bool release = true);\n\n        /// <summary>\n        /// Apply settings to a source filter\n        /// </summary>\n        /// <param name=\"sourceName\">Source with filter</param>\n        /// <param name=\"filterName\">Filter name</param>\n        /// <param name=\"filterSettings\">JObject with filter settings</param>\n        /// <param name=\"overlay\">Apply over existing settings?</param>\n        void SetSourceFilterSettings(string sourceName, string filterName, JObject filterSettings, bool overlay = false);\n\n        /// <summary>\n        /// Apply settings to a source filter\n        /// </summary>\n        /// <param name=\"sourceName\">Source with filter</param>\n        /// <param name=\"filterName\">Filter name</param>\n        /// <param name=\"filterSettings\">Filter settings</param>\n        /// <param name=\"overlay\">Apply over existing settings?</param>\n        void SetSourceFilterSettings(string sourceName, string filterName, FilterSettings filterSettings, bool overlay = false);\n\n        /// <summary>\n        /// Modify the Source Filter's visibility\n        /// </summary>\n        /// <param name=\"sourceName\">Source name</param>\n        /// <param name=\"filterName\">Source filter name</param>\n        /// <param name=\"filterEnabled\">New filter state</param>\n        void SetSourceFilterEnabled(string sourceName, string filterName, bool filterEnabled);\n\n        /// <summary>\n        /// Return a list of all filters on a source\n        /// </summary>\n        /// <param name=\"sourceName\">Source name</param>\n        List<FilterSettings> GetSourceFilterList(string sourceName);\n\n        /// <summary>\n        /// Return a list of settings for a specific filter\n        /// </summary>\n        /// <param name=\"sourceName\">Source name</param>\n        /// <param name=\"filterName\">Filter name</param>\n        FilterSettings GetSourceFilter(string sourceName, string filterName);\n\n        /// <summary>\n        /// Remove the filter from a source\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source the filter is on</param>\n        /// <param name=\"filterName\">Name of the filter to remove</param>\n        bool RemoveSourceFilter(string sourceName, string filterName);\n\n        /// <summary>\n        /// Add a filter to a source\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source for the filter</param>\n        /// <param name=\"filterName\">Name of the filter</param>\n        /// <param name=\"filterKind\">Type of filter</param>\n        /// <param name=\"filterSettings\">JObject holding filter settings object</param>\n        void CreateSourceFilter(string sourceName, string filterName, string filterKind, JObject filterSettings);\n\n        /// <summary>\n        /// Add a filter to a source\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source for the filter</param>\n        /// <param name=\"filterName\">Name of the filter</param>\n        /// <param name=\"filterKind\">Type of filter</param>\n        /// <param name=\"filterSettings\">Filter settings object</param>\n        void CreateSourceFilter(string sourceName, string filterName, string filterKind, FilterSettings filterSettings);\n\n        /// <summary>\n        /// Toggles the status of the stream output.\n        /// </summary>\n        /// <returns>New state of the stream output</returns>\n        bool ToggleStream();\n\n        /// <summary>\n        /// Toggles the status of the record output.\n        /// </summary>\n        void ToggleRecord();\n\n        /// <summary>\n        /// Gets the status of the stream output\n        /// </summary>\n        /// <returns>An <see cref=\"OutputStatus\"/> object describing the current outputs states</returns>\n        OutputStatus GetStreamStatus();\n\n        /// <summary>\n        /// Get the current transition name and duration\n        /// </summary>\n        /// <returns>An <see cref=\"TransitionSettings\"/> object with the current transition name and duration</returns>\n        TransitionSettings GetCurrentSceneTransition();\n\n        /// <summary>\n        /// Set the current transition to the specified one\n        /// </summary>\n        /// <param name=\"transitionName\">Desired transition name</param>\n        void SetCurrentSceneTransition(string transitionName);\n\n        /// <summary>\n        /// Change the transition's duration\n        /// </summary>\n        /// <param name=\"transitionDuration\">Desired transition duration (in milliseconds)</param>\n        void SetCurrentSceneTransitionDuration(int transitionDuration);\n\n        /// <summary>\n        /// Change the current settings of a transition\n        /// </summary>\n        /// <param name=\"transitionSettings\">Transition settings (they can be partial)</param>\n        /// <param name=\"overlay\">Whether to overlay over the current settins or replace them</param>\n        /// <returns>Updated transition settings</returns>\n        void SetCurrentSceneTransitionSettings(JObject transitionSettings, bool overlay);\n\n        /// <summary>\n        /// Change the volume of the specified source\n        /// </summary>\n        /// <param name=\"inputName\">Name of the source which volume will be changed</param>\n        /// <param name=\"inputVolume\">Desired volume. Must be between `0.0` and `1.0` for amplitude/mul (useDecibel is false), and under 0.0 for dB (useDecibel is true). Note: OBS will interpret dB values under -100.0 as Inf.</param>\n        /// <param name=\"inputVolumeDb\">Interperet `volume` data as decibels instead of amplitude/mul.</param>\n        void SetInputVolume(string inputName, float inputVolume, bool inputVolumeDb = false);\n\n        /// <summary>\n        /// Get the volume of the specified source\n        /// Volume is between `0.0` and `1.0` if using amplitude/mul (useDecibel is false), under `0.0` if using dB (useDecibel is true).\n        /// </summary>\n        /// <param name=\"inputName\">Source name</param>\n        /// <returns>An <see cref=\"VolumeInfo\"/>Object containing the volume and mute state of the specified source.</returns>\n        VolumeInfo GetInputVolume(string inputName);\n\n        /// <summary>\n        /// Gets the audio mute state of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of input to get the mute state of</param>\n        /// <returns>Whether the input is muted</returns>\n        bool GetInputMute(string inputName);\n\n        /// <summary>\n        /// Set the mute state of the specified source\n        /// </summary>\n        /// <param name=\"inputName\">Name of the source which mute state will be changed</param>\n        /// <param name=\"inputMuted\">Desired mute state</param>\n        void SetInputMute(string inputName, bool inputMuted);\n\n        /// <summary>\n        /// Toggle the mute state of the specified source\n        /// </summary>\n        /// <param name=\"inputName\">Name of the source which mute state will be toggled</param>\n        void ToggleInputMute(string inputName);\n\n        /// <summary>\n        /// Sets the transform and crop info of a scene item\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene that has the SceneItem</param>\n        /// <param name=\"sceneItemId\">Id of the Scene Item</param>\n        /// <param name=\"sceneItemTransform\">JObject holding transform settings</param>\n        void SetSceneItemTransform(string sceneName, int sceneItemId, JObject sceneItemTransform);\n\n        /// <summary>\n        /// Sets the transform and crop info of a scene item\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene that has the SceneItem</param>\n        /// <param name=\"sceneItemId\">Id of the Scene Item</param>\n        /// <param name=\"sceneItemTransform\">Transform settings</param>\n        void SetSceneItemTransform(string sceneName, int sceneItemId, SceneItemTransformInfo sceneItemTransform);\n\n        /// <summary>\n        /// Set the current scene collection to the specified one\n        /// </summary>\n        /// <param name=\"sceneCollectionName\">Desired scene collection name</param>\n        void SetCurrentSceneCollection(string sceneCollectionName);\n\n        /// <summary>\n        /// Get the name of the current scene collection\n        /// </summary>\n        /// <returns>Name of the current scene collection</returns>\n        string GetCurrentSceneCollection();\n\n        /// <summary>\n        /// List all scene collections\n        /// </summary>\n        /// <returns>A <see cref=\"List{T}\"/> of the names of all scene collections</returns>\n        List<string> GetSceneCollectionList();\n\n        /// <summary>\n        /// Set the current profile to the specified one\n        /// </summary>\n        /// <param name=\"profileName\">Name of the desired profile</param>\n        void SetCurrentProfile(string profileName);\n\n        /// <summary>\n        /// List all profiles\n        /// </summary>\n        /// <returns>A <see cref=\"List{T}\"/> of the names of all profiles</returns>\n        GetProfileListInfo GetProfileList();\n\n        /// <summary>\n        /// Start streaming. Will trigger an error if streaming is already active\n        /// </summary>\n        void StartStream();\n\n        /// <summary>\n        /// Stop streaming. Will trigger an error if streaming is not active.\n        /// </summary>\n        void StopStream();\n\n        /// <summary>\n        /// Start recording. Will trigger an error if recording is already active.\n        /// </summary>\n        void StartRecord();\n\n        /// <summary>\n        /// Stop recording. Will trigger an error if recording is not active.\n        /// <returns>File name for the saved recording</returns>\n        /// </summary>\n        string StopRecord();\n\n        /// <summary>\n        /// Pause the current recording. Returns an error if recording is not active or already paused.\n        /// </summary>\n        void PauseRecord();\n\n        /// <summary>\n        /// Resume/unpause the current recording (if paused). Returns an error if recording is not active or not paused.\n        /// </summary>\n        void ResumeRecord();\n\n        /// <summary>\n        /// Get the path of the current recording folder\n        /// </summary>\n        /// <returns>Current recording folder path</returns>\n        string GetRecordDirectory();\n\n        /// <summary>\n        /// Get current recording status.\n        /// </summary>\n        /// <returns></returns>\n        RecordingStatus GetRecordStatus();\n\n        /// <summary>\n        /// Get the status of the OBS replay buffer.\n        /// </summary>\n        /// <returns>Current recording status. true when active</returns>\n        bool GetReplayBufferStatus();\n\n        /// <summary>\n        /// Get duration of the currently selected transition (if supported)\n        /// </summary>\n        /// <returns>Current transition duration (in milliseconds)</returns>\n        GetTransitionListInfo GetSceneTransitionList();\n\n        /// <summary>\n        /// Get status of Studio Mode\n        /// </summary>\n        /// <returns>Studio Mode status (on/off)</returns>\n        bool GetStudioModeEnabled();\n\n        /// <summary>\n        /// Enables or disables studio mode\n        /// </summary>\n        /// <param name=\"studioModeEnabled\"></param>\n        void SetStudioModeEnabled(bool studioModeEnabled);\n\n        /// <summary>\n        /// Get the name of the currently selected preview scene. \n        /// Note: Triggers an error if Studio Mode is disabled\n        /// </summary>\n        /// <returns>Preview scene name</returns>\n        string GetCurrentPreviewScene();\n\n        /// <summary>\n        /// Change the currently active preview/studio scene to the one specified.\n        /// Triggers an error if Studio Mode is disabled\n        /// </summary>\n        /// <param name=\"sceneName\">Preview scene name</param>\n        void SetCurrentPreviewScene(string sceneName);\n\n        /// <summary>\n        /// Change the currently active preview/studio scene to the one specified.\n        /// Triggers an error if Studio Mode is disabled.\n        /// </summary>\n        /// <param name=\"previewScene\">Preview scene object</param>\n        void SetCurrentPreviewScene(ObsScene previewScene);\n\n        /// <summary>\n        /// Triggers the current scene transition. Same functionality as the `Transition` button in Studio Mode\n        /// </summary>\n        void TriggerStudioModeTransition();\n\n        /// <summary>\n        /// Toggles the state of the replay buffer output.\n        /// </summary>\n        void ToggleReplayBuffer();\n\n        /// <summary>\n        /// Start recording into the Replay Buffer. Triggers an error\n        /// if the Replay Buffer is already active, or if the \"Save Replay Buffer\"\n        /// hotkey is not set in OBS' settings\n        /// </summary>\n        void StartReplayBuffer();\n\n        /// <summary>\n        /// Stop recording into the Replay Buffer. Triggers an error if the\n        /// Replay Buffer is not active.\n        /// </summary>\n        void StopReplayBuffer();\n\n        /// <summary>\n        /// Save and flush the contents of the Replay Buffer to disk. Basically\n        /// the same as triggering the \"Save Replay Buffer\" hotkey in OBS.\n        /// Triggers an error if Replay Buffer is not active.\n        /// </summary>\n        void SaveReplayBuffer();\n\n        /// <summary>\n        /// Set the audio sync offset of the specified source\n        /// </summary>\n        /// <param name=\"inputName\">Source name</param>\n        /// <param name=\"inputAudioSyncOffset\">Audio offset (in nanoseconds) for the specified source</param>\n        void SetInputAudioSyncOffset(string inputName, int inputAudioSyncOffset);\n\n        /// <summary>\n        /// Get the audio sync offset of the specified source\n        /// </summary>\n        /// <param name=\"inputName\">Source name</param>\n        /// <returns>Audio offset (in nanoseconds) of the specified source</returns>\n        int GetInputAudioSyncOffset(string inputName);\n\n        /// <summary>\n        /// Removes a scene item from a scene.\n        /// Scenes only.\n        /// </summary>\n        /// <param name=\"sceneItemId\">Scene item id</param>\n        /// <param name=\"sceneName\">Scene name from which to delete item</param>\n        void RemoveSceneItem(string sceneName, int sceneItemId);\n\n        /// <summary>\n        /// Sends CEA-608 caption text over the stream output. As of OBS Studio 23.1, captions are not yet available on Linux.\n        /// </summary>\n        /// <param name=\"captionText\">Captions text</param>\n        void SendStreamCaption(string captionText);\n\n        /// <summary>\n        /// Duplicates a scene item\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene that has the SceneItem</param>\n        /// <param name=\"sceneItemId\">Id of the Scene Item</param>\n        /// <param name=\"destinationSceneName\">Name of scene to add the new duplicated Scene Item. If not specified will assume sceneName</param>\n        void DuplicateSceneItem(string sceneName, int sceneItemId, string destinationSceneName = null);\n\n        /// <summary>\n        /// Gets the names of all special inputs.\n        /// </summary>\n        /// <returns>Dictionary of special inputs.</returns>\n        Dictionary<string, string> GetSpecialInputs();\n\n        /// <summary>\n        /// Sets the current stream service settings (stream destination).\n        /// Note: Simple RTMP settings can be set with type `rtmp_custom` and the settings fields `server` and `key`.\n        /// </summary>\n        /// <param name=\"service\">Stream Service Type Name and Settings objects</param>\n        void SetStreamServiceSettings(StreamingService service);\n\n        /// <summary>\n        /// Gets the current stream service settings (stream destination).\n        /// </summary>\n        /// <returns>Stream service type and settings objects</returns>\n        StreamingService GetStreamServiceSettings();\n\n        /// <summary>\n        /// Gets the audio monitor type of an input.\n        /// The available audio monitor types are:\n        /// - `OBS_MONITORING_TYPE_NONE`\n        /// - `OBS_MONITORING_TYPE_MONITOR_ONLY`\n        /// - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`\n        /// </summary>\n        /// <param name=\"inputName\">Source name</param>\n        /// <returns>The monitor type in use</returns>\n        string GetInputAudioMonitorType(string inputName);\n\n        /// <summary>\n        /// Sets the audio monitor type of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to set the audio monitor type of</param>\n        /// <param name=\"monitorType\">Audio monitor type. See `GetInputAudioMonitorType for possible types.</param>\n        void SetInputAudioMonitorType(string inputName, string monitorType);\n\n        /// <summary>\n        /// Broadcasts a `CustomEvent` to all WebSocket clients. Receivers are clients which are identified and subscribed.\n        /// </summary>\n        /// <param name=\"eventData\">Data payload to emit to all receivers</param>\n        void BroadcastCustomEvent(JObject eventData);\n\n        /// <summary>\n        /// Sets the cursor position of a media input.\n        /// This request does not perform bounds checking of the cursor position.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the media input</param>\n        /// <param name=\"mediaCursor\">New cursor position to set (milliseconds).</param>\n        void SetMediaInputCursor(string inputName, int mediaCursor);\n\n        /// <summary>\n        /// Offsets the current cursor position of a media input by the specified value.\n        /// This request does not perform bounds checking of the cursor position.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the media input</param>\n        /// <param name=\"mediaCursorOffset\">Value to offset the current cursor position by (milliseconds +/-)</param>\n        void OffsetMediaInputCursor(string inputName, int mediaCursorOffset);\n\n        /// <summary>\n        /// Creates a new input, adding it as a scene item to the specified scene.\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to add the input to as a scene item</param>\n        /// <param name=\"inputName\">Name of the new input to created</param>\n        /// <param name=\"inputKind\">The kind of input to be created</param>\n        /// <param name=\"inputSettings\">Jobject holding the settings object to initialize the input with</param>\n        /// <param name=\"sceneItemEnabled\">Whether to set the created scene item to enabled or disabled</param>\n        /// <returns>ID of the SceneItem in the scene.</returns>\n        int CreateInput(string sceneName, string inputName, string inputKind, JObject inputSettings, bool? sceneItemEnabled);\n\n        /// <summary>\n        /// Gets the default settings for an input kind.\n        /// </summary>\n        /// <param name=\"inputKind\">Input kind to get the default settings for</param>\n        /// <returns>Object of default settings for the input kind</returns>\n        JObject GetInputDefaultSettings(string inputKind);\n\n        /// <summary>\n        /// Gets a list of all scene items in a scene.\n        /// Scenes only\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to get the items of</param>\n        /// <returns>Array of scene items in the scene</returns>\n        List<SceneItemDetails> GetSceneItemList(string sceneName);\n\n        /// <summary>\n        /// Creates a new scene item using a source.\n        /// Scenes only\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to create the new item in</param>\n        /// <param name=\"sourceName\">Name of the source to add to the scene</param>\n        /// <param name=\"sceneItemEnabled\">Enable state to apply to the scene item on creation</param>\n        /// <returns>Numeric ID of the scene item</returns>\n        int CreateSceneItem(string sceneName, string sourceName, bool sceneItemEnabled = true);\n\n        /// <summary>\n        /// Creates a new scene in OBS.\n        /// </summary>\n        /// <param name=\"sceneName\">Name for the new scene</param>\n        void CreateScene(string sceneName);\n\n        /// <summary>\n        /// Gets the enable state of all audio tracks of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input</param>\n        /// <returns>Object of audio tracks and associated enable states</returns>\n        SourceTracks GetInputAudioTracks(string inputName);\n\n        /// <summary>\n        /// Sets the enable state of audio tracks of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input</param>\n        /// <param name=\"inputAudioTracks\">JObject holding track settings to apply</param>\n        void SetInputAudioTracks(string inputName, JObject inputAudioTracks);\n\n        /// <summary>\n        /// Sets the enable state of audio tracks of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input</param>\n        /// <param name=\"inputAudioTracks\">Track settings to apply</param>\n        void SetInputAudioTracks(string inputName, SourceTracks inputAudioTracks);\n\n        /// <summary>\n        /// Gets the active and show state of a source.\n        /// **Compatible with inputs and scenes.**\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source to get the active state of</param>\n        /// <returns>Whether the source is showing in Program</returns>\n        SourceActiveInfo GetSourceActive(string sourceName);\n\n        /// <summary>\n        /// Gets the status of the virtualcam output.\n        /// </summary>\n        /// <returns>An <see cref=\"VirtualCamStatus\"/> object describing the current virtual camera state</returns>\n        VirtualCamStatus GetVirtualCamStatus();\n\n        /// <summary>\n        /// Starts the virtualcam output.\n        /// </summary>\n        void StartVirtualCam();\n\n        /// <summary>\n        /// Stops the virtualcam output.\n        /// </summary>\n        void StopVirtualCam();\n\n        /// <summary>\n        /// Toggles the state of the virtualcam output.\n        /// </summary>\n        /// <returns>Whether the output is active</returns>\n        VirtualCamStatus ToggleVirtualCam();\n\n        /// <summary>\n        /// Gets the value of a \\\"slot\\\" from the selected persistent data realm.\n        /// </summary>\n        /// <param name=\"realm\">The data realm to select. `OBS_WEBSOCKET_DATA_REALM_GLOBAL` or `OBS_WEBSOCKET_DATA_REALM_PROFILE`</param>\n        /// <param name=\"slotName\">The name of the slot to retrieve data from</param>\n        /// <returns type=\"Any\">Value associated with the slot. `null` if not set</returns>\n        JObject GetPersistentData(string realm, string slotName);\n\n        /// <summary>\n        /// Sets the value of a \\\"slot\\\" from the selected persistent data realm.\n        /// </summary>\n        /// <param name=\"realm\">The data realm to select. `OBS_WEBSOCKET_DATA_REALM_GLOBAL` or `OBS_WEBSOCKET_DATA_REALM_PROFILE`</param>\n        /// <param name=\"slotName\">The name of the slot to retrieve data from</param>\n        /// <param name=\"slotValue\">The value to apply to the slot</param>\n        void SetPersistentData(string realm, string slotName, JObject slotValue);\n\n        /// <summary>\n        /// Creates a new scene collection, switching to it in the process.\\n\\nNote: This will block until the collection has finished changing.\n        /// </summary>\n        /// <param name=\"sceneCollectionName\">Name for the new scene collection</param>\n        void CreateSceneCollection(string sceneCollectionName);\n\n        /// <summary>\n        /// Creates a new profile, switching to it in the process\n        /// </summary>\n        /// <param name=\"profileName\">Name for the new profile</param>\n        void CreateProfile(string profileName);\n\n        /// <summary>\n        /// Removes a profile. If the current profile is chosen, it will change to a different profile first.\n        /// </summary>\n        /// <param name=\"profileName\">Name of the profile to remove</param>\n        void RemoveProfile(string profileName);\n\n        /// <summary>\n        /// Gets a parameter from the current profile's configuration.\n        /// </summary>\n        /// <param name=\"parameterCategory\">Category of the parameter to get</param>\n        /// <param name=\"parameterName\">Name of the parameter to get</param>\n        /// <returns></returns>\n        JObject GetProfileParameter(string parameterCategory, string parameterName);\n\n        /// <summary>\n        /// Sets the value of a parameter in the current profile's configuration.\n        /// </summary>\n        /// <param name=\"parameterCategory\">Category of the parameter to set</param>\n        /// <param name=\"parameterName\">Name of the parameter to set</param>\n        /// <param name=\"parameterValue\">Value of the parameter to set. Use `null` to delete</param>\n        void SetProfileParameter(string parameterCategory, string parameterName, string parameterValue);\n\n        /// <summary>\n        /// Sets the current video settings.\n        /// Note: Fields must be specified in pairs. For example, you cannot set only `baseWidth` without needing to specify `baseHeight`.\n        /// </summary>\n        /// <param name=\"obsVideoSettings\">Object containing video settings</param>\n        void SetVideoSettings(ObsVideoSettings obsVideoSettings);\n\n        /// <summary>\n        /// Gets the default settings for a filter kind.\n        /// </summary>\n        /// <param name=\"filterKind\">Filter kind to get the default settings for</param>\n        /// <returns>Object of default settings for the filter kind</returns>\n        JObject GetSourceFilterDefaultSettings(string filterKind);\n\n        /// <summary>\n        /// Sets the name of a source filter (rename).\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source the filter is on</param>\n        /// <param name=\"filterName\">Current name of the filter</param>\n        /// <param name=\"newFilterName\">New name for the filter</param>\n        void SetSourceFilterName(string sourceName, string filterName, string newFilterName);\n\n        /// <summary>\n        /// Sets the index position of a filter on a source.\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source the filter is on</param>\n        /// <param name=\"filterName\">Name of the filter</param>\n        /// <param name=\"filterIndex\">New index position of the filter</param>\n        void SetSourceFilterIndex(string sourceName, string filterName, int filterIndex);\n\n        /// <summary>\n        /// Gets data about the current plugin and RPC version.\n        /// </summary>\n        /// <returns>Version info in an <see cref=\"ObsVersion\"/> object</returns>\n        ObsVersion GetVersion();\n\n        /// <summary>\n        /// Call a request registered to a vendor.\n        /// A vendor is a unique name registered by a third-party plugin or script, which allows for custom requests and events to be added to obs-websocket.\n        /// If a plugin or script implements vendor requests or events, documentation is expected to be provided with them.\n        /// </summary>\n        /// <param name=\"vendorName\">Name of the vendor to use</param>\n        /// <param name=\"requestType\">The request type to call</param>\n        /// <param name=\"requestData\">Object containing appropriate request data</param>\n        /// <returns>Object containing appropriate response data. {} if request does not provide any response data</returns>\n        JObject CallVendorRequest(string vendorName, string requestType, JObject requestData = null);\n\n        /// <summary>\n        /// Gets an array of all hotkey names in OBS\n        /// </summary>\n        /// <returns>Array of hotkey names</returns>\n        List<string> GetHotkeyList();\n\n        /// <summary>\n        /// Sleeps for a time duration or number of frames. Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`.\n        /// </summary>\n        /// <param name=\"sleepMillis\">Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode)</param>\n        /// <param name=\"sleepFrames\">Number of frames to sleep for (if `SERIAL_FRAME` mode)</param>\n        void Sleep(int sleepMillis, int sleepFrames);\n\n        /// <summary>\n        /// Gets an array of all inputs in OBS.\n        /// </summary>\n        /// <param name=\"inputKind\">Restrict the array to only inputs of the specified kind</param>\n        /// <returns>List of Inputs in OBS</returns>\n        List<InputBasicInfo> GetInputList(string inputKind = null);\n\n        /// <summary>\n        /// Gets an array of all available input kinds in OBS.\n        /// </summary>\n        /// <param name=\"unversioned\">True == Return all kinds as unversioned, False == Return with version suffixes (if available)</param>\n        /// <returns>Array of input kinds</returns>\n        List<string> GetInputKindList(bool unversioned = false);\n\n        /// <summary>\n        /// Removes an existing input.\n        /// Note: Will immediately remove all associated scene items.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to remove</param>\n        void RemoveInput(string inputName);\n\n        /// <summary>\n        /// Sets the name of an input (rename).\n        /// </summary>\n        /// <param name=\"inputName\">Current input name</param>\n        /// <param name=\"newInputName\">New name for the input</param>\n        void SetInputName(string inputName, string newInputName);\n\n        /// <summary>\n        /// Gets the settings of an input.\n        /// Note: Does not include defaults. To create the entire settings object, overlay `inputSettings` over the `defaultInputSettings` provided by `GetInputDefaultSettings`.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to get the settings of</param>\n        /// <returns>New populated InputSettings object</returns>\n        InputSettings GetInputSettings(string inputName);\n\n        /// <summary>\n        /// Sets the settings of an input.\n        /// </summary>\n        /// <param name=\"inputSettings\">Object of settings to apply</param>\n        /// <param name=\"overlay\">True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings.</param>\n        void SetInputSettings(InputSettings inputSettings, bool overlay = true);\n\n        /// <summary>\n        /// Sets the settings of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to set the settings of</param>\n        /// <param name=\"inputSettings\">Object of settings to apply</param>\n        /// <param name=\"overlay\">True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings.</param>\n        void SetInputSettings(string inputName, JObject inputSettings, bool overlay = true);\n\n        /// <summary>\n        /// Gets the audio balance of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to get the audio balance of</param>\n        /// <returns>Audio balance value from 0.0-1.0</returns>\n        double GetInputAudioBalance(string inputName);\n\n        /// <summary>\n        /// Sets the audio balance of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to set the audio balance of</param>\n        /// <param name=\"inputAudioBalance\">New audio balance value</param>\n        void SetInputAudioBalance(string inputName, double inputAudioBalance);\n\n        /// <summary>\n        /// Gets the items of a list property from an input's properties.\n        /// Note: Use this in cases where an input provides a dynamic, selectable list of items.\n        /// For example, display capture, where it provides a list of available displays.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input</param>\n        /// <param name=\"propertyName\">Name of the list property to get the items of</param>\n        /// <returns>Array of items in the list property</returns>\n        List<JObject> GetInputPropertiesListPropertyItems(string inputName, string propertyName);\n\n        /// <summary>\n        /// Presses a button in the properties of an input.\n        /// Note: Use this in cases where there is a button in the properties of an input that cannot be accessed in any other way.\n        /// For example, browser sources, where there is a refresh button.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input</param>\n        /// <param name=\"propertyName\">Name of the button property to press</param>\n        void PressInputPropertiesButton(string inputName, string propertyName);\n\n        /// <summary>\n        /// Gets the status of a media input.\\n\\nMedia States:\n        /// - `OBS_MEDIA_STATE_NONE`\n        /// - `OBS_MEDIA_STATE_PLAYING`\n        /// - `OBS_MEDIA_STATE_OPENING`\n        /// - `OBS_MEDIA_STATE_BUFFERING`\n        /// - `OBS_MEDIA_STATE_PAUSED`\n        /// - `OBS_MEDIA_STATE_STOPPED`\n        /// - `OBS_MEDIA_STATE_ENDED`\n        /// - `OBS_MEDIA_STATE_ERROR`\n        /// </summary>\n        /// <param name=\"inputName\">Name of the media input</param>\n        /// <returns>Object containing string mediaState, int mediaDuration, int mediaCursor properties</returns>\n        MediaInputStatus GetMediaInputStatus(string inputName);\n\n        /// <summary>\n        /// Triggers an action on a media input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the media input</param>\n        /// <param name=\"mediaAction\">Identifier of the `ObsMediaInputAction` enum</param>\n        void TriggerMediaInputAction(string inputName, string mediaAction);\n\n        /// <summary>\n        /// Gets the filename of the last replay buffer save file.\n        /// </summary>\n        /// <returns>File path of last replay</returns>\n        string GetLastReplayBufferReplay();\n\n        /// <summary>\n        /// Toggles pause on the record output.\n        /// </summary>\n        void ToggleRecordPause();\n\n        /// <summary>\n        /// Currently BROKEN in obs-websocket/obs-studio\n        /// Basically GetSceneItemList, but for groups.\n        /// Using groups at all in OBS is discouraged, as they are very broken under the hood.\n        /// Groups only\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the group to get the items of</param>\n        /// <returns>Array of scene items in the group</returns>\n        List<JObject> GetGroupSceneItemList(string sceneName);\n\n        /// <summary>\n        /// Searches a scene for a source, and returns its id.\\n\\nScenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene or group to search in</param>\n        /// <param name=\"sourceName\">Name of the source to find</param>\n        /// <param name=\"searchOffset\">Number of matches to skip during search. >= 0 means first forward. -1 means last (top) item</param>\n        /// <returns>Numeric ID of the scene item</returns>\n        int GetSceneItemId(string sceneName, string sourceName, int searchOffset);\n\n        /// <summary>\n        /// Gets the transform and crop info of a scene item.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <returns>Object containing scene item transform info</returns>\n        SceneItemTransformInfo GetSceneItemTransform(string sceneName, int sceneItemId);\n\n        /// <summary>\n        /// Gets the JObject of transform settings for a scene item. Use this one you don't want it populated with default values.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <returns>Object containing scene item transform info</returns>\n        JObject GetSceneItemTransformRaw(string sceneName, int sceneItemId);\n\n        /// <summary>\n        /// Gets the enable state of a scene item.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <returns>Whether the scene item is enabled. `true` for enabled, `false` for disabled</returns>\n        bool GetSceneItemEnabled(string sceneName, int sceneItemId);\n\n        /// <summary>\n        /// Gets the enable state of a scene item.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <param name=\"sceneItemEnabled\">New enable state of the scene item</param>\n        void SetSceneItemEnabled(string sceneName, int sceneItemId, bool sceneItemEnabled);\n\n        /// <summary>\n        /// Gets the lock state of a scene item.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <returns>Whether the scene item is locked. `true` for locked, `false` for unlocked</returns>\n        bool GetSceneItemLocked(string sceneName, int sceneItemId);\n\n        /// <summary>\n        /// Sets the lock state of a scene item.\n        /// Scenes and Group\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <param name=\"sceneItemLocked\">New lock state of the scene item</param>\n        void SetSceneItemLocked(string sceneName, int sceneItemId, bool sceneItemLocked);\n\n        /// <summary>\n        /// Gets the index position of a scene item in a scene.\n        /// An index of 0 is at the bottom of the source list in the UI.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <returns>Index position of the scene item</returns>\n        int GetSceneItemIndex(string sceneName, int sceneItemId);\n\n        /// <summary>\n        /// Sets the index position of a scene item in a scene.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <param name=\"sceneItemIndex\">New index position of the scene item</param>\n        void SetSceneItemIndex(string sceneName, int sceneItemId, int sceneItemIndex);\n\n        /// <summary>\n        /// Gets the blend mode of a scene item.\n        /// Blend modes:\n        /// - `OBS_BLEND_NORMAL`\n        /// - `OBS_BLEND_ADDITIVE`\n        /// - `OBS_BLEND_SUBTRACT`\n        /// - `OBS_BLEND_SCREEN`\n        /// - `OBS_BLEND_MULTIPLY`\n        /// - `OBS_BLEND_LIGHTEN`\n        /// - `OBS_BLEND_DARKEN`\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <returns>Current blend mode</returns>\n        string GetSceneItemBlendMode(string sceneName, int sceneItemId);\n\n        /// <summary>\n        /// Sets the blend mode of a scene item.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\"></param>\n        /// <param name=\"sceneItemId\"></param>\n        /// <param name=\"sceneItemBlendMode\"></param>\n        void SetSceneItemBlendMode(string sceneName, int sceneItemId, string sceneItemBlendMode);\n\n        /// <summary>\n        /// Gets an array of all groups in OBS.\n        /// Groups in OBS are actually scenes, but renamed and modified. In obs-websocket, we treat them as scenes where we can.\n        /// </summary>\n        /// <returns>Array of group names</returns>\n        List<string> GetGroupList();\n\n        /// <summary>\n        /// Removes a scene from OBS.\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to remove</param>\n        void RemoveScene(string sceneName);\n\n        /// <summary>\n        /// Sets the name of a scene (rename).\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to be renamed</param>\n        /// <param name=\"newSceneName\">New name for the scene</param>\n        void SetSceneName(string sceneName, string newSceneName);\n\n        /// <summary>\n        /// Gets a Base64-encoded screenshot of a source.\n        /// The `imageWidth` and `imageHeight` parameters are treated as \\\"scale to inner\\\", meaning the smallest ratio will be used and the aspect ratio of the original resolution is kept.\n        /// If `imageWidth` and `imageHeight` are not specified, the compressed image will use the full resolution of the source.\n        /// **Compatible with inputs and scenes.**\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source to take a screenshot of</param>\n        /// <param name=\"imageFormat\">Image compression format to use. Use `GetVersion` to get compatible image formats</param>\n        /// <param name=\"imageWidth\">Width to scale the screenshot to</param>\n        /// <param name=\"imageHeight\">Height to scale the screenshot to</param>\n        /// <param name=\"imageCompressionQuality\">Compression quality to use. 0 for high compression, 100 for uncompressed. -1 to use \\\"default\\\" (whatever that means, idk)</param>\n        /// <returns>Base64-encoded screenshot</returns>\n        string GetSourceScreenshot(string sourceName, string imageFormat, int imageWidth = -1, int imageHeight = -1, int imageCompressionQuality = -1);\n\n        /// <summary>\n        /// Gets an array of all available transition kinds.\n        /// Similar to `GetInputKindList`\n        /// </summary>\n        /// <returns>Array of transition kinds</returns>\n        List<string> GetTransitionKindList();\n\n        /// <summary>\n        /// Gets the cursor position of the current scene transition.\n        /// Note: `transitionCursor` will return 1.0 when the transition is inactive.\n        /// </summary>\n        /// <returns>Cursor position, between 0.0 and 1.0</returns>\n        double GetCurrentSceneTransitionCursor();\n\n        /// <summary>\n        /// Opens the properties dialog of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to open the dialog of</param>\n        void OpenInputPropertiesDialog(string inputName);\n\n        /// <summary>\n        /// Opens the filters dialog of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to open the dialog of</param>\n        void OpenInputFiltersDialog(string inputName);\n\n        /// <summary>\n        /// Opens the interact dialog of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to open the dialog of</param>\n        void OpenInputInteractDialog(string inputName);\n\n        /// <summary>\n        /// Gets a list of connected monitors and information about them.\n        /// </summary>\n        /// <returns>a list of detected monitors with some information</returns>\n        List<Monitor> GetMonitorList();\n\n        /// <summary>\n        /// Connect this instance to the specified URL, and authenticate (if needed) with the specified password.\n        /// NOTE: Please subscribe to the Connected/Disconnected events (or atlease check the IsConnected property) to determine when the connection is actually fully established\n        /// </summary>\n        /// <param name=\"url\">Server URL in standard URL format.</param>\n        /// <param name=\"password\">Server password</param>\n        [Obsolete(\"Please use ConnectAsync, this function will be removed in the next version\")]\n        void Connect(string url, string password);\n\n        /// <summary>\n        /// Connect this instance to the specified URL, and authenticate (if needed) with the specified password.\n        /// NOTE: Please subscribe to the Connected/Disconnected events (or atleast check the IsConnected property) to determine when the connection is actually fully established\n        /// </summary>\n        /// <param name=\"url\">Server URL in standard URL format.</param>\n        /// <param name=\"password\">Server password</param>\n        void ConnectAsync(string url, string password);\n\n        /// <summary>\n        /// Disconnect this instance from the server\n        /// </summary>\n        void Disconnect();\n\n        /// <summary>\n        /// Sends a message to the websocket API with the specified request type and optional parameters\n        /// </summary>\n        /// <param name=\"requestType\">obs-websocket request type, must be one specified in the protocol specification</param>\n        /// <param name=\"additionalFields\">additional JSON fields if required by the request type</param>\n        /// <returns>The server's JSON response as a JObject</returns>\n        JObject SendRequest(string requestType, JObject additionalFields = null);\n\n        /// <summary>\n        /// Request authentication data. You don't have to call this manually.\n        /// </summary>\n        /// <returns>Authentication data in an <see cref=\"OBSAuthInfo\"/> object</returns>\n        OBSAuthInfo GetAuthInfo();\n\n        #endregion\n\n        #region Events\n\n        /// <summary>\n        /// The current program scene has changed.\n        /// </summary>\n        event EventHandler<ProgramSceneChangedEventArgs> CurrentProgramSceneChanged;\n\n        /// <summary>\n        /// The list of scenes has changed.\n        /// TODO: Make OBS fire this event when scenes are reordered.\n        /// </summary>\n        event EventHandler<SceneListChangedEventArgs> SceneListChanged;\n\n        /// <summary>\n        /// Triggered when the scene item list of the specified scene is reordered\n        /// </summary>\n        event EventHandler<SceneItemListReindexedEventArgs> SceneItemListReindexed;\n\n        /// <summary>\n        /// Triggered when a new item is added to the item list of the specified scene\n        /// </summary>\n        event EventHandler<SceneItemCreatedEventArgs> SceneItemCreated;\n\n        /// <summary>\n        /// Triggered when an item is removed from the item list of the specified scene\n        /// </summary>\n        event EventHandler<SceneItemRemovedEventArgs> SceneItemRemoved;\n\n        /// <summary>\n        /// Triggered when the visibility of a scene item changes\n        /// </summary>\n        event EventHandler<SceneItemEnableStateChangedEventArgs> SceneItemEnableStateChanged;\n\n        /// <summary>\n        /// Triggered when the lock status of a scene item changes\n        /// </summary>\n        event EventHandler<SceneItemLockStateChangedEventArgs> SceneItemLockStateChanged;\n\n        /// <summary>\n        /// Triggered when switching to another scene collection\n        /// </summary>\n        event EventHandler<CurrentSceneCollectionChangedEventArgs> CurrentSceneCollectionChanged;\n\n        /// <summary>\n        /// Triggered when a scene collection is created, deleted or renamed\n        /// </summary>\n        event EventHandler<SceneCollectionListChangedEventArgs> SceneCollectionListChanged;\n\n        /// <summary>\n        /// Triggered when switching to another transition\n        /// </summary>\n        event EventHandler<CurrentSceneTransitionChangedEventArgs> CurrentSceneTransitionChanged;\n\n        /// <summary>\n        /// Triggered when the current transition duration is changed\n        /// </summary>\n        event EventHandler<CurrentSceneTransitionDurationChangedEventArgs> CurrentSceneTransitionDurationChanged;\n\n        /// <summary>\n        /// Triggered when a transition between two scenes starts. Followed by <see cref=\"OBSWebsocket.CurrentProgramSceneChanged\"/>\n        /// </summary>\n        event EventHandler<SceneTransitionStartedEventArgs> SceneTransitionStarted;\n\n        /// <summary>\n        /// Triggered when a transition (other than \"cut\") has ended. Please note that the from-scene field is not available in TransitionEnd\n        /// </summary>\n        event EventHandler<SceneTransitionEndedEventArgs> SceneTransitionEnded;\n\n        /// <summary>\n        /// Triggered when a stinger transition has finished playing its video\n        /// </summary>\n        event EventHandler<SceneTransitionVideoEndedEventArgs> SceneTransitionVideoEnded;\n\n        /// <summary>\n        /// Triggered when switching to another profile\n        /// </summary>\n        event EventHandler<CurrentProfileChangedEventArgs> CurrentProfileChanged;\n\n        /// <summary>\n        /// Triggered when a profile is created, imported, removed or renamed\n        /// </summary>\n        event EventHandler<ProfileListChangedEventArgs> ProfileListChanged;\n\n        /// <summary>\n        /// Triggered when the streaming output state changes\n        /// </summary>\n        event EventHandler<StreamStateChangedEventArgs> StreamStateChanged;\n\n        /// <summary>\n        /// Triggered when the recording output state changes\n        /// </summary>\n        event EventHandler<RecordStateChangedEventArgs> RecordStateChanged;\n\n        /// <summary>\n        /// Triggered when state of the replay buffer changes\n        /// </summary>\n        event EventHandler<ReplayBufferStateChangedEventArgs> ReplayBufferStateChanged;\n\n        /// <summary>\n        /// Triggered when the preview scene selection changes (Studio Mode only)\n        /// </summary>\n        event EventHandler<CurrentPreviewSceneChangedEventArgs> CurrentPreviewSceneChanged;\n\n        /// <summary>\n        /// Triggered when Studio Mode is turned on or off\n        /// </summary>\n        event EventHandler<StudioModeStateChangedEventArgs> StudioModeStateChanged;\n\n        /// <summary>\n        /// Triggered when OBS exits\n        /// </summary>\n        event EventHandler ExitStarted;\n\n        /// <summary>\n        /// Triggered when connected successfully to an obs-websocket server\n        /// </summary>\n        event EventHandler Connected;\n\n        /// <summary>\n        /// Triggered when disconnected from an obs-websocket server\n        /// </summary>\n        event EventHandler<ObsDisconnectionInfo> Disconnected;\n\n        /// <summary>\n        /// A scene item is selected in the UI\n        /// </summary>\n        event EventHandler<SceneItemSelectedEventArgs> SceneItemSelected;\n\n        /// <summary>\n        /// A scene item transform has changed\n        /// </summary>\n        event EventHandler<SceneItemTransformEventArgs> SceneItemTransformChanged;\n\n        /// <summary>\n        /// The audio sync offset of an input has changed\n        /// </summary>\n        event EventHandler<InputAudioSyncOffsetChangedEventArgs> InputAudioSyncOffsetChanged;\n\n        /// <summary>\n        /// A filter was added to a source\n        /// </summary>\n        event EventHandler<SourceFilterCreatedEventArgs> SourceFilterCreated;\n\n        /// <summary>\n        /// A filter was removed from a source\n        /// </summary>\n        event EventHandler<SourceFilterRemovedEventArgs> SourceFilterRemoved;\n\n        /// <summary>\n        /// Filters in a source have been reordered\n        /// </summary>\n        event EventHandler<SourceFilterListReindexedEventArgs> SourceFilterListReindexed;\n\n        /// <summary>\n        /// Triggered when the visibility of a filter has changed\n        /// </summary>\n        event EventHandler<SourceFilterEnableStateChangedEventArgs> SourceFilterEnableStateChanged;\n\n        /// <summary>\n        /// A source has been muted or unmuted\n        /// </summary>\n        event EventHandler<InputMuteStateChangedEventArgs> InputMuteStateChanged;\n\n        /// <summary>\n        /// The volume of a source has changed\n        /// </summary>\n        event EventHandler<InputVolumeChangedEventArgs> InputVolumeChanged;\n\n        /// <summary>\n        /// A custom broadcast message was received\n        /// </summary>\n        event EventHandler<VendorEventArgs> VendorEvent;\n\n        /// <summary>\n        /// These events are emitted by the OBS sources themselves. For example when the media file ends. The behavior depends on the type of media source being used.\n        /// </summary>\n        event EventHandler<MediaInputPlaybackEndedEventArgs> MediaInputPlaybackEnded;\n\n        /// <summary>\n        /// These events are emitted by the OBS sources themselves. For example when the media file starts playing. The behavior depends on the type of media source being used.\n        /// </summary>\n        event EventHandler<MediaInputPlaybackStartedEventArgs> MediaInputPlaybackStarted;\n\n        /// <summary>\n        /// This event is only emitted when something actively controls the media/VLC source. In other words, the source will never emit this on its own naturally.\n        /// </summary>\n        event EventHandler<MediaInputActionTriggeredEventArgs> MediaInputActionTriggered;\n\n        /// <summary>\n        /// The virtual cam state has changed.\n        /// </summary>\n        event EventHandler<VirtualcamStateChangedEventArgs> VirtualcamStateChanged;\n\n        /// <summary>\n        /// The current scene collection has begun changing.\n        /// </summary>\n        event EventHandler<CurrentSceneCollectionChangingEventArgs> CurrentSceneCollectionChanging;\n\n        /// <summary>\n        /// The current profile has begun changing.\n        /// </summary>\n        event EventHandler<CurrentProfileChangingEventArgs> CurrentProfileChanging;\n\n        /// <summary>\n        /// The name of a source filter has changed.\n        /// </summary>\n        event EventHandler<SourceFilterNameChangedEventArgs> SourceFilterNameChanged;\n\n        /// <summary>\n        /// An input has been created.\n        /// </summary>\n        event EventHandler<InputCreatedEventArgs> InputCreated;\n\n        /// <summary>\n        /// An input has been removed.\n        /// </summary>\n        event EventHandler<InputRemovedEventArgs> InputRemoved;\n\n        /// <summary>\n        /// The name of an input has changed.\n        /// </summary>\n        event EventHandler<InputNameChangedEventArgs> InputNameChanged;\n\n        /// <summary>\n        /// An input's active state has changed.\n        /// When an input is active, it means it's being shown by the program feed.\n        /// </summary>\n        event EventHandler<InputActiveStateChangedEventArgs> InputActiveStateChanged;\n\n        /// <summary>\n        /// An input's show state has changed.\n        /// When an input is showing, it means it's being shown by the preview or a dialog.\n        /// </summary>\n        event EventHandler<InputShowStateChangedEventArgs> InputShowStateChanged;\n\n        /// <summary>\n        /// The audio balance value of an input has changed.\n        /// </summary>\n        event EventHandler<InputAudioBalanceChangedEventArgs> InputAudioBalanceChanged;\n\n        /// <summary>\n        /// The audio tracks of an input have changed.\n        /// </summary>\n        event EventHandler<InputAudioTracksChangedEventArgs> InputAudioTracksChanged;\n\n        /// <summary>\n        /// The monitor type of an input has changed.\n        /// Available types are:\n        /// - `OBS_MONITORING_TYPE_NONE`\n        /// - `OBS_MONITORING_TYPE_MONITOR_ONLY`\n        /// - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`\n        /// </summary>\n        event EventHandler<InputAudioMonitorTypeChangedEventArgs> InputAudioMonitorTypeChanged;\n\n        /// <summary>\n        /// A high-volume event providing volume levels of all active inputs every 50 milliseconds.\n        /// </summary>\n        event EventHandler<InputVolumeMetersEventArgs> InputVolumeMeters;\n\n        /// <summary>\n        /// The replay buffer has been saved.\n        /// </summary>\n        event EventHandler<ReplayBufferSavedEventArgs> ReplayBufferSaved;\n\n        /// <summary>\n        /// A new scene has been created.\n        /// </summary>\n        event EventHandler<SceneCreatedEventArgs> SceneCreated;\n\n        /// <summary>\n        /// A scene has been removed.\n        /// </summary>\n        event EventHandler<SceneRemovedEventArgs> SceneRemoved;\n\n        /// <summary>\n        /// The name of a scene has changed.\n        /// </summary>\n        event EventHandler<SceneNameChangedEventArgs> SceneNameChanged;\n\n        #endregion\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/LICENSE.md",
    "content": "\nThe MIT License (MIT)\n\nCopyright (c) 2021 BarRaider\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"
  },
  {
    "path": "obs-websocket-dotnet/OBSWebsocket.cs",
    "content": "using System;\nusing System.Collections.Concurrent;\nusing System.Net.WebSockets;\nusing System.Security.Cryptography;\nusing System.Text;\nusing System.Threading.Tasks;\nusing Microsoft.Extensions.Logging;\nusing Microsoft.Extensions.Logging.Abstractions;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing OBSWebsocketDotNet.Communication;\nusing Websocket.Client;\n\nnamespace OBSWebsocketDotNet\n{\n    public partial class OBSWebsocket : IOBSWebsocket\n    {\n        #region Private Members\n        private const string WEBSOCKET_URL_PREFIX = \"ws://\";\n        private const int SUPPORTED_RPC_VERSION = 1;\n        private TimeSpan wsTimeout = TimeSpan.FromSeconds(10);\n        private string connectionPassword = null;\n        private WebsocketClient wsConnection;\n\n        private delegate void RequestCallback(OBSWebsocket sender, JObject body);\n        private readonly ConcurrentDictionary<string, TaskCompletionSource<JObject>> responseHandlers;\n\n        // Random should never be created inside a function\n        private static readonly Random random = new Random();\n\n        #endregion\n\n        /// <summary>\n        /// WebSocket request timeout, represented as a TimeSpan object\n        /// </summary>\n        public TimeSpan WSTimeout\n        {\n            get\n            {\n                return wsConnection?.ReconnectTimeout ?? wsTimeout;\n            }\n            set\n            {\n                wsTimeout = value;\n\n                if (wsConnection != null)\n                {\n                    wsConnection.ReconnectTimeout = wsTimeout;\n                }\n            }\n        }\n      \n        /// <summary>\n        /// Current connection state\n        /// </summary>\n        public bool IsConnected\n        {\n            get\n            {\n                return (wsConnection != null && wsConnection.IsRunning);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the logger for this instance\n        /// </summary>\n        public ILogger<OBSWebsocket> Logger { get; set; } = NullLogger<OBSWebsocket>.Instance;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        public OBSWebsocket()\n        {\n            responseHandlers = new ConcurrentDictionary<string, TaskCompletionSource<JObject>>();\n        }\n\n        /// <summary>\n        /// Connect this instance to the specified URL, and authenticate (if needed) with the specified password.\n        /// NOTE: Please subscribe to the Connected/Disconnected events (or atleast check the IsConnected property) to determine when the connection is actually fully established\n        /// </summary>\n        /// <param name=\"url\">Server URL in standard URL format.</param>\n        /// <param name=\"password\">Server password</param>\n        [Obsolete(\"Please use ConnectAsync, this function will be removed in the next version\")]\n        public void Connect(string url, string password)\n        {\n            ConnectAsync(url, password);\n        }\n\n        /// <summary>\n        /// Connect this instance to the specified URL, and authenticate (if needed) with the specified password.\n        /// NOTE: Please subscribe to the Connected/Disconnected events (or atleast check the IsConnected property) to determine when the connection is actually fully established\n        /// </summary>\n        /// <param name=\"url\">Server URL in standard URL format.</param>\n        /// <param name=\"password\">Server password</param>\n        public void ConnectAsync(string url, string password)\n        {\n            if (!url.ToLower().StartsWith(WEBSOCKET_URL_PREFIX))\n            {\n                throw new ArgumentException($\"Invalid url, must start with '{WEBSOCKET_URL_PREFIX}'\");\n            }\n\n            if (wsConnection != null && wsConnection.IsRunning)\n            {\n                Disconnect();\n            }\n\n            wsConnection = new WebsocketClient(new Uri(url));\n            wsConnection.IsReconnectionEnabled = false;\n            wsConnection.ReconnectTimeout = null;\n            wsConnection.ErrorReconnectTimeout = null;\n            wsConnection.MessageReceived.Subscribe(m => Task.Run(() => WebsocketMessageHandler(this, m)));\n            wsConnection.DisconnectionHappened.Subscribe(d => Task.Run(() => OnWebsocketDisconnect(this, d)));\n\n            connectionPassword = password;\n            wsConnection.StartOrFail();\n        }\n\n        /// <summary>\n        /// Disconnect this instance from the server\n        /// </summary>\n        public void Disconnect()\n        {\n            connectionPassword = null;\n            if (wsConnection != null)\n            {\n                // Attempt to both close and dispose the existing connection\n                try\n                {\n                    wsConnection.Stop(WebSocketCloseStatus.NormalClosure, \"User requested disconnect\");\n                    ((IDisposable)wsConnection).Dispose();\n                }\n                catch { }\n                wsConnection = null;\n            }\n\n            var unusedHandlers = responseHandlers.ToArray();\n            responseHandlers.Clear();\n            foreach (var cb in unusedHandlers)\n            {\n                var tcs = cb.Value;\n                tcs.TrySetCanceled();\n            }\n        }\n\n        // This callback handles a websocket disconnection\n        private void OnWebsocketDisconnect(object sender, DisconnectionInfo d)\n        {\n            if (d == null || d.CloseStatus == null)\n            {\n                Disconnected?.Invoke(sender, new ObsDisconnectionInfo(ObsCloseCodes.UnknownReason, null, d));\n            }\n            else\n            {\n                Disconnected?.Invoke(sender, new ObsDisconnectionInfo((ObsCloseCodes)d.CloseStatus, d.CloseStatusDescription, d));\n            }\n        }\n\n        // This callback handles incoming JSON messages and determines if it's\n        // a request response or an event (\"Update\" in obs-websocket terminology)\n        private void WebsocketMessageHandler(object sender, ResponseMessage e)\n        {\n            if (e.MessageType != WebSocketMessageType.Text)\n            {\n                return;\n            }\n\n            ServerMessage msg = JsonConvert.DeserializeObject<ServerMessage>(e.Text);\n            JObject body = msg.Data;\n\n            switch (msg.OperationCode)\n            {\n                case MessageTypes.Hello:\n                    // First message received after connection, this may ask us for authentication\n                    HandleHello(body);\n                    break;\n                case MessageTypes.Identified:\n                    Task.Run(() => Connected?.Invoke(this, EventArgs.Empty));\n                    break;\n                case MessageTypes.RequestResponse:\n                case MessageTypes.RequestBatchResponse:\n                    // Handle response to previous request\n                    if (body.ContainsKey(\"requestId\"))\n                    {\n                        // Handle a request :\n                        // Find the response handler based on\n                        // its associated message ID\n                        string msgID = (string)body[\"requestId\"];\n\n                        if (responseHandlers.TryRemove(msgID, out TaskCompletionSource<JObject> handler))\n                        {\n                            // Set the response body as Result and notify the request sender\n                            handler.SetResult(body);\n                        }\n                    }\n                    break;\n                case MessageTypes.Event:\n                    // Handle events\n                    string eventType = body[\"eventType\"].ToString();\n                    Task.Run(() => { ProcessEventType(eventType, body); });\n                    break;\n                default:\n                    // Unsupported message type\n                    Logger?.LogWarning($\"Unsupported message type: {msg.OperationCode}\");\n                    UnsupportedEvent?.Invoke(this, new Types.Events.UnsupportedEventArgs(msg.OperationCode.ToString(), body));\n                    break;\n\n            }\n        }\n\n        /// <summary>\n        /// Sends a message to the websocket API with the specified request type and optional parameters\n        /// </summary>\n        /// <param name=\"requestType\">obs-websocket request type, must be one specified in the protocol specification</param>\n        /// <param name=\"additionalFields\">additional JSON fields if required by the request type</param>\n        /// <returns>The server's JSON response as a JObject</returns>\n        public JObject SendRequest(string requestType, JObject additionalFields = null)\n        {\n            return SendRequest(MessageTypes.Request, requestType, additionalFields, true);\n        }\n\n        /// <summary>\n        /// Internal version which allows to set the opcode\n        /// Sends a message to the websocket API with the specified request type and optional parameters\n        /// </summary>\n        /// <param name=\"operationCode\">Type/OpCode for this messaage</param>\n        /// <param name=\"requestType\">obs-websocket request type, must be one specified in the protocol specification</param>\n        /// <param name=\"additionalFields\">additional JSON fields if required by the request type</param>\n        /// <param name=\"waitForReply\">Should wait for reply vs \"fire and forget\"</param>\n        /// <returns>The server's JSON response as a JObject</returns>\n        internal JObject SendRequest(MessageTypes operationCode, string requestType, JObject additionalFields = null, bool waitForReply = true)\n        {\n            if (wsConnection == null)\n            {\n                throw new NullReferenceException(\"Websocket is not initialized\");\n            }\n\n            // Prepare the asynchronous response handler\n            var tcs = new TaskCompletionSource<JObject>();\n            JObject message = null;\n            do\n            {\n                // Generate a random message id\n                message = MessageFactory.BuildMessage(operationCode, requestType, additionalFields, out string messageId);\n                if (!waitForReply || responseHandlers.TryAdd(messageId, tcs))\n                {\n                    break;\n                }\n                // Message id already exists, retry with a new one.\n            } while (true);\n            // Send the message \n            wsConnection.Send(message.ToString());\n            if (!waitForReply)\n            {\n                return null;\n            }\n\n            // Wait for a response (received and notified by the websocket response handler)\n            tcs.Task.Wait(wsTimeout.Milliseconds);\n\n            if (tcs.Task.IsCanceled)\n                throw new ErrorResponseException(\"Request canceled\", 0);\n\n            // Throw an exception if the server returned an error.\n            // An error occurs if authentication fails or one if the request body is invalid.\n            var result = tcs.Task.Result;\n\n            if (!(bool)result[\"requestStatus\"][\"result\"])\n            {\n                var status = (JObject)result[\"requestStatus\"];\n                throw new ErrorResponseException($\"ErrorCode: {status[\"code\"]}{(status.ContainsKey(\"comment\") ? $\", Comment: {status[\"comment\"]}\" : \"\")}\", (int)status[\"code\"]);\n            }\n\n            if (result.ContainsKey(\"responseData\")) // ResponseData is optional\n                return result[\"responseData\"].ToObject<JObject>();\n\n            return new JObject();\n        }\n\n        /// <summary>\n        /// Request authentication data. You don't have to call this manually.\n        /// </summary>\n        /// <returns>Authentication data in an <see cref=\"OBSAuthInfo\"/> object</returns>\n        public OBSAuthInfo GetAuthInfo()\n        {\n            JObject response = SendRequest(\"GetAuthRequired\");\n            return new OBSAuthInfo(response);\n        }\n\n        /// <summary>\n        /// Authenticates to the Websocket server using the challenge and salt given in the passed <see cref=\"OBSAuthInfo\"/> object\n        /// </summary>\n        /// <param name=\"password\">User password</param>\n        /// <param name=\"authInfo\">Authentication data</param>\n        /// <returns>true if authentication succeeds, false otherwise</returns>\n        protected void SendIdentify(string password, OBSAuthInfo authInfo = null)\n        {\n            var requestFields = new JObject\n            {\n                { \"rpcVersion\", SUPPORTED_RPC_VERSION }\n            };\n\n            if (authInfo != null)\n            {\n                // Authorization required\n\n                string secret = HashEncode(password + authInfo.PasswordSalt);\n                string authResponse = HashEncode(secret + authInfo.Challenge);\n                requestFields.Add(\"authentication\", authResponse);\n            }\n\n            SendRequest(MessageTypes.Identify, null, requestFields, false);\n        }\n\n        /// <summary>\n        /// Encode a Base64-encoded SHA-256 hash\n        /// </summary>\n        /// <param name=\"input\">source string</param>\n        /// <returns></returns>\n        protected string HashEncode(string input)\n        {\n            using var sha256 = new SHA256Managed();\n\n            byte[] textBytes = Encoding.ASCII.GetBytes(input);\n            byte[] hash = sha256.ComputeHash(textBytes);\n\n            return System.Convert.ToBase64String(hash);\n        }\n\n        /// <summary>\n        /// Generate a message ID\n        /// </summary>\n        /// <param name=\"length\">(optional) message ID length</param>\n        /// <returns>A random string of alphanumerical characters</returns>\n        protected string NewMessageID(int length = 16)\n        {\n            const string pool = \"abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\n            string result = \"\";\n            for (int i = 0; i < length; i++)\n            {\n                int index = random.Next(0, pool.Length - 1);\n                result += pool[index];\n            }\n\n            return result;\n        }\n\n        private void HandleHello(JObject payload)\n        {\n            if (!wsConnection.IsStarted)\n            {\n                return;\n            }\n\n            OBSAuthInfo authInfo = null;\n            if (payload.ContainsKey(\"authentication\"))\n            {\n                // Authentication required\n                authInfo = new OBSAuthInfo((JObject)payload[\"authentication\"]);\n            }\n\n            SendIdentify(connectionPassword, authInfo);\n\n            connectionPassword = null;\n        }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/OBSWebsocket_Requests.cs",
    "content": "﻿using Microsoft.Extensions.Logging;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing OBSWebsocketDotNet.Types;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Net.NetworkInformation;\n\nnamespace OBSWebsocketDotNet\n{\n    /// <summary>\n    /// Instance of a connection with an obs-websocket server\n    /// </summary>\n    public partial class OBSWebsocket\n    {\n        #region Private Constants\n\n        private const string REQUEST_FIELD_VOLUME_DB = \"inputVolumeDb\";\n        private const string REQUEST_FIELD_VOLUME_MUL = \"inputVolumeMul\";\n        private const string RESPONSE_FIELD_IMAGE_DATA = \"imageData\";\n\n        #endregion\n\n        /// <summary>\n        /// Get basic OBS video information\n        /// </summary>\n        public ObsVideoSettings GetVideoSettings()\n        {\n            JObject response = SendRequest(nameof(GetVideoSettings));\n            return JsonConvert.DeserializeObject<ObsVideoSettings>(response.ToString());\n        }\n\n        /// <summary>\n        /// Saves a screenshot of a source to the filesystem.\n        /// The `imageWidth` and `imageHeight` parameters are treated as \\\"scale to inner\\\", meaning the smallest ratio will be used and the aspect ratio of the original resolution is kept.\n        /// If `imageWidth` and `imageHeight` are not specified, the compressed image will use the full resolution of the source.\n        /// **Compatible with inputs and scenes.**\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source to take a screenshot of</param>\n        /// <param name=\"imageFormat\">Image compression format to use. Use `GetVersion` to get compatible image formats</param>\n        /// <param name=\"imageFilePath\">Path to save the screenshot file to. Eg. `C:\\\\Users\\\\user\\\\Desktop\\\\screenshot.png`</param>\n        /// <param name=\"imageWidth\">Width to scale the screenshot to</param>\n        /// <param name=\"imageHeight\">Height to scale the screenshot to</param>\n        /// <param name=\"imageCompressionQuality\">Compression quality to use. 0 for high compression, 100 for uncompressed. -1 to use \\\"default\\\" (whatever that means, idk)</param>\n        /// <returns>Base64-encoded screenshot string</returns>\n        public string SaveSourceScreenshot(string sourceName, string imageFormat, string imageFilePath, int imageWidth = -1, int imageHeight = -1, int imageCompressionQuality = -1)\n        {\n            var request = new JObject\n            {\n                { nameof(sourceName), sourceName },\n                { nameof(imageFormat), imageFormat },\n                { nameof(imageFilePath), imageFilePath }\n            };\n\n            if (imageWidth > -1)\n            {\n                request.Add(nameof(imageWidth), imageWidth);\n            }\n            if (imageHeight > -1)\n            {\n                request.Add(nameof(imageHeight), imageHeight);\n            }\n            if (imageCompressionQuality > -1)\n            {\n                request.Add(nameof(imageCompressionQuality), imageCompressionQuality);\n            }\n\n            var response = SendRequest(nameof(SaveSourceScreenshot), request);\n            return (string)response[\"imageData\"];\n        }\n\n        /// <summary>\n        /// Saves a screenshot of a source to the filesystem.\n        /// The `imageWidth` and `imageHeight` parameters are treated as \\\"scale to inner\\\", meaning the smallest ratio will be used and the aspect ratio of the original resolution is kept.\n        /// If `imageWidth` and `imageHeight` are not specified, the compressed image will use the full resolution of the source.\n        /// **Compatible with inputs and scenes.**\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source to take a screenshot of</param>\n        /// <param name=\"imageFormat\">Image compression format to use. Use `GetVersion` to get compatible image formats</param>\n        /// <param name=\"imageFilePath\">Path to save the screenshot file to. Eg. `C:\\\\Users\\\\user\\\\Desktop\\\\screenshot.png`</param>\n        /// <returns>Base64-encoded screenshot string</returns>\n        public string SaveSourceScreenshot(string sourceName, string imageFormat, string imageFilePath)\n        {\n            return SaveSourceScreenshot(sourceName, imageFormat, imageFilePath, -1, -1);\n        }\n\n        /// <summary>\n        /// Executes hotkey routine, identified by hotkey unique name\n        /// </summary>\n        /// <param name=\"hotkeyName\">Unique name of the hotkey, as defined when registering the hotkey (e.g. \"ReplayBuffer.Save\")</param>\n        public void TriggerHotkeyByName(string hotkeyName)\n        {\n            var request = new JObject\n            {\n                { nameof(hotkeyName), hotkeyName }\n            };\n\n            SendRequest(nameof(TriggerHotkeyByName), request);\n        }\n\n        /// <summary>\n        /// Triggers a hotkey using a sequence of keys.\n        /// </summary>\n        /// <param name=\"keyId\">Main key identifier (e.g. OBS_KEY_A for key \"A\"). Available identifiers are here: https://github.com/obsproject/obs-studio/blob/master/libobs/obs-hotkeys.h</param>\n        /// <param name=\"keyModifier\">Optional key modifiers object. You can combine multiple key operators. e.g. KeyModifier.Shift | KeyModifier.Control</param>\n        public void TriggerHotkeyByKeySequence(OBSHotkey keyId, KeyModifier keyModifier = KeyModifier.None)\n        {\n            var request = new JObject\n            {\n                { nameof(keyId), keyId.ToString() },\n                { \"keyModifiers\", new JObject{\n                    { \"shift\", (keyModifier & KeyModifier.Shift) == KeyModifier.Shift },\n                    { \"alt\", (keyModifier & KeyModifier.Alt) == KeyModifier.Alt },\n                    { \"control\", (keyModifier & KeyModifier.Control) == KeyModifier.Control },\n                    { \"command\", (keyModifier & KeyModifier.Command) == KeyModifier.Command } } \n                }\n            };\n\n            SendRequest(nameof(TriggerHotkeyByKeySequence), request);\n        }\n\n        /// <summary>\n        /// Get the name of the currently active scene. \n        /// </summary>\n        /// <returns>Name of the current scene</returns>\n        public string GetCurrentProgramScene()\n        {\n            JObject response = SendRequest(nameof(GetCurrentProgramScene));\n            return (string)response[\"currentProgramSceneName\"];\n        }\n\n        /// <summary>\n        /// Set the current scene to the specified one\n        /// </summary>\n        /// <param name=\"sceneName\">The desired scene name</param>\n        public void SetCurrentProgramScene(string sceneName)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName }\n            };\n\n            SendRequest(nameof(SetCurrentProgramScene), request);\n        }\n\n        /// <summary>\n        /// Get OBS stats (almost the same info as provided in OBS' stats window)\n        /// </summary>\n        public ObsStats GetStats()\n        {\n            JObject response = SendRequest(nameof(GetStats));\n            return JsonConvert.DeserializeObject<ObsStats>(response.ToString());\n        }\n\n        /// <summary>\n        /// List every available scene\n        /// </summary>\n        /// <returns>A <see cref=\"List{SceneBasicInfo}\" /> of <see cref=\"SceneBasicInfo\"/> objects describing each scene</returns>\n        public List<SceneBasicInfo> ListScenes()\n        {\n            var response = GetSceneList();\n            return response.Scenes;\n        }\n\n        /// <summary>\n        /// Get a list of scenes in the currently active profile\n        /// </summary>\n        public GetSceneListInfo GetSceneList()\n        {\n            JObject response = SendRequest(nameof(GetSceneList));\n            return JsonConvert.DeserializeObject<GetSceneListInfo>(response.ToString());\n        }\n\n        /// <summary>\n        /// Get the specified scene's transition override info\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to return the override info</param>\n        /// <returns>TransitionOverrideInfo</returns>\n        public TransitionOverrideInfo GetSceneSceneTransitionOverride(string sceneName)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName }\n            };\n\n            JObject response = SendRequest(nameof(GetSceneSceneTransitionOverride), request);\n            return response.ToObject<TransitionOverrideInfo>();\n        }\n\n        /// <summary>\n        /// Set specific transition override for a scene\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to set the transition override</param>\n        /// <param name=\"transitionName\">Name of the transition to use</param>\n        /// <param name=\"transitionDuration\">Duration in milliseconds of the transition if transition is not fixed. Defaults to the current duration specified in the UI if there is no current override and this value is not given</param>\n        public void SetSceneSceneTransitionOverride(string sceneName, string transitionName, int transitionDuration = -1)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(transitionName), transitionName }\n            };\n\n            if (transitionDuration >= 0)\n            {\n                request.Add(nameof(transitionDuration), transitionDuration);\n            }\n\n            SendRequest(nameof(SetSceneSceneTransitionOverride), request);\n        }\n\n        /// <summary>\n        /// If your code needs to perform multiple successive T-Bar moves (e.g. : in an animation, or in response to a user moving a T-Bar control in your User Interface), set release to false and call ReleaseTBar later once the animation/interaction is over.\n        /// </summary>\n        /// <param name=\"position\">\tT-Bar position. This value must be between 0.0 and 1.0.</param>\n        /// <param name=\"release\">Whether or not the T-Bar gets released automatically after setting its new position (like a user releasing their mouse button after moving the T-Bar). Call ReleaseTBar manually if you set release to false. Defaults to true.</param>\n        public void SetTBarPosition(double position, bool release = true)\n        {\n            if (position < 0.0 || position > 1.0)\n            {\n                throw new ArgumentOutOfRangeException(nameof(position));\n            }\n\n            var request = new JObject\n            {\n                { nameof(position), position },\n                { nameof(release), release}\n            };\n\n            SendRequest(nameof(SetTBarPosition), request);\n        }\n\n        /// <summary>\n        /// Apply settings to a source filter\n        /// </summary>\n        /// <param name=\"sourceName\">Source with filter</param>\n        /// <param name=\"filterName\">Filter name</param>\n        /// <param name=\"filterSettings\">JObject with filter settings</param>\n        /// <param name=\"overlay\">Apply over existing settings?</param>\n        public void SetSourceFilterSettings(string sourceName, string filterName, JObject filterSettings, bool overlay = false)\n        {\n            var request = new JObject\n            {\n                { nameof(sourceName), sourceName },\n                { nameof(filterName), filterName },\n                { nameof(filterSettings), filterSettings },\n                { nameof(overlay), overlay }\n            };\n\n            SendRequest(nameof(SetSourceFilterSettings), request);\n        }\n\n        /// <summary>\n        /// Apply settings to a source filter\n        /// </summary>\n        /// <param name=\"sourceName\">Source with filter</param>\n        /// <param name=\"filterName\">Filter name</param>\n        /// <param name=\"filterSettings\">Filter settings</param>\n        /// <param name=\"overlay\">Apply over existing settings?</param>\n        public void SetSourceFilterSettings(string sourceName, string filterName, FilterSettings filterSettings, bool overlay = false)\n        {\n            SetSourceFilterSettings(sourceName, filterName, JObject.FromObject(filterSettings), overlay);\n        }\n\n\n\n        /// <summary>\n        /// Modify the Source Filter's visibility\n        /// </summary>\n        /// <param name=\"sourceName\">Source name</param>\n        /// <param name=\"filterName\">Source filter name</param>\n        /// <param name=\"filterEnabled\">New filter state</param>\n        public void SetSourceFilterEnabled(string sourceName, string filterName, bool filterEnabled)\n        {\n            var request = new JObject\n            {\n                { nameof(sourceName), sourceName },\n                { nameof(filterName), filterName },\n                { nameof(filterEnabled), filterEnabled }\n            };\n\n            SendRequest(nameof(SetSourceFilterEnabled), request);\n        }\n\n        /// <summary>\n        /// Return a list of all filters on a source\n        /// </summary>\n        /// <param name=\"sourceName\">Source name</param>\n        public List<FilterSettings> GetSourceFilterList(string sourceName)\n        {\n            var request = new JObject\n            {\n                { nameof(sourceName), sourceName }\n            };\n\n            JObject response = SendRequest(nameof(GetSourceFilterList), request);\n            if (!response.HasValues)\n            {\n                return new List<FilterSettings>();\n            }\n\n            return JsonConvert.DeserializeObject<List<FilterSettings>>(response[\"filters\"].ToString());\n        }\n\n        /// <summary>\n        /// Return a list of settings for a specific filter\n        /// </summary>\n        /// <param name=\"sourceName\">Source name</param>\n        /// <param name=\"filterName\">Filter name</param>\n        public FilterSettings GetSourceFilter(string sourceName, string filterName)\n        {\n            var request = new JObject\n            {\n                { nameof(sourceName), sourceName },\n                { nameof(filterName), filterName }\n            };\n\n            JObject response = SendRequest(nameof(GetSourceFilter), request);\n            return JsonConvert.DeserializeObject<FilterSettings>(response.ToString());\n        }\n\n        /// <summary>\n        /// Remove the filter from a source\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source the filter is on</param>\n        /// <param name=\"filterName\">Name of the filter to remove</param>\n        public bool RemoveSourceFilter(string sourceName, string filterName)\n        {\n            var request = new JObject\n            {\n                { nameof(sourceName), sourceName },\n                { nameof(filterName), filterName }\n            };\n            try\n            {\n                SendRequest(nameof(RemoveSourceFilter), request);\n                return true;\n            }\n            catch (Exception e)\n            {\n                //TODO exception handling\n                Logger?.LogError(e, \"Error removing filter\");\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// Add a filter to a source\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source for the filter</param>\n        /// <param name=\"filterName\">Name of the filter</param>\n        /// <param name=\"filterKind\">Type of filter</param>\n        /// <param name=\"filterSettings\">JObject holding filter settings object</param>\n        public void CreateSourceFilter(string sourceName, string filterName, string filterKind, JObject filterSettings)\n        {\n            var request = new JObject\n            {\n                { nameof(sourceName), sourceName },\n                { nameof(filterName), filterName },\n                { nameof(filterKind), filterKind },\n                { nameof(filterSettings), filterSettings }\n            };\n\n            SendRequest(nameof(CreateSourceFilter), request);\n        }\n\n        /// <summary>\n        /// Add a filter to a source\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source for the filter</param>\n        /// <param name=\"filterName\">Name of the filter</param>\n        /// <param name=\"filterKind\">Type of filter</param>\n        /// <param name=\"filterSettings\">Filter settings object</param>\n        public void CreateSourceFilter(string sourceName, string filterName, string filterKind, FilterSettings filterSettings)\n        {\n            CreateSourceFilter(sourceName, filterName, filterKind, JObject.FromObject(filterSettings));\n        }\n\n        /// <summary>\n        /// Toggles the status of the stream output.\n        /// </summary>\n        /// <returns>New state of the stream output</returns>\n        public bool ToggleStream()\n        {\n            var response = SendRequest(nameof(ToggleStream));\n            return (bool)response[\"outputActive\"];\n        }\n\n        /// <summary>\n        /// Toggles the status of the record output.\n        /// </summary>\n        public void ToggleRecord()\n        {\n            SendRequest(nameof(ToggleRecord));\n        }\n\n        /// <summary>\n        /// Gets the status of the stream output\n        /// </summary>\n        /// <returns>An <see cref=\"OutputStatus\"/> object describing the current outputs states</returns>\n        public OutputStatus GetStreamStatus()\n        {\n            var response = SendRequest(nameof(GetStreamStatus));\n            var outputStatus = new OutputStatus(response);\n            return outputStatus;\n        }\n\n        /// <summary>\n        /// Get the current transition name and duration\n        /// </summary>\n        /// <returns>An <see cref=\"TransitionSettings\"/> object with the current transition name and duration</returns>\n        public TransitionSettings GetCurrentSceneTransition()\n        {\n            var response = SendRequest(nameof(GetCurrentSceneTransition));\n            return new TransitionSettings(response);\n        }\n\n        /// <summary>\n        /// Set the current transition to the specified one\n        /// </summary>\n        /// <param name=\"transitionName\">Desired transition name</param>\n        public void SetCurrentSceneTransition(string transitionName)\n        {\n            var request = new JObject\n            {\n                { nameof(transitionName), transitionName }\n            };\n\n            SendRequest(nameof(SetCurrentSceneTransition), request);\n        }\n\n        /// <summary>\n        /// Change the transition's duration\n        /// </summary>\n        /// <param name=\"transitionDuration\">Desired transition duration (in milliseconds)</param>\n        public void SetCurrentSceneTransitionDuration(int transitionDuration)\n        {\n            var request = new JObject\n            {\n                { nameof(transitionDuration), transitionDuration }\n            };\n\n            SendRequest(nameof(SetCurrentSceneTransitionDuration), request);\n        }\n\n        /// <summary>\n        /// Change the current settings of a transition\n        /// </summary>\n        /// <param name=\"transitionSettings\">Transition settings (they can be partial)</param>\n        /// <param name=\"overlay\">Whether to overlay over the current settins or replace them</param>\n        /// <returns>Updated transition settings</returns>\n        public void SetCurrentSceneTransitionSettings(JObject transitionSettings, bool overlay)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(transitionSettings), JToken.FromObject(transitionSettings)},\n                { nameof(overlay), overlay }\n            };\n\n            var response = SendRequest(nameof(SetCurrentSceneTransitionSettings), requestFields);\n        }\n\n        /// <summary>\n        /// Change the volume of the specified source\n        /// </summary>\n        /// <param name=\"inputName\">Name of the source which volume will be changed</param>\n        /// <param name=\"inputVolume\">Desired volume. Must be between `0.0` and `1.0` for amplitude/mul (useDecibel is false), and under 0.0 for dB (useDecibel is true). Note: OBS will interpret dB values under -100.0 as Inf.</param>\n        /// <param name=\"inputVolumeDb\">Interperet `volume` data as decibels instead of amplitude/mul.</param>\n        public void SetInputVolume(string inputName, float inputVolume, bool inputVolumeDb = false)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n\n            if (inputVolumeDb)\n            {\n                requestFields.Add(REQUEST_FIELD_VOLUME_DB, inputVolume);\n            }\n            else\n            {\n                requestFields.Add(REQUEST_FIELD_VOLUME_MUL, inputVolume);\n            }\n\n            SendRequest(nameof(SetInputVolume), requestFields);\n        }\n\n        /// <summary>\n        /// Get the volume of the specified source\n        /// Volume is between `0.0` and `1.0` if using amplitude/mul (useDecibel is false), under `0.0` if using dB (useDecibel is true).\n        /// </summary>\n        /// <param name=\"inputName\">Source name</param>\n        /// <returns>An <see cref=\"VolumeInfo\"/>Object containing the volume and mute state of the specified source.</returns>\n        public VolumeInfo GetInputVolume(string inputName)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n\n            var response = SendRequest(nameof(GetInputVolume), request);\n            return new VolumeInfo(response);\n        }\n\n        /// <summary>\n        /// Gets the audio mute state of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of input to get the mute state of</param>\n        /// <returns>Whether the input is muted</returns>\n        public bool GetInputMute(string inputName)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n\n            var response = SendRequest(nameof(GetInputMute), requestFields);\n            return (bool)response[\"inputMuted\"];\n        }\n\n        /// <summary>\n        /// Set the mute state of the specified source\n        /// </summary>\n        /// <param name=\"inputName\">Name of the source which mute state will be changed</param>\n        /// <param name=\"inputMuted\">Desired mute state</param>\n        public void SetInputMute(string inputName, bool inputMuted)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(inputName), inputName },\n                { nameof(inputMuted), inputMuted }\n            };\n\n            SendRequest(nameof(SetInputMute), requestFields);\n        }\n\n        /// <summary>\n        /// Toggle the mute state of the specified source\n        /// </summary>\n        /// <param name=\"inputName\">Name of the source which mute state will be toggled</param>\n        public void ToggleInputMute(string inputName)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n\n            SendRequest(nameof(ToggleInputMute), requestFields);\n        }\n\n        /// <summary>\n        /// Sets the transform and crop info of a scene item\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene that has the SceneItem</param>\n        /// <param name=\"sceneItemId\">Id of the Scene Item</param>\n        /// <param name=\"sceneItemTransform\">JObject holding transform settings</param>\n        public void SetSceneItemTransform(string sceneName, int sceneItemId, JObject sceneItemTransform)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sceneItemId), sceneItemId },\n                { nameof(sceneItemTransform), sceneItemTransform }\n            };\n\n            SendRequest(nameof(SetSceneItemTransform), requestFields);\n        }\n\n        /// <summary>\n        /// Sets the transform and crop info of a scene item\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene that has the SceneItem</param>\n        /// <param name=\"sceneItemId\">Id of the Scene Item</param>\n        /// <param name=\"sceneItemTransform\">Transform settings</param>\n        public void SetSceneItemTransform(string sceneName, int sceneItemId, SceneItemTransformInfo sceneItemTransform)\n        {\n            SetSceneItemTransform(sceneName, sceneItemId, JObject.FromObject(sceneItemTransform));\n        }\n\n        /// <summary>\n        /// Set the current scene collection to the specified one\n        /// </summary>\n        /// <param name=\"sceneCollectionName\">Desired scene collection name</param>\n        public void SetCurrentSceneCollection(string sceneCollectionName)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(sceneCollectionName), sceneCollectionName }\n            };\n\n            SendRequest(nameof(SetCurrentSceneCollection), requestFields);\n        }\n\n        /// <summary>\n        /// Get the name of the current scene collection\n        /// </summary>\n        /// <returns>Name of the current scene collection</returns>\n        public string GetCurrentSceneCollection()\n        {\n            var response = SendRequest(nameof(GetSceneCollectionList));\n            var currentCollectionName = response[\"currentSceneCollectionName\"];\n            return (string)currentCollectionName;\n        }\n\n        /// <summary>\n        /// List all scene collections\n        /// </summary>\n        /// <returns>A <see cref=\"List{T}\"/> of the names of all scene collections</returns>\n        public List<string> GetSceneCollectionList()\n        {\n            var response = SendRequest(nameof(GetSceneCollectionList));\n            return JsonConvert.DeserializeObject<List<string>>(response[\"sceneCollections\"].ToString());\n        }\n\n        /// <summary>\n        /// Set the current profile to the specified one\n        /// </summary>\n        /// <param name=\"profileName\">Name of the desired profile</param>\n        public void SetCurrentProfile(string profileName)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(profileName), profileName }\n            };\n\n            SendRequest(nameof(SetCurrentProfile), requestFields);\n        }\n\n        /// <summary>\n        /// List all profiles\n        /// </summary>\n        /// <returns>A <see cref=\"List{T}\"/> of the names of all profiles</returns>\n        public GetProfileListInfo GetProfileList()\n        {\n            var response = SendRequest(nameof(GetProfileList));\n            return JsonConvert.DeserializeObject<GetProfileListInfo>(response.ToString());\n        }\n\n        /// <summary>\n        /// Start streaming. Will trigger an error if streaming is already active\n        /// </summary>\n        public void StartStream()\n        {\n            SendRequest(nameof(StartStream));\n        }\n\n        /// <summary>\n        /// Stop streaming. Will trigger an error if streaming is not active.\n        /// </summary>\n        public void StopStream()\n        {\n            SendRequest(nameof(StopStream));\n        }\n\n        /// <summary>\n        /// Start recording. Will trigger an error if recording is already active.\n        /// </summary>\n        public void StartRecord()\n        {\n            SendRequest(nameof(StartRecord));\n        }\n\n        /// <summary>\n        /// Stop recording. Will trigger an error if recording is not active.\n        /// <returns>File name for the saved recording</returns>\n        /// </summary>\n        public string StopRecord()\n        {\n            var response = SendRequest(nameof(StopRecord));\n            return (string)response[\"outputPath\"];\n        }\n\n        /// <summary>\n        /// Pause the current recording. Returns an error if recording is not active or already paused.\n        /// </summary>\n        public void PauseRecord()\n        {\n            SendRequest(nameof(PauseRecord));\n        }\n\n        /// <summary>\n        /// Resume/unpause the current recording (if paused). Returns an error if recording is not active or not paused.\n        /// </summary>\n        public void ResumeRecord()\n        {\n            SendRequest(nameof(ResumeRecord));\n        }\n\n        /// <summary>\n        /// Get the path of the current recording folder\n        /// </summary>\n        /// <returns>Current recording folder path</returns>\n        public string GetRecordDirectory()\n        {\n            var response = SendRequest(nameof(GetRecordDirectory));\n            return (string)response[\"recordDirectory\"];\n        }\n\n        /// <summary>\n        /// Get current recording status.\n        /// </summary>\n        /// <returns></returns>\n        public RecordingStatus GetRecordStatus()\n        {\n            var response = SendRequest(nameof(GetRecordStatus));\n            return JsonConvert.DeserializeObject<RecordingStatus>(response.ToString());\n        }\n\n        /// <summary>\n        /// Get the status of the OBS replay buffer.\n        /// </summary>\n        /// <returns>Current recording status. true when active</returns>\n        public bool GetReplayBufferStatus()\n        {\n            var response = SendRequest(nameof(GetReplayBufferStatus));\n            return (bool)response[\"outputActive\"];\n        }\n\n        /// <summary>\n        /// Get duration of the currently selected transition (if supported)\n        /// </summary>\n        /// <returns>Current transition duration (in milliseconds)</returns>\n        public GetTransitionListInfo GetSceneTransitionList()\n        {\n            var response = SendRequest(nameof(GetSceneTransitionList));\n\n            return JsonConvert.DeserializeObject<GetTransitionListInfo>(response.ToString());\n        }\n\n        /// <summary>\n        /// Get status of Studio Mode\n        /// </summary>\n        /// <returns>Studio Mode status (on/off)</returns>\n        public bool GetStudioModeEnabled()\n        {\n            var response = SendRequest(nameof(GetStudioModeEnabled));\n            return (bool)response[\"studioModeEnabled\"];\n        }\n\n        /// <summary>\n        /// Enables or disables studio mode\n        /// </summary>\n        /// <param name=\"studioModeEnabled\"></param>\n        public void SetStudioModeEnabled(bool studioModeEnabled)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(studioModeEnabled), studioModeEnabled }\n            };\n\n            SendRequest(nameof(SetStudioModeEnabled), requestFields);\n        }\n\n        /// <summary>\n        /// Get the name of the currently selected preview scene. \n        /// Note: Triggers an error if Studio Mode is disabled\n        /// </summary>\n        /// <returns>Preview scene name</returns>\n        public string GetCurrentPreviewScene()\n        {\n            var response = SendRequest(nameof(GetCurrentPreviewScene));\n            return (string)response[\"currentPreviewSceneName\"];\n        }\n\n        /// <summary>\n        /// Change the currently active preview/studio scene to the one specified.\n        /// Triggers an error if Studio Mode is disabled\n        /// </summary>\n        /// <param name=\"sceneName\">Preview scene name</param>\n        public void SetCurrentPreviewScene(string sceneName)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(sceneName), sceneName }\n            };\n\n            SendRequest(nameof(SetCurrentPreviewScene), requestFields);\n        }\n\n        /// <summary>\n        /// Change the currently active preview/studio scene to the one specified.\n        /// Triggers an error if Studio Mode is disabled.\n        /// </summary>\n        /// <param name=\"previewScene\">Preview scene object</param>\n        public void SetCurrentPreviewScene(ObsScene previewScene)\n        {\n            SetCurrentPreviewScene(previewScene.Name);\n        }\n\n        /// <summary>\n        /// Triggers the current scene transition. Same functionality as the `Transition` button in Studio Mode\n        /// </summary>\n        public void TriggerStudioModeTransition()\n        {\n            SendRequest(nameof(TriggerStudioModeTransition));\n        }\n\n        /// <summary>\n        /// Toggles the state of the replay buffer output.\n        /// </summary>\n        public void ToggleReplayBuffer()\n        {\n            SendRequest(nameof(ToggleReplayBuffer));\n        }\n\n        /// <summary>\n        /// Start recording into the Replay Buffer. Triggers an error\n        /// if the Replay Buffer is already active, or if the \"Save Replay Buffer\"\n        /// hotkey is not set in OBS' settings\n        /// </summary>\n        public void StartReplayBuffer()\n        {\n            SendRequest(nameof(StartReplayBuffer));\n        }\n\n        /// <summary>\n        /// Stop recording into the Replay Buffer. Triggers an error if the\n        /// Replay Buffer is not active.\n        /// </summary>\n        public void StopReplayBuffer()\n        {\n            SendRequest(nameof(StopReplayBuffer));\n        }\n\n        /// <summary>\n        /// Save and flush the contents of the Replay Buffer to disk. Basically\n        /// the same as triggering the \"Save Replay Buffer\" hotkey in OBS.\n        /// Triggers an error if Replay Buffer is not active.\n        /// </summary>\n        public void SaveReplayBuffer()\n        {\n            SendRequest(nameof(SaveReplayBuffer));\n        }\n\n        /// <summary>\n        /// Set the audio sync offset of the specified source\n        /// </summary>\n        /// <param name=\"inputName\">Source name</param>\n        /// <param name=\"inputAudioSyncOffset\">Audio offset (in nanoseconds) for the specified source</param>\n        public void SetInputAudioSyncOffset(string inputName, int inputAudioSyncOffset)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(inputName), inputName },\n                { nameof(inputAudioSyncOffset), inputAudioSyncOffset }\n            };\n\n            SendRequest(nameof(SetInputAudioSyncOffset), requestFields);\n        }\n\n        /// <summary>\n        /// Get the audio sync offset of the specified source\n        /// </summary>\n        /// <param name=\"inputName\">Source name</param>\n        /// <returns>Audio offset (in nanoseconds) of the specified source</returns>\n        public int GetInputAudioSyncOffset(string inputName)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n            var response = SendRequest(nameof(GetInputAudioSyncOffset), requestFields);\n            return (int)response[\"inputAudioSyncOffset\"];\n        }\n\n        /// <summary>\n        /// Removes a scene item from a scene.\n        /// Scenes only.\n        /// </summary>\n        /// <param name=\"sceneItemId\">Scene item id</param>\n        /// <param name=\"sceneName\">Scene name from which to delete item</param>\n        public void RemoveSceneItem(string sceneName, int sceneItemId)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sceneItemId), sceneItemId }\n            };\n\n            SendRequest(nameof(RemoveSceneItem), requestFields);\n        }\n\n        /// <summary>\n        /// Sends CEA-608 caption text over the stream output. As of OBS Studio 23.1, captions are not yet available on Linux.\n        /// </summary>\n        /// <param name=\"captionText\">Captions text</param>\n        public void SendStreamCaption(string captionText)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(captionText), captionText }\n            };\n\n            SendRequest(nameof(SendStreamCaption), requestFields);\n        }\n\n        /// <summary>\n        /// Duplicates a scene item\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene that has the SceneItem</param>\n        /// <param name=\"sceneItemId\">Id of the Scene Item</param>\n        /// <param name=\"destinationSceneName\">Name of scene to add the new duplicated Scene Item. If not specified will assume sceneName</param>\n        public void DuplicateSceneItem(string sceneName, int sceneItemId, string destinationSceneName = null)\n        {\n            var requestFields = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sceneItemId), sceneItemId }\n            };\n\n            if (!String.IsNullOrEmpty(destinationSceneName))\n            {\n                requestFields.Add(nameof(destinationSceneName), destinationSceneName);\n            }\n\n            SendRequest(nameof(DuplicateSceneItem), requestFields);\n        }\n\n        /// <summary>\n        /// Gets the names of all special inputs.\n        /// </summary>\n        /// <returns>Dictionary of special inputs.</returns>\n        public Dictionary<string, string> GetSpecialInputs()\n        {\n            var response = SendRequest(nameof(GetSpecialInputs));\n            var sources = new Dictionary<string, string>();\n            foreach (KeyValuePair<string, JToken> kvp in response)\n            {\n                string key = kvp.Key;\n                string value = (string)kvp.Value;\n                if (key != \"requestType\")\n                {\n                    sources.Add(key, value);\n                }\n            }\n            return sources;\n        }\n\n        /// <summary>\n        /// Sets the current stream service settings (stream destination).\n        /// Note: Simple RTMP settings can be set with type `rtmp_custom` and the settings fields `server` and `key`.\n        /// </summary>\n        /// <param name=\"service\">Stream Service Type Name and Settings objects</param>\n        public void SetStreamServiceSettings(StreamingService service)\n        {\n            var requestFields = new JObject\n            {\n                { \"streamServiceType\", service.Type },\n                { \"streamServiceSettings\", JToken.FromObject(service.Settings) }\n            };\n\n            SendRequest(nameof(SetStreamServiceSettings), requestFields);\n        }\n\n        /// <summary>\n        /// Gets the current stream service settings (stream destination).\n        /// </summary>\n        /// <returns>Stream service type and settings objects</returns>\n        public StreamingService GetStreamServiceSettings()\n        {\n            var response = SendRequest(nameof(GetStreamServiceSettings));\n\n            return JsonConvert.DeserializeObject<StreamingService>(response.ToString());\n        }\n\n        /// <summary>\n        /// Gets the audio monitor type of an input.\n        /// The available audio monitor types are:\n        /// - `OBS_MONITORING_TYPE_NONE`\n        /// - `OBS_MONITORING_TYPE_MONITOR_ONLY`\n        /// - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`\n        /// </summary>\n        /// <param name=\"inputName\">Source name</param>\n        /// <returns>The monitor type in use</returns>\n        public string GetInputAudioMonitorType(string inputName)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n\n            var response = SendRequest(nameof(GetInputAudioMonitorType), request);\n            return (string)response[\"monitorType\"];\n        }\n\n        /// <summary>\n        /// Sets the audio monitor type of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to set the audio monitor type of</param>\n        /// <param name=\"monitorType\">Audio monitor type. See `GetInputAudioMonitorType for possible types.</param>\n        public void SetInputAudioMonitorType(string inputName, string monitorType)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName },\n                { nameof(monitorType), monitorType }\n            };\n\n            SendRequest(nameof(SetInputAudioMonitorType), request);\n        }\n\n        /// <summary>\n        /// Broadcasts a `CustomEvent` to all WebSocket clients. Receivers are clients which are identified and subscribed.\n        /// </summary>\n        /// <param name=\"eventData\">Data payload to emit to all receivers</param>\n        public void BroadcastCustomEvent(JObject eventData)\n        {\n            var request = new JObject\n            {\n                { nameof(eventData), eventData }\n            };\n\n            SendRequest(nameof(BroadcastCustomEvent), request);\n        }\n\n        /// <summary>\n        /// Sets the cursor position of a media input.\n        /// This request does not perform bounds checking of the cursor position.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the media input</param>\n        /// <param name=\"mediaCursor\">New cursor position to set (milliseconds).</param>\n        public void SetMediaInputCursor(string inputName, int mediaCursor)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName },\n                { nameof(mediaCursor), mediaCursor }\n            };\n\n            SendRequest(nameof(SetMediaInputCursor), request);\n        }\n\n        /// <summary>\n        /// Offsets the current cursor position of a media input by the specified value.\n        /// This request does not perform bounds checking of the cursor position.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the media input</param>\n        /// <param name=\"mediaCursorOffset\">Value to offset the current cursor position by (milliseconds +/-)</param>\n        public void OffsetMediaInputCursor(string inputName, int mediaCursorOffset)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName },\n                { nameof(mediaCursorOffset), mediaCursorOffset }\n            };\n\n            SendRequest(nameof(OffsetMediaInputCursor), request);\n        }\n\n        /// <summary>\n        /// Creates a new input, adding it as a scene item to the specified scene.\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to add the input to as a scene item</param>\n        /// <param name=\"inputName\">Name of the new input to created</param>\n        /// <param name=\"inputKind\">The kind of input to be created</param>\n        /// <param name=\"inputSettings\">Jobject holding the settings object to initialize the input with</param>\n        /// <param name=\"sceneItemEnabled\">Whether to set the created scene item to enabled or disabled</param>\n        /// <returns>ID of the SceneItem in the scene.</returns>\n        public int CreateInput(string sceneName, string inputName, string inputKind, JObject inputSettings, bool? sceneItemEnabled)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(inputName), inputName },\n                { nameof(inputKind), inputKind }\n            };\n\n            if (inputSettings != null)\n            {\n                request.Add(nameof(inputSettings), inputSettings);\n            }\n\n            if (sceneItemEnabled.HasValue)\n            {\n                request.Add(nameof(sceneItemEnabled), sceneItemEnabled.Value);\n            }\n\n            var response = SendRequest(nameof(CreateInput), request);\n            return (int)response[\"sceneItemId\"];\n        }\n\n        /// <summary>\n        /// Gets the default settings for an input kind.\n        /// </summary>\n        /// <param name=\"inputKind\">Input kind to get the default settings for</param>\n        /// <returns>Object of default settings for the input kind</returns>\n        public JObject GetInputDefaultSettings(string inputKind)\n        {\n            var request = new JObject\n            {\n                { nameof(inputKind), inputKind }\n            };\n\n            var response = SendRequest(nameof(GetInputDefaultSettings), request);\n            return (JObject)response[\"defaultInputSettings\"];\n        }\n\n        /// <summary>\n        /// Gets a list of all scene items in a scene.\n        /// Scenes only\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to get the items of</param>\n        /// <returns>Array of scene items in the scene</returns>\n        public List<SceneItemDetails> GetSceneItemList(string sceneName)\n        {\n            JObject request = null;\n            if (!string.IsNullOrEmpty(sceneName))\n            {\n                request = new JObject\n                {\n                    { nameof(sceneName), sceneName }\n                };\n            }\n\n            var response = SendRequest(nameof(GetSceneItemList), request);\n            return response[\"sceneItems\"].Select(m => new SceneItemDetails((JObject)m)).ToList();\n        }\n\n        /// <summary>\n        /// Creates a new scene item using a source.\n        /// Scenes only\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to create the new item in</param>\n        /// <param name=\"sourceName\">Name of the source to add to the scene</param>\n        /// <param name=\"sceneItemEnabled\">Enable state to apply to the scene item on creation</param>\n        /// <returns>Numeric ID of the scene item</returns>\n        public int CreateSceneItem(string sceneName, string sourceName, bool sceneItemEnabled = true)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sourceName), sourceName },\n                { nameof(sceneItemEnabled), sceneItemEnabled }\n            };\n\n            var response = SendRequest(nameof(CreateSceneItem), request);\n            return (int)response[\"sceneItemId\"];\n        }\n\n        /// <summary>\n        /// Creates a new scene in OBS.\n        /// </summary>\n        /// <param name=\"sceneName\">Name for the new scene</param>\n        public void CreateScene(string sceneName)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName }\n            };\n\n            SendRequest(nameof(CreateScene), request);\n        }\n\n        /// <summary>\n        /// Gets the enable state of all audio tracks of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input</param>\n        /// <returns>Object of audio tracks and associated enable states</returns>\n        public SourceTracks GetInputAudioTracks(string inputName)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n\n            var response = SendRequest(nameof(GetInputAudioTracks), request);\n            return new SourceTracks(response);\n        }\n\n        /// <summary>\n        /// Sets the enable state of audio tracks of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input</param>\n        /// <param name=\"inputAudioTracks\">JObject holding track settings to apply</param>\n        public void SetInputAudioTracks(string inputName, JObject inputAudioTracks)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName },\n                { nameof(inputAudioTracks), inputAudioTracks }\n            };\n\n            SendRequest(nameof(SetInputAudioTracks), request);\n        }\n\n        /// <summary>\n        /// Sets the enable state of audio tracks of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input</param>\n        /// <param name=\"inputAudioTracks\">Track settings to apply</param>\n        public void SetInputAudioTracks(string inputName, SourceTracks inputAudioTracks)\n        {\n            SetInputAudioTracks(inputName, JObject.FromObject(inputAudioTracks));\n        }       \n\n        /// <summary>\n        /// Gets the active and show state of a source.\n        /// **Compatible with inputs and scenes.**\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source to get the active state of</param>\n        /// <returns>Whether the source is showing in Program</returns>\n        public SourceActiveInfo GetSourceActive(string sourceName)\n        {\n            var request = new JObject\n            {\n                { nameof(sourceName), sourceName }\n            };\n\n            var response = SendRequest(nameof(GetSourceActive), request);\n            return new SourceActiveInfo(response);\n        }\n\n        /// <summary>\n        /// Gets the status of the virtualcam output.\n        /// </summary>\n        /// <returns>An <see cref=\"VirtualCamStatus\"/> object describing the current virtual camera state</returns>\n        public VirtualCamStatus GetVirtualCamStatus()\n        {\n            JObject response = SendRequest(nameof(GetVirtualCamStatus));\n            var outputStatus = new VirtualCamStatus(response);\n            return outputStatus;\n        }\n\n        /// <summary>\n        /// Starts the virtualcam output.\n        /// </summary>\n        public void StartVirtualCam()\n        {\n            SendRequest(nameof(StartVirtualCam));\n        }\n\n        /// <summary>\n        /// Stops the virtualcam output.\n        /// </summary>\n        public void StopVirtualCam()\n        {\n            SendRequest(nameof(StopVirtualCam));\n        }\n\n        /// <summary>\n        /// Toggles the state of the virtualcam output.\n        /// </summary>\n        /// <returns>Whether the output is active</returns>\n        public VirtualCamStatus ToggleVirtualCam()\n        {\n            JObject response = SendRequest(nameof(ToggleVirtualCam));\n            var outputStatus = new VirtualCamStatus(response);\n            return outputStatus;\n        }\n\n        /// <summary>\n        /// Gets the value of a \\\"slot\\\" from the selected persistent data realm.\n        /// </summary>\n        /// <param name=\"realm\">The data realm to select. `OBS_WEBSOCKET_DATA_REALM_GLOBAL` or `OBS_WEBSOCKET_DATA_REALM_PROFILE`</param>\n        /// <param name=\"slotName\">The name of the slot to retrieve data from</param>\n        /// <returns type=\"Any\">Value associated with the slot. `null` if not set</returns>\n        public JObject GetPersistentData(string realm, string slotName)\n        {\n            var request = new JObject\n            {\n                { nameof(realm), realm },\n                { nameof(slotName), slotName }\n            };\n\n            return SendRequest(nameof(GetPersistentData), request);\n        }\n\n        /// <summary>\n        /// Sets the value of a \\\"slot\\\" from the selected persistent data realm.\n        /// </summary>\n        /// <param name=\"realm\">The data realm to select. `OBS_WEBSOCKET_DATA_REALM_GLOBAL` or `OBS_WEBSOCKET_DATA_REALM_PROFILE`</param>\n        /// <param name=\"slotName\">The name of the slot to retrieve data from</param>\n        /// <param name=\"slotValue\">The value to apply to the slot</param>\n        public void SetPersistentData(string realm, string slotName, JObject slotValue)\n        {\n            var request = new JObject\n            {\n                { nameof(realm), realm },\n                { nameof(slotName), slotName },\n                { nameof(slotValue), slotValue }\n            };\n\n            SendRequest(nameof(SetPersistentData), request);\n        }\n\n        /// <summary>\n        /// Creates a new scene collection, switching to it in the process.\\n\\nNote: This will block until the collection has finished changing.\n        /// </summary>\n        /// <param name=\"sceneCollectionName\">Name for the new scene collection</param>\n        public void CreateSceneCollection(string sceneCollectionName)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneCollectionName), sceneCollectionName }\n            };\n\n            SendRequest(nameof(CreateSceneCollection), request);\n        }\n\n        /// <summary>\n        /// Creates a new profile, switching to it in the process\n        /// </summary>\n        /// <param name=\"profileName\">Name for the new profile</param>\n        public void CreateProfile(string profileName)\n        {\n            var request = new JObject\n            {\n                { nameof(profileName), profileName }\n            };\n\n            SendRequest(nameof(CreateProfile), request);\n        }\n\n        /// <summary>\n        /// Removes a profile. If the current profile is chosen, it will change to a different profile first.\n        /// </summary>\n        /// <param name=\"profileName\">Name of the profile to remove</param>\n        public void RemoveProfile(string profileName)\n        {\n            var request = new JObject\n            {\n                { nameof(profileName), profileName }\n            };\n\n            SendRequest(nameof(RemoveProfile), request);\n        }\n\n        /// <summary>\n        /// Gets a parameter from the current profile's configuration.\n        /// </summary>\n        /// <param name=\"parameterCategory\">Category of the parameter to get</param>\n        /// <param name=\"parameterName\">Name of the parameter to get</param>\n        /// <returns></returns>\n        public JObject GetProfileParameter(string parameterCategory, string parameterName)\n        {\n            var request = new JObject\n            {\n                { nameof(parameterCategory), parameterCategory },\n                { nameof(parameterName), parameterName }\n            };\n\n            return SendRequest(nameof(GetProfileParameter), request);\n        }\n\n        /// <summary>\n        /// Sets the value of a parameter in the current profile's configuration.\n        /// </summary>\n        /// <param name=\"parameterCategory\">Category of the parameter to set</param>\n        /// <param name=\"parameterName\">Name of the parameter to set</param>\n        /// <param name=\"parameterValue\">Value of the parameter to set. Use `null` to delete</param>\n        public void SetProfileParameter(string parameterCategory, string parameterName, string parameterValue)\n        {\n            var request = new JObject\n            {\n                { nameof(parameterCategory), parameterCategory },\n                { nameof(parameterName), parameterName },\n                { nameof(parameterValue), parameterValue }\n            };\n\n            SendRequest(nameof(SetProfileParameter), request);\n        }\n\n        /// <summary>\n        /// Sets the current video settings.\n        /// Note: Fields must be specified in pairs. For example, you cannot set only `baseWidth` without needing to specify `baseHeight`.\n        /// </summary>\n        /// <param name=\"obsVideoSettings\">Object containing video settings</param>\n        public void SetVideoSettings(ObsVideoSettings obsVideoSettings)\n        {\n            SendRequest(nameof(SetVideoSettings), JObject.FromObject(obsVideoSettings));\n        }\n\n        /// <summary>\n        /// Gets the default settings for a filter kind.\n        /// </summary>\n        /// <param name=\"filterKind\">Filter kind to get the default settings for</param>\n        /// <returns>Object of default settings for the filter kind</returns>\n        public JObject GetSourceFilterDefaultSettings(string filterKind)\n        {\n            var request = new JObject\n            {\n                { nameof(filterKind), filterKind }\n            };\n\n            return SendRequest(nameof(GetSourceFilterDefaultSettings), request);\n        }\n\n        /// <summary>\n        /// Sets the name of a source filter (rename).\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source the filter is on</param>\n        /// <param name=\"filterName\">Current name of the filter</param>\n        /// <param name=\"newFilterName\">New name for the filter</param>\n        public void SetSourceFilterName(string sourceName, string filterName, string newFilterName)\n        {\n            var request = new JObject\n            {\n                { nameof(sourceName), sourceName },\n                { nameof(filterName), filterName },\n                { nameof(newFilterName), newFilterName }\n            };\n\n            SendRequest(nameof(SetSourceFilterName), request);\n        }\n\n        /// <summary>\n        /// Sets the index position of a filter on a source.\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source the filter is on</param>\n        /// <param name=\"filterName\">Name of the filter</param>\n        /// <param name=\"filterIndex\">New index position of the filter</param>\n        public void SetSourceFilterIndex(string sourceName, string filterName, int filterIndex)\n        {\n            var request = new JObject\n            {\n                { nameof(sourceName), sourceName },\n                { nameof(filterName), filterName },\n                { nameof(filterIndex), filterIndex }\n            };\n\n            SendRequest(nameof(SetSourceFilterIndex), request);\n        }\n\n        /// <summary>\n        /// Gets data about the current plugin and RPC version.\n        /// </summary>\n        /// <returns>Version info in an <see cref=\"ObsVersion\"/> object</returns>\n        public ObsVersion GetVersion()\n        {\n            JObject response = SendRequest(nameof(GetVersion));\n            return new ObsVersion(response);\n        }\n\n        /// <summary>\n        /// Call a request registered to a vendor.\n        /// A vendor is a unique name registered by a third-party plugin or script, which allows for custom requests and events to be added to obs-websocket.\n        /// If a plugin or script implements vendor requests or events, documentation is expected to be provided with them.\n        /// </summary>\n        /// <param name=\"vendorName\">Name of the vendor to use</param>\n        /// <param name=\"requestType\">The request type to call</param>\n        /// <param name=\"requestData\">Object containing appropriate request data</param>\n        /// <returns>Object containing appropriate response data. {} if request does not provide any response data</returns>\n        public JObject CallVendorRequest(string vendorName, string requestType, JObject requestData = null)\n        {\n            var request = new JObject\n            {\n                { nameof(vendorName), vendorName },\n                { nameof(requestType), requestType },\n                { nameof(requestData), requestData }\n            };\n\n            return SendRequest(nameof(CallVendorRequest), request);\n        }\n\n        /// <summary>\n        /// Gets an array of all hotkey names in OBS\n        /// </summary>\n        /// <returns>Array of hotkey names</returns>\n        public List<string> GetHotkeyList()\n        {\n            var response = SendRequest(nameof(GetHotkeyList));\n            return JsonConvert.DeserializeObject<List<string>>(response[\"hotkeys\"].ToString());\n        }\n\n        /// <summary>\n        /// Sleeps for a time duration or number of frames. Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`.\n        /// </summary>\n        /// <param name=\"sleepMillis\">Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode)</param>\n        /// <param name=\"sleepFrames\">Number of frames to sleep for (if `SERIAL_FRAME` mode)</param>\n        public void Sleep(int sleepMillis, int sleepFrames)\n        {\n            var request = new JObject\n            {\n                { nameof(sleepMillis), sleepMillis },\n                { nameof(sleepFrames), sleepFrames }\n            };\n\n            SendRequest(nameof(Sleep), request);\n        }\n\n        /// <summary>\n        /// Gets an array of all inputs in OBS.\n        /// </summary>\n        /// <param name=\"inputKind\">Restrict the array to only inputs of the specified kind</param>\n        /// <returns>List of Inputs in OBS</returns>\n        public List<InputBasicInfo> GetInputList(string inputKind = null)\n        {\n            var request = new JObject\n            {\n                { nameof(inputKind), inputKind }\n            };\n\n            var response = inputKind is null\n                ? SendRequest(nameof(GetInputList))\n                : SendRequest(nameof(GetInputList), request);\n\n            var returnList = new List<InputBasicInfo>();\n            foreach (var input in response[\"inputs\"])\n            {\n                returnList.Add(new InputBasicInfo(input as JObject));\n            }\n\n            return returnList;\n        }\n\n        /// <summary>\n        /// Gets an array of all available input kinds in OBS.\n        /// </summary>\n        /// <param name=\"unversioned\">True == Return all kinds as unversioned, False == Return with version suffixes (if available)</param>\n        /// <returns>Array of input kinds</returns>\n        public List<string> GetInputKindList(bool unversioned = false)\n        {\n            var request = new JObject\n            {\n                { nameof(unversioned), unversioned }\n            };\n\n            var response = unversioned is false\n                ? SendRequest(nameof(GetInputKindList))\n                : SendRequest(nameof(GetInputKindList), request);\n\n            return JsonConvert.DeserializeObject<List<string>>(response[\"inputKinds\"].ToString());\n        }\n\n        /// <summary>\n        /// Removes an existing input.\n        /// Note: Will immediately remove all associated scene items.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to remove</param>\n        public void RemoveInput(string inputName)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n\n            SendRequest(nameof(RemoveInput), request);\n        }\n\n        /// <summary>\n        /// Sets the name of an input (rename).\n        /// </summary>\n        /// <param name=\"inputName\">Current input name</param>\n        /// <param name=\"newInputName\">New name for the input</param>\n        public void SetInputName(string inputName, string newInputName)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName },\n                { nameof(newInputName), newInputName }\n            };\n\n            SendRequest(nameof(SetInputName), request);\n        }\n\n        /// <summary>\n        /// Gets the settings of an input.\n        /// Note: Does not include defaults. To create the entire settings object, overlay `inputSettings` over the `defaultInputSettings` provided by `GetInputDefaultSettings`.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to get the settings of</param>\n        /// <returns>New populated InputSettings object</returns>\n        public InputSettings GetInputSettings(string inputName)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n\n            var response = SendRequest(nameof(GetInputSettings), request);\n            response.Merge(request);\n            return new InputSettings(response);\n        }\n\n        /// <summary>\n        /// Sets the settings of an input.\n        /// </summary>\n        /// <param name=\"inputSettings\">Object of settings to apply</param>\n        /// <param name=\"overlay\">True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings.</param>\n        public void SetInputSettings(InputSettings inputSettings, bool overlay = true)\n        {\n            SetInputSettings(inputSettings.InputName, inputSettings.Settings, overlay);\n        }\n\n        /// <summary>\n        /// Sets the settings of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to set the settings of</param>\n        /// <param name=\"inputSettings\">Object of settings to apply</param>\n        /// <param name=\"overlay\">True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings.</param>\n        public void SetInputSettings(string inputName, JObject inputSettings, bool overlay = true)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName },\n                { nameof(inputSettings), inputSettings },\n                { nameof(overlay), overlay }\n            };\n\n            SendRequest(nameof(SetInputSettings), request);\n        }\n\n        /// <summary>\n        /// Gets the audio balance of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to get the audio balance of</param>\n        /// <returns>Audio balance value from 0.0-1.0</returns>\n        public double GetInputAudioBalance(string inputName)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n\n            var response = SendRequest(nameof(GetInputAudioBalance), request);\n            return (double)response[\"inputAudioBalance\"];\n        }\n\n        /// <summary>\n        /// Sets the audio balance of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to set the audio balance of</param>\n        /// <param name=\"inputAudioBalance\">New audio balance value</param>\n        public void SetInputAudioBalance(string inputName, double inputAudioBalance)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName },\n                { nameof(inputAudioBalance), inputAudioBalance }\n            };\n\n            SendRequest(nameof(SetInputAudioBalance), request);\n        }\n\n        /// <summary>\n        /// Gets the items of a list property from an input's properties.\n        /// Note: Use this in cases where an input provides a dynamic, selectable list of items.\n        /// For example, display capture, where it provides a list of available displays.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input</param>\n        /// <param name=\"propertyName\">Name of the list property to get the items of</param>\n        /// <returns>Array of items in the list property</returns>\n        public List<JObject> GetInputPropertiesListPropertyItems(string inputName, string propertyName)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName },\n                { nameof(propertyName), propertyName }\n            };\n\n            var response = SendRequest(nameof(GetInputPropertiesListPropertyItems), request);\n            return response[\"propertyItems\"].Value<List<JObject>>();\n        }\n\n        /// <summary>\n        /// Presses a button in the properties of an input.\n        /// Note: Use this in cases where there is a button in the properties of an input that cannot be accessed in any other way.\n        /// For example, browser sources, where there is a refresh button.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input</param>\n        /// <param name=\"propertyName\">Name of the button property to press</param>\n        public void PressInputPropertiesButton(string inputName, string propertyName)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName },\n                { nameof(propertyName), propertyName }\n            };\n\n            SendRequest(nameof(PressInputPropertiesButton), request);\n        }\n\n        /// <summary>\n        /// Gets the status of a media input.\\n\\nMedia States:\n        /// - `OBS_MEDIA_STATE_NONE`\n        /// - `OBS_MEDIA_STATE_PLAYING`\n        /// - `OBS_MEDIA_STATE_OPENING`\n        /// - `OBS_MEDIA_STATE_BUFFERING`\n        /// - `OBS_MEDIA_STATE_PAUSED`\n        /// - `OBS_MEDIA_STATE_STOPPED`\n        /// - `OBS_MEDIA_STATE_ENDED`\n        /// - `OBS_MEDIA_STATE_ERROR`\n        /// </summary>\n        /// <param name=\"inputName\">Name of the media input</param>\n        /// <returns>Object containing string mediaState, int mediaDuration, int mediaCursor properties</returns>\n        public MediaInputStatus GetMediaInputStatus(string inputName)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n\n            return new MediaInputStatus(SendRequest(nameof(GetMediaInputStatus), request));\n        }\n\n        /// <summary>\n        /// Triggers an action on a media input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the media input</param>\n        /// <param name=\"mediaAction\">Identifier of the `ObsMediaInputAction` enum</param>\n        public void TriggerMediaInputAction(string inputName, string mediaAction)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName },\n                { nameof(mediaAction), mediaAction }\n            };\n\n            SendRequest(nameof(TriggerMediaInputAction), request);\n        }\n\n        /// <summary>\n        /// Gets the filename of the last replay buffer save file.\n        /// </summary>\n        /// <returns>File path of last replay</returns>\n        public string GetLastReplayBufferReplay()\n        {\n            var response = SendRequest(nameof(GetLastReplayBufferReplay));\n            return (string)response[\"savedReplayPath\"];\n        }\n\n        /// <summary>\n        /// Toggles pause on the record output.\n        /// </summary>\n        public void ToggleRecordPause()\n        {\n            SendRequest(nameof(ToggleRecordPause));\n        }\n\n        /// <summary>\n        /// Currently BROKEN in obs-websocket/obs-studio\n        /// Basically GetSceneItemList, but for groups.\n        /// Using groups at all in OBS is discouraged, as they are very broken under the hood.\n        /// Groups only\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the group to get the items of</param>\n        /// <returns>Array of scene items in the group</returns>\n        public List<JObject> GetGroupSceneItemList(string sceneName)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName }\n            };\n\n            var response = SendRequest(nameof(GetGroupSceneItemList), request);\n            return JsonConvert.DeserializeObject<List<JObject>>((string)response[\"sceneItems\"]);\n        }\n\n        /// <summary>\n        /// Searches a scene for a source, and returns its id.\\n\\nScenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene or group to search in</param>\n        /// <param name=\"sourceName\">Name of the source to find</param>\n        /// <param name=\"searchOffset\">Number of matches to skip during search. >= 0 means first forward. -1 means last (top) item</param>\n        /// <returns>Numeric ID of the scene item</returns>\n        public int GetSceneItemId(string sceneName, string sourceName, int searchOffset)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sourceName), sourceName },\n                { nameof(searchOffset), searchOffset }\n            };\n\n            var response = SendRequest(nameof(GetSceneItemId), request);\n            return (int)response[\"sceneItemId\"];\n        }\n\n        /// <summary>\n        /// Gets the transform and crop info of a scene item.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <returns>Object containing scene item transform info</returns>\n        public SceneItemTransformInfo GetSceneItemTransform(string sceneName, int sceneItemId)\n        {\n            var response = GetSceneItemTransformRaw(sceneName, sceneItemId);\n            return JsonConvert.DeserializeObject<SceneItemTransformInfo>(response[\"sceneItemTransform\"].ToString());\n        }\n\n        /// <summary>\n        /// Gets the JObject of transform settings for a scene item. Use this one you don't want it populated with default values.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <returns>Object containing scene item transform info</returns>\n        public JObject GetSceneItemTransformRaw(string sceneName, int sceneItemId)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sceneItemId), sceneItemId }\n            };\n\n            return SendRequest(nameof(GetSceneItemTransform), request);\n        }\n\n        /// <summary>\n        /// Gets the enable state of a scene item.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <returns>Whether the scene item is enabled. `true` for enabled, `false` for disabled</returns>\n        public bool GetSceneItemEnabled(string sceneName, int sceneItemId)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sceneItemId), sceneItemId }\n            };\n\n            var response = SendRequest(nameof(GetSceneItemEnabled), request);\n            return (bool)response[\"sceneItemEnabled\"];\n        }\n\n        /// <summary>\n        /// Gets the enable state of a scene item.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <param name=\"sceneItemEnabled\">New enable state of the scene item</param>\n        public void SetSceneItemEnabled(string sceneName, int sceneItemId, bool sceneItemEnabled)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sceneItemId), sceneItemId },\n                { nameof(sceneItemEnabled), sceneItemEnabled }\n            };\n\n            SendRequest(nameof(SetSceneItemEnabled), request);\n        }\n\n        /// <summary>\n        /// Gets the lock state of a scene item.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <returns>Whether the scene item is locked. `true` for locked, `false` for unlocked</returns>\n        public bool GetSceneItemLocked(string sceneName, int sceneItemId)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sceneItemId), sceneItemId }\n            };\n\n            var response = SendRequest(nameof(GetSceneItemLocked), request);\n            return (bool)response[\"sceneItemLocked\"];\n        }\n\n        /// <summary>\n        /// Sets the lock state of a scene item.\n        /// Scenes and Group\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <param name=\"sceneItemLocked\">New lock state of the scene item</param>\n        public void SetSceneItemLocked(string sceneName, int sceneItemId, bool sceneItemLocked)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sceneItemId), sceneItemId },\n                { nameof(sceneItemLocked), sceneItemLocked }\n            };\n\n            SendRequest(nameof(SetSceneItemLocked), request);\n        }\n\n        /// <summary>\n        /// Gets the index position of a scene item in a scene.\n        /// An index of 0 is at the bottom of the source list in the UI.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <returns>Index position of the scene item</returns>\n        public int GetSceneItemIndex(string sceneName, int sceneItemId)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sceneItemId), sceneItemId }\n            };\n\n            var response = SendRequest(nameof(GetSceneItemIndex), request);\n            return (int)response[\"sceneItemIndex\"];\n        }\n\n        /// <summary>\n        /// Sets the index position of a scene item in a scene.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <param name=\"sceneItemIndex\">New index position of the scene item</param>\n        public void SetSceneItemIndex(string sceneName, int sceneItemId, int sceneItemIndex)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sceneItemId), sceneItemId },\n                { nameof(sceneItemIndex), sceneItemIndex }\n            };\n\n            SendRequest(nameof(SetSceneItemIndex), request);\n        }\n\n        /// <summary>\n        /// Gets the blend mode of a scene item.\n        /// Blend modes:\n        /// - `OBS_BLEND_NORMAL`\n        /// - `OBS_BLEND_ADDITIVE`\n        /// - `OBS_BLEND_SUBTRACT`\n        /// - `OBS_BLEND_SCREEN`\n        /// - `OBS_BLEND_MULTIPLY`\n        /// - `OBS_BLEND_LIGHTEN`\n        /// - `OBS_BLEND_DARKEN`\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene the item is in</param>\n        /// <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n        /// <returns>Current blend mode</returns>\n        public string GetSceneItemBlendMode(string sceneName, int sceneItemId)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sceneItemId), sceneItemId }\n            };\n\n            var response = SendRequest(nameof(GetSceneItemBlendMode), request);\n            return (string)response[\"sceneItemBlendMode\"];\n        }\n\n        /// <summary>\n        /// Sets the blend mode of a scene item.\n        /// Scenes and Groups\n        /// </summary>\n        /// <param name=\"sceneName\"></param>\n        /// <param name=\"sceneItemId\"></param>\n        /// <param name=\"sceneItemBlendMode\"></param>\n        public void SetSceneItemBlendMode(string sceneName, int sceneItemId, string sceneItemBlendMode)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(sceneItemId), sceneItemId },\n                { nameof(sceneItemBlendMode), sceneItemBlendMode }\n            };\n\n            SendRequest(nameof(SetSceneItemBlendMode), request);\n        }\n\n        /// <summary>\n        /// Gets an array of all groups in OBS.\n        /// Groups in OBS are actually scenes, but renamed and modified. In obs-websocket, we treat them as scenes where we can.\n        /// </summary>\n        /// <returns>Array of group names</returns>\n        public List<string> GetGroupList()\n        {\n            var response = SendRequest(nameof(GetGroupList));\n            return JsonConvert.DeserializeObject<List<string>>(response[\"groups\"].ToString());\n        }\n\n        /// <summary>\n        /// Removes a scene from OBS.\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to remove</param>\n        public void RemoveScene(string sceneName)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName }\n            };\n\n            SendRequest(nameof(RemoveScene), request);\n        }\n\n        /// <summary>\n        /// Sets the name of a scene (rename).\n        /// </summary>\n        /// <param name=\"sceneName\">Name of the scene to be renamed</param>\n        /// <param name=\"newSceneName\">New name for the scene</param>\n        public void SetSceneName(string sceneName, string newSceneName)\n        {\n            var request = new JObject\n            {\n                { nameof(sceneName), sceneName },\n                { nameof(newSceneName), newSceneName }\n            };\n\n            SendRequest(nameof(SetSceneName), request);\n        }\n\n        /// <summary>\n        /// Gets a Base64-encoded screenshot of a source.\n        /// The `imageWidth` and `imageHeight` parameters are treated as \\\"scale to inner\\\", meaning the smallest ratio will be used and the aspect ratio of the original resolution is kept.\n        /// If `imageWidth` and `imageHeight` are not specified, the compressed image will use the full resolution of the source.\n        /// **Compatible with inputs and scenes.**\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source to take a screenshot of</param>\n        /// <param name=\"imageFormat\">Image compression format to use. Use `GetVersion` to get compatible image formats</param>\n        /// <param name=\"imageWidth\">Width to scale the screenshot to</param>\n        /// <param name=\"imageHeight\">Height to scale the screenshot to</param>\n        /// <param name=\"imageCompressionQuality\">Compression quality to use. 0 for high compression, 100 for uncompressed. -1 to use \\\"default\\\" (whatever that means, idk)</param>\n        /// <returns>Base64-encoded screenshot</returns>\n        public string GetSourceScreenshot(string sourceName, string imageFormat, int imageWidth = -1, int imageHeight = -1, int imageCompressionQuality = -1)\n        {\n            var request = new JObject\n            {\n                { nameof(sourceName), sourceName },\n                { nameof(imageFormat), imageFormat }\n            };\n\n            if (imageWidth > -1)\n            {\n                request.Add(nameof(imageWidth), imageWidth);\n            }\n            if (imageHeight > -1)\n            {\n                request.Add(nameof(imageHeight), imageHeight);\n            }\n            if (imageCompressionQuality > -1)\n            {\n                request.Add(nameof(imageCompressionQuality), imageCompressionQuality);\n            }\n\n            var response = SendRequest(nameof(GetSourceScreenshot), request);\n            return (string)response[\"imageData\"];\n        }\n\n        /// <summary>\n        /// Gets an array of all available transition kinds.\n        /// Similar to `GetInputKindList`\n        /// </summary>\n        /// <returns>Array of transition kinds</returns>\n        public List<string> GetTransitionKindList()\n        {\n            var response = SendRequest(nameof(GetTransitionKindList));\n            return JsonConvert.DeserializeObject<List<string>>(response[\"transitionKinds\"].ToString());\n        }\n\n        /// <summary>\n        /// Gets the cursor position of the current scene transition.\n        /// Note: `transitionCursor` will return 1.0 when the transition is inactive.\n        /// </summary>\n        /// <returns>Cursor position, between 0.0 and 1.0</returns>\n        public double GetCurrentSceneTransitionCursor()\n        {\n            var response = SendRequest(nameof(GetCurrentSceneTransitionCursor));\n            return (double)response[\"transitionCursor\"];\n        }\n\n        /// <summary>\n        /// Opens the properties dialog of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to open the dialog of</param>\n        public void OpenInputPropertiesDialog(string inputName)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n\n            SendRequest(nameof(OpenInputPropertiesDialog), request);\n        }\n\n        /// <summary>\n        /// Opens the filters dialog of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to open the dialog of</param>\n        public void OpenInputFiltersDialog(string inputName)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n\n            SendRequest(nameof(OpenInputFiltersDialog), request);\n        }\n\n        /// <summary>\n        /// Opens the interact dialog of an input.\n        /// </summary>\n        /// <param name=\"inputName\">Name of the input to open the dialog of</param>\n        public void OpenInputInteractDialog(string inputName)\n        {\n            var request = new JObject\n            {\n                { nameof(inputName), inputName }\n            };\n\n            SendRequest(nameof(OpenInputInteractDialog), request);\n        }\n\n        /// <summary>\n        /// Gets a list of connected monitors and information about them.\n        /// </summary>\n        /// <returns>a list of detected monitors with some information</returns>\n        public List<Monitor> GetMonitorList()\n        {\n            var response = SendRequest(nameof(GetMonitorList));\n            var monitors = new List<Monitor>();\n\n            foreach(var monitor in response[\"monitors\"])\n            {\n                monitors.Add(new Monitor((JObject)monitor));\n            }\n            return monitors;\n        }\n\n        /// <summary>\n        /// Opens a projector for a source.\n        /// Note: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release.\n        /// </summary>\n        /// <param name=\"sourceName\">Name of the source to open a projector for</param>\n        /// <param name=\"projectorGeometry\">Size/Position data for a windowed projector, in Qt Base64 encoded format. Mutually exclusive with monitorIndex</param>\n        /// <param name=\"monitorIndex\">Monitor index, use GetMonitorList to obtain index. -1 to open in windowed mode</param>\n        public void OpenSourceProjector(string sourceName, string projectorGeometry, int monitorIndex = -1)\n        {\n            var request = new JObject\n            {\n                { nameof(sourceName), sourceName },\n                { nameof(projectorGeometry), projectorGeometry },\n                { nameof(monitorIndex), monitorIndex },\n            };\n\n            SendRequest(nameof(OpenSourceProjector), request);\n        }\n\n        /// <summary>\n        /// Opens a projector for a specific output video mix.\n        /// Note: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release.\n        /// </summary>\n        /// <param name=\"videoMixType\">Mix types: OBS_WEBSOCKET_VIDEO_MIX_TYPE_PREVIEW, OBS_WEBSOCKET_VIDEO_MIX_TYPE_PROGRAM, OBS_WEBSOCKET_VIDEO_MIX_TYPE_MULTIVIEW</param>\n        /// <param name=\"projectorGeometry\">Size/Position data for a windowed projector, in Qt Base64 encoded format. Mutually exclusive with monitorIndex</param>\n        /// <param name=\"monitorIndex\">Monitor index, use GetMonitorList to obtain index. -1 to open in windowed mode</param>\n        public void OpenVideoMixProjector(string videoMixType, string projectorGeometry, int monitorIndex = -1)\n        {\n            var request = new JObject\n            {\n                { nameof(videoMixType), videoMixType },\n                { nameof(projectorGeometry), projectorGeometry },\n                { nameof(monitorIndex), monitorIndex },\n            };\n\n            SendRequest(nameof(OpenVideoMixProjector), request);\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/CurrentPreviewSceneChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.CurrentPreviewSceneChanged\"/>\n    /// </summary>\n    public class CurrentPreviewSceneChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the scene that was switched to\n        /// </summary>\n        public string SceneName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneName\">The scene name</param>\n        public CurrentPreviewSceneChangedEventArgs(string sceneName)\n        {\n            SceneName = sceneName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/CurrentProfileChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.CurrentProfileChanged\"/>\n    /// </summary>\n    public class CurrentProfileChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the new profile\n        /// </summary>\n        public string ProfileName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"profileName\">The profile name</param>\n        public CurrentProfileChangedEventArgs(string profileName)\n        {\n            ProfileName = profileName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/CurrentProfileChangingEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.CurrentProfileChanging\"/>\n    /// </summary>\n    public class CurrentProfileChangingEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the current profile\n        /// </summary>\n        public string ProfileName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"profileName\">The profile name</param>\n        public CurrentProfileChangingEventArgs(string profileName)\n        {\n            ProfileName = profileName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/CurrentSceneCollectionChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.CurrentSceneCollectionChanged\"/> \n    /// </summary>\n    public class CurrentSceneCollectionChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the new scene collection\n        /// </summary>\n        public string SceneCollectionName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneCollectionName\">The scene collection name</param>\n        public CurrentSceneCollectionChangedEventArgs(string sceneCollectionName)\n        {\n            SceneCollectionName = sceneCollectionName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/CurrentSceneCollectionChangingEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.CurrentSceneCollectionChanging\"/>\n    /// </summary>\n    public class CurrentSceneCollectionChangingEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the current scene collection\n        /// </summary>\n        public string SceneCollectionName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneCollectionName\">The scene collection name</param>\n        public CurrentSceneCollectionChangingEventArgs(string sceneCollectionName)\n        {\n            SceneCollectionName = sceneCollectionName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/CurrentSceneTransitionChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.CurrentSceneTransitionChanged\"/>\n    /// </summary>\n    public class CurrentSceneTransitionChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the new transition\n        /// </summary>\n        public string TransitionName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"transitionName\">The transition name</param>\n        public CurrentSceneTransitionChangedEventArgs(string transitionName)\n        {\n            TransitionName = transitionName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/CurrentSceneTransitionDurationChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.CurrentSceneTransitionDurationChanged\"/>\n    /// </summary>\n    public class CurrentSceneTransitionDurationChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Transition duration in milliseconds\n        /// </summary>\n        public int TransitionDuration { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"transitionDuration\">The transition duration</param>\n        public CurrentSceneTransitionDurationChangedEventArgs(int transitionDuration)\n        {\n            TransitionDuration = transitionDuration;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/InputActiveStateChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.InputActiveStateChanged\"/>\n    /// </summary>\n    public class InputActiveStateChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the input\n        /// </summary>\n        public string InputName { get; }\n        \n        /// <summary>\n        /// Whether the input is active\n        /// </summary>\n        public bool VideoActive { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"inputName\">The input name</param>\n        /// <param name=\"videoActive\">Is the video active</param>\n        public InputActiveStateChangedEventArgs(string inputName, bool videoActive)\n        {\n            InputName = inputName;\n            VideoActive = videoActive;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/InputAudioBalanceChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.InputAudioBalanceChanged\"/>\n    /// </summary>\n    public class InputAudioBalanceChangedEventArgs : EventArgs \n    {   \n        /// <summary>\n        /// Name of the affected input\n        /// </summary>\n        public string InputName { get; }\n        \n        /// <summary>\n        /// New audio balance value of the input\n        /// </summary>\n        public double InputAudioBalance { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"inputName\">The input name</param>\n        /// <param name=\"inputAudioBalance\">The input audio balance</param>\n        public InputAudioBalanceChangedEventArgs(string inputName, double inputAudioBalance)\n        {\n            InputName = inputName;\n            InputAudioBalance = inputAudioBalance;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/InputAudioMonitorTypeChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.InputAudioMonitorTypeChanged\"/>\n    /// Available types are:\n    /// - `OBS_MONITORING_TYPE_NONE`\n    /// - `OBS_MONITORING_TYPE_MONITOR_ONLY`\n    /// - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`\n    /// </summary>\n    public class InputAudioMonitorTypeChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the input\n        /// </summary>\n        public string InputName { get; }\n        \n        /// <summary>\n        /// New monitor type of the input\n        /// </summary>\n        public string MonitorType { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"inputName\">The input name</param>\n        /// <param name=\"monitorType\">The monitor type</param>\n        public InputAudioMonitorTypeChangedEventArgs(string inputName, string monitorType)\n        {\n            InputName = inputName;\n            MonitorType = monitorType;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/InputAudioSyncOffsetChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.InputAudioSyncOffsetChanged\"/>\n    /// </summary>\n    public class InputAudioSyncOffsetChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the input\n        /// </summary>\n        public string InputName { get; }\n        \n        /// <summary>\n        /// New sync offset in milliseconds\n        /// </summary>\n        public int InputAudioSyncOffset { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"inputName\">The input name</param>\n        /// <param name=\"inputAudioSyncOffset\">The input audio sync offset</param>\n        public InputAudioSyncOffsetChangedEventArgs(string inputName, int inputAudioSyncOffset)\n        {\n            InputName = inputName;\n            InputAudioSyncOffset = inputAudioSyncOffset;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/InputAudioTracksChangedEventArgs.cs",
    "content": "﻿using System;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.InputAudioTracksChanged\"/>\n    /// </summary>\n    public class InputAudioTracksChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the input\n        /// </summary>\n        public string InputName { get; }\n        \n        /// <summary>\n        /// Object of audio tracks along with their associated enable states\n        /// </summary>\n        public JObject InputAudioTracks {get;}\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"inputName\">The input name</param>\n        /// <param name=\"inputAudioTracks\">The audio track data as a JObject</param>\n        public InputAudioTracksChangedEventArgs(string inputName, JObject inputAudioTracks)\n        {\n            InputName = inputName;\n            InputAudioTracks = inputAudioTracks;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/InputCreatedEventArgs.cs",
    "content": "﻿using System;\nusing Newtonsoft.Json.Linq;\nusing OBSWebsocketDotNet;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.InputCreated\"/>\n    /// </summary>\n    public class InputCreatedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the input\n        /// </summary>\n        public string InputName { get; } \n        \n        /// <summary>\n        /// The kind of the input\n        /// </summary>\n        public string InputKind { get; }\n        \n        /// <summary>\n        /// The unversioned kind of input (aka no `_v2` stuff)\n        /// </summary>\n        public string UnversionedInputKind { get; } \n        \n        /// <summary>\n        /// The settings configured to the input when it was created\n        /// </summary>\n        public JObject InputSettings { get; } \n        \n        /// <summary>\n        /// The default settings for the input\n        /// </summary>\n        public JObject DefaultInputSettings { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"inputName\">The input name</param>\n        /// <param name=\"inputKind\">The kind of input</param>\n        /// <param name=\"unversionedInputKind\">The unversioned kind of input</param>\n        /// <param name=\"inputSettings\">The input settings as a JObject</param>\n        /// <param name=\"defaultInputSettings\">The default input settings as a JObject</param>\n        public InputCreatedEventArgs(string inputName, string inputKind, string unversionedInputKind, JObject inputSettings, JObject defaultInputSettings)\n        {\n            InputName = inputName;\n            InputKind = inputKind;\n            UnversionedInputKind = unversionedInputKind;\n            InputSettings = inputSettings;\n            DefaultInputSettings = defaultInputSettings;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/InputMuteStateChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.InputMuteStateChanged\"/>\n    /// </summary>\n    public class InputMuteStateChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the input\n        /// </summary>\n        public string InputName { get; }\n        \n        /// <summary>\n        /// Whether the input is muted\n        /// </summary>\n        public bool InputMuted { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"inputName\">The input name</param>\n        /// <param name=\"inputMuted\">Is the input muted</param>\n        public InputMuteStateChangedEventArgs(string inputName, bool inputMuted)\n        {\n            InputName = inputName;\n            InputMuted = inputMuted;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/InputNameChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.InputNameChanged\"/>\n    /// </summary>\n    public class InputNameChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Old name of the input\n        /// </summary>\n        public string OldInputName { get; }\n        \n        /// <summary>\n        /// New name of the input\n        /// </summary>\n        public string InputName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"oldInputName\">The old input name</param>\n        /// <param name=\"inputName\">The new input name</param>\n        public InputNameChangedEventArgs(string oldInputName, string inputName)\n        {\n            OldInputName = oldInputName;\n            InputName = inputName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/InputRemovedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.InputRemoved\"/>\n    /// </summary>\n    public class InputRemovedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the input\n        /// </summary>\n        public string InputName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"inputName\">The input name</param>\n        public InputRemovedEventArgs(string inputName)\n        {\n            InputName = inputName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/InputShowStateChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.InputShowStateChanged\"/>\n    /// </summary>\n    public class InputShowStateChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the input\n        /// </summary>\n        public string InputName { get; }\n        \n        /// <summary>\n        /// Whether the input is showing\n        /// </summary>\n        public bool VideoShowing { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"inputName\">The input name</param>\n        /// <param name=\"videoShowing\">Is the video showing</param>\n        public InputShowStateChangedEventArgs(string inputName, bool videoShowing)\n        {\n            InputName = inputName;\n            VideoShowing = videoShowing;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/InputVolumeChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.InputVolumeChanged\"/>\n    /// </summary>\n    public class InputVolumeChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Current volume levels of source\n        /// </summary>\n        public InputVolume Volume { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"volume\">The new input volume</param>\n        public InputVolumeChangedEventArgs(InputVolume volume)\n        {\n            Volume = volume;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/InputVolumeMetersEventArgs.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.InputVolumeMeters\"/>\n    /// </summary>\n    public class InputVolumeMetersEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Array of active inputs with their associated volume levels\n        /// </summary>\n        public List<JObject> inputs { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"inputs\">Collection inputs as JObjects</param>\n        public InputVolumeMetersEventArgs(List<JObject> inputs)\n        {\n            this.inputs = inputs;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/MediaInputActionTriggeredEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.MediaInputActionTriggered\"/>\n    /// </summary>\n    public class MediaInputActionTriggeredEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the input\n        /// </summary>\n        public string InputName { get; } \n        \n        /// <summary>\n        /// Action performed on the input. See `ObsMediaInputAction` enum\n        /// </summary>\n        public string MediaAction { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"inputName\">The input name</param>\n        /// <param name=\"mediaAction\">The media action data</param>\n        public MediaInputActionTriggeredEventArgs(string inputName, string mediaAction)\n        {\n            InputName = inputName;\n            MediaAction = mediaAction;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/MediaInputPlaybackEndedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.MediaInputPlaybackEnded\"/>\n    /// </summary>\n    public class MediaInputPlaybackEndedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the input\n        /// </summary>\n        public string InputName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"inputName\">The input name</param>\n        public MediaInputPlaybackEndedEventArgs(string inputName)\n        {\n            InputName = inputName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/MediaInputPlaybackStartedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.MediaInputPlaybackStarted\"/>\n    /// </summary>\n    public class MediaInputPlaybackStartedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the input\n        /// </summary>\n        public string InputName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"inputName\">The input name</param>\n        public MediaInputPlaybackStartedEventArgs(string inputName)\n        {\n            InputName = inputName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/ProfileListChangedEventArgs.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.ProfileListChanged\"/>\n    /// </summary>\n    public class ProfileListChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// The profiles that have changed\n        /// </summary>\n        public List<string> Profiles { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"profiles\">Collection of profile names as strings</param>\n        public ProfileListChangedEventArgs(List<string> profiles)\n        {\n            Profiles = profiles;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/ProgramSceneChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.CurrentProgramSceneChanged\"/>\n    /// </summary>\n    public class ProgramSceneChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// The new scene name\n        /// </summary>\n        public string SceneName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneName\">The scene name</param>\n        public ProgramSceneChangedEventArgs(string sceneName)\n        {\n            SceneName = sceneName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/RecordStateChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.RecordStateChanged\"/>\n    /// </summary>\n    public class RecordStateChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// The specific state of the output\n        /// </summary>\n        public RecordStateChanged OutputState { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"outputState\">The record state change data</param>\n        public RecordStateChangedEventArgs(RecordStateChanged outputState)\n        {\n            OutputState = outputState;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/ReplayBufferSavedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.ReplayBufferSaved\"/>\n    /// </summary>\n    public class ReplayBufferSavedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Path of the saved replay file\n        /// </summary>\n        public string SavedReplayPath { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"savedReplayPath\">The saved replay path</param>\n        public ReplayBufferSavedEventArgs(string savedReplayPath)\n        {\n            SavedReplayPath = savedReplayPath;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/ReplayBufferStateChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.ReplayBufferStateChanged\"/>\n    /// </summary>\n    public class ReplayBufferStateChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// The specific state of the output\n        /// </summary>\n        public OutputStateChanged OutputState { get; }\n\n        /// <summary>\n        /// Default constructor\n        /// </summary>\n        /// <param name=\"outputState\">Specific state of the output</param>\n        public ReplayBufferStateChangedEventArgs(OutputStateChanged outputState)\n        {\n            OutputState = outputState;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneCollectionListChangedEventArgs.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneCollectionListChanged\"/>\n    /// </summary>\n    public class SceneCollectionListChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Updated list of scene collections\n        /// </summary>\n        public List<string> SceneCollections { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneCollections\">Collection of scene collection names as string</param>\n        public SceneCollectionListChangedEventArgs(List<string> sceneCollections)\n        {\n            SceneCollections = sceneCollections;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneCreatedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneCreated\"/>\n    /// </summary>\n    public class SceneCreatedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the new scene\n        /// </summary>\n        public string SceneName { get; }\n        \n        /// <summary>\n        /// Whether the new scene is a group\n        /// </summary>\n        public bool IsGroup { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneName\">The scene name</param>\n        /// <param name=\"isGroup\">Is the scene item a group</param>\n        public SceneCreatedEventArgs(string sceneName, bool isGroup)\n        {\n            SceneName = sceneName;\n            IsGroup = isGroup;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneItemCreatedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneItemCreated\"/>\n    /// </summary>\n    public class SceneItemCreatedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the scene where the item is\n        /// </summary>\n        public string SceneName { get; } \n        \n        /// <summary>\n        /// Name of the concerned item\n        /// </summary>\n        public string SourceName { get; }\n        \n        /// <summary>\n        /// Numeric ID of the scene item\n        /// </summary>\n        public int SceneItemId { get; } \n        \n        /// <summary>\n        /// Index position of the item\n        /// </summary>\n        public int SceneItemIndex { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneName\">The scene name</param>\n        /// <param name=\"sourceName\">The source name</param>\n        /// <param name=\"sceneItemId\">The scene item id</param>\n        /// <param name=\"sceneItemIndex\">The scene item index</param>\n        public SceneItemCreatedEventArgs(string sceneName, string sourceName, int sceneItemId, int sceneItemIndex)\n        {\n            SceneName = sceneName;\n            SourceName = sourceName;\n            SceneItemId = sceneItemId;\n            SceneItemIndex = sceneItemIndex;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneItemEnableStateChangedEventArgs.cs",
    "content": "using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneItemEnableStateChanged\"/>\n    /// </summary>\n    public class SceneItemEnableStateChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the scene the item is in\n        /// </summary>\n        public string SceneName { get; } \n        \n        /// <summary>\n        /// Numeric ID of the scene item\n        /// </summary>\n        public int SceneItemId { get; }\n        \n        /// <summary>\n        /// Whether the scene item is enabled (visible)\n        /// </summary>\n        public bool SceneItemEnabled { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneName\">The scene name</param>\n        /// <param name=\"sceneItemId\">The scene item id</param>\n        /// <param name=\"sceneItemEnabled\">Is the scene item enabled</param>\n        public SceneItemEnableStateChangedEventArgs(string sceneName, int sceneItemId, bool sceneItemEnabled)\n        {\n            SceneName = sceneName;\n            SceneItemId = sceneItemId;\n            SceneItemEnabled = sceneItemEnabled;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneItemListReindexedEventArgs.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneItemListReindexed\"/>\n    /// </summary>\n    public class SceneItemListReindexedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the scene where items where reordered\n        /// </summary>\n        public string SceneName { get; } \n\n        /// <summary>\n        /// List of all scene items as JObject\n        /// </summary>\n        public List<JObject> SceneItems { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneName\">The scene name</param>\n        /// <param name=\"sceneItems\">The scene item data as a colleciton of JObjects</param>\n        public SceneItemListReindexedEventArgs(string sceneName, List<JObject> sceneItems)\n        {\n            SceneName = sceneName;\n            SceneItems = sceneItems;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneItemLockStateChangedEventArgs.cs",
    "content": "using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneItemLockStateChanged\"/>\n    /// </summary>\n    public class SceneItemLockStateChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the scene the item is in\n        /// </summary>\n        public string SceneName { get; } \n        \n        /// <summary>\n        /// Numeric ID of the scene item\n        /// </summary>\n        public int SceneItemId { get; }\n        \n        /// <summary>\n        /// Whether the scene item is locked (visible)\n        /// </summary>\n        public bool SceneItemLocked { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneName\">The scene name</param>\n        /// <param name=\"sceneItemId\">The scene item id</param>\n        /// <param name=\"sceneItemLocked\">is the scene item locked</param>\n        public SceneItemLockStateChangedEventArgs(string sceneName, int sceneItemId, bool sceneItemLocked)\n        {\n            SceneName = sceneName;\n            SceneItemId = sceneItemId;\n            SceneItemLocked = sceneItemLocked;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneItemRemovedEventArgs.cs",
    "content": "using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneItemRemoved\"/>\n    /// </summary>\n    public class SceneItemRemovedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the scene where the item was removed from\n        /// </summary>\n        public string SceneName { get; } \n        \n        /// <summary>\n        /// Name of the concerned item\n        /// </summary>\n        public string SourceName { get; }\n        \n        /// <summary>\n        /// Numeric ID of the scene item\n        /// </summary>\n        public int SceneItemId { get; } \n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneName\">The scene name</param>\n        /// <param name=\"sourceName\">The source name</param>\n        /// <param name=\"sceneItemId\">The scene items id</param>\n        public SceneItemRemovedEventArgs(string sceneName, string sourceName, int sceneItemId)\n        {\n            SceneName = sceneName;\n            SourceName = sourceName;\n            SceneItemId = sceneItemId;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneItemSelectedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneItemSelected\"/>\n    /// </summary>\n    public class SceneItemSelectedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the scene item is in\n        /// </summary>\n        public string SceneName { get; }\n        \n        /// <summary>\n        /// Numeric ID of the scene item\n        /// </summary>\n        public string SceneItemId { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneName\">The scene name</param>\n        /// <param name=\"sceneItemId\">The scene item id</param>\n        public SceneItemSelectedEventArgs(string sceneName, string sceneItemId)\n        {\n            SceneName = sceneName;\n            SceneItemId = sceneItemId;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneItemTransformEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneItemTransformChanged\"/>\n    /// </summary>\n    public class SceneItemTransformEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the scene item is in\n        /// </summary>\n        public string SceneName { get; } \n        \n        /// <summary>\n        /// Numeric ID of the scene item\n        /// </summary>\n        public string SceneItemId { get; } \n        \n        /// <summary>\n        /// Transform data\n        /// </summary>\n        public SceneItemTransformInfo Transform { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneName\">The scene name</param>\n        /// <param name=\"sceneItemId\">The scene item id</param>\n        /// <param name=\"transform\">The transform data</param>\n        public SceneItemTransformEventArgs(string sceneName, string sceneItemId, SceneItemTransformInfo transform)\n        {\n            SceneName = sceneName;\n            SceneItemId = sceneItemId;\n            Transform = transform;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneListChangedEventArgs.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneListChanged\"/>\n    /// </summary>\n    public class SceneListChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Updated array of scenes\n        /// </summary>\n        public List<JObject> Scenes { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"scenes\">Collection of scene data as JObjects</param>\n        public SceneListChangedEventArgs(List<JObject> scenes)\n        {\n            Scenes = scenes;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneNameChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneNameChanged\"/>\n    /// </summary>\n    public class SceneNameChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Old name of the scene\n        /// </summary>\n        public string OldSceneName { get; }\n        \n        /// <summary>\n        /// New name of the scene\n        /// </summary>\n        public string SceneName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"oldSceneName\">The previous scene name</param>\n        /// <param name=\"sceneName\">The new scene name</param>\n        public SceneNameChangedEventArgs(string oldSceneName, string sceneName)\n        {\n            OldSceneName = oldSceneName;\n            SceneName = sceneName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneRemovedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneRemoved\"/>\n    /// </summary>\n    public class SceneRemovedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the removed scene\n        /// </summary>\n        public string SceneName { get; }\n        \n        /// <summary>\n        /// Whether the removed scene was a group\n        /// </summary>\n        public bool IsGroup { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sceneName\">The scene name</param>\n        /// <param name=\"isGroup\">Is the scene name a group</param>\n        public SceneRemovedEventArgs(string sceneName, bool isGroup)\n        {\n            SceneName = sceneName;\n            IsGroup = isGroup;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneTransitionEndedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneTransitionEnded\"/>\n    /// </summary>\n    public class SceneTransitionEndedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Scene transition name\n        /// </summary>\n        public string TransitionName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"transitionName\">The transition name</param>\n        public SceneTransitionEndedEventArgs(string transitionName)\n        {\n            TransitionName = transitionName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneTransitionStartedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SceneTransitionStarted\"/>\n    /// </summary>\n    public class SceneTransitionStartedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Transition name\n        /// </summary>\n        public string TransitionName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"transitionName\">The transition name</param>\n        public SceneTransitionStartedEventArgs(string transitionName)\n        {\n            TransitionName = transitionName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SceneTransitionVideoEndedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Called by <see cref=\"OBSWebsocket.SceneTransitionVideoEnded\"/>\n    /// </summary>\n    public class SceneTransitionVideoEndedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Transition name\n        /// </summary>\n        public string TransitionName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"transitionName\">The transition name</param>\n        public SceneTransitionVideoEndedEventArgs(string transitionName)\n        {\n            TransitionName = transitionName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SourceFilterCreatedEventArgs.cs",
    "content": "﻿using System;\nusing Newtonsoft.Json.Linq;\nusing OBSWebsocketDotNet;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SourceFilterCreated\"/>\n    /// </summary>\n    public class SourceFilterCreatedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the source the filter was added to\n        /// </summary>\n        public string SourceName { get; }\n        \n        /// <summary>\n        /// Name of the filter\n        /// </summary>\n        public string FilterName{ get; }\n        \n        /// <summary>\n        /// The kind of the filter\n        /// </summary>\n        public string FilterKind{ get; }\n        \n        /// <summary>\n        /// Index position of the filter\n        /// </summary>\n        public int FilterIndex{ get; }\n        \n        /// <summary>\n        /// The settings configured to the filter when it was created\n        /// </summary>\n        public JObject FilterSettings{ get; }\n        \n        /// <summary>\n        /// The default settings for the filter\n        /// </summary>\n        public JObject DefaultFilterSettings { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sourceName\">The source name</param>\n        /// <param name=\"filterName\">The filter name</param>\n        /// <param name=\"filterKind\">The kind of filter</param>\n        /// <param name=\"filterIndex\">The index of the filter</param>\n        /// <param name=\"filterSettings\">The filters settings as a JObject</param>\n        /// <param name=\"defaultFilterSettings\">The default filter settings as a JObject</param>\n        public SourceFilterCreatedEventArgs(string sourceName, string filterName, string filterKind, int filterIndex, JObject filterSettings, JObject defaultFilterSettings)\n        {\n            SourceName = sourceName;\n            FilterName = filterName;\n            FilterKind = filterKind;\n            FilterIndex = filterIndex;\n            FilterSettings = filterSettings;\n            DefaultFilterSettings = defaultFilterSettings;\n        }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SourceFilterEnableStateChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SourceFilterEnableStateChanged\"/>\n    /// </summary>\n    public class SourceFilterEnableStateChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the source the filter is on\n        /// </summary>\n        public string SourceName { get; }\n        \n        /// <summary>\n        /// Name of the filter\n        /// </summary>\n        public string FilterName { get; } \n        \n        /// <summary>\n        /// Whether the filter is enabled\n        /// </summary>\n        public bool FilterEnabled { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sourceName\">The source name</param>\n        /// <param name=\"filterName\">The filter name</param>\n        /// <param name=\"filterEnabled\">If the filter is enabled or not</param>\n        public SourceFilterEnableStateChangedEventArgs(string sourceName, string filterName, bool filterEnabled)\n        {\n            SourceName = sourceName;\n            FilterName = filterName;\n            FilterEnabled = filterEnabled;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SourceFilterListReindexedEventArgs.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SourceFilterListReindexed\"/>\n    /// </summary>\n    public class SourceFilterListReindexedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the source\n        /// </summary>\n        public string SourceName { get; }\n        \n        /// <summary>\n        /// Array of filter objects\n        /// </summary>\n        public List<FilterReorderItem> Filters { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sourceName\">The source name</param>\n        /// <param name=\"filters\">Collection of filters</param>\n        public SourceFilterListReindexedEventArgs(string sourceName, List<FilterReorderItem> filters)\n        {\n            SourceName = sourceName;\n            Filters = filters;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SourceFilterNameChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SourceFilterNameChanged\"/>\n    /// </summary>\n    public class SourceFilterNameChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// The source the filter is on\n        /// </summary>\n        public string SourceName { get; } \n        \n        /// <summary>\n        /// Old name of the filter\n        /// </summary>\n        public string OldFilterName { get; } \n        \n        /// <summary>\n        /// New name of the filter\n        /// </summary>\n        public string FilterName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sourceName\">The source name</param>\n        /// <param name=\"oldFilterName\">The filters previous name</param>\n        /// <param name=\"filterName\">The filters new name</param>\n        public SourceFilterNameChangedEventArgs(string sourceName, string oldFilterName, string filterName)\n        {\n            SourceName = sourceName;\n            OldFilterName = oldFilterName;\n            FilterName = filterName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/SourceFilterRemovedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.SourceFilterRemoved\"/>\n    /// </summary>\n    public class SourceFilterRemovedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the source the filter was on\n        /// </summary>\n        public string SourceName { get; }\n        \n        /// <summary>\n        /// Name of the filter\n        /// </summary>\n        public string FilterName { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"sourceName\">The source name</param>\n        /// <param name=\"filterName\">The filter name that's been removed</param>\n        public SourceFilterRemovedEventArgs(string sourceName, string filterName)\n        {\n            SourceName = sourceName;\n            FilterName = filterName;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/StreamStateChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.StreamStateChanged\"/>\n    /// </summary>\n    public class StreamStateChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// The specific state of the output\n        /// </summary>\n        public OutputStateChanged OutputState { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"outputState\">The output state data</param>\n        public StreamStateChangedEventArgs(OutputStateChanged outputState)\n        {\n            OutputState = outputState;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/StudioModeStateChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.StudioModeStateChanged\"/>\n    /// </summary>\n    public class StudioModeStateChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// New Studio Mode status\n        /// </summary>\n        public bool StudioModeEnabled { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"studioModeEnabled\">Is studio mode enabled</param>\n        public StudioModeStateChangedEventArgs(bool studioModeEnabled)\n        {\n            StudioModeEnabled = studioModeEnabled;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/UnsupportedEventArgs.cs",
    "content": "﻿using System;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for unsupported events\n    /// </summary>\n    public class UnsupportedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// The type of the event\n        /// </summary>\n        public string EventType { get; }\n        /// <summary>\n        /// The body of the event\n        /// </summary>\n        public JObject Body { get; }\n\n        /// <summary>\n        /// Event args for unsupported events\n        /// </summary>\n        public UnsupportedEventArgs(string eventType, JObject body)\n        {\n            EventType = eventType;\n            Body = body;\n        }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/VendorEventArgs.cs",
    "content": "﻿using System;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.VendorEvent\"/>\n    /// </summary>\n    public class VendorEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Name of the vendor emitting the event\n        /// </summary>\n        public string VendorName { get; }\n        \n        /// <summary>\n        /// Vendor-provided event typedef\n        /// </summary>\n        public string EventType { get; } \n        \n        /// <summary>\n        /// Vendor-provided event data. {} if event does not provide any data\n        /// </summary>\n        public JObject eventData { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"vendorName\">The vendor name</param>\n        /// <param name=\"eventType\">The event type</param>\n        /// <param name=\"eventData\">The event data as a Json Object</param>\n        public VendorEventArgs(string vendorName, string eventType, JObject eventData)\n        {\n            VendorName = vendorName;\n            EventType = eventType;\n            this.eventData = eventData;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/Events/VirtualcamStateChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types.Events\n{\n    /// <summary>\n    /// Event args for <see cref=\"OBSWebsocket.VirtualcamStateChanged\"/>\n    /// </summary>\n    public class VirtualcamStateChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// The specific state of the output\n        /// </summary>\n        public OutputStateChanged OutputState { get; }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        /// <param name=\"outputState\">The output state data</param>\n        public VirtualcamStateChangedEventArgs(OutputStateChanged outputState)\n        {\n            OutputState = outputState;\n        }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/FilterReorderItem.cs",
    "content": "﻿using Newtonsoft.Json;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Filter list item\n    /// </summary>\n    public class FilterReorderItem\n    {\n        /// <summary>\n        /// Name of filter\n        /// </summary>\n        [JsonProperty(PropertyName = \"name\")]\n        public string Name { set; get; }\n\n        /// <summary>\n        /// Type of filter\n        /// </summary>\n        [JsonProperty(PropertyName = \"type\")]\n        public string Type { set; get; }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/FilterSettings.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Filter settings\n    /// </summary>\n    public class FilterSettings\n    {\n        /// <summary>\n        /// Name of the filter\n        /// </summary>\n        [JsonProperty(PropertyName = \"filterName\")]\n        public string Name { set; get; }\n\n        /// <summary>\n        /// Type of the specified filter\n        /// </summary>\n        [JsonProperty(PropertyName = \"filterKind\")]\n        public string Kind { set; get; }\n\n        /// <summary>\n        /// Index of the filter in the list, beginning at 0\n        /// </summary>\n        [JsonProperty(PropertyName = \"filterIndex\")]\n        public int Index { get; set; }\n\n        /// <summary>\n        /// Status of the specified filter\n        /// </summary>\n        [JsonProperty(PropertyName = \"filterEnabled\")]\n        public bool IsEnabled { set; get; }\n\n        /// <summary>\n        /// Settings for the filter\n        /// </summary>\n        [JsonProperty(PropertyName = \"filterSettings\")]\n        public JObject Settings { set; get; }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/GetProfileListInfo.cs",
    "content": "﻿using Newtonsoft.Json;\nusing System.Collections.Generic;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Response from <see cref=\"OBSWebsocket.GetProfileList\"/>\n    /// </summary>\n    public class GetProfileListInfo\n    {\n        /// <summary>\n        /// Name of the currently active profile\n        /// </summary>\n        [JsonProperty(PropertyName = \"currentProfileName\")]\n        public string CurrentProfileName { set; get; }\n\n        /// <summary>\n        /// List of all profiles\n        /// </summary>\n        [JsonProperty(PropertyName = \"profiles\")]\n        public List<string> Profiles { set; get; }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/GetSceneListInfo.cs",
    "content": "﻿using Newtonsoft.Json;\nusing System.Collections.Generic;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Response from <see cref=\"OBSWebsocket.GetSceneList\"/>\n    /// </summary>\n    public class GetSceneListInfo\n    {\n        /// <summary>\n        /// Name of the currently active program scene\n        /// </summary>\n        [JsonProperty(PropertyName = \"currentProgramSceneName\")]\n        public string CurrentProgramSceneName { set; get; }\n\n        /// <summary>\n        /// Name of the currently active preview/studio scene\n        /// Note: Will return null if not in studio mode\n        /// </summary>\n        [JsonProperty(PropertyName = \"currentPreviewSceneName\")]\n        public string CurrentPreviewSceneName { set; get; }\n\n        /// <summary>\n        /// Ordered list of the current profile's scenes\n        /// </summary>\n        [JsonProperty(PropertyName = \"scenes\")]\n        public List<SceneBasicInfo> Scenes { set; get; }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/GetTransitionListInfo.cs",
    "content": "﻿using Newtonsoft.Json;\nusing System.Collections.Generic;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Response from <see cref=\"OBSWebsocket.GetSceneTransitionList\"/>\n    /// </summary>\n    public class GetTransitionListInfo\n    {\n        /// <summary>\n        /// Name of the currently active transition\n        /// </summary>\n        [JsonProperty(PropertyName = \"currentSceneTransitionName\")]\n        public string CurrentTransition { set; get; }\n\n        /// <summary>\n        /// Kind of the currently active transition\n        /// </summary>\n        [JsonProperty(PropertyName = \"currentSceneTransitionKind\")]\n        public string CurrentTransitionKing { set; get; }\n\n        /// <summary>\n        /// List of transitions.\n        /// </summary>\n        [JsonProperty(PropertyName = \"transitions\")]\n        public List<TransitionSettings> Transitions { set; get; }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/Input.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Abstract class with information on a specific Input\n    /// </summary>\n    public abstract class Input\n    {\n        /// <summary>\n        /// Name of the Input\n        /// </summary>\n        [JsonProperty(PropertyName = \"inputName\")]\n        public string InputName { get; set; }\n\n        /// <summary>\n        /// Kind of the Input\n        /// </summary>\n        [JsonProperty(PropertyName = \"inputKind\")]\n        public string InputKind { get; set; }\n\n        /// <summary>\n        /// Instantiate object from response data\n        /// </summary>\n        /// <param name=\"body\"></param>\n        public Input(JObject body)\n        {\n            JsonConvert.PopulateObject(body.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        public Input() { }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/InputBasicInfo.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Input class which also shows the Unversioned Input Kind\n    /// </summary>\n    public class InputBasicInfo : Input\n    {\n        /// <summary>\n        /// Unversioned Kind of the Input\n        /// </summary>\n        [JsonProperty(PropertyName = \"unversionedInputKind\")]\n        public string UnversionedKind { get; set; }\n\n        /// <summary>\n        /// Instantiate object from response data\n        /// </summary>\n        /// <param name=\"body\"></param>\n        public InputBasicInfo(JObject body) : base(body)\n        {\n            JsonConvert.PopulateObject(body.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        public InputBasicInfo() { }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/InputBrowserSourceSettings.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Input class dedicated for the ffmpeg_source input kind.\n    /// Usage: InputBrowserSourceSettings.FromInputSettings(InputSettings)\n    /// </summary>\n    public class InputBrowserSourceSettings : Input\n    {\n        private const string SUPPORTED_INPUT_KIND = \"browser_source\";\n        private const string CSS_DEFAULT_VALUE = \"body { background-color: rgba(0, 0, 0, 0); margin: 0px auto; overflow: hidden; }\";\n\n        /// <summary>\n        /// Set a custom FPS (using the FPS property)\n        /// </summary>\n        [JsonProperty(PropertyName = \"fps_custom\")]\n        public bool CustomFPS { get; set; } = false;\n\n        /// <summary>\n        /// Frames Per Second\n        /// </summary>\n        [JsonProperty(PropertyName = \"fps\")]\n        public int FPS { get; set; } = 30;\n\n        /// <summary>\n        /// Control audio via OBS\n        /// </summary>\n        [JsonProperty(PropertyName = \"reroute_audio\")]\n        public bool RerouteAudio { get; set; } = false;\n\n        /// <summary>\n        /// Height\n        /// </summary>\n        [JsonProperty(PropertyName = \"height\")]\n        public int Height { get; set; } = 600;\n\n        /// <summary>\n        /// Width\n        /// </summary>\n        [JsonProperty(PropertyName = \"width\")]\n        public int Width { get; set; } = 800;\n\n        /// <summary>\n        /// Custom CSS\n        /// </summary>\n        [JsonProperty(PropertyName = \"css\")]\n        public string CSS { get; set; } = CSS_DEFAULT_VALUE;\n\n        /// <summary>\n        /// Is Local file\n        /// </summary>\n        [JsonProperty(PropertyName = \"is_local_file\")]\n        public bool IsLocalFile { get; set; } = false;\n\n        /// <summary>\n        /// Local filename (when IsLocalFile is true)\n        /// </summary>\n        [JsonProperty(PropertyName = \"local_file\")]\n        public string LocalFile { get; set; }\n\n        /// <summary>\n        /// URL (when IsLocalFile is false)\n        /// </summary>\n        [JsonProperty(PropertyName = \"url\")]\n        public string URL { get; set; }\n\n        /// <summary>\n        /// Refresh browser when scene becomes active\n        /// </summary>\n        [JsonProperty(PropertyName = \"restart_when_active\")]\n        public bool RestartWhenActive { get; set; } = false;\n\n        /// <summary>\n        /// Shutdown source when not visible\n        /// </summary>\n        [JsonProperty(PropertyName = \"shutdown\")]\n        public bool ShutdownWhenNotVisible { get; set; } = false;\n              \n        /// <summary>\n        /// Page Permissions\n        /// </summary>\n        [JsonProperty(PropertyName = \"webpage_control_level\")]\n        public int ControlLevel { get; set; } = 1;\n\n        /// <summary>\n        /// Static constructor to instanciate a InputBrowserSourceSettings object\n        /// Requires an InputSettings class with InputKind of browser_source to create\n        /// </summary>\n        /// <param name=\"settings\">Settings object</param>\n        /// <returns></returns>\n        public static InputBrowserSourceSettings FromInputSettings(InputSettings settings)\n        {\n            return new InputBrowserSourceSettings(settings);\n        }\n        // Private Constrctor\n        private InputBrowserSourceSettings(InputSettings settings) : base(JObject.FromObject(settings))\n        {\n            if (settings.InputKind != SUPPORTED_INPUT_KIND)\n            {\n                throw new InvalidCastException();\n            }\n            JsonConvert.PopulateObject(settings.Settings.ToString(), this);\n        }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/InputFFMpegSettings.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Input class dedicated for the ffmpeg_source input kind.\n    /// Usage: InputFFMpegSettings.FromInputSettings(InputSettings)\n    /// </summary>\n    public class InputFFMpegSettings : Input\n    {\n        private const string SUPPORTED_INPUT_KIND = \"ffmpeg_source\";\n\n        /// <summary>\n        /// Buffering MB\n        /// </summary>\n        [JsonProperty(PropertyName = \"buffering_mb\")]\n        public int BufferingMB { get; set; } = 2;\n\n        /// <summary>\n        /// Clear window when media ends\n        /// </summary>\n        [JsonProperty(PropertyName = \"clear_on_media_end\")]\n        public bool ClearOnMediaEnd { get; set; } = true;\n\n        /// <summary>\n        /// Close when inactive\n        /// </summary>\n        [JsonProperty(PropertyName = \"close_when_inactive\")]\n        public bool CloseWhenInactive { get; set; } = false;\n\n        /// <summary>\n        /// Color Range\n        /// </summary>\n        [JsonProperty(PropertyName = \"color_range\")]\n        public int ColorRange { get; set; } = 0;\n\n        /// <summary>\n        /// HW Decoder\n        /// </summary>\n        [JsonProperty(PropertyName = \"hw_decode\")]\n        public bool HWDecode { get; set; } = false;\n\n        /// <summary>\n        /// Is Local file\n        /// </summary>\n        [JsonProperty(PropertyName = \"is_local_file\")]\n        public bool IsLocalFile { get; set; } = true;\n\n        /// <summary>\n        /// Local filename\n        /// </summary>\n        [JsonProperty(PropertyName = \"local_file\")]\n        public string LocalFile { get; set; }\n\n        /// <summary>\n        /// Looping\n        /// </summary>\n        [JsonProperty(PropertyName = \"looping\")]\n        public bool Looping { get; set; } = false;\n\n        /// <summary>\n        /// Apply alpha in linear space\n        /// </summary>\n        [JsonProperty(PropertyName = \"linear_alpha\")]\n        public bool LinearAlpha { get; set; } = false;\n\n        /// <summary>\n        /// Restart when activated\n        /// </summary>\n        [JsonProperty(PropertyName = \"restart_on_activate\")]\n        public bool RestartOnActivate { get; set; } = true;\n\n        /// <summary>\n        /// ffmpeg options\n        /// </summary>\n        [JsonProperty(PropertyName = \"ffmpeg_options\")]\n        public string Options { get; set; }\n\n        /// <summary>\n        /// Speed percentage\n        /// </summary>\n        [JsonProperty(PropertyName = \"speed_percent\")]\n        public int SpeedPercent { get; set; } = 100;\n\n        /// <summary>\n        /// Static constructor to instanciate a InputFFMpegSettings object\n        /// Requires an InputSettings class with InputKind of ffmpeg_source to create\n        /// </summary>\n        /// <param name=\"settings\">Setings object</param>\n        /// <returns></returns>\n        public static InputFFMpegSettings FromInputSettings(InputSettings settings)\n        {\n            return new InputFFMpegSettings(settings);\n        }\n        // Private Constrctor\n        private InputFFMpegSettings(InputSettings settings) : base(JObject.FromObject(settings))\n        {\n            if (settings.InputKind != SUPPORTED_INPUT_KIND)\n            {\n                throw new InvalidCastException();\n            }\n            JsonConvert.PopulateObject(settings.Settings.ToString(), this);\n        }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/InputSettings.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Settings for a source item\n    /// </summary>\n    public class InputSettings : Input\n    {\n        /// <summary>\n        /// Settings for the source\n        /// </summary>\n        [JsonProperty(PropertyName = \"inputSettings\")]\n        public JObject Settings { set; get; }\n\n        /// <summary>\n        /// Builds the object from the JSON data\n        /// </summary>\n        /// <param name=\"data\">JSON item description as a <see cref=\"JObject\"/></param>\n        public InputSettings(JObject data) : base(data)\n        {\n            JsonConvert.PopulateObject(data.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor for deserialization\n        /// </summary>\n        public InputSettings() { }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/InputVolume.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Source volume values\n    /// </summary>\n    public class InputVolume\n    {\n        /// <summary>\n        /// Name of the source\n        /// </summary>\n        [JsonProperty(PropertyName = \"inputName\")]\n        public string InputName { set; get; }\n        /// <summary>\n        /// The source volume in percent\n        /// </summary>\n        [JsonProperty(PropertyName = \"inputVolumeMul\")]\n        public float InputVolumeMul { get; set; }\n        /// <summary>\n        /// The source volume in decibels\n        /// </summary>\n        [JsonProperty(PropertyName = \"inputVolumeDb\")]\n        public float InputVolumeDb { get; set; }\n\n        /// <summary>\n        /// Builds the object from the JSON response body\n        /// </summary>\n        /// <param name=\"data\">JSON response body as a <see cref=\"JObject\"/></param>\n        public InputVolume(JObject data)\n        {\n            JsonConvert.PopulateObject(data.ToString(), this);\n        }\n\n        /// <summary>\n        /// Empty constructor for jsonconvert\n        /// </summary>\n        public InputVolume() { }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/KeyModifier.cs",
    "content": "﻿using System;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Key Modifiers\n    /// </summary>\n    [Flags]\n    public enum KeyModifier\n    {\n        /// <summary>\n        /// No modifiers\n        /// </summary>\n        None    = 0b_0000_0000,  // 0\n        \n        /// <summary>\n        /// Shift Key\n        /// </summary>\n        Shift   = 0b_0000_0001,  // 1\n\n        /// <summary>\n        /// Alt Key\n        /// </summary>\n        Alt     = 0b_0000_0010,  // 2\n        \n        /// <summary>\n        /// Control Key\n        /// </summary>\n        Control = 0b_0000_0100,  // 4,\n        \n        /// <summary>\n        /// Command (Mac) / WinKey (?) Windows\n        /// </summary>\n        Command = 0b_0000_1000   // 8\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/MediaInputStatus.cs",
    "content": "﻿using System;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Status of a Media Input\n    /// </summary>\n    public class MediaInputStatus\n    {\n        /// <summary>\n        /// State of the media input\n        /// </summary>\n        [JsonProperty(PropertyName = \"mediaState\")]\n        public string StateString { get; set; }\n\n        /// <summary>\n        /// State of the media input\n        /// </summary>\n        [JsonIgnore]\n        public MediaState? State\n        {\n            get\n            {\n                if (!Enum.TryParse(StateString, out MediaState state))\n                {\n                    return null;\n                }\n                return state;\n            }\n        }\n\n        /// <summary>\n        /// Total duration of the playing media in milliseconds. `null` if not playing\n        /// </summary>\n        [JsonProperty(PropertyName = \"mediaDuration\")]\n        public long? Duration { get; set; }\n\n        /// <summary>\n        /// Position of the cursor in milliseconds. `null` if not playing\n        /// </summary>\n        [JsonProperty(PropertyName = \"mediaCursor\")]\n        public long? Cursor { get; set; }\n\n        /// <summary>\n        /// Instantiate from JObject\n        /// </summary>\n        /// <param name=\"body\"></param>\n        public MediaInputStatus(JObject body)\n        {\n            JsonConvert.PopulateObject(body.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        public MediaInputStatus() { }\n    }\n\n    /// <summary>\n    /// Enum representing the state of a media input\n    /// </summary>\n    public enum MediaState\n    {\n        /// <summary>\n        /// No media is loaded\n        /// </summary>\n        OBS_MEDIA_STATE_NONE,\n\n        /// <summary>\n        /// Media is playing\n        /// </summary>\n        OBS_MEDIA_STATE_PLAYING,\n\n        /// <summary>\n        /// Media is opening\n        /// </summary>\n        OBS_MEDIA_STATE_OPENING,\n\n        /// <summary>\n        /// Media is buffering\n        /// </summary>\n        OBS_MEDIA_STATE_BUFFERING,\n\n        /// <summary>\n        /// Media is playing but is paused\n        /// </summary>\n        OBS_MEDIA_STATE_PAUSED, \n\n        /// <summary>\n        /// Media is stopped\n        /// </summary>\n        OBS_MEDIA_STATE_STOPPED,\n\n        /// <summary>\n        /// Media is ended\n        /// </summary>\n        OBS_MEDIA_STATE_ENDED,\n\n        /// <summary>\n        /// Media has errored\n        /// </summary>\n        OBS_MEDIA_STATE_ERROR\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/Monitor.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Information on a connected Monitor\n    /// </summary>\n    public class Monitor\n    {\n        /// <summary>\n        /// Monitor height (px)\n        /// </summary>\n        [JsonProperty(PropertyName = \"monitorHeight\")]\n        public int Height { get; set; }\n\n        /// <summary>\n        /// Monitor width (px)\n        /// </summary>\n        [JsonProperty(PropertyName = \"monitorWidth\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Monitor Name\n        /// </summary>\n        [JsonProperty(PropertyName = \"monitorName\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Monitor Index\n        /// </summary>\n        [JsonProperty(PropertyName = \"monitorIndex\")]\n        public int Index { get; set; }\n\n        /// <summary>\n        /// Monitor Position X\n        /// </summary>\n        [JsonProperty(PropertyName = \"monitorPositionX\")]\n        public int PositionX { get; set; }\n\n        /// <summary>\n        /// Monitor Position Y\n        /// </summary>\n        [JsonProperty(PropertyName = \"monitorPositionY\")]\n        public int PositionY { get; set; }\n\n        /// <summary>\n        /// Constructor to auto populate\n        /// </summary>\n        /// <param name=\"data\"></param>\n        public Monitor (JObject data)\n        {\n            JsonConvert.PopulateObject(data.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        public Monitor() { }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/OBSHotkey.cs",
    "content": "﻿namespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// OBS Hotkeys as defined here: https://github.com/obsproject/obs-studio/blob/master/libobs/obs-hotkeys.h\n    /// </summary>\n    public enum OBSHotkey\n    {\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n        OBS_KEY_NONE,\n        OBS_KEY_RETURN,\n        OBS_KEY_ENTER,\n        OBS_KEY_ESCAPE,\n        OBS_KEY_TAB,\n        OBS_KEY_BACKTAB,\n        OBS_KEY_BACKSPACE,\n        OBS_KEY_INSERT,\n        OBS_KEY_DELETE,\n        OBS_KEY_PAUSE,\n        OBS_KEY_PRINT,\n        OBS_KEY_SYSREQ,\n        OBS_KEY_CLEAR,\n        OBS_KEY_HOME,\n        OBS_KEY_END,\n        OBS_KEY_LEFT,\n        OBS_KEY_UP,\n        OBS_KEY_RIGHT,\n        OBS_KEY_DOWN,\n        OBS_KEY_PAGEUP,\n        OBS_KEY_PAGEDOWN,\n        OBS_KEY_SHIFT,\n        OBS_KEY_CONTROL,\n        OBS_KEY_META,\n        OBS_KEY_ALT,\n        OBS_KEY_ALTGR,\n        OBS_KEY_CAPSLOCK,\n        OBS_KEY_NUMLOCK,\n        OBS_KEY_SCROLLLOCK,\n        OBS_KEY_F1,\n        OBS_KEY_F2,\n        OBS_KEY_F3,\n        OBS_KEY_F4,\n        OBS_KEY_F5,\n        OBS_KEY_F6,\n        OBS_KEY_F7,\n        OBS_KEY_F8,\n        OBS_KEY_F9,\n        OBS_KEY_F10,\n        OBS_KEY_F11,\n        OBS_KEY_F12,\n        OBS_KEY_F13,\n        OBS_KEY_F14,\n        OBS_KEY_F15,\n        OBS_KEY_F16,\n        OBS_KEY_F17,\n        OBS_KEY_F18,\n        OBS_KEY_F19,\n        OBS_KEY_F20,\n        OBS_KEY_F21,\n        OBS_KEY_F22,\n        OBS_KEY_F23,\n        OBS_KEY_F24,\n        OBS_KEY_F25,\n        OBS_KEY_F26,\n        OBS_KEY_F27,\n        OBS_KEY_F28,\n        OBS_KEY_F29,\n        OBS_KEY_F30,\n        OBS_KEY_F31,\n        OBS_KEY_F32,\n        OBS_KEY_F33,\n        OBS_KEY_F34,\n        OBS_KEY_F35,\n        OBS_KEY_MENU,\n        OBS_KEY_HYPER_L,\n        OBS_KEY_HYPER_R,\n        OBS_KEY_HELP,\n        OBS_KEY_DIRECTION_L,\n        OBS_KEY_DIRECTION_R,\n        OBS_KEY_SPACE,\n        OBS_KEY_EXCLAM,\n        OBS_KEY_QUOTEDBL,\n        OBS_KEY_NUMBERSIGN,\n        OBS_KEY_DOLLAR,\n        OBS_KEY_PERCENT,\n        OBS_KEY_AMPERSAND,\n        OBS_KEY_APOSTROPHE,\n        OBS_KEY_PARENLEFT,\n        OBS_KEY_PARENRIGHT,\n        OBS_KEY_ASTERISK,\n        OBS_KEY_PLUS,\n        OBS_KEY_COMMA,\n        OBS_KEY_MINUS,\n        OBS_KEY_PERIOD,\n        OBS_KEY_SLASH,\n        OBS_KEY_0,\n        OBS_KEY_1,\n        OBS_KEY_2,\n        OBS_KEY_3,\n        OBS_KEY_4,\n        OBS_KEY_5,\n        OBS_KEY_6,\n        OBS_KEY_7,\n        OBS_KEY_8,\n        OBS_KEY_9,\n        OBS_KEY_NUMEQUAL,\n        OBS_KEY_NUMASTERISK,\n        OBS_KEY_NUMPLUS,\n        OBS_KEY_NUMCOMMA,\n        OBS_KEY_NUMMINUS,\n        OBS_KEY_NUMPERIOD,\n        OBS_KEY_NUMSLASH,\n        OBS_KEY_NUM0,\n        OBS_KEY_NUM1,\n        OBS_KEY_NUM2,\n        OBS_KEY_NUM3,\n        OBS_KEY_NUM4,\n        OBS_KEY_NUM5,\n        OBS_KEY_NUM6,\n        OBS_KEY_NUM7,\n        OBS_KEY_NUM8,\n        OBS_KEY_NUM9,\n        OBS_KEY_COLON,\n        OBS_KEY_SEMICOLON,\n        OBS_KEY_QUOTE,\n        OBS_KEY_LESS,\n        OBS_KEY_EQUAL,\n        OBS_KEY_GREATER,\n        OBS_KEY_QUESTION,\n        OBS_KEY_AT,\n        OBS_KEY_A,\n        OBS_KEY_B,\n        OBS_KEY_C,\n        OBS_KEY_D,\n        OBS_KEY_E,\n        OBS_KEY_F,\n        OBS_KEY_G,\n        OBS_KEY_H,\n        OBS_KEY_I,\n        OBS_KEY_J,\n        OBS_KEY_K,\n        OBS_KEY_L,\n        OBS_KEY_M,\n        OBS_KEY_N,\n        OBS_KEY_O,\n        OBS_KEY_P,\n        OBS_KEY_Q,\n        OBS_KEY_R,\n        OBS_KEY_S,\n        OBS_KEY_T,\n        OBS_KEY_U,\n        OBS_KEY_V,\n        OBS_KEY_W,\n        OBS_KEY_X,\n        OBS_KEY_Y,\n        OBS_KEY_Z,\n        OBS_KEY_BRACKETLEFT,\n        OBS_KEY_BACKSLASH,\n        OBS_KEY_BRACKETRIGHT,\n        OBS_KEY_ASCIICIRCUM,\n        OBS_KEY_UNDERSCORE,\n        OBS_KEY_QUOTELEFT,\n        OBS_KEY_BRACELEFT,\n        OBS_KEY_BAR,\n        OBS_KEY_BRACERIGHT,\n        OBS_KEY_ASCIITILDE,\n        OBS_KEY_NOBREAKSPACE,\n        OBS_KEY_EXCLAMDOWN,\n        OBS_KEY_CENT,\n        OBS_KEY_STERLING,\n        OBS_KEY_CURRENCY,\n        OBS_KEY_YEN,\n        OBS_KEY_BROKENBAR,\n        OBS_KEY_SECTION,\n        OBS_KEY_DIAERESIS,\n        OBS_KEY_COPYRIGHT,\n        OBS_KEY_ORDFEMININE,\n        OBS_KEY_GUILLEMOTLEFT,\n        OBS_KEY_NOTSIGN,\n        OBS_KEY_HYPHEN,\n        OBS_KEY_REGISTERED,\n        OBS_KEY_MACRON,\n        OBS_KEY_DEGREE,\n        OBS_KEY_PLUSMINUS,\n        OBS_KEY_TWOSUPERIOR,\n        OBS_KEY_THREESUPERIOR,\n        OBS_KEY_ACUTE,\n        OBS_KEY_MU,\n        OBS_KEY_PARAGRAPH,\n        OBS_KEY_PERIODCENTERED,\n        OBS_KEY_CEDILLA,\n        OBS_KEY_ONESUPERIOR,\n        OBS_KEY_MASCULINE,\n        OBS_KEY_GUILLEMOTRIGHT,\n        OBS_KEY_ONEQUARTER,\n        OBS_KEY_ONEHALF,\n        OBS_KEY_THREEQUARTERS,\n        OBS_KEY_QUESTIONDOWN,\n        OBS_KEY_AGRAVE,\n        OBS_KEY_AACUTE,\n        OBS_KEY_ACIRCUMFLEX,\n        OBS_KEY_ATILDE,\n        OBS_KEY_ADIAERESIS,\n        OBS_KEY_ARING,\n        OBS_KEY_AE,\n        OBS_KEY_CCEDILLA,\n        OBS_KEY_EGRAVE,\n        OBS_KEY_EACUTE,\n        OBS_KEY_ECIRCUMFLEX,\n        OBS_KEY_EDIAERESIS,\n        OBS_KEY_IGRAVE,\n        OBS_KEY_IACUTE,\n        OBS_KEY_ICIRCUMFLEX,\n        OBS_KEY_IDIAERESIS,\n        OBS_KEY_ETH,\n        OBS_KEY_NTILDE,\n        OBS_KEY_OGRAVE,\n        OBS_KEY_OACUTE,\n        OBS_KEY_OCIRCUMFLEX,\n        OBS_KEY_OTILDE,\n        OBS_KEY_ODIAERESIS,\n        OBS_KEY_MULTIPLY,\n        OBS_KEY_OOBLIQUE,\n        OBS_KEY_UGRAVE,\n        OBS_KEY_UACUTE,\n        OBS_KEY_UCIRCUMFLEX,\n        OBS_KEY_UDIAERESIS,\n        OBS_KEY_YACUTE,\n        OBS_KEY_THORN,\n        OBS_KEY_SSHARP,\n        OBS_KEY_DIVISION,\n        OBS_KEY_YDIAERESIS,\n        OBS_KEY_MULTI_KEY,\n        OBS_KEY_CODEINPUT,\n        OBS_KEY_SINGLECANDIDATE,\n        OBS_KEY_MULTIPLECANDIDATE,\n        OBS_KEY_PREVIOUSCANDIDATE,\n        OBS_KEY_MODE_SWITCH,\n        OBS_KEY_KANJI,\n        OBS_KEY_MUHENKAN,\n        OBS_KEY_HENKAN,\n        OBS_KEY_ROMAJI,\n        OBS_KEY_HIRAGANA,\n        OBS_KEY_KATAKANA,\n        OBS_KEY_HIRAGANA_KATAKANA,\n        OBS_KEY_ZENKAKU,\n        OBS_KEY_HANKAKU,\n        OBS_KEY_ZENKAKU_HANKAKU,\n        OBS_KEY_TOUROKU,\n        OBS_KEY_MASSYO,\n        OBS_KEY_KANA_LOCK,\n        OBS_KEY_KANA_SHIFT,\n        OBS_KEY_EISU_SHIFT,\n        OBS_KEY_EISU_TOGGLE,\n        OBS_KEY_HANGUL,\n        OBS_KEY_HANGUL_START,\n        OBS_KEY_HANGUL_END,\n        OBS_KEY_HANGUL_HANJA,\n        OBS_KEY_HANGUL_JAMO,\n        OBS_KEY_HANGUL_ROMAJA,\n        OBS_KEY_HANGUL_JEONJA,\n        OBS_KEY_HANGUL_BANJA,\n        OBS_KEY_HANGUL_PREHANJA,\n        OBS_KEY_HANGUL_POSTHANJA,\n        OBS_KEY_HANGUL_SPECIAL,\n        OBS_KEY_DEAD_GRAVE,\n        OBS_KEY_DEAD_ACUTE,\n        OBS_KEY_DEAD_CIRCUMFLEX,\n        OBS_KEY_DEAD_TILDE,\n        OBS_KEY_DEAD_MACRON,\n        OBS_KEY_DEAD_BREVE,\n        OBS_KEY_DEAD_ABOVEDOT,\n        OBS_KEY_DEAD_DIAERESIS,\n        OBS_KEY_DEAD_ABOVERING,\n        OBS_KEY_DEAD_DOUBLEACUTE,\n        OBS_KEY_DEAD_CARON,\n        OBS_KEY_DEAD_CEDILLA,\n        OBS_KEY_DEAD_OGONEK,\n        OBS_KEY_DEAD_IOTA,\n        OBS_KEY_DEAD_VOICED_SOUND,\n        OBS_KEY_DEAD_SEMIVOICED_SOUND,\n        OBS_KEY_DEAD_BELOWDOT,\n        OBS_KEY_DEAD_HOOK,\n        OBS_KEY_DEAD_HORN,\n        OBS_KEY_BACK,\n        OBS_KEY_FORWARD,\n        OBS_KEY_STOP,\n        OBS_KEY_REFRESH,\n        OBS_KEY_VOLUMEDOWN,\n        OBS_KEY_VOLUMEMUTE,\n        OBS_KEY_VOLUMEUP,\n        OBS_KEY_BASSBOOST,\n        OBS_KEY_BASSUP,\n        OBS_KEY_BASSDOWN,\n        OBS_KEY_TREBLEUP,\n        OBS_KEY_TREBLEDOWN,\n        OBS_KEY_MEDIAPLAY,\n        OBS_KEY_MEDIASTOP,\n        OBS_KEY_MEDIAPREVIOUS,\n        OBS_KEY_MEDIANEXT,\n        OBS_KEY_MEDIARECORD,\n        OBS_KEY_MEDIAPAUSE,\n        OBS_KEY_MEDIATOGGLEPLAYPAUSE,\n        OBS_KEY_HOMEPAGE,\n        OBS_KEY_FAVORITES,\n        OBS_KEY_SEARCH,\n        OBS_KEY_STANDBY,\n        OBS_KEY_OPENURL,\n        OBS_KEY_LAUNCHMAIL,\n        OBS_KEY_LAUNCHMEDIA,\n        OBS_KEY_LAUNCH0,\n        OBS_KEY_LAUNCH1,\n        OBS_KEY_LAUNCH2,\n        OBS_KEY_LAUNCH3,\n        OBS_KEY_LAUNCH4,\n        OBS_KEY_LAUNCH5,\n        OBS_KEY_LAUNCH6,\n        OBS_KEY_LAUNCH7,\n        OBS_KEY_LAUNCH8,\n        OBS_KEY_LAUNCH9,\n        OBS_KEY_LAUNCHA,\n        OBS_KEY_LAUNCHB,\n        OBS_KEY_LAUNCHC,\n        OBS_KEY_LAUNCHD,\n        OBS_KEY_LAUNCHE,\n        OBS_KEY_LAUNCHF,\n        OBS_KEY_LAUNCHG,\n        OBS_KEY_LAUNCHH,\n        OBS_KEY_MONBRIGHTNESSUP,\n        OBS_KEY_MONBRIGHTNESSDOWN,\n        OBS_KEY_KEYBOARDLIGHTONOFF,\n        OBS_KEY_KEYBOARDBRIGHTNESSUP,\n        OBS_KEY_KEYBOARDBRIGHTNESSDOWN,\n        OBS_KEY_POWEROFF,\n        OBS_KEY_WAKEUP,\n        OBS_KEY_EJECT,\n        OBS_KEY_SCREENSAVER,\n        OBS_KEY_WWW,\n        OBS_KEY_MEMO,\n        OBS_KEY_LIGHTBULB,\n        OBS_KEY_SHOP,\n        OBS_KEY_HISTORY,\n        OBS_KEY_ADDFAVORITE,\n        OBS_KEY_HOTLINKS,\n        OBS_KEY_BRIGHTNESSADJUST,\n        OBS_KEY_FINANCE,\n        OBS_KEY_COMMUNITY,\n        OBS_KEY_AUDIOREWIND,\n        OBS_KEY_BACKFORWARD,\n        OBS_KEY_APPLICATIONLEFT,\n        OBS_KEY_APPLICATIONRIGHT,\n        OBS_KEY_BOOK,\n        OBS_KEY_CD,\n        OBS_KEY_CALCULATOR,\n        OBS_KEY_TODOLIST,\n        OBS_KEY_CLEARGRAB,\n        OBS_KEY_CLOSE,\n        OBS_KEY_COPY,\n        OBS_KEY_CUT,\n        OBS_KEY_DISPLAY,\n        OBS_KEY_DOS,\n        OBS_KEY_DOCUMENTS,\n        OBS_KEY_EXCEL,\n        OBS_KEY_EXPLORER,\n        OBS_KEY_GAME,\n        OBS_KEY_GO,\n        OBS_KEY_ITOUCH,\n        OBS_KEY_LOGOFF,\n        OBS_KEY_MARKET,\n        OBS_KEY_MEETING,\n        OBS_KEY_MENUKB,\n        OBS_KEY_MENUPB,\n        OBS_KEY_MYSITES,\n        OBS_KEY_NEWS,\n        OBS_KEY_OFFICEHOME,\n        OBS_KEY_OPTION,\n        OBS_KEY_PASTE,\n        OBS_KEY_PHONE,\n        OBS_KEY_CALENDAR,\n        OBS_KEY_REPLY,\n        OBS_KEY_RELOAD,\n        OBS_KEY_ROTATEWINDOWS,\n        OBS_KEY_ROTATIONPB,\n        OBS_KEY_ROTATIONKB,\n        OBS_KEY_SAVE,\n        OBS_KEY_SEND,\n        OBS_KEY_SPELL,\n        OBS_KEY_SPLITSCREEN,\n        OBS_KEY_SUPPORT,\n        OBS_KEY_TASKPANE,\n        OBS_KEY_TERMINAL,\n        OBS_KEY_TOOLS,\n        OBS_KEY_TRAVEL,\n        OBS_KEY_VIDEO,\n        OBS_KEY_WORD,\n        OBS_KEY_XFER,\n        OBS_KEY_ZOOMIN,\n        OBS_KEY_ZOOMOUT,\n        OBS_KEY_AWAY,\n        OBS_KEY_MESSENGER,\n        OBS_KEY_WEBCAM,\n        OBS_KEY_MAILFORWARD,\n        OBS_KEY_PICTURES,\n        OBS_KEY_MUSIC,\n        OBS_KEY_BATTERY,\n        OBS_KEY_BLUETOOTH,\n        OBS_KEY_WLAN,\n        OBS_KEY_UWB,\n        OBS_KEY_AUDIOFORWARD,\n        OBS_KEY_AUDIOREPEAT,\n        OBS_KEY_AUDIORANDOMPLAY,\n        OBS_KEY_SUBTITLE,\n        OBS_KEY_AUDIOCYCLETRACK,\n        OBS_KEY_TIME,\n        OBS_KEY_HIBERNATE,\n        OBS_KEY_VIEW,\n        OBS_KEY_TOPMENU,\n        OBS_KEY_POWERDOWN,\n        OBS_KEY_SUSPEND,\n        OBS_KEY_CONTRASTADJUST,\n        OBS_KEY_MEDIALAST,\n        OBS_KEY_CALL,\n        OBS_KEY_CAMERA,\n        OBS_KEY_CAMERAFOCUS,\n        OBS_KEY_CONTEXT1,\n        OBS_KEY_CONTEXT2,\n        OBS_KEY_CONTEXT3,\n        OBS_KEY_CONTEXT4,\n        OBS_KEY_FLIP,\n        OBS_KEY_HANGUP,\n        OBS_KEY_NO,\n        OBS_KEY_SELECT,\n        OBS_KEY_YES,\n        OBS_KEY_TOGGLECALLHANGUP,\n        OBS_KEY_VOICEDIAL,\n        OBS_KEY_LASTNUMBERREDIAL,\n        OBS_KEY_EXECUTE,\n        OBS_KEY_PRINTER,\n        OBS_KEY_PLAY,\n        OBS_KEY_SLEEP,\n        OBS_KEY_ZOOM,\n        OBS_KEY_CANCEL,\n        OBS_KEY_BACKSLASH_RT102,\n        OBS_KEY_OPEN,\n        OBS_KEY_FIND,\n        OBS_KEY_REDO,\n        OBS_KEY_UNDO,\n        OBS_KEY_FRONT,\n        OBS_KEY_PROPS,\n        OBS_KEY_VK_CANCEL,\n        OBS_KEY_0x07,\n        OBS_KEY_0x0A,\n        OBS_KEY_0x0B,\n        OBS_KEY_0x0E,\n        OBS_KEY_0x0F,\n        OBS_KEY_0x16,\n        OBS_KEY_VK_JUNJA,\n        OBS_KEY_VK_FINAL,\n        OBS_KEY_0x1A,\n        OBS_KEY_VK_ACCEPT,\n        OBS_KEY_VK_MODECHANGE,\n        OBS_KEY_VK_SELECT,\n        OBS_KEY_VK_PRINT,\n        OBS_KEY_VK_EXECUTE,\n        OBS_KEY_VK_HELP,\n        OBS_KEY_0x30,\n        OBS_KEY_0x31,\n        OBS_KEY_0x32,\n        OBS_KEY_0x33,\n        OBS_KEY_0x34,\n        OBS_KEY_0x35,\n        OBS_KEY_0x36,\n        OBS_KEY_0x37,\n        OBS_KEY_0x38,\n        OBS_KEY_0x39,\n        OBS_KEY_0x3A,\n        OBS_KEY_0x3B,\n        OBS_KEY_0x3C,\n        OBS_KEY_0x3D,\n        OBS_KEY_0x3E,\n        OBS_KEY_0x3F,\n        OBS_KEY_0x40,\n        OBS_KEY_0x41,\n        OBS_KEY_0x42,\n        OBS_KEY_0x43,\n        OBS_KEY_0x44,\n        OBS_KEY_0x45,\n        OBS_KEY_0x46,\n        OBS_KEY_0x47,\n        OBS_KEY_0x48,\n        OBS_KEY_0x49,\n        OBS_KEY_0x4A,\n        OBS_KEY_0x4B,\n        OBS_KEY_0x4C,\n        OBS_KEY_0x4D,\n        OBS_KEY_0x4E,\n        OBS_KEY_0x4F,\n        OBS_KEY_0x50,\n        OBS_KEY_0x51,\n        OBS_KEY_0x52,\n        OBS_KEY_0x53,\n        OBS_KEY_0x54,\n        OBS_KEY_0x55,\n        OBS_KEY_0x56,\n        OBS_KEY_0x57,\n        OBS_KEY_0x58,\n        OBS_KEY_0x59,\n        OBS_KEY_0x5A,\n        OBS_KEY_VK_LWIN,\n        OBS_KEY_VK_RWIN,\n        OBS_KEY_VK_APPS,\n        OBS_KEY_0x5E,\n        OBS_KEY_VK_SLEEP,\n        OBS_KEY_VK_SEPARATOR,\n        OBS_KEY_0x88,\n        OBS_KEY_0x89,\n        OBS_KEY_0x8A,\n        OBS_KEY_0x8B,\n        OBS_KEY_0x8C,\n        OBS_KEY_0x8D,\n        OBS_KEY_0x8E,\n        OBS_KEY_0x8F,\n        OBS_KEY_VK_OEM_FJ_JISHO,\n        OBS_KEY_VK_OEM_FJ_LOYA,\n        OBS_KEY_VK_OEM_FJ_ROYA,\n        OBS_KEY_0x97,\n        OBS_KEY_0x98,\n        OBS_KEY_0x99,\n        OBS_KEY_0x9A,\n        OBS_KEY_0x9B,\n        OBS_KEY_0x9C,\n        OBS_KEY_0x9D,\n        OBS_KEY_0x9E,\n        OBS_KEY_0x9F,\n        OBS_KEY_VK_LSHIFT,\n        OBS_KEY_VK_RSHIFT,\n        OBS_KEY_VK_LCONTROL,\n        OBS_KEY_VK_RCONTROL,\n        OBS_KEY_VK_LMENU,\n        OBS_KEY_VK_RMENU,\n        OBS_KEY_VK_BROWSER_BACK,\n        OBS_KEY_VK_BROWSER_FORWARD,\n        OBS_KEY_VK_BROWSER_REFRESH,\n        OBS_KEY_VK_BROWSER_STOP,\n        OBS_KEY_VK_BROWSER_SEARCH,\n        OBS_KEY_VK_BROWSER_FAVORITES,\n        OBS_KEY_VK_BROWSER_HOME,\n        OBS_KEY_VK_VOLUME_MUTE,\n        OBS_KEY_VK_VOLUME_DOWN,\n        OBS_KEY_VK_VOLUME_UP,\n        OBS_KEY_VK_MEDIA_NEXT_TRACK,\n        OBS_KEY_VK_MEDIA_PREV_TRACK,\n        OBS_KEY_VK_MEDIA_STOP,\n        OBS_KEY_VK_MEDIA_PLAY_PAUSE,\n        OBS_KEY_VK_LAUNCH_MAIL,\n        OBS_KEY_VK_LAUNCH_MEDIA_SELECT,\n        OBS_KEY_VK_LAUNCH_APP1,\n        OBS_KEY_VK_LAUNCH_APP2,\n        OBS_KEY_0xB8,\n        OBS_KEY_0xB9,\n        OBS_KEY_0xC1,\n        OBS_KEY_0xC2,\n        OBS_KEY_0xC3,\n        OBS_KEY_0xC4,\n        OBS_KEY_0xC5,\n        OBS_KEY_0xC6,\n        OBS_KEY_0xC7,\n        OBS_KEY_0xC8,\n        OBS_KEY_0xC9,\n        OBS_KEY_0xCA,\n        OBS_KEY_0xCB,\n        OBS_KEY_0xCC,\n        OBS_KEY_0xCD,\n        OBS_KEY_0xCE,\n        OBS_KEY_0xCF,\n        OBS_KEY_0xD0,\n        OBS_KEY_0xD1,\n        OBS_KEY_0xD2,\n        OBS_KEY_0xD3,\n        OBS_KEY_0xD4,\n        OBS_KEY_0xD5,\n        OBS_KEY_0xD6,\n        OBS_KEY_0xD7,\n        OBS_KEY_0xD8,\n        OBS_KEY_0xD9,\n        OBS_KEY_0xDA,\n        OBS_KEY_VK_OEM_8,\n        OBS_KEY_0xE0,\n        OBS_KEY_VK_OEM_AX,\n        OBS_KEY_VK_ICO_HELP,\n        OBS_KEY_VK_ICO_00,\n        OBS_KEY_VK_PROCESSKEY,\n        OBS_KEY_VK_ICO_CLEAR,\n        OBS_KEY_VK_PACKET,\n        OBS_KEY_0xE8,\n        OBS_KEY_VK_OEM_RESET,\n        OBS_KEY_VK_OEM_JUMP,\n        OBS_KEY_VK_OEM_PA1,\n        OBS_KEY_VK_OEM_PA2,\n        OBS_KEY_VK_OEM_PA3,\n        OBS_KEY_VK_OEM_WSCTRL,\n        OBS_KEY_VK_OEM_CUSEL,\n        OBS_KEY_VK_OEM_ATTN,\n        OBS_KEY_VK_OEM_FINISH,\n        OBS_KEY_VK_OEM_COPY,\n        OBS_KEY_VK_OEM_AUTO,\n        OBS_KEY_VK_OEM_ENLW,\n        OBS_KEY_VK_ATTN,\n        OBS_KEY_VK_CRSEL,\n        OBS_KEY_VK_EXSEL,\n        OBS_KEY_VK_EREOF,\n        OBS_KEY_VK_PLAY,\n        OBS_KEY_VK_ZOOM,\n        OBS_KEY_VK_NONAME,\n        OBS_KEY_VK_PA1,\n        OBS_KEY_VK_OEM_CLEAR\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/OBSScene.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System.Collections.Generic;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Describes a scene in OBS, along with its items\n    /// </summary>\n    public class ObsScene\n    {\n        /// <summary>\n        /// OBS Scene name\n        /// </summary>\n        [JsonProperty(PropertyName = \"sceneName\")]\n        public string Name;\n\n        /// <summary>\n        /// Is group\n        /// </summary>\n        [JsonProperty(PropertyName = \"isGroup\")]\n        public bool IsGroup;\n\n        /// <summary>\n        /// Scene item list\n        /// </summary>\n        [JsonProperty(PropertyName = \"sources\")]\n        public List<SceneItemDetails> Items;\n\n        /// <summary>\n        /// Builds the object from the JSON description\n        /// </summary>\n        /// <param name=\"data\">JSON scene description as a <see cref=\"JObject\" /></param>\n        public ObsScene(JObject data)\n        {\n            JsonSerializerSettings settings = new JsonSerializerSettings\n            {\n                ObjectCreationHandling = ObjectCreationHandling.Auto,\n                NullValueHandling = NullValueHandling.Include\n            };\n            if (data.ContainsKey(\"currentProgramSceneName\"))\n            {\n                var newToken = JToken.FromObject(data[\"currentProgramSceneName\"]);\n                data.Add(\"sceneName\", newToken);\n            }\n            JsonConvert.PopulateObject(data.ToString(), this, settings);\n        }\n\n        /// <summary>\n        /// Default Constructor for deserialization\n        /// </summary>\n        public ObsScene() { }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/OBSStats.cs",
    "content": "﻿using Newtonsoft.Json;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// OBS Stats\n    /// </summary>\n    public class ObsStats\n    {\n        /// <summary>\n        /// Current framerate.\n        /// </summary>\n        [JsonProperty(PropertyName = \"activeFps\")]\n        public double FPS { set; get; }\n\n        /// <summary>\n        /// Number of frames rendered\n        /// </summary>\n        [JsonProperty(PropertyName = \"renderTotalFrames\")]\n        public long RenderTotalFrames { set; get; }\n\n        /// <summary>\n        /// Number of frames missed due to rendering lag\n        /// </summary>\n        [JsonProperty(PropertyName = \"renderSkippedFrames\")]\n        public long RenderMissedFrames { set; get; }\n\n        /// <summary>\n        /// Number of frames outputted\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputTotalFrames\")]\n        public long OutputTotalFrames { set; get; }\n\n        /// <summary>\n        /// Number of frames skipped due to encoding lag\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputSkippedFrames\")]\n        public long OutputSkippedFrames { set; get; }\n\n        /// <summary>\n        /// Average frame render time (in milliseconds)\n        /// </summary>\n        [JsonProperty(PropertyName = \"averageFrameRenderTime\")]\n        public double AverageFrameTime { set; get; }\n\n        /// <summary>\n        /// Current CPU usage (percentage)\n        /// </summary>\n        [JsonProperty(PropertyName = \"cpuUsage\")]\n        public double CpuUsage { set; get; }\n\n        /// <summary>\n        /// Current RAM usage (in megabytes)\n        /// </summary>\n        [JsonProperty(PropertyName = \"memoryUsage\")]\n        public double MemoryUsage { set; get; }\n\n        /// <summary>\n        /// Free recording disk space (in megabytes)\n        /// </summary>\n        [JsonProperty(PropertyName = \"availableDiskSpace\")]\n        public double FreeDiskSpace { set; get; }\n\n        /// <summary>\n        /// Total number of messages received by obs-websocket from the client\n        /// </summary>\n        [JsonProperty(PropertyName = \"webSocketSessionIncomingMessages\")]\n        public long SessionIncomingMessages { get; set; }\n\n        /// <summary>\n        /// Total number of messages sent by obs-websocket to the client\n        /// </summary>\n        [JsonProperty(PropertyName = \"webSocketSessionOutgoingMessages\")]\n        public long SessionOutgoingMessages { get; set; }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/OBSVersion.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System.Collections.Generic;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Version info of the plugin, the API and OBS Studio\n    /// </summary>\n    public class ObsVersion\n    {\n        /// <summary>\n        /// obs-websocket plugin version\n        /// </summary>\n        [JsonProperty(PropertyName = \"obsWebSocketVersion\")]\n        public string PluginVersion { get; internal set; }\n\n        /// <summary>\n        /// OBS Studio version\n        /// </summary>\n        [JsonProperty(PropertyName = \"obsVersion\")]\n        public string OBSStudioVersion { get; internal set; }\n\n        /// <summary>\n        /// OBSRemote compatible API version.Fixed to 1.1 for retrocompatibility.\n        /// </summary>\n        [JsonProperty(PropertyName = \"rpcVersion\")]\n        public double Version { internal set; get; }\n\n        /// <summary>\n        /// List of available request types, formatted as a comma-separated list string (e.g. : \"Method1,Method2,Method3\").\n        /// </summary>\n        [JsonProperty(PropertyName = \"availableRequests\")]\n        public List<string> AvailableRequests { get; internal set; }\n\n        /// <summary>\n        /// Image formats available in `GetSourceScreenshot` and `SaveSourceScreenshot` requests.\n        /// </summary>\n        [JsonProperty(PropertyName = \"supportedImageFormats\")]\n        public List<string> SupportedImageFormats { get; internal set; }\n\n        /// <summary>\n        /// Name of the platform. Usually `windows`, `macos`, or `ubuntu` (linux flavor). Not guaranteed to be any of those\n        /// </summary>\n        [JsonProperty(PropertyName = \"platform\")]\n        public string Platform { get; internal set; }\n\n        /// <summary>\n        /// Description of the platform, like `Windows 10 (10.0)`\n        /// </summary>\n        [JsonProperty(PropertyName = \"platformDescription\")]\n        public string PlatformDescription { get; internal set; }\n\n        /// <summary>\n        /// Builds the object from the JSON response body\n        /// </summary>\n        /// <param name=\"data\">JSON response body as a <see cref=\"JObject\"/></param>\n        public ObsVersion(JObject data)\n        {\n            JsonConvert.PopulateObject(data.ToString(), this);\n        }\n\n        /// <summary>\n        /// Empty constructor for jsonconvert\n        /// </summary>\n        public ObsVersion() { }\n\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/OBSVideoSettings.cs",
    "content": "﻿using Newtonsoft.Json;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Basic OBS video information\n    /// </summary>\n    public class ObsVideoSettings\n    {\n        /// <summary>\n        /// Numerator of the fractional FPS value\n        /// </summary>\n        [JsonProperty(PropertyName = \"fpsNumerator\")]\n        public double FpsNumerator { set; get; }\n\n        /// <summary>\n        /// Denominator of the fractional FPS value\n        /// </summary>\n        [JsonProperty(PropertyName = \"fpsDenominator\")]\n        public double FpsDenominator { set; get; }\n\n        /// <summary>\n        /// Base (canvas) width\n        /// </summary>\n        [JsonProperty(PropertyName = \"baseWidth\")]\n        public int BaseWidth { set; get; }\n\n        /// <summary>\n        /// Base (canvas) height\n        /// </summary>\n        [JsonProperty(PropertyName = \"baseHeight\")]\n        public int BaseHeight { set; get; }\n\n        /// <summary>\n        /// Width of the output resolution in pixels\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputWidth\")]\n        public int OutputWidth { set; get; }\n\n        /// <summary>\n        /// Height of the output resolution in pixels\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputHeight\")]\n        public int OutputHeight { set; get; }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/OutputState.cs",
    "content": "﻿namespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Describes the state of an output (streaming or recording)\n    /// </summary>\n    public enum OutputState\n    {\n        /// <summary>\n        /// The output is initializing and doesn't produce frames yet\n        /// </summary>\n        OBS_WEBSOCKET_OUTPUT_STARTING,\n\n        /// <summary>\n        /// The output is running and produces frames\n        /// </summary>\n        OBS_WEBSOCKET_OUTPUT_STARTED,\n\n        /// <summary>\n        /// The output is stopping and sends the last remaining frames in its buffer\n        /// </summary>\n        OBS_WEBSOCKET_OUTPUT_STOPPING,\n\n        /// <summary>\n        /// The output is completely stopped\n        /// </summary>\n        OBS_WEBSOCKET_OUTPUT_STOPPED,\n\n        /// <summary>\n        /// The output is paused (usually recording output)\n        /// </summary>\n        OBS_WEBSOCKET_OUTPUT_PAUSED,\n\n        /// <summary>\n        /// The output is resumed (i.e. no longer paused) - usually recording output\n        /// </summary>\n        OBS_WEBSOCKET_OUTPUT_RESUMED\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/OutputStateChanged.cs",
    "content": "﻿using System;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Data when Stream/Recording/Instant_Replay change states\n    /// </summary>\n    public class OutputStateChanged\n    {\n        private OutputState? state;\n        /// <summary>\n        /// Is output currently active (streaming/recording)\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputActive\")]\n        public bool IsActive { set; get; }\n\n        /// <summary>\n        /// Output state as string\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputState\")]\n        public string StateStr { set; get; }\n\n        /// <summary>\n        /// OutputState enum of current state\n        /// </summary>\n        public OutputState State {\n            get\n            {\n                if (state.HasValue)\n                {\n                    return state.Value;\n                }\n\n                if (!Enum.TryParse(StateStr, ignoreCase: true, out OutputState stateTmp))\n                {\n                    throw new ArgumentOutOfRangeException($\"Couldn't parse '{StateStr}' as {nameof(OutputState)}\");\n                }\n                state = stateTmp;\n\n                return state.Value;\n            }\n        }\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"body\"></param>\n        public OutputStateChanged(JObject body)\n        {\n            JsonConvert.PopulateObject(body.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor for deserialization\n        /// </summary>\n        public OutputStateChanged() { }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/OutputStatus.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Status of streaming output\n    /// </summary>\n    public class OutputStatus\n    {\n        /// <summary>\n        /// True if streaming is started and running, false otherwise\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputActive\")]\n        public readonly bool IsActive;\n\n        /// <summary>\n        /// Whether the output is currently reconnectins\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputReconnecting\")]\n        public bool IsReconnecting { get; set; }\n\n        /// <summary>\n        /// Current formatted timecode string for the output\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputTimecode\")]\n        public string TimeCode { get; set; }\n\n        /// <summary>\n        /// Current duration in milliseconds for the output\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputDuration\")]\n        public long Duration { get; set; }\n\n        /// <summary>\n        /// Congestion of the output\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputCongestion\")]\n        public double Congestion { get; set; }\n\n        /// <summary>\n        /// Nubmer of bytes sent by the output\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputBytes\")]\n        public long BytesSent { get; set; }\n\n        /// <summary>\n        /// Number of frames skipped by the output's process\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputSkippedFrames\")]\n        public long SkippedFrames { get; set; }\n\n        /// <summary>\n        /// Total number of frames delivered by the output's process\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputTotalFrames\")]\n        public long TotalFrames { get; set; }\n\n        /// <summary>\n        /// Builds the object from the JSON response body\n        /// </summary>\n        /// <param name=\"data\">JSON response body as a <see cref=\"JObject\"/></param>\n        public OutputStatus(JObject data)\n        {\n            JsonConvert.PopulateObject(data.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor for deserialization\n        /// </summary>\n        public OutputStatus() { }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/RecordStateChanged.cs",
    "content": "﻿using Newtonsoft.Json.Linq;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Data when Recording change states\n    /// </summary>\n    public class RecordStateChanged : OutputStateChanged\n    {\n        /// <summary>\n        /// File name for the saved recording, if record stopped. null otherwise\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputPath\")]\n        public string OutputPath { set; get; }\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"body\"></param>\n        public RecordStateChanged(JObject body) :base(body)\n        {\n            JsonConvert.PopulateObject(body.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor for deserialization\n        /// </summary>\n        public RecordStateChanged() { }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/RecordingStatus.cs",
    "content": "using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// GetRecordingStatus response\n    /// </summary>\n    public class RecordingStatus\n    {\n        /// <summary>\n        /// Current recording status\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputActive\")]\n        public bool IsRecording { set; get; }\n\n        /// <summary>\n        /// Whether the recording is paused or not\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputPaused\")]\n        public bool IsRecordingPaused { set; get; }\n\n        /// <summary>\n        /// Current formatted timecode string for the output\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputTimecode\")]\n        public string RecordTimecode { set; get; }\n\n        /// <summary>\n        /// Current duration in milliseconds for the output\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputDuration\")]\n        public long RecordingDuration { set; get; }\n\n        /// <summary>\n        /// Number of bytes sent by the output\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputBytes\")]\n        public long RecordingBytes { set; get; }\n\n        /// <summary>\n        /// Builds the object from the JSON response body\n        /// </summary>\n        /// <param name=\"data\">JSON response body as a <see cref=\"JObject\"/></param>\n        public RecordingStatus(JObject data)\n        {\n            JsonConvert.PopulateObject(data.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor for deserialization\n        /// </summary>\n        public RecordingStatus() { }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/SceneBasicInfo.cs",
    "content": "﻿using Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Response from <see cref=\"OBSWebsocket.GetSceneList\"/>\n    /// </summary>\n    public class SceneBasicInfo\n    {\n        /// <summary>\n        /// Name of scene\n        /// </summary>\n        [JsonProperty(PropertyName = \"sceneName\")]\n        public string Name { set; get; }\n\n        /// <summary>\n        /// Index of scene\n        /// </summary>\n        [JsonProperty(PropertyName = \"sceneIndex\")]\n        public string Index { set; get; }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/SceneItemBoundsType.cs",
    "content": "﻿namespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Types of bounding boxes for scene items\n    /// </summary>\n    public enum SceneItemBoundsType\n    {\n        /// <summary>\n        /// Stretch\n        /// </summary>\n        OBS_BOUNDS_STRETCH,\n        /// <summary>\n        /// Inner scale\n        /// </summary>\n        OBS_BOUNDS_SCALE_INNER,\n        /// <summary>\n        /// Outer scale\n        /// </summary>\n        OBS_BOUNDS_SCALE_OUTER,\n        /// <summary>\n        /// Scale to width\n        /// </summary>\n        OBS_BOUNDS_SCALE_TO_WIDTH,\n        /// <summary>\n        /// Scale to height\n        /// </summary>\n        OBS_BOUNDS_SCALE_TO_HEIGHT,\n        /// <summary>\n        /// Max only\n        /// </summary>\n        OBS_BOUNDS_MAX_ONLY,\n        /// <summary>\n        /// No bounds\n        /// </summary>\n        OBS_BOUNDS_NONE\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/SceneItemDetails.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Meta data regarding a Scene item\n    /// </summary>\n    public class SceneItemDetails\n    {\n        /// <summary>\n        /// Unique item id of the source item\n        /// </summary>\n        [JsonProperty(PropertyName = \"sceneItemId\")]\n        public int ItemId { set; get; }\n\n        /// <summary>\n        /// Kind of source (Example: vlc_source or image_source)\n        /// </summary>\n        [JsonProperty(PropertyName = \"inputKind\")]\n        public string SourceKind { set; get; }\n\n        /// <summary>\n        /// Name of the scene item's source\n        /// </summary>\n        [JsonProperty(PropertyName = \"sourceName\")]\n        public string SourceName { set; get; }\n\n        /// <summary>\n        /// Type of the scene item's source.\n        /// </summary>\n        [JsonProperty(PropertyName = \"sourceType\")]\n        public SceneItemSourceType SourceType { set; get; }\n\n\n        /// <summary>\n        /// Builds the object from the JSON data\n        /// </summary>\n        /// <param name=\"data\">JSON item description as a <see cref=\"JObject\"/></param>\n        public SceneItemDetails(JObject data)\n        {\n            if (data != null)\n            {\n                JsonConvert.PopulateObject(data.ToString(), this);\n            }\n        }\n\n        /// <summary>\n        /// Default Constructor for deserialization\n        /// </summary>\n        public SceneItemDetails() { }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/SceneItemSourceType.cs",
    "content": "﻿namespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Type of scene item's source\n    /// </summary>\n    public enum SceneItemSourceType\n    {\n        /// <summary>\n        /// Input\n        /// </summary>\n        OBS_SOURCE_TYPE_INPUT,\n\n        /// <summary>\n        /// Filter\n        /// </summary>\n        OBS_SOURCE_TYPE_FILTER,\n\n        /// <summary>\n        /// Transition\n        /// </summary>\n        OBS_SOURCE_TYPE_TRANSITION,\n\n        /// <summary>\n        /// Scene\n        /// </summary>\n        OBS_SOURCE_TYPE_SCENE\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/SceneItemTransformInfo.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Converters;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Item transformation information\n    /// </summary>\n    public class SceneItemTransformInfo\n    {\n        /// <summary>\n        /// Alignment of the item\n        /// </summary>\n        [JsonProperty(PropertyName = \"alignment\")]\n        public int Alignnment { set; get; }\n\n        /// <summary>\n        /// The point on the scene item that the item is manipulated from\n        /// </summary>\n        [JsonProperty(PropertyName = \"boundsAlignment\")]\n        public int BoundsAlignnment { set; get; }\n\n        /// <summary>\n        /// Height of the bounding box\n        /// </summary>\n        [JsonProperty(PropertyName = \"boundsHeight\")]\n        public double BoundsHeight { set; get; }\n\n        /// <summary>\n        /// Width of the bounding box\n        /// </summary>\n        [JsonProperty(PropertyName = \"boundsWidth\")]\n        public double BoundsWidth { set; get; }\n\n        /// <summary>\n        /// Type of bounding box\n        /// </summary>\n        [JsonProperty(PropertyName = \"boundsType\")]\n        [JsonConverter(typeof(StringEnumConverter))]\n        public SceneItemBoundsType BoundsType { set; get; }\n\n        /// <summary>\n        /// Bottom crop (in pixels)\n        /// </summary>\n        [JsonProperty(PropertyName = \"cropBottom\")]\n        public int CropBottom;\n\n        /// <summary>\n        /// Left crop (in pixels)\n        /// </summary>\n        [JsonProperty(PropertyName = \"cropLeft\")]\n        public int CropLeft;\n\n        /// <summary>\n        /// Right crop (in pixels)\n        /// </summary>\n        [JsonProperty(PropertyName = \"cropRight\")]\n        public int CropRight;\n\n        /// <summary>\n        /// Top crop (in pixels)\n        /// </summary>\n        [JsonProperty(PropertyName = \"cropTop\")]\n        public int CropTop;\n\n        /// <summary>\n        /// The clockwise rotation of the scene item in degrees around the point of alignment.\n        /// </summary>\n        [JsonProperty(PropertyName = \"rotation\")]\n        public double Rotation { set; get; }\n\n        /// <summary>\n        /// The x-scale factor of the scene item\n        /// </summary>\n        [JsonProperty(PropertyName = \"scaleX\")]\n        public double ScaleX { get; set; }\n\n        /// <summary>\n        /// The y-scale factor of the scene item\n        /// </summary>\n        [JsonProperty(PropertyName = \"scaleY\")]\n        public double ScaleY { get; set; }\n\n        /// <summary>\n        /// Base height (without scaling) of the source\n        /// </summary>\n        [JsonProperty(PropertyName = \"sourceHeight\")]\n        public double SourceHeight { set; get; }\n\n        /// <summary>\n        /// Base width (without scaling) of the source\n        /// </summary>\n        [JsonProperty(PropertyName = \"sourceWidth\")]\n        public double SourceWidth { set; get; }\n\n        /// <summary>\n        /// Scene item height (base source height multiplied by the vertical scaling factor)\n        /// </summary>\n        [JsonProperty(PropertyName = \"height\")]\n        public double Height { set; get; }\n\n        /// <summary>\n        /// Scene item width (base source width multiplied by the horizontal scaling factor)\n        /// </summary>\n        [JsonProperty(PropertyName = \"width\")]\n        public double Width { set; get; }\n\n        /// <summary>\n        /// The x position of the scene item from the left\n        /// </summary>\n        [JsonProperty(PropertyName = \"positionX\")]\n        public double X { set; get; }\n\n        /// <summary>\n        /// The y position of the scene item from the top\n        /// </summary>\n        [JsonProperty(PropertyName = \"positionY\")]\n        public double Y { set; get; }\n\n        /// <summary>\n        /// Initialize the scene item transform\n        /// </summary>\n        /// <param name=\"body\"></param>\n        public SceneItemTransformInfo(JObject body)\n        {\n            JsonConvert.PopulateObject(body.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor for deserialization\n        /// </summary>\n        public SceneItemTransformInfo() { }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/SourceActiveInfo.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Gets the Active and Showing state of a video source\n    /// </summary>\n    public class SourceActiveInfo\n    {\n        /// <summary>\n        /// Whether the source is showing in Program\n        /// </summary>\n        [JsonProperty(PropertyName = \"videaActive\")]\n        public bool VideoActive { get; set; }\n\n        /// <summary>\n        /// Whether the source is showing in the UI (Preview, Projector, Properties)\n        /// </summary>\n        [JsonProperty(PropertyName = \"videoShowing\")]\n        public bool VideoShowing { get; set; }\n\n        /// <summary>\n        /// Auto populate constructor\n        /// </summary>\n        /// <param name=\"data\"></param>\n        public SourceActiveInfo(JObject data)\n        {\n            JsonConvert.PopulateObject(data.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor\n        /// </summary>\n        public SourceActiveInfo() { }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/SourceTracks.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Tracks status for a source item\n    /// </summary>\n    public class SourceTracks\n    {\n        /// <summary>\n        /// Is the track active\n        /// </summary>\n        [JsonProperty(PropertyName = \"1\")]\n        public bool IsTrack1Active { set; get; }\n\n        /// <summary>\n        /// Is the track active\n        /// </summary>\n        [JsonProperty(PropertyName = \"2\")]\n        public bool IsTrack2Active { set; get; }\n\n        /// <summary>\n        /// Is the track active\n        /// </summary>\n        [JsonProperty(PropertyName = \"3\")]\n        public bool IsTrack3Active { set; get; }\n\n        /// <summary>\n        /// Is the track active\n        /// </summary>\n        [JsonProperty(PropertyName = \"4\")]\n        public bool IsTrack4Active { set; get; }\n\n        /// <summary>\n        /// Is the track active\n        /// </summary>\n        [JsonProperty(PropertyName = \"5\")]\n        public bool IsTrack5Active { set; get; }\n\n        /// <summary>\n        /// Is the track active\n        /// </summary>\n        [JsonProperty(PropertyName = \"6\")]\n        public bool IsTrack6Active { set; get; }\n\n        /// <summary>\n        /// Builds the object from the JSON data\n        /// </summary>\n        /// <param name=\"data\">JSON item description as a <see cref=\"JObject\"/></param>\n        public SourceTracks(JObject data)\n        {\n            JsonConvert.PopulateObject(data.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor for deserialization\n        /// </summary>\n        public SourceTracks() { }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/StreamingService.cs",
    "content": "﻿using Newtonsoft.Json;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Streaming settings\n    /// </summary>\n    public class StreamingService\n    {\n        /// <summary>\n        /// Type of streaming service\n        /// </summary>\n        [JsonProperty(PropertyName = \"streamServiceType\")]\n        public string Type { set; get; }\n\n        /// <summary>\n        /// Streaming service settings (JSON data)\n        /// </summary>\n        [JsonProperty(PropertyName = \"streamServiceSettings\")]\n        public StreamingServiceSettings Settings { set; get; }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/StreamingServiceSettings.cs",
    "content": "﻿using System.Collections.Generic;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Streaming server settings\n    /// </summary>\n    public class StreamingServiceSettings\n    {\n        /// <summary>\n        /// The publish URL\n        /// </summary>\n        [JsonProperty(PropertyName = \"server\")]\n        public string Server { set; get; }\n\n        /// <summary>\n        /// The publish key of the stream\n        /// </summary>\n        [JsonProperty(PropertyName = \"key\")]\n        public string Key { set; get; }\n\n        /// <summary>\n        /// Indicates whether authentication should be used when connecting to the streaming server\n        /// </summary>\n        [JsonProperty(PropertyName = \"use_auth\")]\n        public bool UseAuth { set; get; }\n\n        /// <summary>\n        /// The username to use when accessing the streaming server. Only present if use-auth is true\n        /// </summary>\n        [JsonProperty(PropertyName = \"username\")]\n        public string Username { set; get; }\n\n        /// <summary>\n        /// The password to use when accessing the streaming server. Only present if use-auth is true\n        /// </summary>\n        [JsonProperty(PropertyName = \"password\")]\n        public string Password { set; get; }\n\n        /// <summary>\n        /// The service being used to stream\n        /// </summary>\n        [JsonProperty(PropertyName = \"service\")]\n        public string Service { get; set; }\n\n        /// <summary>\n        /// The protocol to use for the stream\n        /// </summary>\n        [JsonProperty(PropertyName = \"protocol\")]\n        public string Protocol { get; set; }\n\n        /// <summary>\n        /// Other values not covered by the class\n        /// </summary>\n        [JsonExtensionData]\n        public Dictionary<string, JToken> OtherValues { get; set; }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/TransitionOverrideInfo.cs",
    "content": "﻿using Newtonsoft.Json;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Scene transition override settings\n    /// </summary>\n    public class TransitionOverrideInfo\n    {\n        /// <summary>\n        /// Name of the current overriding transition. Empty string if no override is set.\n        /// </summary>\n        [JsonProperty(PropertyName = \"transitionName\")]\n        public string Name { internal set; get; }\n\n        /// <summary>\n        /// Transition duration in milliseconds. -1 if no override is set.\n        /// </summary>\n        [JsonProperty(PropertyName = \"transitionDuration\")]\n        public int Duration { internal set; get; }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/TransitionSettings.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Current transition settings\n    /// </summary>\n    public class TransitionSettings\n    {\n        /// <summary>\n        /// Transition name\n        /// </summary>\n        [JsonProperty(PropertyName = \"transitionName\")]\n        public string Name { internal set; get; }\n\n        /// <summary>\n        /// Transition duration in milliseconds\n        /// </summary>\n        [JsonProperty(PropertyName = \"transitionDuration\")]\n        public int? Duration { internal set; get; }\n\n        /// <summary>\n        /// Kind of the transition\n        /// </summary>\n        [JsonProperty(PropertyName = \"transitionKind\")]\n        public string Kind { internal set; get; }\n\n        /// <summary>\n        /// Whether the transition uses a fixed (unconfigurable) duration\n        /// </summary>\n        [JsonProperty(PropertyName = \"transitionFixed\")]\n        public bool IsFixed { internal set; get; }\n\n        /// <summary>\n        /// Whether the transition supports being configured\n        /// </summary>\n        [JsonProperty(PropertyName = \"transitionConfigurable\")]\n        public bool IsConfigurable { internal set; get; }\n\n        /// <summary>\n        /// Object of settings for the transition. 'null' if transition is not configurable\n        /// </summary>\n        [JsonProperty(PropertyName = \"transitionSettings\")]\n        public JObject Settings { get; set; }\n\n        /// <summary>\n        /// Builds the object from the JSON response body\n        /// </summary>\n        /// <param name=\"data\">JSON response body as a <see cref=\"JObject\"/></param>\n        public TransitionSettings(JObject data)\n        {\n            JsonConvert.PopulateObject(data.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor for deserialization\n        /// </summary>\n        public TransitionSettings() { }\n\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/Types/VirtualCamStatus.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// VirtualCam Status\n    /// </summary>\n    public class VirtualCamStatus\n    {\n        /// <summary>\n        /// Whether the output is active\n        /// </summary>\n        [JsonProperty(PropertyName = \"outputActive\")]\n        public bool IsActive { get; set; }\n\n        /// <summary>\n        /// Builds the object from the JSON response body\n        /// </summary>\n        /// <param name=\"data\">JSON response body as a <see cref=\"JObject\"/></param>\n        public VirtualCamStatus(JObject data)\n        {\n            JsonConvert.PopulateObject(data.ToString(), this);\n        }\n\n        /// <summary>\n        /// Constructor for jsonconverter\n        /// </summary>\n        public VirtualCamStatus()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet/Types/VolumeInfo.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace OBSWebsocketDotNet.Types\n{\n    /// <summary>\n    /// Volume settings of an OBS source\n    /// </summary>\n    public class VolumeInfo\n    {\n        /// <summary>\n        /// Source volume in linear scale (0.0 to 1.0)\n        /// </summary>\n        [JsonProperty(PropertyName = \"inputVolumeMul\")]\n        public float VolumeMul { internal set; get; }\n\n        /// <summary>\n        /// Volume setting in dB\n        /// </summary>\n        [JsonProperty(PropertyName = \"inputVolumeDb\")]\n        public float VolumeDb { internal set; get; }\n\n        /// <summary>\n        /// Builds the object from the JSON response body\n        /// </summary>\n        /// <param name=\"data\">JSON response body as a <see cref=\"JObject\"/></param>\n        public VolumeInfo(JObject data)\n        {\n            JsonConvert.PopulateObject(data.ToString(), this);\n        }\n\n        /// <summary>\n        /// Default Constructor for deserialization\n        /// </summary>\n        public VolumeInfo() { }\n    }\n}"
  },
  {
    "path": "obs-websocket-dotnet/obs-websocket-dotnet.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n\t<PropertyGroup>\n\t\t<TargetFramework>netstandard2.1</TargetFramework>\n\t\t<AssemblyName>obs-websocket-dotnet</AssemblyName>\n\t\t<RootNamespace>OBSWebsocketDotNet</RootNamespace>\n\t\t<Copyright>Copyright © BarRaider 2025</Copyright>\n\t\t<LangVersion>8</LangVersion>\n\t\t<Version>5.0.1</Version>\n\t\t<Authors>BarRaider</Authors>\n\t\t<PackageLicenseFile>LICENSE</PackageLicenseFile>\n\t\t<PackageProjectUrl>https://github.com/BarRaider/obs-websocket-dotnet</PackageProjectUrl>\n\t\t<RepositoryUrl>https://github.com/BarRaider/obs-websocket-dotnet</RepositoryUrl>\n\t\t<Description>Official obs-websocket .NET library. Written in C#. Supports .NET Standard</Description>\n\t\t<PackageTags>OBS obs-websocket websocket official obs-websocket-dotnet obs.websocket.net obs-websocket-net</PackageTags>\n\t\t<GeneratePackageOnBuild>true</GeneratePackageOnBuild>\n\t\t<PackageReleaseNotes>What's new in v5.0.1\n* Fixes for deserialization issues in MediaInputStatus\n* Allow OBSVideoSettings to be updated via the API\n* New ILogger support instead of writing to console\n* New UnsupportedEvent event\n\n</PackageReleaseNotes>\n\t</PropertyGroup>\n\n\t<PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n\t  <DocumentationFile>obs-websocket-dotnet.xml</DocumentationFile>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t  <PackageReference Include=\"Microsoft.Extensions.Logging.Abstractions\" Version=\"9.0.4\" />\n\t  <PackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" />\n\t  <PackageReference Include=\"Websocket.Client\" Version=\"5.1.2\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t  <None Include=\"..\\LICENSE\">\n\t    <Pack>True</Pack>\n\t    <PackagePath></PackagePath>\n\t  </None>\n\t</ItemGroup>\n\n</Project>"
  },
  {
    "path": "obs-websocket-dotnet/obs-websocket-dotnet.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>obs-websocket-dotnet</name>\n    </assembly>\n    <members>\n        <member name=\"T:OBSWebsocketDotNet.Communication.OBSAuthInfo\">\n            <summary>\n            Data required by authentication\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.OBSAuthInfo.Challenge\">\n            <summary>\n            Authentication challenge\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.OBSAuthInfo.PasswordSalt\">\n            <summary>\n            Password salt\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Communication.OBSAuthInfo.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Builds the object from JSON response body\n            </summary>\n            <param name=\"data\">JSON response body as a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Communication.OBSAuthInfo.#ctor\">\n            <summary>\n            Default Constructor for deserialization\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Communication.ObsCloseCodes\">\n            <summary>\n            Close/Error codes sent by OBS Websocket when closing the connection\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.ObsCloseCodes.DontClose\">\n            <summary>\n            For internal use only to tell the request handler not to perform any close action.\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.ObsCloseCodes.UnknownReason\">\n            <summary>\n            Unknown reason, should never be used.\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.ObsCloseCodes.MessageDecodeError\">\n            <summary>\n            The server was unable to decode the incoming websocket message.\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.ObsCloseCodes.MissingDataField\">\n            <summary>\n            A data field is required but missing from the payload.\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.ObsCloseCodes.InvalidDataFieldType\">\n            <summary>\n            A data field's value type is invalid.\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.ObsCloseCodes.InvalidDataFieldValue\">\n            <summary>\n            A data field's value is invalid.\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.ObsCloseCodes.UnknownOpCode\">\n            <summary>\n            The specified op was invalid or missing.\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.ObsCloseCodes.NotIdentified\">\n            <summary>\n            The client sent a websocket message without first sending Identify message.\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.ObsCloseCodes.AlreadyIdentified\">\n            <summary>\n            The client sent an Identify message while already identified.\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.ObsCloseCodes.AuthenticationFailed\">\n            <summary>\n            The authentication attempt (via Identify) failed.\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.ObsCloseCodes.UnsupportedRpcVersion\">\n            <summary>\n            The server detected the usage of an old version of the obs-websocket RPC protocol.\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.ObsCloseCodes.SessionInvalidated\">\n            <summary>\n            The websocket session has been invalidated by the obs-websocket server.\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Communication.ObsCloseCodes.UnsupportedFeature\">\n            <summary>\n            A requested feature is not supported due to hardware/software limitations.\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Communication.ObsDisconnectionInfo\">\n            <summary>\n            Disconnection information received from the OBS Websocket server\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Communication.ObsDisconnectionInfo.ObsCloseCode\">\n            <summary>\n            Close/Error codes sent by OBS Websocket when closing the connection\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Communication.ObsDisconnectionInfo.DisconnectReason\">\n            <summary>\n            String reason of disconnect\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Communication.ObsDisconnectionInfo.WebsocketDisconnectionInfo\">\n            <summary>\n            Websocket Client internal information\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Communication.ObsDisconnectionInfo.#ctor(OBSWebsocketDotNet.Communication.ObsCloseCodes,System.String,Websocket.Client.DisconnectionInfo)\">\n            <summary>\n            Constructor\n            </summary>\n            <param name=\"obsCloseCode\">Close/Error codes sent by OBS Websocket when closing the connection</param>\n            <param name=\"disconnectReason\">String reason of disconnect</param>\n            <param name=\"websocketDisconnectionInfo\">Websocket Client internal information</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Communication.ServerMessage\">\n            <summary>\n            Message received from the server\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Communication.ServerMessage.OperationCode\">\n            <summary>\n            Server Message's operation code\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Communication.ServerMessage.Data\">\n            <summary>\n            Server Data\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.OBSWebsocket\">\n            <summary>\n            Instance of a connection with an obs-websocket server\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentProgramSceneChanged\">\n            <summary>\n            The current program scene has changed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneListChanged\">\n            <summary>\n            The list of scenes has changed.\n            TODO: Make OBS fire this event when scenes are reordered.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemListReindexed\">\n            <summary>\n            Triggered when the scene item list of the specified scene is reordered\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemCreated\">\n            <summary>\n            Triggered when a new item is added to the item list of the specified scene\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemRemoved\">\n            <summary>\n            Triggered when an item is removed from the item list of the specified scene\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemEnableStateChanged\">\n            <summary>\n            Triggered when the visibility of a scene item changes\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemLockStateChanged\">\n            <summary>\n            Triggered when the lock status of a scene item changes\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentSceneCollectionChanged\">\n            <summary>\n            Triggered when switching to another scene collection\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneCollectionListChanged\">\n            <summary>\n            Triggered when a scene collection is created, deleted or renamed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentSceneTransitionChanged\">\n            <summary>\n            Triggered when switching to another transition\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentSceneTransitionDurationChanged\">\n            <summary>\n            Triggered when the current transition duration is changed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneTransitionStarted\">\n            <summary>\n            Triggered when a transition between two scenes starts. Followed by <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentProgramSceneChanged\"/>\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneTransitionEnded\">\n            <summary>\n            Triggered when a transition (other than \"cut\") has ended. Please note that the from-scene field is not available in TransitionEnd\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneTransitionVideoEnded\">\n            <summary>\n            Triggered when a stinger transition has finished playing its video\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentProfileChanged\">\n            <summary>\n            Triggered when switching to another profile\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.ProfileListChanged\">\n            <summary>\n            Triggered when a profile is created, imported, removed or renamed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.StreamStateChanged\">\n            <summary>\n            Triggered when the streaming output state changes\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.RecordStateChanged\">\n            <summary>\n            Triggered when the recording output state changes\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.ReplayBufferStateChanged\">\n            <summary>\n            Triggered when state of the replay buffer changes\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentPreviewSceneChanged\">\n            <summary>\n            Triggered when the preview scene selection changes (Studio Mode only)\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.StudioModeStateChanged\">\n            <summary>\n            Triggered when Studio Mode is turned on or off\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.ExitStarted\">\n            <summary>\n            Triggered when OBS exits\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.Connected\">\n            <summary>\n            Triggered when connected successfully to an obs-websocket server\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.Disconnected\">\n            <summary>\n            Triggered when disconnected from an obs-websocket server\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemSelected\">\n            <summary>\n            A scene item is selected in the UI\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemTransformChanged\">\n            <summary>\n            A scene item transform has changed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.InputAudioSyncOffsetChanged\">\n            <summary>\n            The audio sync offset of an input has changed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SourceFilterCreated\">\n            <summary>\n            A filter was added to a source\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SourceFilterRemoved\">\n            <summary>\n            A filter was removed from a source\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SourceFilterListReindexed\">\n            <summary>\n            Filters in a source have been reordered\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SourceFilterEnableStateChanged\">\n            <summary>\n            Triggered when the visibility of a filter has changed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.InputMuteStateChanged\">\n            <summary>\n            A source has been muted or unmuted\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.InputVolumeChanged\">\n            <summary>\n            The volume of a source has changed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.VendorEvent\">\n            <summary>\n            A custom broadcast message was received\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.MediaInputPlaybackEnded\">\n            <summary>\n            These events are emitted by the OBS sources themselves. For example when the media file ends. The behavior depends on the type of media source being used.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.MediaInputPlaybackStarted\">\n            <summary>\n            These events are emitted by the OBS sources themselves. For example when the media file starts playing. The behavior depends on the type of media source being used.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.MediaInputActionTriggered\">\n            <summary>\n            This event is only emitted when something actively controls the media/VLC source. In other words, the source will never emit this on its own naturally.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.VirtualcamStateChanged\">\n            <summary>\n            The virtual cam state has changed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentSceneCollectionChanging\">\n            <summary>\n            The current scene collection has begun changing.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentProfileChanging\">\n            <summary>\n            The current profile has begun changing.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SourceFilterNameChanged\">\n            <summary>\n            The name of a source filter has changed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.InputCreated\">\n            <summary>\n            An input has been created.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.InputRemoved\">\n            <summary>\n            An input has been removed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.InputNameChanged\">\n            <summary>\n            The name of an input has changed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.InputActiveStateChanged\">\n            <summary>\n            An input's active state has changed.\n            When an input is active, it means it's being shown by the program feed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.InputShowStateChanged\">\n            <summary>\n            An input's show state has changed.\n            When an input is showing, it means it's being shown by the preview or a dialog.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.InputAudioBalanceChanged\">\n            <summary>\n            The audio balance value of an input has changed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.InputAudioTracksChanged\">\n            <summary>\n            The audio tracks of an input have changed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.InputAudioMonitorTypeChanged\">\n            <summary>\n            The monitor type of an input has changed.\n            Available types are:\n            - `OBS_MONITORING_TYPE_NONE`\n            - `OBS_MONITORING_TYPE_MONITOR_ONLY`\n            - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.InputVolumeMeters\">\n            <summary>\n            A high-volume event providing volume levels of all active inputs every 50 milliseconds.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.ReplayBufferSaved\">\n            <summary>\n            The replay buffer has been saved.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneCreated\">\n            <summary>\n            A new scene has been created.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneRemoved\">\n            <summary>\n            A scene has been removed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneNameChanged\">\n            <summary>\n            The name of a scene has changed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.OBSWebsocket.UnsupportedEvent\">\n            <summary>\n            An unsupported event has been received.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.ProcessEventType(System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Update message handler\n            </summary>\n            <param name=\"eventType\">Value of \"event-type\" in the JSON body</param>\n            <param name=\"body\">full JSON message body</param>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.OBSWebsocket.WSTimeout\">\n            <summary>\n            WebSocket request timeout, represented as a TimeSpan object\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.OBSWebsocket.IsConnected\">\n            <summary>\n            Current connection state\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.OBSWebsocket.Logger\">\n            <summary>\n            Gets or sets the logger for this instance\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.#ctor\">\n            <summary>\n            Constructor\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.Connect(System.String,System.String)\">\n            <summary>\n            Connect this instance to the specified URL, and authenticate (if needed) with the specified password.\n            NOTE: Please subscribe to the Connected/Disconnected events (or atleast check the IsConnected property) to determine when the connection is actually fully established\n            </summary>\n            <param name=\"url\">Server URL in standard URL format.</param>\n            <param name=\"password\">Server password</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.ConnectAsync(System.String,System.String)\">\n            <summary>\n            Connect this instance to the specified URL, and authenticate (if needed) with the specified password.\n            NOTE: Please subscribe to the Connected/Disconnected events (or atleast check the IsConnected property) to determine when the connection is actually fully established\n            </summary>\n            <param name=\"url\">Server URL in standard URL format.</param>\n            <param name=\"password\">Server password</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.Disconnect\">\n            <summary>\n            Disconnect this instance from the server\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SendRequest(System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Sends a message to the websocket API with the specified request type and optional parameters\n            </summary>\n            <param name=\"requestType\">obs-websocket request type, must be one specified in the protocol specification</param>\n            <param name=\"additionalFields\">additional JSON fields if required by the request type</param>\n            <returns>The server's JSON response as a JObject</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SendRequest(OBSWebsocketDotNet.Communication.MessageTypes,System.String,Newtonsoft.Json.Linq.JObject,System.Boolean)\">\n            <summary>\n            Internal version which allows to set the opcode\n            Sends a message to the websocket API with the specified request type and optional parameters\n            </summary>\n            <param name=\"operationCode\">Type/OpCode for this messaage</param>\n            <param name=\"requestType\">obs-websocket request type, must be one specified in the protocol specification</param>\n            <param name=\"additionalFields\">additional JSON fields if required by the request type</param>\n            <param name=\"waitForReply\">Should wait for reply vs \"fire and forget\"</param>\n            <returns>The server's JSON response as a JObject</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetAuthInfo\">\n            <summary>\n            Request authentication data. You don't have to call this manually.\n            </summary>\n            <returns>Authentication data in an <see cref=\"T:OBSWebsocketDotNet.Communication.OBSAuthInfo\"/> object</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SendIdentify(System.String,OBSWebsocketDotNet.Communication.OBSAuthInfo)\">\n            <summary>\n            Authenticates to the Websocket server using the challenge and salt given in the passed <see cref=\"T:OBSWebsocketDotNet.Communication.OBSAuthInfo\"/> object\n            </summary>\n            <param name=\"password\">User password</param>\n            <param name=\"authInfo\">Authentication data</param>\n            <returns>true if authentication succeeds, false otherwise</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.HashEncode(System.String)\">\n            <summary>\n            Encode a Base64-encoded SHA-256 hash\n            </summary>\n            <param name=\"input\">source string</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.NewMessageID(System.Int32)\">\n            <summary>\n            Generate a message ID\n            </summary>\n            <param name=\"length\">(optional) message ID length</param>\n            <returns>A random string of alphanumerical characters</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetVideoSettings\">\n            <summary>\n            Get basic OBS video information\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SaveSourceScreenshot(System.String,System.String,System.String,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Saves a screenshot of a source to the filesystem.\n            The `imageWidth` and `imageHeight` parameters are treated as \\\"scale to inner\\\", meaning the smallest ratio will be used and the aspect ratio of the original resolution is kept.\n            If `imageWidth` and `imageHeight` are not specified, the compressed image will use the full resolution of the source.\n            **Compatible with inputs and scenes.**\n            </summary>\n            <param name=\"sourceName\">Name of the source to take a screenshot of</param>\n            <param name=\"imageFormat\">Image compression format to use. Use `GetVersion` to get compatible image formats</param>\n            <param name=\"imageFilePath\">Path to save the screenshot file to. Eg. `C:\\\\Users\\\\user\\\\Desktop\\\\screenshot.png`</param>\n            <param name=\"imageWidth\">Width to scale the screenshot to</param>\n            <param name=\"imageHeight\">Height to scale the screenshot to</param>\n            <param name=\"imageCompressionQuality\">Compression quality to use. 0 for high compression, 100 for uncompressed. -1 to use \\\"default\\\" (whatever that means, idk)</param>\n            <returns>Base64-encoded screenshot string</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SaveSourceScreenshot(System.String,System.String,System.String)\">\n            <summary>\n            Saves a screenshot of a source to the filesystem.\n            The `imageWidth` and `imageHeight` parameters are treated as \\\"scale to inner\\\", meaning the smallest ratio will be used and the aspect ratio of the original resolution is kept.\n            If `imageWidth` and `imageHeight` are not specified, the compressed image will use the full resolution of the source.\n            **Compatible with inputs and scenes.**\n            </summary>\n            <param name=\"sourceName\">Name of the source to take a screenshot of</param>\n            <param name=\"imageFormat\">Image compression format to use. Use `GetVersion` to get compatible image formats</param>\n            <param name=\"imageFilePath\">Path to save the screenshot file to. Eg. `C:\\\\Users\\\\user\\\\Desktop\\\\screenshot.png`</param>\n            <returns>Base64-encoded screenshot string</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.TriggerHotkeyByName(System.String)\">\n            <summary>\n            Executes hotkey routine, identified by hotkey unique name\n            </summary>\n            <param name=\"hotkeyName\">Unique name of the hotkey, as defined when registering the hotkey (e.g. \"ReplayBuffer.Save\")</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.TriggerHotkeyByKeySequence(OBSWebsocketDotNet.Types.OBSHotkey,OBSWebsocketDotNet.Types.KeyModifier)\">\n            <summary>\n            Triggers a hotkey using a sequence of keys.\n            </summary>\n            <param name=\"keyId\">Main key identifier (e.g. OBS_KEY_A for key \"A\"). Available identifiers are here: https://github.com/obsproject/obs-studio/blob/master/libobs/obs-hotkeys.h</param>\n            <param name=\"keyModifier\">Optional key modifiers object. You can combine multiple key operators. e.g. KeyModifier.Shift | KeyModifier.Control</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetCurrentProgramScene\">\n            <summary>\n            Get the name of the currently active scene. \n            </summary>\n            <returns>Name of the current scene</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetCurrentProgramScene(System.String)\">\n            <summary>\n            Set the current scene to the specified one\n            </summary>\n            <param name=\"sceneName\">The desired scene name</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetStats\">\n            <summary>\n            Get OBS stats (almost the same info as provided in OBS' stats window)\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.ListScenes\">\n            <summary>\n            List every available scene\n            </summary>\n            <returns>A <see cref=\"T:System.Collections.Generic.List`1\" /> of <see cref=\"T:OBSWebsocketDotNet.Types.SceneBasicInfo\"/> objects describing each scene</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneList\">\n            <summary>\n            Get a list of scenes in the currently active profile\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneSceneTransitionOverride(System.String)\">\n            <summary>\n            Get the specified scene's transition override info\n            </summary>\n            <param name=\"sceneName\">Name of the scene to return the override info</param>\n            <returns>TransitionOverrideInfo</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetSceneSceneTransitionOverride(System.String,System.String,System.Int32)\">\n            <summary>\n            Set specific transition override for a scene\n            </summary>\n            <param name=\"sceneName\">Name of the scene to set the transition override</param>\n            <param name=\"transitionName\">Name of the transition to use</param>\n            <param name=\"transitionDuration\">Duration in milliseconds of the transition if transition is not fixed. Defaults to the current duration specified in the UI if there is no current override and this value is not given</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetTBarPosition(System.Double,System.Boolean)\">\n            <summary>\n            If your code needs to perform multiple successive T-Bar moves (e.g. : in an animation, or in response to a user moving a T-Bar control in your User Interface), set release to false and call ReleaseTBar later once the animation/interaction is over.\n            </summary>\n            <param name=\"position\">\tT-Bar position. This value must be between 0.0 and 1.0.</param>\n            <param name=\"release\">Whether or not the T-Bar gets released automatically after setting its new position (like a user releasing their mouse button after moving the T-Bar). Call ReleaseTBar manually if you set release to false. Defaults to true.</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetSourceFilterSettings(System.String,System.String,Newtonsoft.Json.Linq.JObject,System.Boolean)\">\n            <summary>\n            Apply settings to a source filter\n            </summary>\n            <param name=\"sourceName\">Source with filter</param>\n            <param name=\"filterName\">Filter name</param>\n            <param name=\"filterSettings\">JObject with filter settings</param>\n            <param name=\"overlay\">Apply over existing settings?</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetSourceFilterSettings(System.String,System.String,OBSWebsocketDotNet.Types.FilterSettings,System.Boolean)\">\n            <summary>\n            Apply settings to a source filter\n            </summary>\n            <param name=\"sourceName\">Source with filter</param>\n            <param name=\"filterName\">Filter name</param>\n            <param name=\"filterSettings\">Filter settings</param>\n            <param name=\"overlay\">Apply over existing settings?</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetSourceFilterEnabled(System.String,System.String,System.Boolean)\">\n            <summary>\n            Modify the Source Filter's visibility\n            </summary>\n            <param name=\"sourceName\">Source name</param>\n            <param name=\"filterName\">Source filter name</param>\n            <param name=\"filterEnabled\">New filter state</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSourceFilterList(System.String)\">\n            <summary>\n            Return a list of all filters on a source\n            </summary>\n            <param name=\"sourceName\">Source name</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSourceFilter(System.String,System.String)\">\n            <summary>\n            Return a list of settings for a specific filter\n            </summary>\n            <param name=\"sourceName\">Source name</param>\n            <param name=\"filterName\">Filter name</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.RemoveSourceFilter(System.String,System.String)\">\n            <summary>\n            Remove the filter from a source\n            </summary>\n            <param name=\"sourceName\">Name of the source the filter is on</param>\n            <param name=\"filterName\">Name of the filter to remove</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.CreateSourceFilter(System.String,System.String,System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Add a filter to a source\n            </summary>\n            <param name=\"sourceName\">Name of the source for the filter</param>\n            <param name=\"filterName\">Name of the filter</param>\n            <param name=\"filterKind\">Type of filter</param>\n            <param name=\"filterSettings\">JObject holding filter settings object</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.CreateSourceFilter(System.String,System.String,System.String,OBSWebsocketDotNet.Types.FilterSettings)\">\n            <summary>\n            Add a filter to a source\n            </summary>\n            <param name=\"sourceName\">Name of the source for the filter</param>\n            <param name=\"filterName\">Name of the filter</param>\n            <param name=\"filterKind\">Type of filter</param>\n            <param name=\"filterSettings\">Filter settings object</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.ToggleStream\">\n            <summary>\n            Toggles the status of the stream output.\n            </summary>\n            <returns>New state of the stream output</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.ToggleRecord\">\n            <summary>\n            Toggles the status of the record output.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetStreamStatus\">\n            <summary>\n            Gets the status of the stream output\n            </summary>\n            <returns>An <see cref=\"T:OBSWebsocketDotNet.Types.OutputStatus\"/> object describing the current outputs states</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetCurrentSceneTransition\">\n            <summary>\n            Get the current transition name and duration\n            </summary>\n            <returns>An <see cref=\"T:OBSWebsocketDotNet.Types.TransitionSettings\"/> object with the current transition name and duration</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetCurrentSceneTransition(System.String)\">\n            <summary>\n            Set the current transition to the specified one\n            </summary>\n            <param name=\"transitionName\">Desired transition name</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetCurrentSceneTransitionDuration(System.Int32)\">\n            <summary>\n            Change the transition's duration\n            </summary>\n            <param name=\"transitionDuration\">Desired transition duration (in milliseconds)</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetCurrentSceneTransitionSettings(Newtonsoft.Json.Linq.JObject,System.Boolean)\">\n            <summary>\n            Change the current settings of a transition\n            </summary>\n            <param name=\"transitionSettings\">Transition settings (they can be partial)</param>\n            <param name=\"overlay\">Whether to overlay over the current settins or replace them</param>\n            <returns>Updated transition settings</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetInputVolume(System.String,System.Single,System.Boolean)\">\n            <summary>\n            Change the volume of the specified source\n            </summary>\n            <param name=\"inputName\">Name of the source which volume will be changed</param>\n            <param name=\"inputVolume\">Desired volume. Must be between `0.0` and `1.0` for amplitude/mul (useDecibel is false), and under 0.0 for dB (useDecibel is true). Note: OBS will interpret dB values under -100.0 as Inf.</param>\n            <param name=\"inputVolumeDb\">Interperet `volume` data as decibels instead of amplitude/mul.</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetInputVolume(System.String)\">\n            <summary>\n            Get the volume of the specified source\n            Volume is between `0.0` and `1.0` if using amplitude/mul (useDecibel is false), under `0.0` if using dB (useDecibel is true).\n            </summary>\n            <param name=\"inputName\">Source name</param>\n            <returns>An <see cref=\"T:OBSWebsocketDotNet.Types.VolumeInfo\"/>Object containing the volume and mute state of the specified source.</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetInputMute(System.String)\">\n            <summary>\n            Gets the audio mute state of an input.\n            </summary>\n            <param name=\"inputName\">Name of input to get the mute state of</param>\n            <returns>Whether the input is muted</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetInputMute(System.String,System.Boolean)\">\n            <summary>\n            Set the mute state of the specified source\n            </summary>\n            <param name=\"inputName\">Name of the source which mute state will be changed</param>\n            <param name=\"inputMuted\">Desired mute state</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.ToggleInputMute(System.String)\">\n            <summary>\n            Toggle the mute state of the specified source\n            </summary>\n            <param name=\"inputName\">Name of the source which mute state will be toggled</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetSceneItemTransform(System.String,System.Int32,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Sets the transform and crop info of a scene item\n            </summary>\n            <param name=\"sceneName\">Name of the scene that has the SceneItem</param>\n            <param name=\"sceneItemId\">Id of the Scene Item</param>\n            <param name=\"sceneItemTransform\">JObject holding transform settings</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetSceneItemTransform(System.String,System.Int32,OBSWebsocketDotNet.Types.SceneItemTransformInfo)\">\n            <summary>\n            Sets the transform and crop info of a scene item\n            </summary>\n            <param name=\"sceneName\">Name of the scene that has the SceneItem</param>\n            <param name=\"sceneItemId\">Id of the Scene Item</param>\n            <param name=\"sceneItemTransform\">Transform settings</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetCurrentSceneCollection(System.String)\">\n            <summary>\n            Set the current scene collection to the specified one\n            </summary>\n            <param name=\"sceneCollectionName\">Desired scene collection name</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetCurrentSceneCollection\">\n            <summary>\n            Get the name of the current scene collection\n            </summary>\n            <returns>Name of the current scene collection</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneCollectionList\">\n            <summary>\n            List all scene collections\n            </summary>\n            <returns>A <see cref=\"T:System.Collections.Generic.List`1\"/> of the names of all scene collections</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetCurrentProfile(System.String)\">\n            <summary>\n            Set the current profile to the specified one\n            </summary>\n            <param name=\"profileName\">Name of the desired profile</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetProfileList\">\n            <summary>\n            List all profiles\n            </summary>\n            <returns>A <see cref=\"T:System.Collections.Generic.List`1\"/> of the names of all profiles</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.StartStream\">\n            <summary>\n            Start streaming. Will trigger an error if streaming is already active\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.StopStream\">\n            <summary>\n            Stop streaming. Will trigger an error if streaming is not active.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.StartRecord\">\n            <summary>\n            Start recording. Will trigger an error if recording is already active.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.StopRecord\">\n            <summary>\n            Stop recording. Will trigger an error if recording is not active.\n            <returns>File name for the saved recording</returns>\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.PauseRecord\">\n            <summary>\n            Pause the current recording. Returns an error if recording is not active or already paused.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.ResumeRecord\">\n            <summary>\n            Resume/unpause the current recording (if paused). Returns an error if recording is not active or not paused.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetRecordDirectory\">\n            <summary>\n            Get the path of the current recording folder\n            </summary>\n            <returns>Current recording folder path</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetRecordStatus\">\n            <summary>\n            Get current recording status.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetReplayBufferStatus\">\n            <summary>\n            Get the status of the OBS replay buffer.\n            </summary>\n            <returns>Current recording status. true when active</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneTransitionList\">\n            <summary>\n            Get duration of the currently selected transition (if supported)\n            </summary>\n            <returns>Current transition duration (in milliseconds)</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetStudioModeEnabled\">\n            <summary>\n            Get status of Studio Mode\n            </summary>\n            <returns>Studio Mode status (on/off)</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetStudioModeEnabled(System.Boolean)\">\n            <summary>\n            Enables or disables studio mode\n            </summary>\n            <param name=\"studioModeEnabled\"></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetCurrentPreviewScene\">\n            <summary>\n            Get the name of the currently selected preview scene. \n            Note: Triggers an error if Studio Mode is disabled\n            </summary>\n            <returns>Preview scene name</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetCurrentPreviewScene(System.String)\">\n            <summary>\n            Change the currently active preview/studio scene to the one specified.\n            Triggers an error if Studio Mode is disabled\n            </summary>\n            <param name=\"sceneName\">Preview scene name</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetCurrentPreviewScene(OBSWebsocketDotNet.Types.ObsScene)\">\n            <summary>\n            Change the currently active preview/studio scene to the one specified.\n            Triggers an error if Studio Mode is disabled.\n            </summary>\n            <param name=\"previewScene\">Preview scene object</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.TriggerStudioModeTransition\">\n            <summary>\n            Triggers the current scene transition. Same functionality as the `Transition` button in Studio Mode\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.ToggleReplayBuffer\">\n            <summary>\n            Toggles the state of the replay buffer output.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.StartReplayBuffer\">\n            <summary>\n            Start recording into the Replay Buffer. Triggers an error\n            if the Replay Buffer is already active, or if the \"Save Replay Buffer\"\n            hotkey is not set in OBS' settings\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.StopReplayBuffer\">\n            <summary>\n            Stop recording into the Replay Buffer. Triggers an error if the\n            Replay Buffer is not active.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SaveReplayBuffer\">\n            <summary>\n            Save and flush the contents of the Replay Buffer to disk. Basically\n            the same as triggering the \"Save Replay Buffer\" hotkey in OBS.\n            Triggers an error if Replay Buffer is not active.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetInputAudioSyncOffset(System.String,System.Int32)\">\n            <summary>\n            Set the audio sync offset of the specified source\n            </summary>\n            <param name=\"inputName\">Source name</param>\n            <param name=\"inputAudioSyncOffset\">Audio offset (in nanoseconds) for the specified source</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetInputAudioSyncOffset(System.String)\">\n            <summary>\n            Get the audio sync offset of the specified source\n            </summary>\n            <param name=\"inputName\">Source name</param>\n            <returns>Audio offset (in nanoseconds) of the specified source</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.RemoveSceneItem(System.String,System.Int32)\">\n            <summary>\n            Removes a scene item from a scene.\n            Scenes only.\n            </summary>\n            <param name=\"sceneItemId\">Scene item id</param>\n            <param name=\"sceneName\">Scene name from which to delete item</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SendStreamCaption(System.String)\">\n            <summary>\n            Sends CEA-608 caption text over the stream output. As of OBS Studio 23.1, captions are not yet available on Linux.\n            </summary>\n            <param name=\"captionText\">Captions text</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.DuplicateSceneItem(System.String,System.Int32,System.String)\">\n            <summary>\n            Duplicates a scene item\n            </summary>\n            <param name=\"sceneName\">Name of the scene that has the SceneItem</param>\n            <param name=\"sceneItemId\">Id of the Scene Item</param>\n            <param name=\"destinationSceneName\">Name of scene to add the new duplicated Scene Item. If not specified will assume sceneName</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSpecialInputs\">\n            <summary>\n            Gets the names of all special inputs.\n            </summary>\n            <returns>Dictionary of special inputs.</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetStreamServiceSettings(OBSWebsocketDotNet.Types.StreamingService)\">\n            <summary>\n            Sets the current stream service settings (stream destination).\n            Note: Simple RTMP settings can be set with type `rtmp_custom` and the settings fields `server` and `key`.\n            </summary>\n            <param name=\"service\">Stream Service Type Name and Settings objects</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetStreamServiceSettings\">\n            <summary>\n            Gets the current stream service settings (stream destination).\n            </summary>\n            <returns>Stream service type and settings objects</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetInputAudioMonitorType(System.String)\">\n            <summary>\n            Gets the audio monitor type of an input.\n            The available audio monitor types are:\n            - `OBS_MONITORING_TYPE_NONE`\n            - `OBS_MONITORING_TYPE_MONITOR_ONLY`\n            - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`\n            </summary>\n            <param name=\"inputName\">Source name</param>\n            <returns>The monitor type in use</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetInputAudioMonitorType(System.String,System.String)\">\n            <summary>\n            Sets the audio monitor type of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to set the audio monitor type of</param>\n            <param name=\"monitorType\">Audio monitor type. See `GetInputAudioMonitorType for possible types.</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.BroadcastCustomEvent(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Broadcasts a `CustomEvent` to all WebSocket clients. Receivers are clients which are identified and subscribed.\n            </summary>\n            <param name=\"eventData\">Data payload to emit to all receivers</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetMediaInputCursor(System.String,System.Int32)\">\n            <summary>\n            Sets the cursor position of a media input.\n            This request does not perform bounds checking of the cursor position.\n            </summary>\n            <param name=\"inputName\">Name of the media input</param>\n            <param name=\"mediaCursor\">New cursor position to set (milliseconds).</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.OffsetMediaInputCursor(System.String,System.Int32)\">\n            <summary>\n            Offsets the current cursor position of a media input by the specified value.\n            This request does not perform bounds checking of the cursor position.\n            </summary>\n            <param name=\"inputName\">Name of the media input</param>\n            <param name=\"mediaCursorOffset\">Value to offset the current cursor position by (milliseconds +/-)</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.CreateInput(System.String,System.String,System.String,Newtonsoft.Json.Linq.JObject,System.Nullable{System.Boolean})\">\n            <summary>\n            Creates a new input, adding it as a scene item to the specified scene.\n            </summary>\n            <param name=\"sceneName\">Name of the scene to add the input to as a scene item</param>\n            <param name=\"inputName\">Name of the new input to created</param>\n            <param name=\"inputKind\">The kind of input to be created</param>\n            <param name=\"inputSettings\">Jobject holding the settings object to initialize the input with</param>\n            <param name=\"sceneItemEnabled\">Whether to set the created scene item to enabled or disabled</param>\n            <returns>ID of the SceneItem in the scene.</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetInputDefaultSettings(System.String)\">\n            <summary>\n            Gets the default settings for an input kind.\n            </summary>\n            <param name=\"inputKind\">Input kind to get the default settings for</param>\n            <returns>Object of default settings for the input kind</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneItemList(System.String)\">\n            <summary>\n            Gets a list of all scene items in a scene.\n            Scenes only\n            </summary>\n            <param name=\"sceneName\">Name of the scene to get the items of</param>\n            <returns>Array of scene items in the scene</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.CreateSceneItem(System.String,System.String,System.Boolean)\">\n            <summary>\n            Creates a new scene item using a source.\n            Scenes only\n            </summary>\n            <param name=\"sceneName\">Name of the scene to create the new item in</param>\n            <param name=\"sourceName\">Name of the source to add to the scene</param>\n            <param name=\"sceneItemEnabled\">Enable state to apply to the scene item on creation</param>\n            <returns>Numeric ID of the scene item</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.CreateScene(System.String)\">\n            <summary>\n            Creates a new scene in OBS.\n            </summary>\n            <param name=\"sceneName\">Name for the new scene</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetInputAudioTracks(System.String)\">\n            <summary>\n            Gets the enable state of all audio tracks of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input</param>\n            <returns>Object of audio tracks and associated enable states</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetInputAudioTracks(System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Sets the enable state of audio tracks of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input</param>\n            <param name=\"inputAudioTracks\">JObject holding track settings to apply</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetInputAudioTracks(System.String,OBSWebsocketDotNet.Types.SourceTracks)\">\n            <summary>\n            Sets the enable state of audio tracks of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input</param>\n            <param name=\"inputAudioTracks\">Track settings to apply</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSourceActive(System.String)\">\n            <summary>\n            Gets the active and show state of a source.\n            **Compatible with inputs and scenes.**\n            </summary>\n            <param name=\"sourceName\">Name of the source to get the active state of</param>\n            <returns>Whether the source is showing in Program</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetVirtualCamStatus\">\n            <summary>\n            Gets the status of the virtualcam output.\n            </summary>\n            <returns>An <see cref=\"T:OBSWebsocketDotNet.Types.VirtualCamStatus\"/> object describing the current virtual camera state</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.StartVirtualCam\">\n            <summary>\n            Starts the virtualcam output.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.StopVirtualCam\">\n            <summary>\n            Stops the virtualcam output.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.ToggleVirtualCam\">\n            <summary>\n            Toggles the state of the virtualcam output.\n            </summary>\n            <returns>Whether the output is active</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetPersistentData(System.String,System.String)\">\n            <summary>\n            Gets the value of a \\\"slot\\\" from the selected persistent data realm.\n            </summary>\n            <param name=\"realm\">The data realm to select. `OBS_WEBSOCKET_DATA_REALM_GLOBAL` or `OBS_WEBSOCKET_DATA_REALM_PROFILE`</param>\n            <param name=\"slotName\">The name of the slot to retrieve data from</param>\n            <returns type=\"Any\">Value associated with the slot. `null` if not set</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetPersistentData(System.String,System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Sets the value of a \\\"slot\\\" from the selected persistent data realm.\n            </summary>\n            <param name=\"realm\">The data realm to select. `OBS_WEBSOCKET_DATA_REALM_GLOBAL` or `OBS_WEBSOCKET_DATA_REALM_PROFILE`</param>\n            <param name=\"slotName\">The name of the slot to retrieve data from</param>\n            <param name=\"slotValue\">The value to apply to the slot</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.CreateSceneCollection(System.String)\">\n            <summary>\n            Creates a new scene collection, switching to it in the process.\\n\\nNote: This will block until the collection has finished changing.\n            </summary>\n            <param name=\"sceneCollectionName\">Name for the new scene collection</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.CreateProfile(System.String)\">\n            <summary>\n            Creates a new profile, switching to it in the process\n            </summary>\n            <param name=\"profileName\">Name for the new profile</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.RemoveProfile(System.String)\">\n            <summary>\n            Removes a profile. If the current profile is chosen, it will change to a different profile first.\n            </summary>\n            <param name=\"profileName\">Name of the profile to remove</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetProfileParameter(System.String,System.String)\">\n            <summary>\n            Gets a parameter from the current profile's configuration.\n            </summary>\n            <param name=\"parameterCategory\">Category of the parameter to get</param>\n            <param name=\"parameterName\">Name of the parameter to get</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetProfileParameter(System.String,System.String,System.String)\">\n            <summary>\n            Sets the value of a parameter in the current profile's configuration.\n            </summary>\n            <param name=\"parameterCategory\">Category of the parameter to set</param>\n            <param name=\"parameterName\">Name of the parameter to set</param>\n            <param name=\"parameterValue\">Value of the parameter to set. Use `null` to delete</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetVideoSettings(OBSWebsocketDotNet.Types.ObsVideoSettings)\">\n            <summary>\n            Sets the current video settings.\n            Note: Fields must be specified in pairs. For example, you cannot set only `baseWidth` without needing to specify `baseHeight`.\n            </summary>\n            <param name=\"obsVideoSettings\">Object containing video settings</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSourceFilterDefaultSettings(System.String)\">\n            <summary>\n            Gets the default settings for a filter kind.\n            </summary>\n            <param name=\"filterKind\">Filter kind to get the default settings for</param>\n            <returns>Object of default settings for the filter kind</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetSourceFilterName(System.String,System.String,System.String)\">\n            <summary>\n            Sets the name of a source filter (rename).\n            </summary>\n            <param name=\"sourceName\">Name of the source the filter is on</param>\n            <param name=\"filterName\">Current name of the filter</param>\n            <param name=\"newFilterName\">New name for the filter</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetSourceFilterIndex(System.String,System.String,System.Int32)\">\n            <summary>\n            Sets the index position of a filter on a source.\n            </summary>\n            <param name=\"sourceName\">Name of the source the filter is on</param>\n            <param name=\"filterName\">Name of the filter</param>\n            <param name=\"filterIndex\">New index position of the filter</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetVersion\">\n            <summary>\n            Gets data about the current plugin and RPC version.\n            </summary>\n            <returns>Version info in an <see cref=\"T:OBSWebsocketDotNet.Types.ObsVersion\"/> object</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.CallVendorRequest(System.String,System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Call a request registered to a vendor.\n            A vendor is a unique name registered by a third-party plugin or script, which allows for custom requests and events to be added to obs-websocket.\n            If a plugin or script implements vendor requests or events, documentation is expected to be provided with them.\n            </summary>\n            <param name=\"vendorName\">Name of the vendor to use</param>\n            <param name=\"requestType\">The request type to call</param>\n            <param name=\"requestData\">Object containing appropriate request data</param>\n            <returns>Object containing appropriate response data. {} if request does not provide any response data</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetHotkeyList\">\n            <summary>\n            Gets an array of all hotkey names in OBS\n            </summary>\n            <returns>Array of hotkey names</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.Sleep(System.Int32,System.Int32)\">\n            <summary>\n            Sleeps for a time duration or number of frames. Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`.\n            </summary>\n            <param name=\"sleepMillis\">Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode)</param>\n            <param name=\"sleepFrames\">Number of frames to sleep for (if `SERIAL_FRAME` mode)</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetInputList(System.String)\">\n            <summary>\n            Gets an array of all inputs in OBS.\n            </summary>\n            <param name=\"inputKind\">Restrict the array to only inputs of the specified kind</param>\n            <returns>List of Inputs in OBS</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetInputKindList(System.Boolean)\">\n            <summary>\n            Gets an array of all available input kinds in OBS.\n            </summary>\n            <param name=\"unversioned\">True == Return all kinds as unversioned, False == Return with version suffixes (if available)</param>\n            <returns>Array of input kinds</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.RemoveInput(System.String)\">\n            <summary>\n            Removes an existing input.\n            Note: Will immediately remove all associated scene items.\n            </summary>\n            <param name=\"inputName\">Name of the input to remove</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetInputName(System.String,System.String)\">\n            <summary>\n            Sets the name of an input (rename).\n            </summary>\n            <param name=\"inputName\">Current input name</param>\n            <param name=\"newInputName\">New name for the input</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetInputSettings(System.String)\">\n            <summary>\n            Gets the settings of an input.\n            Note: Does not include defaults. To create the entire settings object, overlay `inputSettings` over the `defaultInputSettings` provided by `GetInputDefaultSettings`.\n            </summary>\n            <param name=\"inputName\">Name of the input to get the settings of</param>\n            <returns>New populated InputSettings object</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetInputSettings(OBSWebsocketDotNet.Types.InputSettings,System.Boolean)\">\n            <summary>\n            Sets the settings of an input.\n            </summary>\n            <param name=\"inputSettings\">Object of settings to apply</param>\n            <param name=\"overlay\">True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings.</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetInputSettings(System.String,Newtonsoft.Json.Linq.JObject,System.Boolean)\">\n            <summary>\n            Sets the settings of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to set the settings of</param>\n            <param name=\"inputSettings\">Object of settings to apply</param>\n            <param name=\"overlay\">True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings.</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetInputAudioBalance(System.String)\">\n            <summary>\n            Gets the audio balance of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to get the audio balance of</param>\n            <returns>Audio balance value from 0.0-1.0</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetInputAudioBalance(System.String,System.Double)\">\n            <summary>\n            Sets the audio balance of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to set the audio balance of</param>\n            <param name=\"inputAudioBalance\">New audio balance value</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetInputPropertiesListPropertyItems(System.String,System.String)\">\n            <summary>\n            Gets the items of a list property from an input's properties.\n            Note: Use this in cases where an input provides a dynamic, selectable list of items.\n            For example, display capture, where it provides a list of available displays.\n            </summary>\n            <param name=\"inputName\">Name of the input</param>\n            <param name=\"propertyName\">Name of the list property to get the items of</param>\n            <returns>Array of items in the list property</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.PressInputPropertiesButton(System.String,System.String)\">\n            <summary>\n            Presses a button in the properties of an input.\n            Note: Use this in cases where there is a button in the properties of an input that cannot be accessed in any other way.\n            For example, browser sources, where there is a refresh button.\n            </summary>\n            <param name=\"inputName\">Name of the input</param>\n            <param name=\"propertyName\">Name of the button property to press</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetMediaInputStatus(System.String)\">\n            <summary>\n            Gets the status of a media input.\\n\\nMedia States:\n            - `OBS_MEDIA_STATE_NONE`\n            - `OBS_MEDIA_STATE_PLAYING`\n            - `OBS_MEDIA_STATE_OPENING`\n            - `OBS_MEDIA_STATE_BUFFERING`\n            - `OBS_MEDIA_STATE_PAUSED`\n            - `OBS_MEDIA_STATE_STOPPED`\n            - `OBS_MEDIA_STATE_ENDED`\n            - `OBS_MEDIA_STATE_ERROR`\n            </summary>\n            <param name=\"inputName\">Name of the media input</param>\n            <returns>Object containing string mediaState, int mediaDuration, int mediaCursor properties</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.TriggerMediaInputAction(System.String,System.String)\">\n            <summary>\n            Triggers an action on a media input.\n            </summary>\n            <param name=\"inputName\">Name of the media input</param>\n            <param name=\"mediaAction\">Identifier of the `ObsMediaInputAction` enum</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetLastReplayBufferReplay\">\n            <summary>\n            Gets the filename of the last replay buffer save file.\n            </summary>\n            <returns>File path of last replay</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.ToggleRecordPause\">\n            <summary>\n            Toggles pause on the record output.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetGroupSceneItemList(System.String)\">\n            <summary>\n            Currently BROKEN in obs-websocket/obs-studio\n            Basically GetSceneItemList, but for groups.\n            Using groups at all in OBS is discouraged, as they are very broken under the hood.\n            Groups only\n            </summary>\n            <param name=\"sceneName\">Name of the group to get the items of</param>\n            <returns>Array of scene items in the group</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneItemId(System.String,System.String,System.Int32)\">\n            <summary>\n            Searches a scene for a source, and returns its id.\\n\\nScenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene or group to search in</param>\n            <param name=\"sourceName\">Name of the source to find</param>\n            <param name=\"searchOffset\">Number of matches to skip during search. >= 0 means first forward. -1 means last (top) item</param>\n            <returns>Numeric ID of the scene item</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneItemTransform(System.String,System.Int32)\">\n            <summary>\n            Gets the transform and crop info of a scene item.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <returns>Object containing scene item transform info</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneItemTransformRaw(System.String,System.Int32)\">\n            <summary>\n            Gets the JObject of transform settings for a scene item. Use this one you don't want it populated with default values.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <returns>Object containing scene item transform info</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneItemEnabled(System.String,System.Int32)\">\n            <summary>\n            Gets the enable state of a scene item.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <returns>Whether the scene item is enabled. `true` for enabled, `false` for disabled</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetSceneItemEnabled(System.String,System.Int32,System.Boolean)\">\n            <summary>\n            Gets the enable state of a scene item.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <param name=\"sceneItemEnabled\">New enable state of the scene item</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneItemLocked(System.String,System.Int32)\">\n            <summary>\n            Gets the lock state of a scene item.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <returns>Whether the scene item is locked. `true` for locked, `false` for unlocked</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetSceneItemLocked(System.String,System.Int32,System.Boolean)\">\n            <summary>\n            Sets the lock state of a scene item.\n            Scenes and Group\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <param name=\"sceneItemLocked\">New lock state of the scene item</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneItemIndex(System.String,System.Int32)\">\n            <summary>\n            Gets the index position of a scene item in a scene.\n            An index of 0 is at the bottom of the source list in the UI.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <returns>Index position of the scene item</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetSceneItemIndex(System.String,System.Int32,System.Int32)\">\n            <summary>\n            Sets the index position of a scene item in a scene.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <param name=\"sceneItemIndex\">New index position of the scene item</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneItemBlendMode(System.String,System.Int32)\">\n            <summary>\n            Gets the blend mode of a scene item.\n            Blend modes:\n            - `OBS_BLEND_NORMAL`\n            - `OBS_BLEND_ADDITIVE`\n            - `OBS_BLEND_SUBTRACT`\n            - `OBS_BLEND_SCREEN`\n            - `OBS_BLEND_MULTIPLY`\n            - `OBS_BLEND_LIGHTEN`\n            - `OBS_BLEND_DARKEN`\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <returns>Current blend mode</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetSceneItemBlendMode(System.String,System.Int32,System.String)\">\n            <summary>\n            Sets the blend mode of a scene item.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\"></param>\n            <param name=\"sceneItemId\"></param>\n            <param name=\"sceneItemBlendMode\"></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetGroupList\">\n            <summary>\n            Gets an array of all groups in OBS.\n            Groups in OBS are actually scenes, but renamed and modified. In obs-websocket, we treat them as scenes where we can.\n            </summary>\n            <returns>Array of group names</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.RemoveScene(System.String)\">\n            <summary>\n            Removes a scene from OBS.\n            </summary>\n            <param name=\"sceneName\">Name of the scene to remove</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.SetSceneName(System.String,System.String)\">\n            <summary>\n            Sets the name of a scene (rename).\n            </summary>\n            <param name=\"sceneName\">Name of the scene to be renamed</param>\n            <param name=\"newSceneName\">New name for the scene</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSourceScreenshot(System.String,System.String,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Gets a Base64-encoded screenshot of a source.\n            The `imageWidth` and `imageHeight` parameters are treated as \\\"scale to inner\\\", meaning the smallest ratio will be used and the aspect ratio of the original resolution is kept.\n            If `imageWidth` and `imageHeight` are not specified, the compressed image will use the full resolution of the source.\n            **Compatible with inputs and scenes.**\n            </summary>\n            <param name=\"sourceName\">Name of the source to take a screenshot of</param>\n            <param name=\"imageFormat\">Image compression format to use. Use `GetVersion` to get compatible image formats</param>\n            <param name=\"imageWidth\">Width to scale the screenshot to</param>\n            <param name=\"imageHeight\">Height to scale the screenshot to</param>\n            <param name=\"imageCompressionQuality\">Compression quality to use. 0 for high compression, 100 for uncompressed. -1 to use \\\"default\\\" (whatever that means, idk)</param>\n            <returns>Base64-encoded screenshot</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetTransitionKindList\">\n            <summary>\n            Gets an array of all available transition kinds.\n            Similar to `GetInputKindList`\n            </summary>\n            <returns>Array of transition kinds</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetCurrentSceneTransitionCursor\">\n            <summary>\n            Gets the cursor position of the current scene transition.\n            Note: `transitionCursor` will return 1.0 when the transition is inactive.\n            </summary>\n            <returns>Cursor position, between 0.0 and 1.0</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.OpenInputPropertiesDialog(System.String)\">\n            <summary>\n            Opens the properties dialog of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to open the dialog of</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.OpenInputFiltersDialog(System.String)\">\n            <summary>\n            Opens the filters dialog of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to open the dialog of</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.OpenInputInteractDialog(System.String)\">\n            <summary>\n            Opens the interact dialog of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to open the dialog of</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.GetMonitorList\">\n            <summary>\n            Gets a list of connected monitors and information about them.\n            </summary>\n            <returns>a list of detected monitors with some information</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.OpenSourceProjector(System.String,System.String,System.Int32)\">\n            <summary>\n            Opens a projector for a source.\n            Note: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release.\n            </summary>\n            <param name=\"sourceName\">Name of the source to open a projector for</param>\n            <param name=\"projectorGeometry\">Size/Position data for a windowed projector, in Qt Base64 encoded format. Mutually exclusive with monitorIndex</param>\n            <param name=\"monitorIndex\">Monitor index, use GetMonitorList to obtain index. -1 to open in windowed mode</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.OBSWebsocket.OpenVideoMixProjector(System.String,System.String,System.Int32)\">\n            <summary>\n            Opens a projector for a specific output video mix.\n            Note: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release.\n            </summary>\n            <param name=\"videoMixType\">Mix types: OBS_WEBSOCKET_VIDEO_MIX_TYPE_PREVIEW, OBS_WEBSOCKET_VIDEO_MIX_TYPE_PROGRAM, OBS_WEBSOCKET_VIDEO_MIX_TYPE_MULTIVIEW</param>\n            <param name=\"projectorGeometry\">Size/Position data for a windowed projector, in Qt Base64 encoded format. Mutually exclusive with monitorIndex</param>\n            <param name=\"monitorIndex\">Monitor index, use GetMonitorList to obtain index. -1 to open in windowed mode</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.AuthFailureException\">\n            <summary>\n            Thrown if authentication fails\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.ErrorResponseException\">\n            <summary>\n            Thrown when the server responds with an error\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.ErrorResponseException.ErrorCode\">\n            <summary>\n            Error Code of exception\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.ErrorResponseException.#ctor(System.String,System.Int32)\">\n            <summary>\n            Constructor\n            </summary>\n            <param name=\"message\">Exception Message</param>\n            /// <param name=\"errorCode\">Error Code</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.IOBSWebsocket\">\n            <summary>\n            OBS Websocket Dotnet interface\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.IOBSWebsocket.WSTimeout\">\n            <summary>\n            WebSocket request timeout, represented as a TimeSpan object\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.IOBSWebsocket.IsConnected\">\n            <summary>\n            Current connection state\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetVideoSettings\">\n            <summary>\n            Get basic OBS video information\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SaveSourceScreenshot(System.String,System.String,System.String,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Saves a screenshot of a source to the filesystem.\n            The `imageWidth` and `imageHeight` parameters are treated as \\\"scale to inner\\\", meaning the smallest ratio will be used and the aspect ratio of the original resolution is kept.\n            If `imageWidth` and `imageHeight` are not specified, the compressed image will use the full resolution of the source.\n            **Compatible with inputs and scenes.**\n            </summary>\n            <param name=\"sourceName\">Name of the source to take a screenshot of</param>\n            <param name=\"imageFormat\">Image compression format to use. Use `GetVersion` to get compatible image formats</param>\n            <param name=\"imageFilePath\">Path to save the screenshot file to. Eg. `C:\\\\Users\\\\user\\\\Desktop\\\\screenshot.png`</param>\n            <param name=\"imageWidth\">Width to scale the screenshot to</param>\n            <param name=\"imageHeight\">Height to scale the screenshot to</param>\n            <param name=\"imageCompressionQuality\">Compression quality to use. 0 for high compression, 100 for uncompressed. -1 to use \\\"default\\\" (whatever that means, idk)</param>\n            <returns>Base64-encoded screenshot string</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SaveSourceScreenshot(System.String,System.String,System.String)\">\n            <summary>\n            Saves a screenshot of a source to the filesystem.\n            The `imageWidth` and `imageHeight` parameters are treated as \\\"scale to inner\\\", meaning the smallest ratio will be used and the aspect ratio of the original resolution is kept.\n            If `imageWidth` and `imageHeight` are not specified, the compressed image will use the full resolution of the source.\n            **Compatible with inputs and scenes.**\n            </summary>\n            <param name=\"sourceName\">Name of the source to take a screenshot of</param>\n            <param name=\"imageFormat\">Image compression format to use. Use `GetVersion` to get compatible image formats</param>\n            <param name=\"imageFilePath\">Path to save the screenshot file to. Eg. `C:\\\\Users\\\\user\\\\Desktop\\\\screenshot.png`</param>\n            <returns>Base64-encoded screenshot string</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.TriggerHotkeyByName(System.String)\">\n            <summary>\n            Executes hotkey routine, identified by hotkey unique name\n            </summary>\n            <param name=\"hotkeyName\">Unique name of the hotkey, as defined when registering the hotkey (e.g. \"ReplayBuffer.Save\")</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.TriggerHotkeyByKeySequence(OBSWebsocketDotNet.Types.OBSHotkey,OBSWebsocketDotNet.Types.KeyModifier)\">\n            <summary>\n            Triggers a hotkey using a sequence of keys.\n            </summary>\n            <param name=\"keyId\">Main key identifier (e.g. OBS_KEY_A for key \"A\"). Available identifiers are here: https://github.com/obsproject/obs-studio/blob/master/libobs/obs-hotkeys.h</param>\n            <param name=\"keyModifier\">Optional key modifiers object. You can combine multiple key operators. e.g. KeyModifier.Shift | KeyModifier.Control</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetCurrentProgramScene\">\n            <summary>\n            Get the name of the currently active scene. \n            </summary>\n            <returns>Name of the current scene</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetCurrentProgramScene(System.String)\">\n            <summary>\n            Set the current scene to the specified one\n            </summary>\n            <param name=\"sceneName\">The desired scene name</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetStats\">\n            <summary>\n            Get OBS stats (almost the same info as provided in OBS' stats window)\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.ListScenes\">\n            <summary>\n            List every available scene\n            </summary>\n            <returns>A <see cref=\"T:System.Collections.Generic.List`1\" /> of <see cref=\"T:OBSWebsocketDotNet.Types.SceneBasicInfo\"/> objects describing each scene</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSceneList\">\n            <summary>\n            Get a list of scenes in the currently active profile\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSceneSceneTransitionOverride(System.String)\">\n            <summary>\n            Get the specified scene's transition override info\n            </summary>\n            <param name=\"sceneName\">Name of the scene to return the override info</param>\n            <returns>TransitionOverrideInfo</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetSceneSceneTransitionOverride(System.String,System.String,System.Int32)\">\n            <summary>\n            Set specific transition override for a scene\n            </summary>\n            <param name=\"sceneName\">Name of the scene to set the transition override</param>\n            <param name=\"transitionName\">Name of the transition to use</param>\n            <param name=\"transitionDuration\">Duration in milliseconds of the transition if transition is not fixed. Defaults to the current duration specified in the UI if there is no current override and this value is not given</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetTBarPosition(System.Double,System.Boolean)\">\n            <summary>\n            If your code needs to perform multiple successive T-Bar moves (e.g. : in an animation, or in response to a user moving a T-Bar control in your User Interface), set release to false and call ReleaseTBar later once the animation/interaction is over.\n            </summary>\n            <param name=\"position\">\tT-Bar position. This value must be between 0.0 and 1.0.</param>\n            <param name=\"release\">Whether or not the T-Bar gets released automatically after setting its new position (like a user releasing their mouse button after moving the T-Bar). Call ReleaseTBar manually if you set release to false. Defaults to true.</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetSourceFilterSettings(System.String,System.String,Newtonsoft.Json.Linq.JObject,System.Boolean)\">\n            <summary>\n            Apply settings to a source filter\n            </summary>\n            <param name=\"sourceName\">Source with filter</param>\n            <param name=\"filterName\">Filter name</param>\n            <param name=\"filterSettings\">JObject with filter settings</param>\n            <param name=\"overlay\">Apply over existing settings?</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetSourceFilterSettings(System.String,System.String,OBSWebsocketDotNet.Types.FilterSettings,System.Boolean)\">\n            <summary>\n            Apply settings to a source filter\n            </summary>\n            <param name=\"sourceName\">Source with filter</param>\n            <param name=\"filterName\">Filter name</param>\n            <param name=\"filterSettings\">Filter settings</param>\n            <param name=\"overlay\">Apply over existing settings?</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetSourceFilterEnabled(System.String,System.String,System.Boolean)\">\n            <summary>\n            Modify the Source Filter's visibility\n            </summary>\n            <param name=\"sourceName\">Source name</param>\n            <param name=\"filterName\">Source filter name</param>\n            <param name=\"filterEnabled\">New filter state</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSourceFilterList(System.String)\">\n            <summary>\n            Return a list of all filters on a source\n            </summary>\n            <param name=\"sourceName\">Source name</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSourceFilter(System.String,System.String)\">\n            <summary>\n            Return a list of settings for a specific filter\n            </summary>\n            <param name=\"sourceName\">Source name</param>\n            <param name=\"filterName\">Filter name</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.RemoveSourceFilter(System.String,System.String)\">\n            <summary>\n            Remove the filter from a source\n            </summary>\n            <param name=\"sourceName\">Name of the source the filter is on</param>\n            <param name=\"filterName\">Name of the filter to remove</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.CreateSourceFilter(System.String,System.String,System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Add a filter to a source\n            </summary>\n            <param name=\"sourceName\">Name of the source for the filter</param>\n            <param name=\"filterName\">Name of the filter</param>\n            <param name=\"filterKind\">Type of filter</param>\n            <param name=\"filterSettings\">JObject holding filter settings object</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.CreateSourceFilter(System.String,System.String,System.String,OBSWebsocketDotNet.Types.FilterSettings)\">\n            <summary>\n            Add a filter to a source\n            </summary>\n            <param name=\"sourceName\">Name of the source for the filter</param>\n            <param name=\"filterName\">Name of the filter</param>\n            <param name=\"filterKind\">Type of filter</param>\n            <param name=\"filterSettings\">Filter settings object</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.ToggleStream\">\n            <summary>\n            Toggles the status of the stream output.\n            </summary>\n            <returns>New state of the stream output</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.ToggleRecord\">\n            <summary>\n            Toggles the status of the record output.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetStreamStatus\">\n            <summary>\n            Gets the status of the stream output\n            </summary>\n            <returns>An <see cref=\"T:OBSWebsocketDotNet.Types.OutputStatus\"/> object describing the current outputs states</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetCurrentSceneTransition\">\n            <summary>\n            Get the current transition name and duration\n            </summary>\n            <returns>An <see cref=\"T:OBSWebsocketDotNet.Types.TransitionSettings\"/> object with the current transition name and duration</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetCurrentSceneTransition(System.String)\">\n            <summary>\n            Set the current transition to the specified one\n            </summary>\n            <param name=\"transitionName\">Desired transition name</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetCurrentSceneTransitionDuration(System.Int32)\">\n            <summary>\n            Change the transition's duration\n            </summary>\n            <param name=\"transitionDuration\">Desired transition duration (in milliseconds)</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetCurrentSceneTransitionSettings(Newtonsoft.Json.Linq.JObject,System.Boolean)\">\n            <summary>\n            Change the current settings of a transition\n            </summary>\n            <param name=\"transitionSettings\">Transition settings (they can be partial)</param>\n            <param name=\"overlay\">Whether to overlay over the current settins or replace them</param>\n            <returns>Updated transition settings</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetInputVolume(System.String,System.Single,System.Boolean)\">\n            <summary>\n            Change the volume of the specified source\n            </summary>\n            <param name=\"inputName\">Name of the source which volume will be changed</param>\n            <param name=\"inputVolume\">Desired volume. Must be between `0.0` and `1.0` for amplitude/mul (useDecibel is false), and under 0.0 for dB (useDecibel is true). Note: OBS will interpret dB values under -100.0 as Inf.</param>\n            <param name=\"inputVolumeDb\">Interperet `volume` data as decibels instead of amplitude/mul.</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetInputVolume(System.String)\">\n            <summary>\n            Get the volume of the specified source\n            Volume is between `0.0` and `1.0` if using amplitude/mul (useDecibel is false), under `0.0` if using dB (useDecibel is true).\n            </summary>\n            <param name=\"inputName\">Source name</param>\n            <returns>An <see cref=\"T:OBSWebsocketDotNet.Types.VolumeInfo\"/>Object containing the volume and mute state of the specified source.</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetInputMute(System.String)\">\n            <summary>\n            Gets the audio mute state of an input.\n            </summary>\n            <param name=\"inputName\">Name of input to get the mute state of</param>\n            <returns>Whether the input is muted</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetInputMute(System.String,System.Boolean)\">\n            <summary>\n            Set the mute state of the specified source\n            </summary>\n            <param name=\"inputName\">Name of the source which mute state will be changed</param>\n            <param name=\"inputMuted\">Desired mute state</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.ToggleInputMute(System.String)\">\n            <summary>\n            Toggle the mute state of the specified source\n            </summary>\n            <param name=\"inputName\">Name of the source which mute state will be toggled</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetSceneItemTransform(System.String,System.Int32,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Sets the transform and crop info of a scene item\n            </summary>\n            <param name=\"sceneName\">Name of the scene that has the SceneItem</param>\n            <param name=\"sceneItemId\">Id of the Scene Item</param>\n            <param name=\"sceneItemTransform\">JObject holding transform settings</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetSceneItemTransform(System.String,System.Int32,OBSWebsocketDotNet.Types.SceneItemTransformInfo)\">\n            <summary>\n            Sets the transform and crop info of a scene item\n            </summary>\n            <param name=\"sceneName\">Name of the scene that has the SceneItem</param>\n            <param name=\"sceneItemId\">Id of the Scene Item</param>\n            <param name=\"sceneItemTransform\">Transform settings</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetCurrentSceneCollection(System.String)\">\n            <summary>\n            Set the current scene collection to the specified one\n            </summary>\n            <param name=\"sceneCollectionName\">Desired scene collection name</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetCurrentSceneCollection\">\n            <summary>\n            Get the name of the current scene collection\n            </summary>\n            <returns>Name of the current scene collection</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSceneCollectionList\">\n            <summary>\n            List all scene collections\n            </summary>\n            <returns>A <see cref=\"T:System.Collections.Generic.List`1\"/> of the names of all scene collections</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetCurrentProfile(System.String)\">\n            <summary>\n            Set the current profile to the specified one\n            </summary>\n            <param name=\"profileName\">Name of the desired profile</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetProfileList\">\n            <summary>\n            List all profiles\n            </summary>\n            <returns>A <see cref=\"T:System.Collections.Generic.List`1\"/> of the names of all profiles</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.StartStream\">\n            <summary>\n            Start streaming. Will trigger an error if streaming is already active\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.StopStream\">\n            <summary>\n            Stop streaming. Will trigger an error if streaming is not active.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.StartRecord\">\n            <summary>\n            Start recording. Will trigger an error if recording is already active.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.StopRecord\">\n            <summary>\n            Stop recording. Will trigger an error if recording is not active.\n            <returns>File name for the saved recording</returns>\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.PauseRecord\">\n            <summary>\n            Pause the current recording. Returns an error if recording is not active or already paused.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.ResumeRecord\">\n            <summary>\n            Resume/unpause the current recording (if paused). Returns an error if recording is not active or not paused.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetRecordDirectory\">\n            <summary>\n            Get the path of the current recording folder\n            </summary>\n            <returns>Current recording folder path</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetRecordStatus\">\n            <summary>\n            Get current recording status.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetReplayBufferStatus\">\n            <summary>\n            Get the status of the OBS replay buffer.\n            </summary>\n            <returns>Current recording status. true when active</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSceneTransitionList\">\n            <summary>\n            Get duration of the currently selected transition (if supported)\n            </summary>\n            <returns>Current transition duration (in milliseconds)</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetStudioModeEnabled\">\n            <summary>\n            Get status of Studio Mode\n            </summary>\n            <returns>Studio Mode status (on/off)</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetStudioModeEnabled(System.Boolean)\">\n            <summary>\n            Enables or disables studio mode\n            </summary>\n            <param name=\"studioModeEnabled\"></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetCurrentPreviewScene\">\n            <summary>\n            Get the name of the currently selected preview scene. \n            Note: Triggers an error if Studio Mode is disabled\n            </summary>\n            <returns>Preview scene name</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetCurrentPreviewScene(System.String)\">\n            <summary>\n            Change the currently active preview/studio scene to the one specified.\n            Triggers an error if Studio Mode is disabled\n            </summary>\n            <param name=\"sceneName\">Preview scene name</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetCurrentPreviewScene(OBSWebsocketDotNet.Types.ObsScene)\">\n            <summary>\n            Change the currently active preview/studio scene to the one specified.\n            Triggers an error if Studio Mode is disabled.\n            </summary>\n            <param name=\"previewScene\">Preview scene object</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.TriggerStudioModeTransition\">\n            <summary>\n            Triggers the current scene transition. Same functionality as the `Transition` button in Studio Mode\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.ToggleReplayBuffer\">\n            <summary>\n            Toggles the state of the replay buffer output.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.StartReplayBuffer\">\n            <summary>\n            Start recording into the Replay Buffer. Triggers an error\n            if the Replay Buffer is already active, or if the \"Save Replay Buffer\"\n            hotkey is not set in OBS' settings\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.StopReplayBuffer\">\n            <summary>\n            Stop recording into the Replay Buffer. Triggers an error if the\n            Replay Buffer is not active.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SaveReplayBuffer\">\n            <summary>\n            Save and flush the contents of the Replay Buffer to disk. Basically\n            the same as triggering the \"Save Replay Buffer\" hotkey in OBS.\n            Triggers an error if Replay Buffer is not active.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetInputAudioSyncOffset(System.String,System.Int32)\">\n            <summary>\n            Set the audio sync offset of the specified source\n            </summary>\n            <param name=\"inputName\">Source name</param>\n            <param name=\"inputAudioSyncOffset\">Audio offset (in nanoseconds) for the specified source</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetInputAudioSyncOffset(System.String)\">\n            <summary>\n            Get the audio sync offset of the specified source\n            </summary>\n            <param name=\"inputName\">Source name</param>\n            <returns>Audio offset (in nanoseconds) of the specified source</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.RemoveSceneItem(System.String,System.Int32)\">\n            <summary>\n            Removes a scene item from a scene.\n            Scenes only.\n            </summary>\n            <param name=\"sceneItemId\">Scene item id</param>\n            <param name=\"sceneName\">Scene name from which to delete item</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SendStreamCaption(System.String)\">\n            <summary>\n            Sends CEA-608 caption text over the stream output. As of OBS Studio 23.1, captions are not yet available on Linux.\n            </summary>\n            <param name=\"captionText\">Captions text</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.DuplicateSceneItem(System.String,System.Int32,System.String)\">\n            <summary>\n            Duplicates a scene item\n            </summary>\n            <param name=\"sceneName\">Name of the scene that has the SceneItem</param>\n            <param name=\"sceneItemId\">Id of the Scene Item</param>\n            <param name=\"destinationSceneName\">Name of scene to add the new duplicated Scene Item. If not specified will assume sceneName</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSpecialInputs\">\n            <summary>\n            Gets the names of all special inputs.\n            </summary>\n            <returns>Dictionary of special inputs.</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetStreamServiceSettings(OBSWebsocketDotNet.Types.StreamingService)\">\n            <summary>\n            Sets the current stream service settings (stream destination).\n            Note: Simple RTMP settings can be set with type `rtmp_custom` and the settings fields `server` and `key`.\n            </summary>\n            <param name=\"service\">Stream Service Type Name and Settings objects</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetStreamServiceSettings\">\n            <summary>\n            Gets the current stream service settings (stream destination).\n            </summary>\n            <returns>Stream service type and settings objects</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetInputAudioMonitorType(System.String)\">\n            <summary>\n            Gets the audio monitor type of an input.\n            The available audio monitor types are:\n            - `OBS_MONITORING_TYPE_NONE`\n            - `OBS_MONITORING_TYPE_MONITOR_ONLY`\n            - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`\n            </summary>\n            <param name=\"inputName\">Source name</param>\n            <returns>The monitor type in use</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetInputAudioMonitorType(System.String,System.String)\">\n            <summary>\n            Sets the audio monitor type of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to set the audio monitor type of</param>\n            <param name=\"monitorType\">Audio monitor type. See `GetInputAudioMonitorType for possible types.</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.BroadcastCustomEvent(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Broadcasts a `CustomEvent` to all WebSocket clients. Receivers are clients which are identified and subscribed.\n            </summary>\n            <param name=\"eventData\">Data payload to emit to all receivers</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetMediaInputCursor(System.String,System.Int32)\">\n            <summary>\n            Sets the cursor position of a media input.\n            This request does not perform bounds checking of the cursor position.\n            </summary>\n            <param name=\"inputName\">Name of the media input</param>\n            <param name=\"mediaCursor\">New cursor position to set (milliseconds).</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.OffsetMediaInputCursor(System.String,System.Int32)\">\n            <summary>\n            Offsets the current cursor position of a media input by the specified value.\n            This request does not perform bounds checking of the cursor position.\n            </summary>\n            <param name=\"inputName\">Name of the media input</param>\n            <param name=\"mediaCursorOffset\">Value to offset the current cursor position by (milliseconds +/-)</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.CreateInput(System.String,System.String,System.String,Newtonsoft.Json.Linq.JObject,System.Nullable{System.Boolean})\">\n            <summary>\n            Creates a new input, adding it as a scene item to the specified scene.\n            </summary>\n            <param name=\"sceneName\">Name of the scene to add the input to as a scene item</param>\n            <param name=\"inputName\">Name of the new input to created</param>\n            <param name=\"inputKind\">The kind of input to be created</param>\n            <param name=\"inputSettings\">Jobject holding the settings object to initialize the input with</param>\n            <param name=\"sceneItemEnabled\">Whether to set the created scene item to enabled or disabled</param>\n            <returns>ID of the SceneItem in the scene.</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetInputDefaultSettings(System.String)\">\n            <summary>\n            Gets the default settings for an input kind.\n            </summary>\n            <param name=\"inputKind\">Input kind to get the default settings for</param>\n            <returns>Object of default settings for the input kind</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSceneItemList(System.String)\">\n            <summary>\n            Gets a list of all scene items in a scene.\n            Scenes only\n            </summary>\n            <param name=\"sceneName\">Name of the scene to get the items of</param>\n            <returns>Array of scene items in the scene</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.CreateSceneItem(System.String,System.String,System.Boolean)\">\n            <summary>\n            Creates a new scene item using a source.\n            Scenes only\n            </summary>\n            <param name=\"sceneName\">Name of the scene to create the new item in</param>\n            <param name=\"sourceName\">Name of the source to add to the scene</param>\n            <param name=\"sceneItemEnabled\">Enable state to apply to the scene item on creation</param>\n            <returns>Numeric ID of the scene item</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.CreateScene(System.String)\">\n            <summary>\n            Creates a new scene in OBS.\n            </summary>\n            <param name=\"sceneName\">Name for the new scene</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetInputAudioTracks(System.String)\">\n            <summary>\n            Gets the enable state of all audio tracks of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input</param>\n            <returns>Object of audio tracks and associated enable states</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetInputAudioTracks(System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Sets the enable state of audio tracks of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input</param>\n            <param name=\"inputAudioTracks\">JObject holding track settings to apply</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetInputAudioTracks(System.String,OBSWebsocketDotNet.Types.SourceTracks)\">\n            <summary>\n            Sets the enable state of audio tracks of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input</param>\n            <param name=\"inputAudioTracks\">Track settings to apply</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSourceActive(System.String)\">\n            <summary>\n            Gets the active and show state of a source.\n            **Compatible with inputs and scenes.**\n            </summary>\n            <param name=\"sourceName\">Name of the source to get the active state of</param>\n            <returns>Whether the source is showing in Program</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetVirtualCamStatus\">\n            <summary>\n            Gets the status of the virtualcam output.\n            </summary>\n            <returns>An <see cref=\"T:OBSWebsocketDotNet.Types.VirtualCamStatus\"/> object describing the current virtual camera state</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.StartVirtualCam\">\n            <summary>\n            Starts the virtualcam output.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.StopVirtualCam\">\n            <summary>\n            Stops the virtualcam output.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.ToggleVirtualCam\">\n            <summary>\n            Toggles the state of the virtualcam output.\n            </summary>\n            <returns>Whether the output is active</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetPersistentData(System.String,System.String)\">\n            <summary>\n            Gets the value of a \\\"slot\\\" from the selected persistent data realm.\n            </summary>\n            <param name=\"realm\">The data realm to select. `OBS_WEBSOCKET_DATA_REALM_GLOBAL` or `OBS_WEBSOCKET_DATA_REALM_PROFILE`</param>\n            <param name=\"slotName\">The name of the slot to retrieve data from</param>\n            <returns type=\"Any\">Value associated with the slot. `null` if not set</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetPersistentData(System.String,System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Sets the value of a \\\"slot\\\" from the selected persistent data realm.\n            </summary>\n            <param name=\"realm\">The data realm to select. `OBS_WEBSOCKET_DATA_REALM_GLOBAL` or `OBS_WEBSOCKET_DATA_REALM_PROFILE`</param>\n            <param name=\"slotName\">The name of the slot to retrieve data from</param>\n            <param name=\"slotValue\">The value to apply to the slot</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.CreateSceneCollection(System.String)\">\n            <summary>\n            Creates a new scene collection, switching to it in the process.\\n\\nNote: This will block until the collection has finished changing.\n            </summary>\n            <param name=\"sceneCollectionName\">Name for the new scene collection</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.CreateProfile(System.String)\">\n            <summary>\n            Creates a new profile, switching to it in the process\n            </summary>\n            <param name=\"profileName\">Name for the new profile</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.RemoveProfile(System.String)\">\n            <summary>\n            Removes a profile. If the current profile is chosen, it will change to a different profile first.\n            </summary>\n            <param name=\"profileName\">Name of the profile to remove</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetProfileParameter(System.String,System.String)\">\n            <summary>\n            Gets a parameter from the current profile's configuration.\n            </summary>\n            <param name=\"parameterCategory\">Category of the parameter to get</param>\n            <param name=\"parameterName\">Name of the parameter to get</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetProfileParameter(System.String,System.String,System.String)\">\n            <summary>\n            Sets the value of a parameter in the current profile's configuration.\n            </summary>\n            <param name=\"parameterCategory\">Category of the parameter to set</param>\n            <param name=\"parameterName\">Name of the parameter to set</param>\n            <param name=\"parameterValue\">Value of the parameter to set. Use `null` to delete</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetVideoSettings(OBSWebsocketDotNet.Types.ObsVideoSettings)\">\n            <summary>\n            Sets the current video settings.\n            Note: Fields must be specified in pairs. For example, you cannot set only `baseWidth` without needing to specify `baseHeight`.\n            </summary>\n            <param name=\"obsVideoSettings\">Object containing video settings</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSourceFilterDefaultSettings(System.String)\">\n            <summary>\n            Gets the default settings for a filter kind.\n            </summary>\n            <param name=\"filterKind\">Filter kind to get the default settings for</param>\n            <returns>Object of default settings for the filter kind</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetSourceFilterName(System.String,System.String,System.String)\">\n            <summary>\n            Sets the name of a source filter (rename).\n            </summary>\n            <param name=\"sourceName\">Name of the source the filter is on</param>\n            <param name=\"filterName\">Current name of the filter</param>\n            <param name=\"newFilterName\">New name for the filter</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetSourceFilterIndex(System.String,System.String,System.Int32)\">\n            <summary>\n            Sets the index position of a filter on a source.\n            </summary>\n            <param name=\"sourceName\">Name of the source the filter is on</param>\n            <param name=\"filterName\">Name of the filter</param>\n            <param name=\"filterIndex\">New index position of the filter</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetVersion\">\n            <summary>\n            Gets data about the current plugin and RPC version.\n            </summary>\n            <returns>Version info in an <see cref=\"T:OBSWebsocketDotNet.Types.ObsVersion\"/> object</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.CallVendorRequest(System.String,System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Call a request registered to a vendor.\n            A vendor is a unique name registered by a third-party plugin or script, which allows for custom requests and events to be added to obs-websocket.\n            If a plugin or script implements vendor requests or events, documentation is expected to be provided with them.\n            </summary>\n            <param name=\"vendorName\">Name of the vendor to use</param>\n            <param name=\"requestType\">The request type to call</param>\n            <param name=\"requestData\">Object containing appropriate request data</param>\n            <returns>Object containing appropriate response data. {} if request does not provide any response data</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetHotkeyList\">\n            <summary>\n            Gets an array of all hotkey names in OBS\n            </summary>\n            <returns>Array of hotkey names</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.Sleep(System.Int32,System.Int32)\">\n            <summary>\n            Sleeps for a time duration or number of frames. Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`.\n            </summary>\n            <param name=\"sleepMillis\">Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode)</param>\n            <param name=\"sleepFrames\">Number of frames to sleep for (if `SERIAL_FRAME` mode)</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetInputList(System.String)\">\n            <summary>\n            Gets an array of all inputs in OBS.\n            </summary>\n            <param name=\"inputKind\">Restrict the array to only inputs of the specified kind</param>\n            <returns>List of Inputs in OBS</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetInputKindList(System.Boolean)\">\n            <summary>\n            Gets an array of all available input kinds in OBS.\n            </summary>\n            <param name=\"unversioned\">True == Return all kinds as unversioned, False == Return with version suffixes (if available)</param>\n            <returns>Array of input kinds</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.RemoveInput(System.String)\">\n            <summary>\n            Removes an existing input.\n            Note: Will immediately remove all associated scene items.\n            </summary>\n            <param name=\"inputName\">Name of the input to remove</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetInputName(System.String,System.String)\">\n            <summary>\n            Sets the name of an input (rename).\n            </summary>\n            <param name=\"inputName\">Current input name</param>\n            <param name=\"newInputName\">New name for the input</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetInputSettings(System.String)\">\n            <summary>\n            Gets the settings of an input.\n            Note: Does not include defaults. To create the entire settings object, overlay `inputSettings` over the `defaultInputSettings` provided by `GetInputDefaultSettings`.\n            </summary>\n            <param name=\"inputName\">Name of the input to get the settings of</param>\n            <returns>New populated InputSettings object</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetInputSettings(OBSWebsocketDotNet.Types.InputSettings,System.Boolean)\">\n            <summary>\n            Sets the settings of an input.\n            </summary>\n            <param name=\"inputSettings\">Object of settings to apply</param>\n            <param name=\"overlay\">True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings.</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetInputSettings(System.String,Newtonsoft.Json.Linq.JObject,System.Boolean)\">\n            <summary>\n            Sets the settings of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to set the settings of</param>\n            <param name=\"inputSettings\">Object of settings to apply</param>\n            <param name=\"overlay\">True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings.</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetInputAudioBalance(System.String)\">\n            <summary>\n            Gets the audio balance of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to get the audio balance of</param>\n            <returns>Audio balance value from 0.0-1.0</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetInputAudioBalance(System.String,System.Double)\">\n            <summary>\n            Sets the audio balance of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to set the audio balance of</param>\n            <param name=\"inputAudioBalance\">New audio balance value</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetInputPropertiesListPropertyItems(System.String,System.String)\">\n            <summary>\n            Gets the items of a list property from an input's properties.\n            Note: Use this in cases where an input provides a dynamic, selectable list of items.\n            For example, display capture, where it provides a list of available displays.\n            </summary>\n            <param name=\"inputName\">Name of the input</param>\n            <param name=\"propertyName\">Name of the list property to get the items of</param>\n            <returns>Array of items in the list property</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.PressInputPropertiesButton(System.String,System.String)\">\n            <summary>\n            Presses a button in the properties of an input.\n            Note: Use this in cases where there is a button in the properties of an input that cannot be accessed in any other way.\n            For example, browser sources, where there is a refresh button.\n            </summary>\n            <param name=\"inputName\">Name of the input</param>\n            <param name=\"propertyName\">Name of the button property to press</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetMediaInputStatus(System.String)\">\n            <summary>\n            Gets the status of a media input.\\n\\nMedia States:\n            - `OBS_MEDIA_STATE_NONE`\n            - `OBS_MEDIA_STATE_PLAYING`\n            - `OBS_MEDIA_STATE_OPENING`\n            - `OBS_MEDIA_STATE_BUFFERING`\n            - `OBS_MEDIA_STATE_PAUSED`\n            - `OBS_MEDIA_STATE_STOPPED`\n            - `OBS_MEDIA_STATE_ENDED`\n            - `OBS_MEDIA_STATE_ERROR`\n            </summary>\n            <param name=\"inputName\">Name of the media input</param>\n            <returns>Object containing string mediaState, int mediaDuration, int mediaCursor properties</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.TriggerMediaInputAction(System.String,System.String)\">\n            <summary>\n            Triggers an action on a media input.\n            </summary>\n            <param name=\"inputName\">Name of the media input</param>\n            <param name=\"mediaAction\">Identifier of the `ObsMediaInputAction` enum</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetLastReplayBufferReplay\">\n            <summary>\n            Gets the filename of the last replay buffer save file.\n            </summary>\n            <returns>File path of last replay</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.ToggleRecordPause\">\n            <summary>\n            Toggles pause on the record output.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetGroupSceneItemList(System.String)\">\n            <summary>\n            Currently BROKEN in obs-websocket/obs-studio\n            Basically GetSceneItemList, but for groups.\n            Using groups at all in OBS is discouraged, as they are very broken under the hood.\n            Groups only\n            </summary>\n            <param name=\"sceneName\">Name of the group to get the items of</param>\n            <returns>Array of scene items in the group</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSceneItemId(System.String,System.String,System.Int32)\">\n            <summary>\n            Searches a scene for a source, and returns its id.\\n\\nScenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene or group to search in</param>\n            <param name=\"sourceName\">Name of the source to find</param>\n            <param name=\"searchOffset\">Number of matches to skip during search. >= 0 means first forward. -1 means last (top) item</param>\n            <returns>Numeric ID of the scene item</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSceneItemTransform(System.String,System.Int32)\">\n            <summary>\n            Gets the transform and crop info of a scene item.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <returns>Object containing scene item transform info</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSceneItemTransformRaw(System.String,System.Int32)\">\n            <summary>\n            Gets the JObject of transform settings for a scene item. Use this one you don't want it populated with default values.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <returns>Object containing scene item transform info</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSceneItemEnabled(System.String,System.Int32)\">\n            <summary>\n            Gets the enable state of a scene item.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <returns>Whether the scene item is enabled. `true` for enabled, `false` for disabled</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetSceneItemEnabled(System.String,System.Int32,System.Boolean)\">\n            <summary>\n            Gets the enable state of a scene item.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <param name=\"sceneItemEnabled\">New enable state of the scene item</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSceneItemLocked(System.String,System.Int32)\">\n            <summary>\n            Gets the lock state of a scene item.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <returns>Whether the scene item is locked. `true` for locked, `false` for unlocked</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetSceneItemLocked(System.String,System.Int32,System.Boolean)\">\n            <summary>\n            Sets the lock state of a scene item.\n            Scenes and Group\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <param name=\"sceneItemLocked\">New lock state of the scene item</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSceneItemIndex(System.String,System.Int32)\">\n            <summary>\n            Gets the index position of a scene item in a scene.\n            An index of 0 is at the bottom of the source list in the UI.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <returns>Index position of the scene item</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetSceneItemIndex(System.String,System.Int32,System.Int32)\">\n            <summary>\n            Sets the index position of a scene item in a scene.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <param name=\"sceneItemIndex\">New index position of the scene item</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSceneItemBlendMode(System.String,System.Int32)\">\n            <summary>\n            Gets the blend mode of a scene item.\n            Blend modes:\n            - `OBS_BLEND_NORMAL`\n            - `OBS_BLEND_ADDITIVE`\n            - `OBS_BLEND_SUBTRACT`\n            - `OBS_BLEND_SCREEN`\n            - `OBS_BLEND_MULTIPLY`\n            - `OBS_BLEND_LIGHTEN`\n            - `OBS_BLEND_DARKEN`\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\">Name of the scene the item is in</param>\n            <param name=\"sceneItemId\">Numeric ID of the scene item</param>\n            <returns>Current blend mode</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetSceneItemBlendMode(System.String,System.Int32,System.String)\">\n            <summary>\n            Sets the blend mode of a scene item.\n            Scenes and Groups\n            </summary>\n            <param name=\"sceneName\"></param>\n            <param name=\"sceneItemId\"></param>\n            <param name=\"sceneItemBlendMode\"></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetGroupList\">\n            <summary>\n            Gets an array of all groups in OBS.\n            Groups in OBS are actually scenes, but renamed and modified. In obs-websocket, we treat them as scenes where we can.\n            </summary>\n            <returns>Array of group names</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.RemoveScene(System.String)\">\n            <summary>\n            Removes a scene from OBS.\n            </summary>\n            <param name=\"sceneName\">Name of the scene to remove</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SetSceneName(System.String,System.String)\">\n            <summary>\n            Sets the name of a scene (rename).\n            </summary>\n            <param name=\"sceneName\">Name of the scene to be renamed</param>\n            <param name=\"newSceneName\">New name for the scene</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetSourceScreenshot(System.String,System.String,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Gets a Base64-encoded screenshot of a source.\n            The `imageWidth` and `imageHeight` parameters are treated as \\\"scale to inner\\\", meaning the smallest ratio will be used and the aspect ratio of the original resolution is kept.\n            If `imageWidth` and `imageHeight` are not specified, the compressed image will use the full resolution of the source.\n            **Compatible with inputs and scenes.**\n            </summary>\n            <param name=\"sourceName\">Name of the source to take a screenshot of</param>\n            <param name=\"imageFormat\">Image compression format to use. Use `GetVersion` to get compatible image formats</param>\n            <param name=\"imageWidth\">Width to scale the screenshot to</param>\n            <param name=\"imageHeight\">Height to scale the screenshot to</param>\n            <param name=\"imageCompressionQuality\">Compression quality to use. 0 for high compression, 100 for uncompressed. -1 to use \\\"default\\\" (whatever that means, idk)</param>\n            <returns>Base64-encoded screenshot</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetTransitionKindList\">\n            <summary>\n            Gets an array of all available transition kinds.\n            Similar to `GetInputKindList`\n            </summary>\n            <returns>Array of transition kinds</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetCurrentSceneTransitionCursor\">\n            <summary>\n            Gets the cursor position of the current scene transition.\n            Note: `transitionCursor` will return 1.0 when the transition is inactive.\n            </summary>\n            <returns>Cursor position, between 0.0 and 1.0</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.OpenInputPropertiesDialog(System.String)\">\n            <summary>\n            Opens the properties dialog of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to open the dialog of</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.OpenInputFiltersDialog(System.String)\">\n            <summary>\n            Opens the filters dialog of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to open the dialog of</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.OpenInputInteractDialog(System.String)\">\n            <summary>\n            Opens the interact dialog of an input.\n            </summary>\n            <param name=\"inputName\">Name of the input to open the dialog of</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetMonitorList\">\n            <summary>\n            Gets a list of connected monitors and information about them.\n            </summary>\n            <returns>a list of detected monitors with some information</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.Connect(System.String,System.String)\">\n            <summary>\n            Connect this instance to the specified URL, and authenticate (if needed) with the specified password.\n            NOTE: Please subscribe to the Connected/Disconnected events (or atlease check the IsConnected property) to determine when the connection is actually fully established\n            </summary>\n            <param name=\"url\">Server URL in standard URL format.</param>\n            <param name=\"password\">Server password</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.ConnectAsync(System.String,System.String)\">\n            <summary>\n            Connect this instance to the specified URL, and authenticate (if needed) with the specified password.\n            NOTE: Please subscribe to the Connected/Disconnected events (or atleast check the IsConnected property) to determine when the connection is actually fully established\n            </summary>\n            <param name=\"url\">Server URL in standard URL format.</param>\n            <param name=\"password\">Server password</param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.Disconnect\">\n            <summary>\n            Disconnect this instance from the server\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.SendRequest(System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Sends a message to the websocket API with the specified request type and optional parameters\n            </summary>\n            <param name=\"requestType\">obs-websocket request type, must be one specified in the protocol specification</param>\n            <param name=\"additionalFields\">additional JSON fields if required by the request type</param>\n            <returns>The server's JSON response as a JObject</returns>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.IOBSWebsocket.GetAuthInfo\">\n            <summary>\n            Request authentication data. You don't have to call this manually.\n            </summary>\n            <returns>Authentication data in an <see cref=\"T:OBSWebsocketDotNet.Communication.OBSAuthInfo\"/> object</returns>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.CurrentProgramSceneChanged\">\n            <summary>\n            The current program scene has changed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneListChanged\">\n            <summary>\n            The list of scenes has changed.\n            TODO: Make OBS fire this event when scenes are reordered.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneItemListReindexed\">\n            <summary>\n            Triggered when the scene item list of the specified scene is reordered\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneItemCreated\">\n            <summary>\n            Triggered when a new item is added to the item list of the specified scene\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneItemRemoved\">\n            <summary>\n            Triggered when an item is removed from the item list of the specified scene\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneItemEnableStateChanged\">\n            <summary>\n            Triggered when the visibility of a scene item changes\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneItemLockStateChanged\">\n            <summary>\n            Triggered when the lock status of a scene item changes\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.CurrentSceneCollectionChanged\">\n            <summary>\n            Triggered when switching to another scene collection\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneCollectionListChanged\">\n            <summary>\n            Triggered when a scene collection is created, deleted or renamed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.CurrentSceneTransitionChanged\">\n            <summary>\n            Triggered when switching to another transition\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.CurrentSceneTransitionDurationChanged\">\n            <summary>\n            Triggered when the current transition duration is changed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneTransitionStarted\">\n            <summary>\n            Triggered when a transition between two scenes starts. Followed by <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentProgramSceneChanged\"/>\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneTransitionEnded\">\n            <summary>\n            Triggered when a transition (other than \"cut\") has ended. Please note that the from-scene field is not available in TransitionEnd\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneTransitionVideoEnded\">\n            <summary>\n            Triggered when a stinger transition has finished playing its video\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.CurrentProfileChanged\">\n            <summary>\n            Triggered when switching to another profile\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.ProfileListChanged\">\n            <summary>\n            Triggered when a profile is created, imported, removed or renamed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.StreamStateChanged\">\n            <summary>\n            Triggered when the streaming output state changes\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.RecordStateChanged\">\n            <summary>\n            Triggered when the recording output state changes\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.ReplayBufferStateChanged\">\n            <summary>\n            Triggered when state of the replay buffer changes\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.CurrentPreviewSceneChanged\">\n            <summary>\n            Triggered when the preview scene selection changes (Studio Mode only)\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.StudioModeStateChanged\">\n            <summary>\n            Triggered when Studio Mode is turned on or off\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.ExitStarted\">\n            <summary>\n            Triggered when OBS exits\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.Connected\">\n            <summary>\n            Triggered when connected successfully to an obs-websocket server\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.Disconnected\">\n            <summary>\n            Triggered when disconnected from an obs-websocket server\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneItemSelected\">\n            <summary>\n            A scene item is selected in the UI\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneItemTransformChanged\">\n            <summary>\n            A scene item transform has changed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.InputAudioSyncOffsetChanged\">\n            <summary>\n            The audio sync offset of an input has changed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SourceFilterCreated\">\n            <summary>\n            A filter was added to a source\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SourceFilterRemoved\">\n            <summary>\n            A filter was removed from a source\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SourceFilterListReindexed\">\n            <summary>\n            Filters in a source have been reordered\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SourceFilterEnableStateChanged\">\n            <summary>\n            Triggered when the visibility of a filter has changed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.InputMuteStateChanged\">\n            <summary>\n            A source has been muted or unmuted\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.InputVolumeChanged\">\n            <summary>\n            The volume of a source has changed\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.VendorEvent\">\n            <summary>\n            A custom broadcast message was received\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.MediaInputPlaybackEnded\">\n            <summary>\n            These events are emitted by the OBS sources themselves. For example when the media file ends. The behavior depends on the type of media source being used.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.MediaInputPlaybackStarted\">\n            <summary>\n            These events are emitted by the OBS sources themselves. For example when the media file starts playing. The behavior depends on the type of media source being used.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.MediaInputActionTriggered\">\n            <summary>\n            This event is only emitted when something actively controls the media/VLC source. In other words, the source will never emit this on its own naturally.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.VirtualcamStateChanged\">\n            <summary>\n            The virtual cam state has changed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.CurrentSceneCollectionChanging\">\n            <summary>\n            The current scene collection has begun changing.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.CurrentProfileChanging\">\n            <summary>\n            The current profile has begun changing.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SourceFilterNameChanged\">\n            <summary>\n            The name of a source filter has changed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.InputCreated\">\n            <summary>\n            An input has been created.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.InputRemoved\">\n            <summary>\n            An input has been removed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.InputNameChanged\">\n            <summary>\n            The name of an input has changed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.InputActiveStateChanged\">\n            <summary>\n            An input's active state has changed.\n            When an input is active, it means it's being shown by the program feed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.InputShowStateChanged\">\n            <summary>\n            An input's show state has changed.\n            When an input is showing, it means it's being shown by the preview or a dialog.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.InputAudioBalanceChanged\">\n            <summary>\n            The audio balance value of an input has changed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.InputAudioTracksChanged\">\n            <summary>\n            The audio tracks of an input have changed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.InputAudioMonitorTypeChanged\">\n            <summary>\n            The monitor type of an input has changed.\n            Available types are:\n            - `OBS_MONITORING_TYPE_NONE`\n            - `OBS_MONITORING_TYPE_MONITOR_ONLY`\n            - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.InputVolumeMeters\">\n            <summary>\n            A high-volume event providing volume levels of all active inputs every 50 milliseconds.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.ReplayBufferSaved\">\n            <summary>\n            The replay buffer has been saved.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneCreated\">\n            <summary>\n            A new scene has been created.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneRemoved\">\n            <summary>\n            A scene has been removed.\n            </summary>\n        </member>\n        <member name=\"E:OBSWebsocketDotNet.IOBSWebsocket.SceneNameChanged\">\n            <summary>\n            The name of a scene has changed.\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.CurrentPreviewSceneChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentPreviewSceneChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.CurrentPreviewSceneChangedEventArgs.SceneName\">\n            <summary>\n            Name of the scene that was switched to\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.CurrentPreviewSceneChangedEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneName\">The scene name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.CurrentProfileChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentProfileChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.CurrentProfileChangedEventArgs.ProfileName\">\n            <summary>\n            Name of the new profile\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.CurrentProfileChangedEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"profileName\">The profile name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.CurrentProfileChangingEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentProfileChanging\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.CurrentProfileChangingEventArgs.ProfileName\">\n            <summary>\n            Name of the current profile\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.CurrentProfileChangingEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"profileName\">The profile name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.CurrentSceneCollectionChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentSceneCollectionChanged\"/> \n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.CurrentSceneCollectionChangedEventArgs.SceneCollectionName\">\n            <summary>\n            Name of the new scene collection\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.CurrentSceneCollectionChangedEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneCollectionName\">The scene collection name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.CurrentSceneCollectionChangingEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentSceneCollectionChanging\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.CurrentSceneCollectionChangingEventArgs.SceneCollectionName\">\n            <summary>\n            Name of the current scene collection\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.CurrentSceneCollectionChangingEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneCollectionName\">The scene collection name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.CurrentSceneTransitionChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentSceneTransitionChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.CurrentSceneTransitionChangedEventArgs.TransitionName\">\n            <summary>\n            Name of the new transition\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.CurrentSceneTransitionChangedEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"transitionName\">The transition name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.CurrentSceneTransitionDurationChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentSceneTransitionDurationChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.CurrentSceneTransitionDurationChangedEventArgs.TransitionDuration\">\n            <summary>\n            Transition duration in milliseconds\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.CurrentSceneTransitionDurationChangedEventArgs.#ctor(System.Int32)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"transitionDuration\">The transition duration</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.InputActiveStateChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.InputActiveStateChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputActiveStateChangedEventArgs.InputName\">\n            <summary>\n            Name of the input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputActiveStateChangedEventArgs.VideoActive\">\n            <summary>\n            Whether the input is active\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.InputActiveStateChangedEventArgs.#ctor(System.String,System.Boolean)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"inputName\">The input name</param>\n            <param name=\"videoActive\">Is the video active</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.InputAudioBalanceChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.InputAudioBalanceChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputAudioBalanceChangedEventArgs.InputName\">\n            <summary>\n            Name of the affected input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputAudioBalanceChangedEventArgs.InputAudioBalance\">\n            <summary>\n            New audio balance value of the input\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.InputAudioBalanceChangedEventArgs.#ctor(System.String,System.Double)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"inputName\">The input name</param>\n            <param name=\"inputAudioBalance\">The input audio balance</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.InputAudioMonitorTypeChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.InputAudioMonitorTypeChanged\"/>\n            Available types are:\n            - `OBS_MONITORING_TYPE_NONE`\n            - `OBS_MONITORING_TYPE_MONITOR_ONLY`\n            - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputAudioMonitorTypeChangedEventArgs.InputName\">\n            <summary>\n            Name of the input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputAudioMonitorTypeChangedEventArgs.MonitorType\">\n            <summary>\n            New monitor type of the input\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.InputAudioMonitorTypeChangedEventArgs.#ctor(System.String,System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"inputName\">The input name</param>\n            <param name=\"monitorType\">The monitor type</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.InputAudioSyncOffsetChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.InputAudioSyncOffsetChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputAudioSyncOffsetChangedEventArgs.InputName\">\n            <summary>\n            Name of the input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputAudioSyncOffsetChangedEventArgs.InputAudioSyncOffset\">\n            <summary>\n            New sync offset in milliseconds\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.InputAudioSyncOffsetChangedEventArgs.#ctor(System.String,System.Int32)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"inputName\">The input name</param>\n            <param name=\"inputAudioSyncOffset\">The input audio sync offset</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.InputAudioTracksChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.InputAudioTracksChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputAudioTracksChangedEventArgs.InputName\">\n            <summary>\n            Name of the input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputAudioTracksChangedEventArgs.InputAudioTracks\">\n            <summary>\n            Object of audio tracks along with their associated enable states\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.InputAudioTracksChangedEventArgs.#ctor(System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"inputName\">The input name</param>\n            <param name=\"inputAudioTracks\">The audio track data as a JObject</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.InputCreatedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.InputCreated\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputCreatedEventArgs.InputName\">\n            <summary>\n            Name of the input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputCreatedEventArgs.InputKind\">\n            <summary>\n            The kind of the input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputCreatedEventArgs.UnversionedInputKind\">\n            <summary>\n            The unversioned kind of input (aka no `_v2` stuff)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputCreatedEventArgs.InputSettings\">\n            <summary>\n            The settings configured to the input when it was created\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputCreatedEventArgs.DefaultInputSettings\">\n            <summary>\n            The default settings for the input\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.InputCreatedEventArgs.#ctor(System.String,System.String,System.String,Newtonsoft.Json.Linq.JObject,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"inputName\">The input name</param>\n            <param name=\"inputKind\">The kind of input</param>\n            <param name=\"unversionedInputKind\">The unversioned kind of input</param>\n            <param name=\"inputSettings\">The input settings as a JObject</param>\n            <param name=\"defaultInputSettings\">The default input settings as a JObject</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.InputMuteStateChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.InputMuteStateChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputMuteStateChangedEventArgs.InputName\">\n            <summary>\n            Name of the input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputMuteStateChangedEventArgs.InputMuted\">\n            <summary>\n            Whether the input is muted\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.InputMuteStateChangedEventArgs.#ctor(System.String,System.Boolean)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"inputName\">The input name</param>\n            <param name=\"inputMuted\">Is the input muted</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.InputNameChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.InputNameChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputNameChangedEventArgs.OldInputName\">\n            <summary>\n            Old name of the input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputNameChangedEventArgs.InputName\">\n            <summary>\n            New name of the input\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.InputNameChangedEventArgs.#ctor(System.String,System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"oldInputName\">The old input name</param>\n            <param name=\"inputName\">The new input name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.InputRemovedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.InputRemoved\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputRemovedEventArgs.InputName\">\n            <summary>\n            Name of the input\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.InputRemovedEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"inputName\">The input name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.InputShowStateChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.InputShowStateChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputShowStateChangedEventArgs.InputName\">\n            <summary>\n            Name of the input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputShowStateChangedEventArgs.VideoShowing\">\n            <summary>\n            Whether the input is showing\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.InputShowStateChangedEventArgs.#ctor(System.String,System.Boolean)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"inputName\">The input name</param>\n            <param name=\"videoShowing\">Is the video showing</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.InputVolumeChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.InputVolumeChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputVolumeChangedEventArgs.Volume\">\n            <summary>\n            Current volume levels of source\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.InputVolumeChangedEventArgs.#ctor(OBSWebsocketDotNet.Types.InputVolume)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"volume\">The new input volume</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.InputVolumeMetersEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.InputVolumeMeters\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.InputVolumeMetersEventArgs.inputs\">\n            <summary>\n            Array of active inputs with their associated volume levels\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.InputVolumeMetersEventArgs.#ctor(System.Collections.Generic.List{Newtonsoft.Json.Linq.JObject})\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"inputs\">Collection inputs as JObjects</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.MediaInputActionTriggeredEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.MediaInputActionTriggered\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.MediaInputActionTriggeredEventArgs.InputName\">\n            <summary>\n            Name of the input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.MediaInputActionTriggeredEventArgs.MediaAction\">\n            <summary>\n            Action performed on the input. See `ObsMediaInputAction` enum\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.MediaInputActionTriggeredEventArgs.#ctor(System.String,System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"inputName\">The input name</param>\n            <param name=\"mediaAction\">The media action data</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.MediaInputPlaybackEndedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.MediaInputPlaybackEnded\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.MediaInputPlaybackEndedEventArgs.InputName\">\n            <summary>\n            Name of the input\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.MediaInputPlaybackEndedEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"inputName\">The input name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.MediaInputPlaybackStartedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.MediaInputPlaybackStarted\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.MediaInputPlaybackStartedEventArgs.InputName\">\n            <summary>\n            Name of the input\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.MediaInputPlaybackStartedEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"inputName\">The input name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.ProfileListChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.ProfileListChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.ProfileListChangedEventArgs.Profiles\">\n            <summary>\n            The profiles that have changed\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.ProfileListChangedEventArgs.#ctor(System.Collections.Generic.List{System.String})\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"profiles\">Collection of profile names as strings</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.ProgramSceneChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.CurrentProgramSceneChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.ProgramSceneChangedEventArgs.SceneName\">\n            <summary>\n            The new scene name\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.ProgramSceneChangedEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneName\">The scene name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.RecordStateChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.RecordStateChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.RecordStateChangedEventArgs.OutputState\">\n            <summary>\n            The specific state of the output\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.RecordStateChangedEventArgs.#ctor(OBSWebsocketDotNet.Types.RecordStateChanged)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"outputState\">The record state change data</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.ReplayBufferSavedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.ReplayBufferSaved\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.ReplayBufferSavedEventArgs.SavedReplayPath\">\n            <summary>\n            Path of the saved replay file\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.ReplayBufferSavedEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"savedReplayPath\">The saved replay path</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.ReplayBufferStateChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.ReplayBufferStateChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.ReplayBufferStateChangedEventArgs.OutputState\">\n            <summary>\n            The specific state of the output\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.ReplayBufferStateChangedEventArgs.#ctor(OBSWebsocketDotNet.Types.OutputStateChanged)\">\n            <summary>\n            Default constructor\n            </summary>\n            <param name=\"outputState\">Specific state of the output</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneCollectionListChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneCollectionListChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneCollectionListChangedEventArgs.SceneCollections\">\n            <summary>\n            Updated list of scene collections\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneCollectionListChangedEventArgs.#ctor(System.Collections.Generic.List{System.String})\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneCollections\">Collection of scene collection names as string</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneCreatedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneCreated\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneCreatedEventArgs.SceneName\">\n            <summary>\n            Name of the new scene\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneCreatedEventArgs.IsGroup\">\n            <summary>\n            Whether the new scene is a group\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneCreatedEventArgs.#ctor(System.String,System.Boolean)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneName\">The scene name</param>\n            <param name=\"isGroup\">Is the scene item a group</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneItemCreatedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemCreated\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemCreatedEventArgs.SceneName\">\n            <summary>\n            Name of the scene where the item is\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemCreatedEventArgs.SourceName\">\n            <summary>\n            Name of the concerned item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemCreatedEventArgs.SceneItemId\">\n            <summary>\n            Numeric ID of the scene item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemCreatedEventArgs.SceneItemIndex\">\n            <summary>\n            Index position of the item\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneItemCreatedEventArgs.#ctor(System.String,System.String,System.Int32,System.Int32)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneName\">The scene name</param>\n            <param name=\"sourceName\">The source name</param>\n            <param name=\"sceneItemId\">The scene item id</param>\n            <param name=\"sceneItemIndex\">The scene item index</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneItemEnableStateChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemEnableStateChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemEnableStateChangedEventArgs.SceneName\">\n            <summary>\n            Name of the scene the item is in\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemEnableStateChangedEventArgs.SceneItemId\">\n            <summary>\n            Numeric ID of the scene item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemEnableStateChangedEventArgs.SceneItemEnabled\">\n            <summary>\n            Whether the scene item is enabled (visible)\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneItemEnableStateChangedEventArgs.#ctor(System.String,System.Int32,System.Boolean)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneName\">The scene name</param>\n            <param name=\"sceneItemId\">The scene item id</param>\n            <param name=\"sceneItemEnabled\">Is the scene item enabled</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneItemListReindexedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemListReindexed\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemListReindexedEventArgs.SceneName\">\n            <summary>\n            Name of the scene where items where reordered\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemListReindexedEventArgs.SceneItems\">\n            <summary>\n            List of all scene items as JObject\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneItemListReindexedEventArgs.#ctor(System.String,System.Collections.Generic.List{Newtonsoft.Json.Linq.JObject})\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneName\">The scene name</param>\n            <param name=\"sceneItems\">The scene item data as a colleciton of JObjects</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneItemLockStateChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemLockStateChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemLockStateChangedEventArgs.SceneName\">\n            <summary>\n            Name of the scene the item is in\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemLockStateChangedEventArgs.SceneItemId\">\n            <summary>\n            Numeric ID of the scene item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemLockStateChangedEventArgs.SceneItemLocked\">\n            <summary>\n            Whether the scene item is locked (visible)\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneItemLockStateChangedEventArgs.#ctor(System.String,System.Int32,System.Boolean)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneName\">The scene name</param>\n            <param name=\"sceneItemId\">The scene item id</param>\n            <param name=\"sceneItemLocked\">is the scene item locked</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneItemRemovedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemRemoved\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemRemovedEventArgs.SceneName\">\n            <summary>\n            Name of the scene where the item was removed from\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemRemovedEventArgs.SourceName\">\n            <summary>\n            Name of the concerned item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemRemovedEventArgs.SceneItemId\">\n            <summary>\n            Numeric ID of the scene item\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneItemRemovedEventArgs.#ctor(System.String,System.String,System.Int32)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneName\">The scene name</param>\n            <param name=\"sourceName\">The source name</param>\n            <param name=\"sceneItemId\">The scene items id</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneItemSelectedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemSelected\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemSelectedEventArgs.SceneName\">\n            <summary>\n            Name of the scene item is in\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemSelectedEventArgs.SceneItemId\">\n            <summary>\n            Numeric ID of the scene item\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneItemSelectedEventArgs.#ctor(System.String,System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneName\">The scene name</param>\n            <param name=\"sceneItemId\">The scene item id</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneItemTransformEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneItemTransformChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemTransformEventArgs.SceneName\">\n            <summary>\n            Name of the scene item is in\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemTransformEventArgs.SceneItemId\">\n            <summary>\n            Numeric ID of the scene item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneItemTransformEventArgs.Transform\">\n            <summary>\n            Transform data\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneItemTransformEventArgs.#ctor(System.String,System.String,OBSWebsocketDotNet.Types.SceneItemTransformInfo)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneName\">The scene name</param>\n            <param name=\"sceneItemId\">The scene item id</param>\n            <param name=\"transform\">The transform data</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneListChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneListChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneListChangedEventArgs.Scenes\">\n            <summary>\n            Updated array of scenes\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneListChangedEventArgs.#ctor(System.Collections.Generic.List{Newtonsoft.Json.Linq.JObject})\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"scenes\">Collection of scene data as JObjects</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneNameChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneNameChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneNameChangedEventArgs.OldSceneName\">\n            <summary>\n            Old name of the scene\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneNameChangedEventArgs.SceneName\">\n            <summary>\n            New name of the scene\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneNameChangedEventArgs.#ctor(System.String,System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"oldSceneName\">The previous scene name</param>\n            <param name=\"sceneName\">The new scene name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneRemovedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneRemoved\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneRemovedEventArgs.SceneName\">\n            <summary>\n            Name of the removed scene\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneRemovedEventArgs.IsGroup\">\n            <summary>\n            Whether the removed scene was a group\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneRemovedEventArgs.#ctor(System.String,System.Boolean)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sceneName\">The scene name</param>\n            <param name=\"isGroup\">Is the scene name a group</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneTransitionEndedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneTransitionEnded\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneTransitionEndedEventArgs.TransitionName\">\n            <summary>\n            Scene transition name\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneTransitionEndedEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"transitionName\">The transition name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneTransitionStartedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneTransitionStarted\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneTransitionStartedEventArgs.TransitionName\">\n            <summary>\n            Transition name\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneTransitionStartedEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"transitionName\">The transition name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SceneTransitionVideoEndedEventArgs\">\n            <summary>\n            Called by <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SceneTransitionVideoEnded\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SceneTransitionVideoEndedEventArgs.TransitionName\">\n            <summary>\n            Transition name\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SceneTransitionVideoEndedEventArgs.#ctor(System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"transitionName\">The transition name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SourceFilterCreatedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SourceFilterCreated\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterCreatedEventArgs.SourceName\">\n            <summary>\n            Name of the source the filter was added to\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterCreatedEventArgs.FilterName\">\n            <summary>\n            Name of the filter\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterCreatedEventArgs.FilterKind\">\n            <summary>\n            The kind of the filter\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterCreatedEventArgs.FilterIndex\">\n            <summary>\n            Index position of the filter\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterCreatedEventArgs.FilterSettings\">\n            <summary>\n            The settings configured to the filter when it was created\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterCreatedEventArgs.DefaultFilterSettings\">\n            <summary>\n            The default settings for the filter\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SourceFilterCreatedEventArgs.#ctor(System.String,System.String,System.String,System.Int32,Newtonsoft.Json.Linq.JObject,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sourceName\">The source name</param>\n            <param name=\"filterName\">The filter name</param>\n            <param name=\"filterKind\">The kind of filter</param>\n            <param name=\"filterIndex\">The index of the filter</param>\n            <param name=\"filterSettings\">The filters settings as a JObject</param>\n            <param name=\"defaultFilterSettings\">The default filter settings as a JObject</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SourceFilterEnableStateChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SourceFilterEnableStateChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterEnableStateChangedEventArgs.SourceName\">\n            <summary>\n            Name of the source the filter is on\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterEnableStateChangedEventArgs.FilterName\">\n            <summary>\n            Name of the filter\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterEnableStateChangedEventArgs.FilterEnabled\">\n            <summary>\n            Whether the filter is enabled\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SourceFilterEnableStateChangedEventArgs.#ctor(System.String,System.String,System.Boolean)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sourceName\">The source name</param>\n            <param name=\"filterName\">The filter name</param>\n            <param name=\"filterEnabled\">If the filter is enabled or not</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SourceFilterListReindexedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SourceFilterListReindexed\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterListReindexedEventArgs.SourceName\">\n            <summary>\n            Name of the source\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterListReindexedEventArgs.Filters\">\n            <summary>\n            Array of filter objects\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SourceFilterListReindexedEventArgs.#ctor(System.String,System.Collections.Generic.List{OBSWebsocketDotNet.Types.FilterReorderItem})\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sourceName\">The source name</param>\n            <param name=\"filters\">Collection of filters</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SourceFilterNameChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SourceFilterNameChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterNameChangedEventArgs.SourceName\">\n            <summary>\n            The source the filter is on\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterNameChangedEventArgs.OldFilterName\">\n            <summary>\n            Old name of the filter\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterNameChangedEventArgs.FilterName\">\n            <summary>\n            New name of the filter\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SourceFilterNameChangedEventArgs.#ctor(System.String,System.String,System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sourceName\">The source name</param>\n            <param name=\"oldFilterName\">The filters previous name</param>\n            <param name=\"filterName\">The filters new name</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.SourceFilterRemovedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.SourceFilterRemoved\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterRemovedEventArgs.SourceName\">\n            <summary>\n            Name of the source the filter was on\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.SourceFilterRemovedEventArgs.FilterName\">\n            <summary>\n            Name of the filter\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.SourceFilterRemovedEventArgs.#ctor(System.String,System.String)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"sourceName\">The source name</param>\n            <param name=\"filterName\">The filter name that's been removed</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.StreamStateChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.StreamStateChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.StreamStateChangedEventArgs.OutputState\">\n            <summary>\n            The specific state of the output\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.StreamStateChangedEventArgs.#ctor(OBSWebsocketDotNet.Types.OutputStateChanged)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"outputState\">The output state data</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.StudioModeStateChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.StudioModeStateChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.StudioModeStateChangedEventArgs.StudioModeEnabled\">\n            <summary>\n            New Studio Mode status\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.StudioModeStateChangedEventArgs.#ctor(System.Boolean)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"studioModeEnabled\">Is studio mode enabled</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.UnsupportedEventArgs\">\n            <summary>\n            Event args for unsupported events\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.UnsupportedEventArgs.EventType\">\n            <summary>\n            The type of the event\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.UnsupportedEventArgs.Body\">\n            <summary>\n            The body of the event\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.UnsupportedEventArgs.#ctor(System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Event args for unsupported events\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.VendorEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.VendorEvent\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.VendorEventArgs.VendorName\">\n            <summary>\n            Name of the vendor emitting the event\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.VendorEventArgs.EventType\">\n            <summary>\n            Vendor-provided event typedef\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.VendorEventArgs.eventData\">\n            <summary>\n            Vendor-provided event data. {} if event does not provide any data\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.VendorEventArgs.#ctor(System.String,System.String,Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"vendorName\">The vendor name</param>\n            <param name=\"eventType\">The event type</param>\n            <param name=\"eventData\">The event data as a Json Object</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Events.VirtualcamStateChangedEventArgs\">\n            <summary>\n            Event args for <see cref=\"E:OBSWebsocketDotNet.OBSWebsocket.VirtualcamStateChanged\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Events.VirtualcamStateChangedEventArgs.OutputState\">\n            <summary>\n            The specific state of the output\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Events.VirtualcamStateChangedEventArgs.#ctor(OBSWebsocketDotNet.Types.OutputStateChanged)\">\n            <summary>\n            Default Constructor\n            </summary>\n            <param name=\"outputState\">The output state data</param>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.FilterReorderItem\">\n            <summary>\n            Filter list item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.FilterReorderItem.Name\">\n            <summary>\n            Name of filter\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.FilterReorderItem.Type\">\n            <summary>\n            Type of filter\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.FilterSettings\">\n            <summary>\n            Filter settings\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.FilterSettings.Name\">\n            <summary>\n            Name of the filter\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.FilterSettings.Kind\">\n            <summary>\n            Type of the specified filter\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.FilterSettings.Index\">\n            <summary>\n            Index of the filter in the list, beginning at 0\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.FilterSettings.IsEnabled\">\n            <summary>\n            Status of the specified filter\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.FilterSettings.Settings\">\n            <summary>\n            Settings for the filter\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.GetProfileListInfo\">\n            <summary>\n            Response from <see cref=\"M:OBSWebsocketDotNet.OBSWebsocket.GetProfileList\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.GetProfileListInfo.CurrentProfileName\">\n            <summary>\n            Name of the currently active profile\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.GetProfileListInfo.Profiles\">\n            <summary>\n            List of all profiles\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.GetSceneListInfo\">\n            <summary>\n            Response from <see cref=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneList\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.GetSceneListInfo.CurrentProgramSceneName\">\n            <summary>\n            Name of the currently active program scene\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.GetSceneListInfo.CurrentPreviewSceneName\">\n            <summary>\n            Name of the currently active preview/studio scene\n            Note: Will return null if not in studio mode\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.GetSceneListInfo.Scenes\">\n            <summary>\n            Ordered list of the current profile's scenes\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.GetTransitionListInfo\">\n            <summary>\n            Response from <see cref=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneTransitionList\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.GetTransitionListInfo.CurrentTransition\">\n            <summary>\n            Name of the currently active transition\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.GetTransitionListInfo.CurrentTransitionKing\">\n            <summary>\n            Kind of the currently active transition\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.GetTransitionListInfo.Transitions\">\n            <summary>\n            List of transitions.\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Input\">\n            <summary>\n            Abstract class with information on a specific Input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Input.InputName\">\n            <summary>\n            Name of the Input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Input.InputKind\">\n            <summary>\n            Kind of the Input\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Input.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Instantiate object from response data\n            </summary>\n            <param name=\"body\"></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Input.#ctor\">\n            <summary>\n            Default Constructor\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.InputBasicInfo\">\n            <summary>\n            Input class which also shows the Unversioned Input Kind\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputBasicInfo.UnversionedKind\">\n            <summary>\n            Unversioned Kind of the Input\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.InputBasicInfo.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Instantiate object from response data\n            </summary>\n            <param name=\"body\"></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.InputBasicInfo.#ctor\">\n            <summary>\n            Default Constructor\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.InputBrowserSourceSettings\">\n            <summary>\n            Input class dedicated for the ffmpeg_source input kind.\n            Usage: InputBrowserSourceSettings.FromInputSettings(InputSettings)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputBrowserSourceSettings.CustomFPS\">\n            <summary>\n            Set a custom FPS (using the FPS property)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputBrowserSourceSettings.FPS\">\n            <summary>\n            Frames Per Second\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputBrowserSourceSettings.RerouteAudio\">\n            <summary>\n            Control audio via OBS\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputBrowserSourceSettings.Height\">\n            <summary>\n            Height\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputBrowserSourceSettings.Width\">\n            <summary>\n            Width\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputBrowserSourceSettings.CSS\">\n            <summary>\n            Custom CSS\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputBrowserSourceSettings.IsLocalFile\">\n            <summary>\n            Is Local file\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputBrowserSourceSettings.LocalFile\">\n            <summary>\n            Local filename (when IsLocalFile is true)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputBrowserSourceSettings.URL\">\n            <summary>\n            URL (when IsLocalFile is false)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputBrowserSourceSettings.RestartWhenActive\">\n            <summary>\n            Refresh browser when scene becomes active\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputBrowserSourceSettings.ShutdownWhenNotVisible\">\n            <summary>\n            Shutdown source when not visible\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputBrowserSourceSettings.ControlLevel\">\n            <summary>\n            Page Permissions\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.InputBrowserSourceSettings.FromInputSettings(OBSWebsocketDotNet.Types.InputSettings)\">\n            <summary>\n            Static constructor to instanciate a InputBrowserSourceSettings object\n            Requires an InputSettings class with InputKind of browser_source to create\n            </summary>\n            <param name=\"settings\">Settings object</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.InputFFMpegSettings\">\n            <summary>\n            Input class dedicated for the ffmpeg_source input kind.\n            Usage: InputFFMpegSettings.FromInputSettings(InputSettings)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputFFMpegSettings.BufferingMB\">\n            <summary>\n            Buffering MB\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputFFMpegSettings.ClearOnMediaEnd\">\n            <summary>\n            Clear window when media ends\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputFFMpegSettings.CloseWhenInactive\">\n            <summary>\n            Close when inactive\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputFFMpegSettings.ColorRange\">\n            <summary>\n            Color Range\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputFFMpegSettings.HWDecode\">\n            <summary>\n            HW Decoder\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputFFMpegSettings.IsLocalFile\">\n            <summary>\n            Is Local file\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputFFMpegSettings.LocalFile\">\n            <summary>\n            Local filename\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputFFMpegSettings.Looping\">\n            <summary>\n            Looping\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputFFMpegSettings.LinearAlpha\">\n            <summary>\n            Apply alpha in linear space\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputFFMpegSettings.RestartOnActivate\">\n            <summary>\n            Restart when activated\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputFFMpegSettings.Options\">\n            <summary>\n            ffmpeg options\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputFFMpegSettings.SpeedPercent\">\n            <summary>\n            Speed percentage\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.InputFFMpegSettings.FromInputSettings(OBSWebsocketDotNet.Types.InputSettings)\">\n            <summary>\n            Static constructor to instanciate a InputFFMpegSettings object\n            Requires an InputSettings class with InputKind of ffmpeg_source to create\n            </summary>\n            <param name=\"settings\">Setings object</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.InputSettings\">\n            <summary>\n            Settings for a source item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputSettings.Settings\">\n            <summary>\n            Settings for the source\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.InputSettings.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Builds the object from the JSON data\n            </summary>\n            <param name=\"data\">JSON item description as a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.InputSettings.#ctor\">\n            <summary>\n            Default Constructor for deserialization\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.InputVolume\">\n            <summary>\n            Source volume values\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputVolume.InputName\">\n            <summary>\n            Name of the source\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputVolume.InputVolumeMul\">\n            <summary>\n            The source volume in percent\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.InputVolume.InputVolumeDb\">\n            <summary>\n            The source volume in decibels\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.InputVolume.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Builds the object from the JSON response body\n            </summary>\n            <param name=\"data\">JSON response body as a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.InputVolume.#ctor\">\n            <summary>\n            Empty constructor for jsonconvert\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.KeyModifier\">\n            <summary>\n            Key Modifiers\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.KeyModifier.None\">\n            <summary>\n            No modifiers\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.KeyModifier.Shift\">\n            <summary>\n            Shift Key\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.KeyModifier.Alt\">\n            <summary>\n            Alt Key\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.KeyModifier.Control\">\n            <summary>\n            Control Key\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.KeyModifier.Command\">\n            <summary>\n            Command (Mac) / WinKey (?) Windows\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.MediaInputStatus\">\n            <summary>\n            Status of a Media Input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.MediaInputStatus.StateString\">\n            <summary>\n            State of the media input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.MediaInputStatus.State\">\n            <summary>\n            State of the media input\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.MediaInputStatus.Duration\">\n            <summary>\n            Total duration of the playing media in milliseconds. `null` if not playing\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.MediaInputStatus.Cursor\">\n            <summary>\n            Position of the cursor in milliseconds. `null` if not playing\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.MediaInputStatus.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Instantiate from JObject\n            </summary>\n            <param name=\"body\"></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.MediaInputStatus.#ctor\">\n            <summary>\n            Default Constructor\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.MediaState\">\n            <summary>\n            Enum representing the state of a media input\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.MediaState.OBS_MEDIA_STATE_NONE\">\n            <summary>\n            No media is loaded\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.MediaState.OBS_MEDIA_STATE_PLAYING\">\n            <summary>\n            Media is playing\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.MediaState.OBS_MEDIA_STATE_OPENING\">\n            <summary>\n            Media is opening\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.MediaState.OBS_MEDIA_STATE_BUFFERING\">\n            <summary>\n            Media is buffering\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.MediaState.OBS_MEDIA_STATE_PAUSED\">\n            <summary>\n            Media is playing but is paused\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.MediaState.OBS_MEDIA_STATE_STOPPED\">\n            <summary>\n            Media is stopped\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.MediaState.OBS_MEDIA_STATE_ENDED\">\n            <summary>\n            Media is ended\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.MediaState.OBS_MEDIA_STATE_ERROR\">\n            <summary>\n            Media has errored\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.Monitor\">\n            <summary>\n            Information on a connected Monitor\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Monitor.Height\">\n            <summary>\n            Monitor height (px)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Monitor.Width\">\n            <summary>\n            Monitor width (px)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Monitor.Name\">\n            <summary>\n            Monitor Name\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Monitor.Index\">\n            <summary>\n            Monitor Index\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Monitor.PositionX\">\n            <summary>\n            Monitor Position X\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.Monitor.PositionY\">\n            <summary>\n            Monitor Position Y\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Monitor.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Constructor to auto populate\n            </summary>\n            <param name=\"data\"></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.Monitor.#ctor\">\n            <summary>\n            Default Constructor\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.OBSHotkey\">\n            <summary>\n            OBS Hotkeys as defined here: https://github.com/obsproject/obs-studio/blob/master/libobs/obs-hotkeys.h\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.ObsScene\">\n            <summary>\n            Describes a scene in OBS, along with its items\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.ObsScene.Name\">\n            <summary>\n            OBS Scene name\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.ObsScene.IsGroup\">\n            <summary>\n            Is group\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.ObsScene.Items\">\n            <summary>\n            Scene item list\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.ObsScene.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Builds the object from the JSON description\n            </summary>\n            <param name=\"data\">JSON scene description as a <see cref=\"T:Newtonsoft.Json.Linq.JObject\" /></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.ObsScene.#ctor\">\n            <summary>\n            Default Constructor for deserialization\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.ObsStats\">\n            <summary>\n            OBS Stats\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsStats.FPS\">\n            <summary>\n            Current framerate.\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsStats.RenderTotalFrames\">\n            <summary>\n            Number of frames rendered\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsStats.RenderMissedFrames\">\n            <summary>\n            Number of frames missed due to rendering lag\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsStats.OutputTotalFrames\">\n            <summary>\n            Number of frames outputted\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsStats.OutputSkippedFrames\">\n            <summary>\n            Number of frames skipped due to encoding lag\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsStats.AverageFrameTime\">\n            <summary>\n            Average frame render time (in milliseconds)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsStats.CpuUsage\">\n            <summary>\n            Current CPU usage (percentage)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsStats.MemoryUsage\">\n            <summary>\n            Current RAM usage (in megabytes)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsStats.FreeDiskSpace\">\n            <summary>\n            Free recording disk space (in megabytes)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsStats.SessionIncomingMessages\">\n            <summary>\n            Total number of messages received by obs-websocket from the client\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsStats.SessionOutgoingMessages\">\n            <summary>\n            Total number of messages sent by obs-websocket to the client\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.ObsVersion\">\n            <summary>\n            Version info of the plugin, the API and OBS Studio\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsVersion.PluginVersion\">\n            <summary>\n            obs-websocket plugin version\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsVersion.OBSStudioVersion\">\n            <summary>\n            OBS Studio version\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsVersion.Version\">\n            <summary>\n            OBSRemote compatible API version.Fixed to 1.1 for retrocompatibility.\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsVersion.AvailableRequests\">\n            <summary>\n            List of available request types, formatted as a comma-separated list string (e.g. : \"Method1,Method2,Method3\").\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsVersion.SupportedImageFormats\">\n            <summary>\n            Image formats available in `GetSourceScreenshot` and `SaveSourceScreenshot` requests.\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsVersion.Platform\">\n            <summary>\n            Name of the platform. Usually `windows`, `macos`, or `ubuntu` (linux flavor). Not guaranteed to be any of those\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsVersion.PlatformDescription\">\n            <summary>\n            Description of the platform, like `Windows 10 (10.0)`\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.ObsVersion.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Builds the object from the JSON response body\n            </summary>\n            <param name=\"data\">JSON response body as a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.ObsVersion.#ctor\">\n            <summary>\n            Empty constructor for jsonconvert\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.ObsVideoSettings\">\n            <summary>\n            Basic OBS video information\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsVideoSettings.FpsNumerator\">\n            <summary>\n            Numerator of the fractional FPS value\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsVideoSettings.FpsDenominator\">\n            <summary>\n            Denominator of the fractional FPS value\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsVideoSettings.BaseWidth\">\n            <summary>\n            Base (canvas) width\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsVideoSettings.BaseHeight\">\n            <summary>\n            Base (canvas) height\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsVideoSettings.OutputWidth\">\n            <summary>\n            Width of the output resolution in pixels\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.ObsVideoSettings.OutputHeight\">\n            <summary>\n            Height of the output resolution in pixels\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.OutputState\">\n            <summary>\n            Describes the state of an output (streaming or recording)\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.OutputState.OBS_WEBSOCKET_OUTPUT_STARTING\">\n            <summary>\n            The output is initializing and doesn't produce frames yet\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.OutputState.OBS_WEBSOCKET_OUTPUT_STARTED\">\n            <summary>\n            The output is running and produces frames\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.OutputState.OBS_WEBSOCKET_OUTPUT_STOPPING\">\n            <summary>\n            The output is stopping and sends the last remaining frames in its buffer\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.OutputState.OBS_WEBSOCKET_OUTPUT_STOPPED\">\n            <summary>\n            The output is completely stopped\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.OutputState.OBS_WEBSOCKET_OUTPUT_PAUSED\">\n            <summary>\n            The output is paused (usually recording output)\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.OutputState.OBS_WEBSOCKET_OUTPUT_RESUMED\">\n            <summary>\n            The output is resumed (i.e. no longer paused) - usually recording output\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.OutputStateChanged\">\n            <summary>\n            Data when Stream/Recording/Instant_Replay change states\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.OutputStateChanged.IsActive\">\n            <summary>\n            Is output currently active (streaming/recording)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.OutputStateChanged.StateStr\">\n            <summary>\n            Output state as string\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.OutputStateChanged.State\">\n            <summary>\n            OutputState enum of current state\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.OutputStateChanged.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Constructor\n            </summary>\n            <param name=\"body\"></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.OutputStateChanged.#ctor\">\n            <summary>\n            Default Constructor for deserialization\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.OutputStatus\">\n            <summary>\n            Status of streaming output\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.OutputStatus.IsActive\">\n            <summary>\n            True if streaming is started and running, false otherwise\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.OutputStatus.IsReconnecting\">\n            <summary>\n            Whether the output is currently reconnectins\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.OutputStatus.TimeCode\">\n            <summary>\n            Current formatted timecode string for the output\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.OutputStatus.Duration\">\n            <summary>\n            Current duration in milliseconds for the output\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.OutputStatus.Congestion\">\n            <summary>\n            Congestion of the output\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.OutputStatus.BytesSent\">\n            <summary>\n            Nubmer of bytes sent by the output\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.OutputStatus.SkippedFrames\">\n            <summary>\n            Number of frames skipped by the output's process\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.OutputStatus.TotalFrames\">\n            <summary>\n            Total number of frames delivered by the output's process\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.OutputStatus.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Builds the object from the JSON response body\n            </summary>\n            <param name=\"data\">JSON response body as a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.OutputStatus.#ctor\">\n            <summary>\n            Default Constructor for deserialization\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.RecordingStatus\">\n            <summary>\n            GetRecordingStatus response\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.RecordingStatus.IsRecording\">\n            <summary>\n            Current recording status\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.RecordingStatus.IsRecordingPaused\">\n            <summary>\n            Whether the recording is paused or not\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.RecordingStatus.RecordTimecode\">\n            <summary>\n            Current formatted timecode string for the output\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.RecordingStatus.RecordingDuration\">\n            <summary>\n            Current duration in milliseconds for the output\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.RecordingStatus.RecordingBytes\">\n            <summary>\n            Number of bytes sent by the output\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.RecordingStatus.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Builds the object from the JSON response body\n            </summary>\n            <param name=\"data\">JSON response body as a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.RecordingStatus.#ctor\">\n            <summary>\n            Default Constructor for deserialization\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.RecordStateChanged\">\n            <summary>\n            Data when Recording change states\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.RecordStateChanged.OutputPath\">\n            <summary>\n            File name for the saved recording, if record stopped. null otherwise\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.RecordStateChanged.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Constructor\n            </summary>\n            <param name=\"body\"></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.RecordStateChanged.#ctor\">\n            <summary>\n            Default Constructor for deserialization\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.SceneBasicInfo\">\n            <summary>\n            Response from <see cref=\"M:OBSWebsocketDotNet.OBSWebsocket.GetSceneList\"/>\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneBasicInfo.Name\">\n            <summary>\n            Name of scene\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneBasicInfo.Index\">\n            <summary>\n            Index of scene\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.SceneItemBoundsType\">\n            <summary>\n            Types of bounding boxes for scene items\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemBoundsType.OBS_BOUNDS_STRETCH\">\n            <summary>\n            Stretch\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemBoundsType.OBS_BOUNDS_SCALE_INNER\">\n            <summary>\n            Inner scale\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemBoundsType.OBS_BOUNDS_SCALE_OUTER\">\n            <summary>\n            Outer scale\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemBoundsType.OBS_BOUNDS_SCALE_TO_WIDTH\">\n            <summary>\n            Scale to width\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemBoundsType.OBS_BOUNDS_SCALE_TO_HEIGHT\">\n            <summary>\n            Scale to height\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemBoundsType.OBS_BOUNDS_MAX_ONLY\">\n            <summary>\n            Max only\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemBoundsType.OBS_BOUNDS_NONE\">\n            <summary>\n            No bounds\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.SceneItemDetails\">\n            <summary>\n            Meta data regarding a Scene item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemDetails.ItemId\">\n            <summary>\n            Unique item id of the source item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemDetails.SourceKind\">\n            <summary>\n            Kind of source (Example: vlc_source or image_source)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemDetails.SourceName\">\n            <summary>\n            Name of the scene item's source\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemDetails.SourceType\">\n            <summary>\n            Type of the scene item's source.\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.SceneItemDetails.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Builds the object from the JSON data\n            </summary>\n            <param name=\"data\">JSON item description as a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.SceneItemDetails.#ctor\">\n            <summary>\n            Default Constructor for deserialization\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.SceneItemSourceType\">\n            <summary>\n            Type of scene item's source\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemSourceType.OBS_SOURCE_TYPE_INPUT\">\n            <summary>\n            Input\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemSourceType.OBS_SOURCE_TYPE_FILTER\">\n            <summary>\n            Filter\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemSourceType.OBS_SOURCE_TYPE_TRANSITION\">\n            <summary>\n            Transition\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemSourceType.OBS_SOURCE_TYPE_SCENE\">\n            <summary>\n            Scene\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.SceneItemTransformInfo\">\n            <summary>\n            Item transformation information\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.Alignnment\">\n            <summary>\n            Alignment of the item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.BoundsAlignnment\">\n            <summary>\n            The point on the scene item that the item is manipulated from\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.BoundsHeight\">\n            <summary>\n            Height of the bounding box\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.BoundsWidth\">\n            <summary>\n            Width of the bounding box\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.BoundsType\">\n            <summary>\n            Type of bounding box\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemTransformInfo.CropBottom\">\n            <summary>\n            Bottom crop (in pixels)\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemTransformInfo.CropLeft\">\n            <summary>\n            Left crop (in pixels)\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemTransformInfo.CropRight\">\n            <summary>\n            Right crop (in pixels)\n            </summary>\n        </member>\n        <member name=\"F:OBSWebsocketDotNet.Types.SceneItemTransformInfo.CropTop\">\n            <summary>\n            Top crop (in pixels)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.Rotation\">\n            <summary>\n            The clockwise rotation of the scene item in degrees around the point of alignment.\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.ScaleX\">\n            <summary>\n            The x-scale factor of the scene item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.ScaleY\">\n            <summary>\n            The y-scale factor of the scene item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.SourceHeight\">\n            <summary>\n            Base height (without scaling) of the source\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.SourceWidth\">\n            <summary>\n            Base width (without scaling) of the source\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.Height\">\n            <summary>\n            Scene item height (base source height multiplied by the vertical scaling factor)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.Width\">\n            <summary>\n            Scene item width (base source width multiplied by the horizontal scaling factor)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.X\">\n            <summary>\n            The x position of the scene item from the left\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SceneItemTransformInfo.Y\">\n            <summary>\n            The y position of the scene item from the top\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.SceneItemTransformInfo.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Initialize the scene item transform\n            </summary>\n            <param name=\"body\"></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.SceneItemTransformInfo.#ctor\">\n            <summary>\n            Default Constructor for deserialization\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.SourceActiveInfo\">\n            <summary>\n            Gets the Active and Showing state of a video source\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SourceActiveInfo.VideoActive\">\n            <summary>\n            Whether the source is showing in Program\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SourceActiveInfo.VideoShowing\">\n            <summary>\n            Whether the source is showing in the UI (Preview, Projector, Properties)\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.SourceActiveInfo.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Auto populate constructor\n            </summary>\n            <param name=\"data\"></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.SourceActiveInfo.#ctor\">\n            <summary>\n            Default Constructor\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.SourceTracks\">\n            <summary>\n            Tracks status for a source item\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SourceTracks.IsTrack1Active\">\n            <summary>\n            Is the track active\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SourceTracks.IsTrack2Active\">\n            <summary>\n            Is the track active\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SourceTracks.IsTrack3Active\">\n            <summary>\n            Is the track active\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SourceTracks.IsTrack4Active\">\n            <summary>\n            Is the track active\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SourceTracks.IsTrack5Active\">\n            <summary>\n            Is the track active\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.SourceTracks.IsTrack6Active\">\n            <summary>\n            Is the track active\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.SourceTracks.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Builds the object from the JSON data\n            </summary>\n            <param name=\"data\">JSON item description as a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.SourceTracks.#ctor\">\n            <summary>\n            Default Constructor for deserialization\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.StreamingService\">\n            <summary>\n            Streaming settings\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.StreamingService.Type\">\n            <summary>\n            Type of streaming service\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.StreamingService.Settings\">\n            <summary>\n            Streaming service settings (JSON data)\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.StreamingServiceSettings\">\n            <summary>\n            Streaming server settings\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.StreamingServiceSettings.Server\">\n            <summary>\n            The publish URL\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.StreamingServiceSettings.Key\">\n            <summary>\n            The publish key of the stream\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.StreamingServiceSettings.UseAuth\">\n            <summary>\n            Indicates whether authentication should be used when connecting to the streaming server\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.StreamingServiceSettings.Username\">\n            <summary>\n            The username to use when accessing the streaming server. Only present if use-auth is true\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.StreamingServiceSettings.Password\">\n            <summary>\n            The password to use when accessing the streaming server. Only present if use-auth is true\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.StreamingServiceSettings.Service\">\n            <summary>\n            The service being used to stream\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.StreamingServiceSettings.Protocol\">\n            <summary>\n            The protocol to use for the stream\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.StreamingServiceSettings.OtherValues\">\n            <summary>\n            Other values not covered by the class\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.TransitionOverrideInfo\">\n            <summary>\n            Scene transition override settings\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.TransitionOverrideInfo.Name\">\n            <summary>\n            Name of the current overriding transition. Empty string if no override is set.\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.TransitionOverrideInfo.Duration\">\n            <summary>\n            Transition duration in milliseconds. -1 if no override is set.\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.TransitionSettings\">\n            <summary>\n            Current transition settings\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.TransitionSettings.Name\">\n            <summary>\n            Transition name\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.TransitionSettings.Duration\">\n            <summary>\n            Transition duration in milliseconds\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.TransitionSettings.Kind\">\n            <summary>\n            Kind of the transition\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.TransitionSettings.IsFixed\">\n            <summary>\n            Whether the transition uses a fixed (unconfigurable) duration\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.TransitionSettings.IsConfigurable\">\n            <summary>\n            Whether the transition supports being configured\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.TransitionSettings.Settings\">\n            <summary>\n            Object of settings for the transition. 'null' if transition is not configurable\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.TransitionSettings.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Builds the object from the JSON response body\n            </summary>\n            <param name=\"data\">JSON response body as a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.TransitionSettings.#ctor\">\n            <summary>\n            Default Constructor for deserialization\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.VirtualCamStatus\">\n            <summary>\n            VirtualCam Status\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.VirtualCamStatus.IsActive\">\n            <summary>\n            Whether the output is active\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.VirtualCamStatus.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Builds the object from the JSON response body\n            </summary>\n            <param name=\"data\">JSON response body as a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.VirtualCamStatus.#ctor\">\n            <summary>\n            Constructor for jsonconverter\n            </summary>\n        </member>\n        <member name=\"T:OBSWebsocketDotNet.Types.VolumeInfo\">\n            <summary>\n            Volume settings of an OBS source\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.VolumeInfo.VolumeMul\">\n            <summary>\n            Source volume in linear scale (0.0 to 1.0)\n            </summary>\n        </member>\n        <member name=\"P:OBSWebsocketDotNet.Types.VolumeInfo.VolumeDb\">\n            <summary>\n            Volume setting in dB\n            </summary>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.VolumeInfo.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Builds the object from the JSON response body\n            </summary>\n            <param name=\"data\">JSON response body as a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/></param>\n        </member>\n        <member name=\"M:OBSWebsocketDotNet.Types.VolumeInfo.#ctor\">\n            <summary>\n            Default Constructor for deserialization\n            </summary>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "obs-websocket-dotnet-tests/UnitTest_OBSWebsocket.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing WebSocketSharp;\n\nnamespace OBSWebsocketDotNet.Tests\n{\n    [TestClass]\n    public class UnitTest_OBSWebsocket : OBSWebsocket\n    {\n        [TestMethod]\n        public void NewMessageID_Test()\n        {\n            int idLength = 22;\n            string msgID = NewMessageID(idLength);\n\n            Assert.IsFalse(msgID.IsNullOrEmpty());\n            Assert.AreEqual(idLength, msgID.Length);\n        }\n\n        [TestMethod]\n        public void HashEncode_Test()\n        {\n            string sourceText, expectedResult, result;\n\n            // First test\n            sourceText = \"The quick brown fox jumps over the lazy dog.\";\n            expectedResult = \"71N/JciVv6eCUmUpqbY9l6pjFWTV14nCt2VEjIY1+2w=\";\n\n            result = HashEncode(sourceText);\n\n            Assert.AreEqual(expectedResult, result);\n\n            // Second test : consecutive calls produce same output\n            // for a given source text\n            Assert.AreEqual(result, HashEncode(sourceText));\n\n            // Third test : another source text\n            sourceText = \"Pack my box with five dozen liquor jugs.\";\n            expectedResult = \"I+7lK59W6o/nkmE65aY5TE13mBTi/AfgndWWjUqu3cw=\";\n\n            result = HashEncode(sourceText);\n\n            Assert.AreEqual(expectedResult, result);\n        }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet-tests/UnitTest_Types.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing Newtonsoft.Json.Linq;\nusing OBSWebsocketDotNet.Communication;\nusing OBSWebsocketDotNet.Types;\n\nnamespace OBSWebsocketDotNet.Tests\n{\n    [TestClass]\n    public class UnitTest_Types\n    {\n        [TestMethod]\n        public void OBSScene_BuildFromJSON()\n        {\n            string sceneName = \"Scene name äëôû\";\n            bool isGroup = true;\n            string itemName = \"First item name äëôû\";\n            SceneItemSourceType sourceType = SceneItemSourceType.OBS_SOURCE_TYPE_INPUT;\n            string inputKind = \"BarRaider\";\n            int sceneItemId = 22;\n            \n\n            JObject itemData = new JObject\n            {\n                { \"sourceName\", itemName },\n                { \"sourceType\", (int)sourceType },\n                { \"inputKind\", inputKind},\n                { \"sceneItemId\", sceneItemId },\n                { \"volume\", 1.0f },\n                { \"x\", 0.0f },\n                { \"y\", 0.0f },\n                { \"source_cx\", 1280 },\n                { \"source_cy\", 720 },\n                { \"cx\", 1280.0f },\n                { \"cy\", 720.0F }\n            };\n\n            var items = new JArray\n            {\n                itemData\n            };\n\n            var data = new JObject\n            {\n                { \"sceneName\", sceneName },\n                { \"sources\", items },\n                { \"isGroup\", isGroup }\n            };\n\n            var scene = new ObsScene(data);\n\n            Assert.AreEqual(sceneName, scene.Name);\n            Assert.AreEqual(1, scene.Items.Count);\n            Assert.AreEqual(isGroup, scene.IsGroup);\n            Assert.AreEqual(itemName, scene.Items[0].SourceName);\n            Assert.AreEqual(sourceType, scene.Items[0].SourceType);\n            Assert.AreEqual(inputKind, scene.Items[0].SourceKind);\n            Assert.AreEqual(sceneItemId, scene.Items[0].ItemId);\n\n        }\n\n        [TestMethod]\n        public void OBSAuthInfo_BuildFromJSON()\n        {\n            string challenge = \"pBWv82hj\";\n            string salt = \"B9fL8CF7\";\n\n            var data = new JObject\n            {\n                { \"authRequired\", true },\n                { \"challenge\", challenge },\n                { \"salt\", salt }\n            };\n\n            var authInfo = new OBSAuthInfo(data);\n\n            Assert.AreEqual(challenge, authInfo.Challenge);\n            Assert.AreEqual(salt, authInfo.PasswordSalt);\n        }\n\n        [TestMethod]\n        public void OBSVersion_BuildFromJSON()\n        {\n            string pluginVersion = \"5.0.1\";\n            string obsVersion = \"28.0.1\";\n            double rpcVersion = 1.1;\n            string availableRequests = \"GetVersion,BarRaider,Test\";\n            string platform = \"windows\";\n            string supportedImageFormats = \"png,jpg\";\n\n            var requests = new JArray(availableRequests.Split(','));\n            var images = new JArray(supportedImageFormats.Split(','));\n\n            var data = new JObject\n            {\n                { \"obsWebSocketVersion\", pluginVersion },\n                { \"obsVersion\", obsVersion },\n                { \"rpcVersion\", rpcVersion},\n                { \"availableRequests\", requests},\n                { \"platform\", platform},\n                { \"supportedImageFormats\", images}\n            };\n\n            var version = new ObsVersion(data);\n\n            Assert.AreEqual(pluginVersion, version.PluginVersion);\n            Assert.AreEqual(obsVersion, version.OBSStudioVersion);\n            Assert.AreEqual(rpcVersion, version.Version);\n            Assert.AreEqual(platform, version.Platform);\n            Assert.AreEqual(3, version.AvailableRequests.Count);\n            Assert.AreEqual(2, version.SupportedImageFormats.Count);\n        }\n\n        [TestMethod]\n        public void OBSStreamStatus_BuildFromJSON()\n        {\n            string outputTimecode = \"00:01:22.666\";\n            int outputDuration = 230;\n            double outputCongestion = 23.32;\n            int outputBytes = 451241;\n            int outputSkippedFrames = 120;\n            int outputTotalFrames = 2000;\n\n            var data = new JObject\n            {\n                { \"outputActive\", true },\n                { \"outputReconnecting\", true },\n                { \"outputTimecode\", outputTimecode },\n                { \"outputDuration\", outputDuration },\n                { \"outputCongestion\", outputCongestion },\n                { \"outputBytes\", outputBytes },\n                { \"outputSkippedFrames\", outputSkippedFrames },\n                { \"outputTotalFrames\", outputTotalFrames }\n            };\n\n            var streamStatus = new OutputStatus(data);\n\n            Assert.IsTrue(streamStatus.IsActive);\n            Assert.IsTrue(streamStatus.IsReconnecting);\n            Assert.AreEqual(outputTimecode, streamStatus.TimeCode);\n            Assert.AreEqual(outputDuration, streamStatus.Duration);\n            Assert.AreEqual(outputCongestion, streamStatus.Congestion);\n            Assert.AreEqual(outputBytes, streamStatus.BytesSent);\n            Assert.AreEqual(outputSkippedFrames, streamStatus.SkippedFrames);\n            Assert.AreEqual(outputTotalFrames, streamStatus.TotalFrames);\n        }\n\n        [TestMethod]\n        public void OBSOutputStatus_BuildFromJSON()\n        {\n            var data = new JObject\n            {\n                { \"outputActive\", true }\n            };\n\n            var outputState = new OutputStatus(data);\n            var recordState = new RecordingStatus(data);\n\n            Assert.IsTrue(outputState.IsActive);\n            Assert.IsTrue(recordState.IsRecording);\n        }\n\n        [TestMethod]\n        public void OBSCurrentTransitionInfo_BuildFromJSON()\n        {\n            string transitionName = \"Transition name éèïöü\";\n            int duration = 2000;\n            string kind = \"TBD\";\n            bool transitionFixed = true;\n            bool transitionConfigurable = true;\n\n            var data = new JObject\n            {\n                { \"transitionName\", transitionName },\n                { \"transitionDuration\", duration },\n                { \"transitionKind\", kind },\n                { \"transitionFixed\", transitionFixed },\n                { \"transitionConfigurable\", transitionConfigurable }\n            };\n\n            var transitionInfo = new TransitionSettings(data);\n\n            Assert.AreEqual(transitionName, transitionInfo.Name);\n            Assert.AreEqual(duration, transitionInfo.Duration);\n            Assert.AreEqual(kind, transitionInfo.Kind);\n            Assert.AreEqual(transitionFixed, transitionInfo.IsFixed);\n            Assert.AreEqual(transitionConfigurable, transitionInfo.IsConfigurable);\n        }\n\n        [TestMethod]\n        public void OBSVolumeInfo_BuildFromJSON()\n        {\n            float volumeMul = 0.50f;\n            float volumeDB = 45.4f;\n\n            var data = new JObject\n            {\n                { \"inputVolumeMul\", volumeMul },\n                { \"inputVolumeDb\", volumeDB }\n            };\n\n            var volumeInfo = new VolumeInfo(data);\n\n            Assert.AreEqual(volumeMul, volumeInfo.VolumeMul);\n            Assert.AreEqual(volumeDB, volumeInfo.VolumeDb);\n        }\n    }\n}\n"
  },
  {
    "path": "obs-websocket-dotnet-tests/obs-websocket-dotnet-tests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n\t<PropertyGroup>\n\t\t<TargetFramework>net9.0</TargetFramework>\n\t\t<AssemblyName>obs-websocket-dotnet-tests</AssemblyName>\n\t\t<RootNamespace>OBSWebsocketDotNet.Tests</RootNamespace>\n\t\t<Copyright>Copyright © Stéphane Lepin, BarRaider 2021</Copyright>\n\t\t<LangVersion>8</LangVersion>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.13.0\" />\n\t\t<PackageReference Include=\"MSTest.TestAdapter\" Version=\"3.8.3\" />\n\t\t<PackageReference Include=\"MSTest.TestFramework\" Version=\"3.8.3\" />\n\t\t<PackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" />\n\t\t<PackageReference Include=\"WebSocketSharp-netstandard\" Version=\"1.0.1\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t  <ProjectReference Include=\"..\\obs-websocket-dotnet\\obs-websocket-dotnet.csproj\" />\n\t</ItemGroup>\n\n</Project>"
  },
  {
    "path": "obs-websocket-dotnet-tests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"WebSocketSharp\" version=\"1.0.3-rc11\" targetFramework=\"net45\" />\n</packages>"
  },
  {
    "path": "obs-websocket-dotnet.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30503.244\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"obs-websocket-dotnet\", \"obs-websocket-dotnet\\obs-websocket-dotnet.csproj\", \"{C8668815-F21E-49C0-8F1A-58BC698153AF}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"TestClient\", \"TestClient\\TestClient.csproj\", \"{2CB2A741-4BFB-4AE8-894B-D6F146E6670F}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"obs-websocket-dotnet-tests\", \"obs-websocket-dotnet-tests\\obs-websocket-dotnet-tests.csproj\", \"{107BEC4B-3EC4-4CA0-A53F-7D3678DC7017}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{C8668815-F21E-49C0-8F1A-58BC698153AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C8668815-F21E-49C0-8F1A-58BC698153AF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C8668815-F21E-49C0-8F1A-58BC698153AF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C8668815-F21E-49C0-8F1A-58BC698153AF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2CB2A741-4BFB-4AE8-894B-D6F146E6670F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2CB2A741-4BFB-4AE8-894B-D6F146E6670F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2CB2A741-4BFB-4AE8-894B-D6F146E6670F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2CB2A741-4BFB-4AE8-894B-D6F146E6670F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{107BEC4B-3EC4-4CA0-A53F-7D3678DC7017}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{107BEC4B-3EC4-4CA0-A53F-7D3678DC7017}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{107BEC4B-3EC4-4CA0-A53F-7D3678DC7017}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{107BEC4B-3EC4-4CA0-A53F-7D3678DC7017}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {DB456FB4-3420-4299-8634-335D28DCCC51}\n\tEndGlobalSection\nEndGlobal\n"
  }
]