Repository: ZHANGTIANYAO1/TS3AudioBot-NetEaseCloudmusic-plugin Branch: main Commit: 178a7708f859 Files: 507 Total size: 3.9 MB Directory structure: gitextract_1muog4nl/ ├── ClassLibrary4.csproj ├── ClassLibrary4.sln ├── LICENSE ├── README.md ├── TS3AudioBot/ │ ├── Algorithm/ │ │ ├── IFilterAlgorithm.cs │ │ ├── LruCache.cs │ │ └── TimedCache.cs │ ├── Audio/ │ │ ├── AudioValues.cs │ │ ├── CustomTargetPipe.cs │ │ ├── FfmpegProducer.cs │ │ ├── IPlayerSource.cs │ │ ├── IVoiceTarget.cs │ │ ├── PlayInfo.cs │ │ ├── PlayInfoEventArgs.cs │ │ ├── PlayManager.cs │ │ ├── Player.cs │ │ ├── SongEndEventArgs.cs │ │ ├── SongInfoChanged.cs │ │ ├── StallCheckPipe.cs │ │ └── StreamAudioPlayerSource.cs │ ├── Bot.cs │ ├── BotManager.cs │ ├── CallerInfo.cs │ ├── ClientCall.cs │ ├── CommandSystem/ │ │ ├── Ast/ │ │ │ ├── AstCommand.cs │ │ │ ├── AstError.cs │ │ │ ├── AstNode.cs │ │ │ ├── AstType.cs │ │ │ ├── AstValue.cs │ │ │ └── StringType.cs │ │ ├── BotCommand.cs │ │ ├── CommandAttribute.cs │ │ ├── CommandException.cs │ │ ├── CommandManager.cs │ │ ├── CommandParser.cs │ │ ├── CommandResults/ │ │ │ ├── IAudioResourceResult.cs │ │ │ ├── IWrappedResult.cs │ │ │ ├── PickObjectCommand.cs │ │ │ └── TailString.cs │ │ ├── CommandSystemExtensions.cs │ │ ├── CommandSystemTypes.cs │ │ ├── Commands/ │ │ │ ├── AliasCommand.cs │ │ │ ├── AppliedCommand.cs │ │ │ ├── CommandGroup.cs │ │ │ ├── FunctionCommand.cs │ │ │ ├── ICommand.cs │ │ │ ├── LazyCommand.cs │ │ │ ├── OverloadedFunctionCommand.cs │ │ │ ├── ResultCommand.cs │ │ │ └── RootCommand.cs │ │ ├── ExecutionInformation.cs │ │ ├── ICommandBag.cs │ │ ├── StaticList.cs │ │ └── Text/ │ │ ├── AppliedTextMod.cs │ │ ├── Color.cs │ │ ├── LongTextBehaviour.cs │ │ ├── LongTextTransform.cs │ │ ├── TextMod.cs │ │ ├── TextModBuilder.cs │ │ ├── TextModFlag.cs │ │ └── TextModHelper.cs │ ├── Config/ │ │ ├── Config.cs │ │ ├── ConfigArray.cs │ │ ├── ConfigDynamicTable.cs │ │ ├── ConfigEnumerable.cs │ │ ├── ConfigHelper.cs │ │ ├── ConfigPart.cs │ │ ├── ConfigStructs.cs │ │ ├── ConfigTable.cs │ │ ├── ConfigUpgrade2.cs │ │ └── ConfigValue.cs │ ├── Core.cs │ ├── DbStore.cs │ ├── Dependency/ │ │ ├── BasicInjector.cs │ │ ├── ChainedInjector.cs │ │ ├── DependencyBuilder.cs │ │ ├── IInjector.cs │ │ ├── InjectorExtensions.cs │ │ ├── Module.cs │ │ └── NullInjector.cs │ ├── Environment/ │ │ ├── Stats.cs │ │ ├── SystemData.cs │ │ └── SystemMonitor.cs │ ├── Error.cs │ ├── Helper/ │ │ ├── AttributeStrings.cs │ │ ├── Const.cs │ │ ├── Diagnose/ │ │ │ ├── SelfDiagnoseLevel.cs │ │ │ └── SelfDiagnoseMessage.cs │ │ ├── IJsonConfig.cs │ │ ├── ImageUtil.cs │ │ ├── Interactive.cs │ │ ├── LimitStream.cs │ │ ├── TextUtil.cs │ │ ├── TomlTools.cs │ │ ├── Util.cs │ │ └── WebWrapper.cs │ ├── History/ │ │ ├── AudioLogEntry.cs │ │ ├── HistoryManager.cs │ │ ├── HistorySaveData.cs │ │ ├── IHistoryFormatter.cs │ │ ├── SearchQuery.cs │ │ └── SmartHistoryFormatter.cs │ ├── InvokerData.cs │ ├── Limits.cs │ ├── Localization/ │ │ ├── DynamicResourceManager.cs │ │ ├── LocalStr.cs │ │ ├── LocalizationManager.cs │ │ ├── strings.Designer.cs │ │ └── strings.resx │ ├── MainCommands.cs │ ├── Playlists/ │ │ ├── LoopMode.cs │ │ ├── Parser/ │ │ │ └── JspfContent.cs │ │ ├── Playlist.cs │ │ ├── PlaylistApiExtensions.cs │ │ ├── PlaylistIO.cs │ │ ├── PlaylistItem.cs │ │ ├── PlaylistManager.cs │ │ └── Shuffle/ │ │ ├── IShuffleAlgorithm.cs │ │ ├── LinearFeedbackShiftRegister.cs │ │ ├── ListedShuffle.cs │ │ └── NormalOrder.cs │ ├── Plugins/ │ │ ├── ITabPlugin.cs │ │ ├── Plugin.cs │ │ ├── PluginCommandBag.cs │ │ ├── PluginExtensions.cs │ │ ├── PluginManager.cs │ │ ├── PluginObjects.cs │ │ ├── PluginResponse.cs │ │ └── PluginStatus.cs │ ├── Properties/ │ │ └── PublishProfiles/ │ │ ├── FolderProfile.pubxml │ │ └── FolderProfile.pubxml.user │ ├── Properties.cs │ ├── ResourceFactories/ │ │ ├── AudioResource.cs │ │ ├── AudioTags/ │ │ │ ├── AudioTagReader.cs │ │ │ ├── BinaryReaderBigEndianExtensions.cs │ │ │ └── M3uReader.cs │ │ ├── BandcampResolver.cs │ │ ├── IPlaylistResolver.cs │ │ ├── IResolver.cs │ │ ├── IResourceResolver.cs │ │ ├── ISearchResolver.cs │ │ ├── IThumbnailResolver.cs │ │ ├── MatchCertainty.cs │ │ ├── MediaResolver.cs │ │ ├── PlayResource.cs │ │ ├── ResolveContext.cs │ │ ├── ResourceResolver.cs │ │ ├── SongInfo.cs │ │ ├── SoundcloudResolver.cs │ │ ├── TwitchResolver.cs │ │ ├── Youtube/ │ │ │ ├── Json.cs │ │ │ ├── LoaderPriority.cs │ │ │ ├── VideoCodec.cs │ │ │ ├── VideoData.cs │ │ │ └── YoutubeResolver.cs │ │ └── YoutubeDlHelper.cs │ ├── Resources/ │ │ ├── DefaultRights.toml │ │ └── NLog.config │ ├── Rights/ │ │ ├── CreateFileSettings.cs │ │ ├── ExecuteContext.cs │ │ ├── Matchers/ │ │ │ ├── MatchApiCallerIp.cs │ │ │ ├── MatchBot.cs │ │ │ ├── MatchChannelGroupId.cs │ │ │ ├── MatchClientGroupId.cs │ │ │ ├── MatchClientUid.cs │ │ │ ├── MatchHost.cs │ │ │ ├── MatchIsApi.cs │ │ │ ├── MatchPermission.cs │ │ │ ├── MatchToken.cs │ │ │ ├── MatchVisibility.cs │ │ │ ├── Matcher.cs │ │ │ └── PermCompare.cs │ │ ├── ParseContext.cs │ │ ├── RightsDecl.cs │ │ ├── RightsGroup.cs │ │ ├── RightsManager.cs │ │ └── RightsRule.cs │ ├── Sessions/ │ │ ├── AnonymousSession.cs │ │ ├── ApiToken.cs │ │ ├── SessionManager.cs │ │ ├── TokenManager.cs │ │ └── UserSession.cs │ ├── Setup.cs │ ├── TS3AudioBot.csproj │ ├── TS3AudioBot.csproj.user │ ├── Ts3Client.cs │ ├── Upgrader.cs │ ├── Web/ │ │ ├── Api/ │ │ │ ├── ApiCall.cs │ │ │ ├── DataStream.cs │ │ │ ├── JsonArray.cs │ │ │ ├── JsonEmpty.cs │ │ │ ├── JsonError.cs │ │ │ ├── JsonObject.cs │ │ │ ├── JsonValue.cs │ │ │ ├── OpenApiGenerator.cs │ │ │ ├── TimeSpanConverter.cs │ │ │ └── WebApi.cs │ │ ├── Model/ │ │ │ ├── CurrentSongInfo.cs │ │ │ ├── PlaylistInfo.cs │ │ │ ├── PlaylistItemGetData.cs │ │ │ └── QueueInfo.cs │ │ └── WebServer.cs │ ├── build.csx │ └── obj/ │ ├── Debug/ │ │ ├── TS3AudioBot.1.0.0.nuspec │ │ ├── net7.0/ │ │ │ └── TS3AudioBot.csproj.AssemblyReference.cache │ │ ├── net7.0-windows/ │ │ │ ├── .NETCoreApp,Version=v7.0.AssemblyAttributes.cs │ │ │ ├── TS3AudioBot.AssemblyInfo.cs │ │ │ ├── TS3AudioBot.AssemblyInfoInputs.cache │ │ │ ├── TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig │ │ │ ├── TS3AudioBot.Localization.strings.resources │ │ │ ├── TS3AudioBot.assets.cache │ │ │ ├── TS3AudioBot.csproj.AssemblyReference.cache │ │ │ ├── TS3AudioBot.csproj.CopyComplete │ │ │ ├── TS3AudioBot.csproj.CoreCompileInputs.cache │ │ │ ├── TS3AudioBot.csproj.FileListAbsolute.txt │ │ │ ├── TS3AudioBot.csproj.GenerateResource.cache │ │ │ ├── TS3AudioBot.csproj.SuggestedBindingRedirects.cache │ │ │ ├── TS3AudioBot.dll.config │ │ │ ├── TS3AudioBot.genruntimeconfig.cache │ │ │ └── TS3AudioBot.pdb │ │ └── netcoreapp3.1/ │ │ ├── .NETCoreApp,Version=v3.1.AssemblyAttributes.cs │ │ ├── TS3AudioBot.AssemblyInfo.cs │ │ ├── TS3AudioBot.AssemblyInfoInputs.cache │ │ ├── TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig │ │ ├── TS3AudioBot.Localization.strings.resources │ │ ├── TS3AudioBot.assets.cache │ │ ├── TS3AudioBot.csproj.AssemblyReference.cache │ │ ├── TS3AudioBot.csproj.CopyComplete │ │ ├── TS3AudioBot.csproj.CoreCompileInputs.cache │ │ ├── TS3AudioBot.csproj.FileListAbsolute.txt │ │ ├── TS3AudioBot.csproj.GenerateResource.cache │ │ ├── TS3AudioBot.csproj.SuggestedBindingRedirects.cache │ │ ├── TS3AudioBot.dll.config │ │ ├── TS3AudioBot.genruntimeconfig.cache │ │ └── TS3AudioBot.pdb │ ├── Release/ │ │ ├── net7.0-windows/ │ │ │ ├── .NETCoreApp,Version=v7.0.AssemblyAttributes.cs │ │ │ ├── TS3AudioBot.AssemblyInfo.cs │ │ │ ├── TS3AudioBot.AssemblyInfoInputs.cache │ │ │ ├── TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig │ │ │ ├── TS3AudioBot.assets.cache │ │ │ └── TS3AudioBot.csproj.AssemblyReference.cache │ │ └── netcoreapp3.1/ │ │ ├── .NETCoreApp,Version=v3.1.AssemblyAttributes.cs │ │ ├── PublishOutputs.25bc18e9a6.txt │ │ ├── TS3AudioBot.AssemblyInfo.cs │ │ ├── TS3AudioBot.AssemblyInfoInputs.cache │ │ ├── TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig │ │ ├── TS3AudioBot.Localization.strings.resources │ │ ├── TS3AudioBot.assets.cache │ │ ├── TS3AudioBot.csproj.AssemblyReference.cache │ │ ├── TS3AudioBot.csproj.CopyComplete │ │ ├── TS3AudioBot.csproj.CoreCompileInputs.cache │ │ ├── TS3AudioBot.csproj.FileListAbsolute.txt │ │ ├── TS3AudioBot.csproj.GenerateResource.cache │ │ ├── TS3AudioBot.csproj.SuggestedBindingRedirects.cache │ │ ├── TS3AudioBot.dll.config │ │ ├── TS3AudioBot.genruntimeconfig.cache │ │ ├── TS3AudioBot.pdb │ │ ├── linux-x64/ │ │ │ ├── .NETCoreApp,Version=v3.1.AssemblyAttributes.cs │ │ │ ├── PublishOutputs.c54adf16a2.txt │ │ │ ├── TS3AudioBot.AssemblyInfo.cs │ │ │ ├── TS3AudioBot.AssemblyInfoInputs.cache │ │ │ ├── TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig │ │ │ ├── TS3AudioBot.Localization.strings.resources │ │ │ ├── TS3AudioBot.assets.cache │ │ │ ├── TS3AudioBot.csproj.AssemblyReference.cache │ │ │ ├── TS3AudioBot.csproj.CopyComplete │ │ │ ├── TS3AudioBot.csproj.CoreCompileInputs.cache │ │ │ ├── TS3AudioBot.csproj.FileListAbsolute.txt │ │ │ ├── TS3AudioBot.csproj.GenerateResource.cache │ │ │ ├── TS3AudioBot.csproj.SuggestedBindingRedirects.cache │ │ │ ├── TS3AudioBot.deps.json │ │ │ ├── TS3AudioBot.dll.config │ │ │ ├── TS3AudioBot.genruntimeconfig.cache │ │ │ ├── TS3AudioBot.pdb │ │ │ └── apphost │ │ └── win-x64/ │ │ ├── .NETCoreApp,Version=v3.1.AssemblyAttributes.cs │ │ ├── PublishOutputs.cf05aea114.txt │ │ ├── TS3AudioBot.AssemblyInfo.cs │ │ ├── TS3AudioBot.AssemblyInfoInputs.cache │ │ ├── TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig │ │ ├── TS3AudioBot.Localization.strings.resources │ │ ├── TS3AudioBot.assets.cache │ │ ├── TS3AudioBot.csproj.AssemblyReference.cache │ │ ├── TS3AudioBot.csproj.CopyComplete │ │ ├── TS3AudioBot.csproj.CoreCompileInputs.cache │ │ ├── TS3AudioBot.csproj.FileListAbsolute.txt │ │ ├── TS3AudioBot.csproj.GenerateResource.cache │ │ ├── TS3AudioBot.csproj.SuggestedBindingRedirects.cache │ │ ├── TS3AudioBot.deps.json │ │ ├── TS3AudioBot.dll.config │ │ ├── TS3AudioBot.genruntimeconfig.cache │ │ └── TS3AudioBot.pdb │ ├── TS3AudioBot.csproj.nuget.dgspec.json │ ├── TS3AudioBot.csproj.nuget.g.props │ ├── TS3AudioBot.csproj.nuget.g.targets │ ├── project.assets.json │ ├── project.nuget.cache │ └── publish/ │ ├── linux-x64/ │ │ ├── TS3AudioBot.csproj.nuget.dgspec.json │ │ ├── TS3AudioBot.csproj.nuget.g.props │ │ ├── TS3AudioBot.csproj.nuget.g.targets │ │ ├── project.assets.json │ │ └── project.nuget.cache │ └── win-x64/ │ ├── TS3AudioBot.csproj.nuget.dgspec.json │ ├── TS3AudioBot.csproj.nuget.g.props │ ├── TS3AudioBot.csproj.nuget.g.targets │ ├── project.assets.json │ └── project.nuget.cache ├── TSLib/ │ ├── Audio/ │ │ ├── AudioInterfaces.cs │ │ ├── AudioMeta.cs │ │ ├── AudioPacketReader.cs │ │ ├── AudioPipeExtensions.cs │ │ ├── AudioTools.cs │ │ ├── CheckActivePipe.cs │ │ ├── ClientMixdown.cs │ │ ├── DecoderPipe.cs │ │ ├── EncoderPipe.cs │ │ ├── Opus/ │ │ │ ├── LICENSE │ │ │ ├── NativeMethods.cs │ │ │ ├── OPUS_LICENSE │ │ │ ├── OpusDecoder.cs │ │ │ ├── OpusEncoder.cs │ │ │ └── README │ │ ├── PassiveMergePipe.cs │ │ ├── PassiveSplitterPipe.cs │ │ ├── PreciseAudioTimer.cs │ │ ├── PreciseTimedPipe.cs │ │ ├── StaticMetaPipe.cs │ │ ├── StreamAudioProducer.cs │ │ └── VolumePipe.cs │ ├── Commands/ │ │ ├── CommandMultiParameter.cs │ │ ├── CommandOption.cs │ │ ├── CommandParameter.cs │ │ ├── ICommandPart.cs │ │ ├── TsCommand.cs │ │ ├── TsCommand.gen.cs │ │ ├── TsCommand.gen.tt │ │ ├── TsConst.cs │ │ └── TsString.cs │ ├── ConnectionData.cs │ ├── DisconnectEventArgs.cs │ ├── EventDispatcher.cs │ ├── Full/ │ │ ├── Book/ │ │ │ ├── Book.cs │ │ │ └── SpecialTypes.cs │ │ ├── GenerationWindow.cs │ │ ├── IdentityData.cs │ │ ├── License.cs │ │ ├── NetworkStats.cs │ │ ├── Packet.cs │ │ ├── PacketHandler.cs │ │ ├── PacketType.cs │ │ ├── QuickerLz.cs │ │ ├── RingQueue.cs │ │ ├── TsCrypt.cs │ │ ├── TsFullClient.cs │ │ ├── TsFullClient.gen.cs │ │ └── TsFullClient.gen.tt │ ├── Generated/ │ │ ├── Book.cs │ │ ├── Book.tt │ │ ├── BookParser.ttinclude │ │ ├── ErrorParser.ttinclude │ │ ├── M2B.cs │ │ ├── M2B.tt │ │ ├── M2BParser.ttinclude │ │ ├── MessageParser.ttinclude │ │ ├── Messages.cs │ │ ├── Messages.tt │ │ ├── NotificationUtil.ttinclude │ │ ├── TsErrorCode.cs │ │ ├── TsErrorCode.tt │ │ ├── TsPermission.cs │ │ ├── TsPermission.tt │ │ ├── TsVersion.gen.cs │ │ ├── TsVersion.gen.tt │ │ └── Util.ttinclude │ ├── Helper/ │ │ ├── AsyncEventHandler.cs │ │ ├── CommandErrorExtensions.cs │ │ ├── DebugUtil.cs │ │ ├── LogId.cs │ │ ├── MissingEnumCaseException.cs │ │ ├── NativeLibraryLoader.cs │ │ ├── R.cs │ │ ├── SpanExtensions.cs │ │ ├── SpanSplitter.cs │ │ └── Tools.cs │ ├── LazyNotification.cs │ ├── MessageProcessor.cs │ ├── Messages/ │ │ ├── BaseTypes.cs │ │ ├── Deserializer.cs │ │ ├── MessageAdditions.cs │ │ ├── PermissionTransform.cs │ │ └── ResponseDictionary.cs │ ├── Properties.cs │ ├── Query/ │ │ ├── TsQueryClient.cs │ │ ├── TsQueryClient.gen.cs │ │ └── TsQueryClient.gen.tt │ ├── Scheduler/ │ │ ├── DedicatedTaskScheduler.cs │ │ ├── DispatcherHelper.cs │ │ └── TickWorker.cs │ ├── TSLib.csproj │ ├── TsBaseFunctions.FileTransfer.cs │ ├── TsBaseFunctions.cs │ ├── TsBaseFunctions.gen.cs │ ├── TsBaseFunctions.gen.tt │ ├── TsDnsResolver.cs │ ├── TsEnums.cs │ ├── TsPermissionHelper.cs │ ├── TsVersion.cs │ ├── Types.cs │ ├── Types.gen.cs │ ├── Types.gen.tt │ ├── WaitBlock.cs │ ├── bin/ │ │ ├── Debug/ │ │ │ ├── netcoreapp3.1/ │ │ │ │ ├── TSLib.deps.json │ │ │ │ └── TSLib.pdb │ │ │ ├── netstandard2.0/ │ │ │ │ ├── TSLib.deps.json │ │ │ │ └── TSLib.pdb │ │ │ └── netstandard2.1/ │ │ │ ├── TSLib.deps.json │ │ │ └── TSLib.pdb │ │ └── Release/ │ │ ├── netcoreapp3.1/ │ │ │ ├── TSLib.deps.json │ │ │ └── TSLib.pdb │ │ ├── netstandard2.0/ │ │ │ ├── TSLib.deps.json │ │ │ └── TSLib.pdb │ │ └── netstandard2.1/ │ │ ├── TSLib.deps.json │ │ └── TSLib.pdb │ ├── dnc2_compat/ │ │ ├── Extensions.cs │ │ ├── Range.cs │ │ └── info.txt │ └── obj/ │ ├── Debug/ │ │ ├── netcoreapp3.1/ │ │ │ ├── .NETCoreApp,Version=v3.1.AssemblyAttributes.cs │ │ │ ├── TSLib.AssemblyInfo.cs │ │ │ ├── TSLib.AssemblyInfoInputs.cache │ │ │ ├── TSLib.GeneratedMSBuildEditorConfig.editorconfig │ │ │ ├── TSLib.assets.cache │ │ │ ├── TSLib.csproj.AssemblyReference.cache │ │ │ ├── TSLib.csproj.CoreCompileInputs.cache │ │ │ ├── TSLib.csproj.FileListAbsolute.txt │ │ │ └── TSLib.pdb │ │ ├── netstandard2.0/ │ │ │ ├── .NETStandard,Version=v2.0.AssemblyAttributes.cs │ │ │ ├── NuGet/ │ │ │ │ ├── 2C8E6E8C03FF0327F78E3CB90559803756F36314/ │ │ │ │ │ └── Nullable/ │ │ │ │ │ └── 1.2.1/ │ │ │ │ │ └── Nullable/ │ │ │ │ │ └── NullableAttributes.cs │ │ │ │ └── 7BA94E4E53727142735FA3B08F79617CD03664FD/ │ │ │ │ └── Nullable/ │ │ │ │ └── 1.2.1/ │ │ │ │ └── Nullable/ │ │ │ │ └── NullableAttributes.cs │ │ │ ├── TSLib.AssemblyInfo.cs │ │ │ ├── TSLib.AssemblyInfoInputs.cache │ │ │ ├── TSLib.GeneratedMSBuildEditorConfig.editorconfig │ │ │ ├── TSLib.assets.cache │ │ │ ├── TSLib.csproj.AssemblyReference.cache │ │ │ ├── TSLib.csproj.CoreCompileInputs.cache │ │ │ ├── TSLib.csproj.FileListAbsolute.txt │ │ │ └── TSLib.pdb │ │ └── netstandard2.1/ │ │ ├── .NETStandard,Version=v2.1.AssemblyAttributes.cs │ │ ├── TSLib.AssemblyInfo.cs │ │ ├── TSLib.AssemblyInfoInputs.cache │ │ ├── TSLib.GeneratedMSBuildEditorConfig.editorconfig │ │ ├── TSLib.assets.cache │ │ ├── TSLib.csproj.AssemblyReference.cache │ │ ├── TSLib.csproj.CoreCompileInputs.cache │ │ ├── TSLib.csproj.FileListAbsolute.txt │ │ └── TSLib.pdb │ ├── Release/ │ │ ├── netcoreapp3.1/ │ │ │ ├── .NETCoreApp,Version=v3.1.AssemblyAttributes.cs │ │ │ ├── TSLib.AssemblyInfo.cs │ │ │ ├── TSLib.AssemblyInfoInputs.cache │ │ │ ├── TSLib.GeneratedMSBuildEditorConfig.editorconfig │ │ │ ├── TSLib.assets.cache │ │ │ ├── TSLib.csproj.AssemblyReference.cache │ │ │ ├── TSLib.csproj.CoreCompileInputs.cache │ │ │ ├── TSLib.csproj.FileListAbsolute.txt │ │ │ └── TSLib.pdb │ │ ├── netstandard2.0/ │ │ │ ├── .NETStandard,Version=v2.0.AssemblyAttributes.cs │ │ │ ├── NuGet/ │ │ │ │ ├── 2C8E6E8C03FF0327F78E3CB90559803756F36314/ │ │ │ │ │ └── Nullable/ │ │ │ │ │ └── 1.2.1/ │ │ │ │ │ └── Nullable/ │ │ │ │ │ └── NullableAttributes.cs │ │ │ │ └── 7BA94E4E53727142735FA3B08F79617CD03664FD/ │ │ │ │ └── Nullable/ │ │ │ │ └── 1.2.1/ │ │ │ │ └── Nullable/ │ │ │ │ └── NullableAttributes.cs │ │ │ ├── TSLib.AssemblyInfo.cs │ │ │ ├── TSLib.AssemblyInfoInputs.cache │ │ │ ├── TSLib.GeneratedMSBuildEditorConfig.editorconfig │ │ │ ├── TSLib.assets.cache │ │ │ ├── TSLib.csproj.AssemblyReference.cache │ │ │ ├── TSLib.csproj.CoreCompileInputs.cache │ │ │ ├── TSLib.csproj.FileListAbsolute.txt │ │ │ └── TSLib.pdb │ │ └── netstandard2.1/ │ │ ├── .NETStandard,Version=v2.1.AssemblyAttributes.cs │ │ ├── TSLib.AssemblyInfo.cs │ │ ├── TSLib.AssemblyInfoInputs.cache │ │ ├── TSLib.GeneratedMSBuildEditorConfig.editorconfig │ │ ├── TSLib.assets.cache │ │ ├── TSLib.csproj.AssemblyReference.cache │ │ ├── TSLib.csproj.CoreCompileInputs.cache │ │ ├── TSLib.csproj.FileListAbsolute.txt │ │ └── TSLib.pdb │ ├── TSLib.csproj.nuget.dgspec.json │ ├── TSLib.csproj.nuget.g.props │ ├── TSLib.csproj.nuget.g.targets │ ├── project.assets.json │ └── project.nuget.cache ├── YunBot.cs └── obj/ ├── ClassLibrary4.csproj.nuget.dgspec.json ├── ClassLibrary4.csproj.nuget.g.props ├── ClassLibrary4.csproj.nuget.g.targets ├── Debug/ │ ├── netcoreapp3.0/ │ │ ├── ClassLibrary4.assets.cache │ │ └── ClassLibrary4.csproj.FileListAbsolute.txt │ └── netcoreapp3.1/ │ ├── .NETCoreApp,Version=v3.1.AssemblyAttributes.cs │ ├── ClassLibrary4.AssemblyInfo.cs │ ├── ClassLibrary4.AssemblyInfoInputs.cache │ ├── ClassLibrary4.GeneratedMSBuildEditorConfig.editorconfig │ ├── ClassLibrary4.assets.cache │ ├── ClassLibrary4.csproj.AssemblyReference.cache │ ├── ClassLibrary4.csproj.CopyComplete │ ├── ClassLibrary4.csproj.CoreCompileInputs.cache │ ├── ClassLibrary4.csproj.FileListAbsolute.txt │ └── YunBot.pdb ├── project.assets.json └── project.nuget.cache ================================================ FILE CONTENTS ================================================ ================================================ FILE: ClassLibrary4.csproj ================================================ netcoreapp3.1 YunBot ================================================ FILE: ClassLibrary4.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.33927.289 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassLibrary4", "ClassLibrary4.csproj", "{D3D9037A-AD7B-4C9E-9FC0-CA330D8776BD}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TSLib", "G:\TS3DEV\TS3AudioBot-master\TSLib\TSLib.csproj", "{66AF7F2B-43B7-41E0-982A-FCD7DA062BAA}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TS3AudioBot", "G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\TS3AudioBot.csproj", "{FFC15959-0725-4B2B-BF06-BFE8403C60A6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {D3D9037A-AD7B-4C9E-9FC0-CA330D8776BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D3D9037A-AD7B-4C9E-9FC0-CA330D8776BD}.Debug|Any CPU.Build.0 = Debug|Any CPU {D3D9037A-AD7B-4C9E-9FC0-CA330D8776BD}.Release|Any CPU.ActiveCfg = Release|Any CPU {D3D9037A-AD7B-4C9E-9FC0-CA330D8776BD}.Release|Any CPU.Build.0 = Release|Any CPU {66AF7F2B-43B7-41E0-982A-FCD7DA062BAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {66AF7F2B-43B7-41E0-982A-FCD7DA062BAA}.Debug|Any CPU.Build.0 = Debug|Any CPU {66AF7F2B-43B7-41E0-982A-FCD7DA062BAA}.Release|Any CPU.ActiveCfg = Release|Any CPU {66AF7F2B-43B7-41E0-982A-FCD7DA062BAA}.Release|Any CPU.Build.0 = Release|Any CPU {FFC15959-0725-4B2B-BF06-BFE8403C60A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FFC15959-0725-4B2B-BF06-BFE8403C60A6}.Debug|Any CPU.Build.0 = Debug|Any CPU {FFC15959-0725-4B2B-BF06-BFE8403C60A6}.Release|Any CPU.ActiveCfg = Release|Any CPU {FFC15959-0725-4B2B-BF06-BFE8403C60A6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {86AB0697-D2EC-474E-8C8F-67F25BEDB10E} EndGlobalSection EndGlobal ================================================ FILE: LICENSE ================================================ Open Software License ("OSL") v 3.0 This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: Licensed under the Open Software License version 3.0 1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: a) to reproduce the Original Work in copies, either alone or as part of a collective work; b) to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; c) to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License; d) to perform the Original Work publicly; and e) to display the Original Work publicly. 2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. 3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. 4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. 5) External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). 6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. 7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. 8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. 9) Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). 10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. 11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. 12) Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. 13) Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. 14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. 16) Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under " or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. ================================================ FILE: README.md ================================================ # ⚠️ 本项目已停止更新和维护 **请使用最新的项目:[teamspeak-music-bot](https://github.com/ZHANGTIANYAO1/teamspeak-music-bot)** 本仓库将不再进行任何更新或维护,建议所有用户迁移到新项目。 --- # TS3AudioBot-NetEaseCloudmusic-plugin >此插件基于Splamy/TS3AudioBot项目 https://github.com/Splamy/TS3AudioBot >以及网易云音乐 API开发 [https://gitlab.com/Binaryify/neteasecloudmusicapi ](https://www.npmjs.com/package/NeteaseCloudMusicApi) 此插件安装方法同样见TS3AudioBot项目wiki **2.0版本之后可以不需要本地部署网易云API了,但是强烈建议自行部署防止隐私泄露 ** **最好给音乐机器人超管权限保证能正常更新头像和描述** 这是一个用C#给TS3AudioBot编写网易云插件,让你的TS可以有一个音乐机器人。如果觉得好的话,还请给个星星支持一下 ## 关于API和机器人部署 目前网易云可能有什么改动,导致如果使用部署在海外的API将无法播放部分VIP歌曲,已经在ISSUE中添加新的国内公开API 推荐将API和机器人都部署在国内的服务器上 ## 关于 DEV 版本 此版本基于 Splamy/TS3AudioBot 项目和 NeteaseCloudMusicApi 开发。DEV 版本由 @577fkj 大佬重构和增强,感谢他的贡献! 由于原开发环境的丢失,无法继续之前兼容 stable 版本的音乐机器人插件的开发。此 DEV 版本是在 @577fkj 的重构和增强版本基础上进一步开发的。 此版本新增了多项功能,包括查看播放列表、验证码登录、无人自动暂停、清除歌单、获取歌单最大长度限制、让机器人前往当前频道、播放专辑功能、私人 FM 模式等。 ### 链接 - DEV 版本 GitHub 仓库:https://github.com/ZHANGTIANYAO1/TS3AudioBot-NetEaseCloudmusic-plugin/tree/DEV - pre-release(测试版)下载链接:https://github.com/ZHANGTIANYAO1/TS3AudioBot-NetEaseCloudmusic-plugin/releases/tag/3.0.0 ### 注意事项 - 此版本windows系统需要使用新的机器人程序,已经打包在pre-release中 - 虽然添加了第三方网易云API,但是为了大家的安全考虑,强烈建议自行部署API - 需要使用最新版本的网易云API:https://gitlab.com/Binaryify/neteasecloudmusicapi - 此版本在开发中,可能会有bug,遇到bug请提交issue,如果有想要添加的功能也可以提交issue - 将机器人整合包的音质默认设置为了最高bitrate - 权限文件修改为所有人有全部权限 - 使用版本过新的linux可能会有困难,比如使用Ubuntu(24,22)版本的需要自己去安装老的lib库,例子:(libicu70_70.1-2_amd64.deb libssl1.1_1.1.1f-1ubuntu2_amd64.deb) - 推荐使用Ubuntu20 ## 关于设置文件YunSettings.ini `playMode=`是播放模式 `WangYiYunAPI_Address`是网易云API地址,目前默认的是一个大佬的远程API,如果加载速度过慢或者无法访问,请自行部署API并修改API地址。(为了保护你的隐私强烈建议你自行部署API) `cookies1=`是保存在你本地的身份验证,通过二维码登录获取。(不需要修改) ## 目前的指令: 正在播放的歌单的图片和名称可以点机器人看它的头像和描述 vip音乐想要先登陆才能播放完整版本:(输入指令后扫描机器人头像二维码登陆) `!yun login` 双击机器人,目前有以下指令(把[xxx]替换成对应信息,**包括中括号**) 1.立即播放网易云音乐 `!yun play [音乐名称]` 2.添加音乐到下一首 `!yun add [音乐名称]` 3.播放网易云音乐歌单(如果提示Error: Nothing to play...重新输入指令解决) `!yun gedan [歌单名称]` 4.播放网易云音乐歌单id `!yun gedanid [歌单名称]` 5.立即播放网易云音乐id `!yun playid [歌单id]` 6.添加指定音乐id到下一首 `!yun add [音乐id]` 7.播放列表中的下一首 `!yun next` 8.修改播放模式 `!yun mode [模式选择数字0-3]` `0 = 顺序播放` `1 = 顺序循环` `2 = 随机播放` `3 = 随机循环` 需要注意的是如果歌单歌曲过多需要时间加载,期间一定一定不要输入其他指令 ### TS频道描述(复制代码到频道描述) ``` [COLOR=#ff5500][B]正在播放的歌单的图片和名称可以点机器人看它的头像和描述[/B][/COLOR] [COLOR=#aa00ff]机器人现在可以通过歌单播放vip音乐,如果遇到其他问题可以联系Github[/COLOR] [COLOR=#0055ff]双击机器人,目前有以下指令([I]把[xxx]替换成对应信息,包括中括号[/I])[/COLOR] 1.立即播放网易云音乐 [COLOR=#00aa00]!yun play [音乐名称][/COLOR] 2.添加音乐到下一首 [COLOR=#00aa00]!yun add [音乐名称][/COLOR] 3.播放网易云音乐歌单 [COLOR=#00aa00]!yun gedan [歌单名称][/COLOR] 4.播放网易云音乐歌单id [COLOR=#00aa00]!yun gedanid [歌单名称][/COLOR] 5.立即播放网易云音乐id [COLOR=#00aa00]!yun playid [歌单id][/COLOR] 6.添加指定音乐id到下一首 [COLOR=#00aa00]!yun add [音乐id][/COLOR] 7.播放列表中的下一首 [COLOR=#00aa00]!yun next[/COLOR] 8.播放模式选择【0=顺序播放 1=顺序循环 2=随机 3=随即循环】 [COLOR=#00aa00]!yun mode[/COLOR] 9.登陆账户 [COLOR=#00aa00]!yun login[/COLOR] [COLOR=#aaaaff]如果想要播放会员音乐需要先登陆会员账户,输入上述命令后扫描机器人头像的二维码登陆(只需要一账户登陆一次即可)[/COLOR] 需要注意的是如果歌单歌曲过多需要时间加载(重写后应该只需要几秒),期间[B]一定一定不要[/B]输入其他指令 以下例子加粗的就是音乐或者歌单id [URL]https://music.163.com/#/my/m/music/playlist?id=[B]2139305008[I][/I][/B][/URL] ``` ### 已知问题 使用官方构建的ts3aduiobot会报错,因为官方的编译环境有问题。 解决方法:1.自行构建 2.使用我打包的版本 重复卸载加载插件会出现问题,如果需要重新加载请先重启Bot Linux Docker无法正常显示description 解决方法:docker版本启用了web管理界面,在里面的Show song in bot description冲突了。关掉就可以正常显示了 #### 写在最后的话 本人完全不会C#,纯粹是自己花两天自学的,所以请各位大佬轻点喷我。 还有很多地方需要完善以及很多功能可以添加,但是本人无法做出任何承诺 同时欢迎各位来修改和完善这个插件 最后的最后请不要轻易信任使用他人提供的公开服务,以免发生安全问题,泄露自己的账号和密码。如果决定使用默认的远程API请自行承担任何可能的后续风险。 ================================================ FILE: TS3AudioBot/Algorithm/IFilterAlgorithm.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using System.Linq; namespace TS3AudioBot.Algorithm { public interface IFilter { IEnumerable> Filter(IEnumerable> list, string filter); } public static class Filter { public static IFilter DefaultFilter { get; } = Ic3Filter.Instance; public static IFilter? GetFilterByName(string filter) { return filter switch { "exact" => ExactFilter.Instance, "substring" => SubstringFilter.Instance, "ic3" => Ic3Filter.Instance, "hamming" => HammingFilter.Instance, _ => null, }; } public static IFilter GetFilterByNameOrDefault(string filter) => GetFilterByName(filter) ?? DefaultFilter; } /// Interleaved continuous character chain. internal sealed class Ic3Filter : IFilter { private Ic3Filter() { } public static IFilter Instance { get; } = new Ic3Filter(); IEnumerable> IFilter.Filter(IEnumerable> list, string filter) { // Convert result to list because it can be enumerated multiple times var possibilities = list.Select(t => (Name: t.Key, t.Value, Index: 0)).ToList(); // Filter matching commands foreach (var c in filter.ToLowerInvariant()) { var newPossibilities = (from p in possibilities let pos = p.Name.ToLowerInvariant().IndexOf(c, p.Index) where pos != -1 select (p.Name, p.Value, Index: pos + 1)).ToList(); if (newPossibilities.Count > 0) possibilities = newPossibilities; } // Take command with lowest index int minIndex = possibilities.Min(t => t.Index); var cmds = possibilities.Where(t => t.Index == minIndex).ToArray(); // Take the smallest command int minLength = cmds.Min(c => c.Name.Length); return cmds.Where(c => c.Name.Length == minLength).Select(fi => new KeyValuePair(fi.Name, fi.Value)); } } internal sealed class ExactFilter : IFilter { private ExactFilter() { } public static IFilter Instance { get; } = new ExactFilter(); IEnumerable> IFilter.Filter(IEnumerable> list, string filter) { return list.Where(x => x.Key == filter); } } internal sealed class HammingFilter : IFilter { private HammingFilter() { } public static IFilter Instance { get; } = new HammingFilter(); IEnumerable> IFilter.Filter(IEnumerable> list, string filter) { throw new System.NotImplementedException(); } } internal sealed class SubstringFilter : IFilter { private SubstringFilter() { } public static IFilter Instance { get; } = new SubstringFilter(); IEnumerable> IFilter.Filter(IEnumerable> list, string filter) { var result = list.Where(x => x.Key.StartsWith(filter)); using var enu = result.GetEnumerator(); if (!enu.MoveNext()) yield break; yield return enu.Current; if (enu.Current.Key == filter) yield break; while (enu.MoveNext()) yield return enu.Current; } } } ================================================ FILE: TS3AudioBot/Algorithm/LruCache.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; namespace TS3AudioBot.Algorithm { public class LruCache where TK : notnull { private readonly int maxCapacity; private readonly Dictionary> cacheDict = new Dictionary>(); private readonly LinkedList<(TK key, TV value)> lruList = new LinkedList<(TK, TV)>(); public LruCache(int capacity) { maxCapacity = capacity; } public bool TryGetValue(TK key, [MaybeNullWhen(false)] out TV value) { if (cacheDict.TryGetValue(key, out var node)) { Renew(node); value = node.Value.value; return true; } value = default!; return false; } public void Set(TK key, TV value) { if (cacheDict.TryGetValue(key, out var node)) { Renew(node); node.Value = (node.Value.key, value); return; } if (cacheDict.Count >= maxCapacity) RemoveOldest(); node = lruList.AddLast((key, value)); cacheDict.Add(key, node); } public bool Remove(TK key) => cacheDict.Remove(key); private void Renew(LinkedListNode<(TK, TV)> node) { lruList.Remove(node); lruList.AddLast(node); } private void RemoveOldest() { var node = lruList.First; if (node is null) return; lruList.RemoveFirst(); cacheDict.Remove(node.Value.key); } public void Clear() { cacheDict.Clear(); lruList.Clear(); } } } ================================================ FILE: TS3AudioBot/Algorithm/TimedCache.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using System.Linq; using TSLib.Helper; namespace TS3AudioBot.Algorithm { public class TimedCache where TK : notnull { public TimeSpan Timeout { get; } private readonly ConcurrentDictionary cachedData; public TimedCache() : this(TimeSpan.FromSeconds(3)) { } public TimedCache(TimeSpan timeout) { Timeout = timeout; cachedData = new ConcurrentDictionary(); } public bool TryGetValue(TK key, [MaybeNullWhen(false)] out TV value) { if (!cachedData.TryGetValue(key, out var data) || Tools.Now - Timeout > data.Timestamp) { CleanCache(); value = default!; return false; } value = data.Data; return true; } public void Set(TK key, TV value) { cachedData[key] = new TimedData { Data = value, Timestamp = Tools.Now }; } public void Clear() { cachedData.Clear(); } private void CleanCache() { var now = Tools.Now - Timeout; foreach (var item in cachedData.Where(kvp => now > kvp.Value.Timestamp).ToList()) { cachedData.TryRemove(item.Key, out _); } } private struct TimedData { public TV Data; public DateTime Timestamp; } } } ================================================ FILE: TS3AudioBot/Audio/AudioValues.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using TSLib.Helper; namespace TS3AudioBot.Audio { public static class AudioValues { public const float MinVolume = 0; public const float MaxVolume = 100; // Reference explanation for the logarithmic scale // https://www.dr-lex.be/info-stuff/volumecontrols.html#table1 // Adjusted values for 40dB private const float fact_a = 1e-2f; private const float fact_b = 4.61512f; public static float HumanVolumeToFactor(float value) { if (value < MinVolume) return 0; if (value > MaxVolume) return 1; // Map input values from [MinVolume, MaxVolume] to [0, 1] value = (value - MinVolume) / (MaxVolume - MinVolume); // Scale the value logarithmically return Tools.Clamp((float)(fact_a * Math.Exp(fact_b * value)) - fact_a, 0, 1); } public static float FactorToHumanVolume(float value) { if (value < 0) return MinVolume; if (value > 1) return MaxVolume; // Undo logarithmical scale value = Tools.Clamp((float)(Math.Log((value + fact_a) / fact_a) / fact_b), 0, 1); // Map input values from [0, 1] to [MinVolume, MaxVolume] return (value * (MaxVolume - MinVolume)) + MinVolume; } } } ================================================ FILE: TS3AudioBot/Audio/CustomTargetPipe.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using TSLib; using TSLib.Audio; using TSLib.Full; using TSLib.Helper; namespace TS3AudioBot.Audio { internal class CustomTargetPipe : IVoiceTarget, IAudioPassiveConsumer { public TargetSendMode SendMode { get; set; } = TargetSendMode.Voice; public ulong GroupWhisperTargetId { get; private set; } public GroupWhisperType GroupWhisperType { get; private set; } public GroupWhisperTarget GroupWhisperTarget { get; private set; } public bool Alone { get; set; } public IReadOnlyCollection WhisperClients { get { lock (subscriptionLockObj) { return clientSubscriptionsSetup.ToArray(); } } } public IReadOnlyCollection WhisperChannel { get { lock (subscriptionLockObj) { return channelSubscriptionsSetup.Keys.ToArray(); } } } public bool Active { get { switch (SendMode) { case TargetSendMode.None: return false; case TargetSendMode.Voice: return !Alone; case TargetSendMode.Whisper: UpdatedSubscriptionCache(); return channelSubscriptionsCache.Length > 0 || clientSubscriptionsCache.Length > 0; default: return true; } } } private readonly Dictionary channelSubscriptionsSetup = new Dictionary(); private readonly HashSet clientSubscriptionsSetup = new HashSet(); private ChannelId[] channelSubscriptionsCache = Array.Empty(); private ClientId[] clientSubscriptionsCache = Array.Empty(); private bool subscriptionSetupChanged; private readonly object subscriptionLockObj = new object(); private readonly TsFullClient client; public CustomTargetPipe(TsFullClient client) { this.client = client; subscriptionSetupChanged = true; } public void Write(Span data, Meta? meta) { UpdatedSubscriptionCache(); var codec = meta?.Codec ?? Codec.OpusMusic; // XXX a bit hacky switch (SendMode) { case TargetSendMode.None: break; case TargetSendMode.Voice: client.SendAudio(data, codec); break; case TargetSendMode.Whisper: client.SendAudioWhisper(data, codec, channelSubscriptionsCache, clientSubscriptionsCache); break; case TargetSendMode.WhisperGroup: client.SendAudioGroupWhisper(data, codec, GroupWhisperType, GroupWhisperTarget, GroupWhisperTargetId); break; default: throw Tools.UnhandledDefault(SendMode); } } #region ITargetManager public void SetGroupWhisper(GroupWhisperType type, GroupWhisperTarget target, ulong targetId = 0) { GroupWhisperType = type; GroupWhisperTarget = target; GroupWhisperTargetId = targetId; } public void WhisperChannelSubscribe(bool temp, params ChannelId[] channels) { lock (subscriptionLockObj) { foreach (var channel in channels) { if (channelSubscriptionsSetup.TryGetValue(channel, out var subscriptionTemp)) { channelSubscriptionsSetup[channel] = !subscriptionTemp || !temp; } else { channelSubscriptionsSetup[channel] = !temp; subscriptionSetupChanged = true; } } } } public void WhisperChannelUnsubscribe(bool temp, params ChannelId[] channels) { lock (subscriptionLockObj) { foreach (var channel in channels) { if (!temp) { subscriptionSetupChanged |= channelSubscriptionsSetup.Remove(channel); } else { if (channelSubscriptionsSetup.TryGetValue(channel, out bool subscriptionTemp) && subscriptionTemp) { channelSubscriptionsSetup.Remove(channel); subscriptionSetupChanged = true; } } } } } public void WhisperClientSubscribe(params ClientId[] userId) { lock (subscriptionLockObj) { clientSubscriptionsSetup.UnionWith(userId); subscriptionSetupChanged = true; } } public void WhisperClientUnsubscribe(params ClientId[] userId) { lock (subscriptionLockObj) { clientSubscriptionsSetup.ExceptWith(userId); subscriptionSetupChanged = true; } } public void ClearTemporary() { lock (subscriptionLockObj) { var removeList = channelSubscriptionsSetup .Where(kvp => kvp.Value) .Select(kvp => kvp.Key) .ToArray(); foreach (var chan in removeList) { channelSubscriptionsSetup.Remove(chan); subscriptionSetupChanged = true; } } } private void UpdatedSubscriptionCache() { if (!subscriptionSetupChanged) return; lock (subscriptionLockObj) { if (!subscriptionSetupChanged) return; channelSubscriptionsCache = channelSubscriptionsSetup.Keys.ToArray(); clientSubscriptionsCache = clientSubscriptionsSetup.ToArray(); subscriptionSetupChanged = false; } } #endregion } } ================================================ FILE: TS3AudioBot/Audio/FfmpegProducer.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using TS3AudioBot.Config; using TS3AudioBot.Helper; using TSLib.Audio; using TSLib.Helper; using TSLib.Scheduler; namespace TS3AudioBot.Audio { public class FfmpegProducer : IPlayerSource, ISampleInfo, IDisposable { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private readonly Id id; private static readonly Regex FindDurationMatch = new Regex(@"^\s*Duration: (\d+):(\d\d):(\d\d).(\d\d)", Util.DefaultRegexConfig); private static readonly Regex IcyMetadataMacher = new Regex("((\\w+)='(.*?)';\\s*)+", Util.DefaultRegexConfig); private const string PreLinkConf = "-hide_banner -nostats -threads 1 -i \""; private const string PostLinkConf = "\" -ac 2 -ar 48000 -f s16le -acodec pcm_s16le pipe:1"; private const string LinkConfIcy = "-hide_banner -nostats -threads 1 -i pipe:0 -ac 2 -ar 48000 -f s16le -acodec pcm_s16le pipe:1"; private static readonly TimeSpan retryOnDropBeforeEnd = TimeSpan.FromSeconds(10); private readonly ConfToolsFfmpeg config; public event EventHandler? OnSongEnd; public event EventHandler? OnSongUpdated; private readonly DedicatedTaskScheduler scheduler; private FfmpegInstance? ffmpegInstance; public int SampleRate { get; } = 48000; public int Channels { get; } = 2; public int BitsPerSample { get; } = 16; public FfmpegProducer(ConfToolsFfmpeg config, DedicatedTaskScheduler scheduler, Id id) { this.config = config; this.scheduler = scheduler; this.id = id; } public Task AudioStart(string url, TimeSpan? startOff = null) { StartFfmpegProcess(url, startOff ?? TimeSpan.Zero); return Task.CompletedTask; } public async Task AudioStartIcy(string url) => await StartFfmpegProcessIcy(url); public void AudioStop() { StopFfmpegProcess(); } public TimeSpan? Length => GetCurrentSongLength(); public TimeSpan? Position => ffmpegInstance?.AudioTimer.SongPosition; public Task Seek(TimeSpan position) { SetPosition(position); return Task.CompletedTask; } public int Read(byte[] buffer, int offset, int length, out Meta? meta) { meta = default; int read; var instance = ffmpegInstance; if (instance is null) return 0; try { read = instance.FfmpegProcess.StandardOutput.BaseStream.Read(buffer, 0, length); } catch (Exception ex) { read = 0; Log.Debug(ex, "Can't read ffmpeg"); } if (read == 0) { AssertNotMainScheduler(); var (ret, triggerEndSafe) = instance.IsIcyStream ? OnReadEmptyIcy(instance) : OnReadEmpty(instance); if (ret) return 0; if (instance.FfmpegProcess.HasExitedSafe()) { Log.Trace("Ffmpeg has exited"); AudioStop(); triggerEndSafe = true; } if (triggerEndSafe) { OnSongEnd?.Invoke(this, EventArgs.Empty); return 0; } } instance.HasTriedToReconnect = false; instance.AudioTimer.PushBytes(read); return read; } private (bool ret, bool trigger) OnReadEmpty(FfmpegInstance instance) { if (instance.FfmpegProcess.HasExitedSafe() && !instance.HasTriedToReconnect) { var expectedStopLength = GetCurrentSongLength(); Log.Trace("Expected song length {0}", expectedStopLength); if (expectedStopLength != TimeSpan.Zero) { var actualStopPosition = instance.AudioTimer.SongPosition; Log.Trace("Actual song position {0}", actualStopPosition); if (actualStopPosition + retryOnDropBeforeEnd < expectedStopLength) { Log.Debug("Connection to song lost, retrying at {0}", actualStopPosition); instance.HasTriedToReconnect = true; var newInstance = SetPosition(actualStopPosition); if (newInstance.Ok) { newInstance.Value.HasTriedToReconnect = true; return (true, false); } else { Log.Debug("Retry failed {0}", newInstance.Error); return (false, true); } } } } return (false, false); } private (bool ret, bool trigger) OnReadEmptyIcy(FfmpegInstance instance) { AssertNotMainScheduler(); if (instance.FfmpegProcess.HasExitedSafe() && !instance.HasTriedToReconnect) { Log.Debug("Connection to stream lost, retrying..."); instance.HasTriedToReconnect = true; var newInstance = StartFfmpegProcessIcy(instance.ReconnectUrl).Result; if (newInstance.Ok) { newInstance.Value.HasTriedToReconnect = true; return (true, false); } else { Log.Debug("Retry failed {0}", newInstance.Error); return (false, true); } } return (false, false); } private R SetPosition(TimeSpan value) { if (value < TimeSpan.Zero) throw new ArgumentOutOfRangeException(nameof(value)); var instance = ffmpegInstance; if (instance is null) return "No instance running"; if (instance.IsIcyStream) return "Cannot seek icy stream"; var lastLink = instance.ReconnectUrl; if (lastLink is null) return "No current url active"; return StartFfmpegProcess(lastLink, value); } private R StartFfmpegProcess(string url, TimeSpan? offsetOpt) { StopFfmpegProcess(); Log.Trace("Start request {0}", url); string arguments; var offset = offsetOpt ?? TimeSpan.Zero; if (offset > TimeSpan.Zero) { var seek = string.Format(CultureInfo.InvariantCulture, @"-ss {0:hh\:mm\:ss\.fff}", offset); arguments = string.Concat(seek, " ", PreLinkConf, url, PostLinkConf, " ", seek); } else { arguments = string.Concat(PreLinkConf, url, PostLinkConf); } var newInstance = new FfmpegInstance( url, new PreciseAudioTimer(this) { SongPositionOffset = offset, }); return StartFfmpegProcessInternal(newInstance, arguments); } private async Task> StartFfmpegProcessIcy(string url) { StopFfmpegProcess(); Log.Trace("Start icy-stream request {0}", url); try { var response = await WebWrapper .Request(url) .WithHeader("Icy-MetaData", "1") .UnsafeResponse(); if (!int.TryParse(response.Headers.GetSingle("icy-metaint"), out var metaint)) { response.Dispose(); return "Invalid icy stream tags"; } var stream = await response.Content.ReadAsStreamAsync(); var newInstance = new FfmpegInstance( url, new PreciseAudioTimer(this), stream, metaint) { OnMetaUpdated = e => OnSongUpdated?.Invoke(this, e) }; new Thread(() => newInstance.ReadStreamLoop(id)) { Name = $"IcyStreamReader[{id}]", }.Start(); return StartFfmpegProcessInternal(newInstance, LinkConfIcy); } catch (Exception ex) { var error = $"Unable to create icy-stream ({ex.Message})"; Log.Warn(ex, error); return error; } } private R StartFfmpegProcessInternal(FfmpegInstance instance, string arguments) { try { instance.FfmpegProcess.StartInfo = new ProcessStartInfo { FileName = config.Path.Value, Arguments = arguments, RedirectStandardOutput = true, RedirectStandardInput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true, }; instance.FfmpegProcess.EnableRaisingEvents = true; Log.Debug("Starting ffmpeg with {0}", arguments); instance.FfmpegProcess.ErrorDataReceived += instance.FfmpegProcess_ErrorDataReceived; instance.FfmpegProcess.Start(); instance.FfmpegProcess.BeginErrorReadLine(); instance.AudioTimer.Start(); var oldInstance = Interlocked.Exchange(ref ffmpegInstance, instance); oldInstance?.Close(); return instance; } catch (Exception ex) { var error = ex is Win32Exception ? $"Ffmpeg could not be found ({ex.Message})" : $"Unable to create stream ({ex.Message})"; Log.Error(ex, error); instance.Close(); StopFfmpegProcess(); return error; } } private void StopFfmpegProcess() { var oldInstance = Interlocked.Exchange(ref ffmpegInstance, null); if (oldInstance != null) { oldInstance.OnMetaUpdated = null; oldInstance.Close(); } } private TimeSpan? GetCurrentSongLength() => ffmpegInstance?.ParsedSongLength; private void AssertNotMainScheduler() { if (TaskScheduler.Current == scheduler) throw new Exception("Cannot read on own scheduler. Throwing to prevent deadlock"); } public void Dispose() { StopFfmpegProcess(); } private class FfmpegInstance { public Process FfmpegProcess { get; } public bool HasTriedToReconnect { get; set; } public string ReconnectUrl { get; } public bool IsIcyStream => IcyStream != null; public PreciseAudioTimer AudioTimer { get; } public TimeSpan? ParsedSongLength { get; set; } = null; public Stream? IcyStream { get; } public int IcyMetaInt { get; } public bool Closed { get; set; } public Action? OnMetaUpdated; public FfmpegInstance(string url, PreciseAudioTimer timer) : this(url, timer, null!, 0) { } public FfmpegInstance(string url, PreciseAudioTimer timer, Stream icyStream, int icyMetaInt) { FfmpegProcess = new Process(); ReconnectUrl = url; AudioTimer = timer; IcyStream = icyStream; IcyMetaInt = icyMetaInt; HasTriedToReconnect = false; } public void Close() { Closed = true; try { if (!FfmpegProcess.HasExitedSafe()) FfmpegProcess.Kill(); } catch { } try { FfmpegProcess.CancelErrorRead(); } catch { } try { FfmpegProcess.StandardInput.Dispose(); } catch { } try { FfmpegProcess.StandardOutput.Dispose(); } catch { } try { FfmpegProcess.Dispose(); } catch { } IcyStream?.Dispose(); } public void FfmpegProcess_ErrorDataReceived(object sender, DataReceivedEventArgs e) { if (e.Data is null) return; if (sender != FfmpegProcess) throw new InvalidOperationException("Wrong process associated to event"); if (ParsedSongLength is null) { var match = FindDurationMatch.Match(e.Data); if (!match.Success) return; int hours = int.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture); int minutes = int.Parse(match.Groups[2].Value, CultureInfo.InvariantCulture); int seconds = int.Parse(match.Groups[3].Value, CultureInfo.InvariantCulture); int millisec = int.Parse(match.Groups[4].Value, CultureInfo.InvariantCulture) * 10; ParsedSongLength = new TimeSpan(0, hours, minutes, seconds, millisec); } //if (!HasIcyTag && e.Data.AsSpan().TrimStart().StartsWith("icy-".AsSpan())) //{ // HasIcyTag = true; //} } public void ReadStreamLoop(Id id) { if (IcyStream is null) throw new InvalidOperationException("Instance is not an icy stream"); Tools.SetLogId(id.ToString()); const int IcyMaxMeta = 255 * 16; const int ReadBufferSize = 4096; int errorCount = 0; var buffer = new byte[Math.Max(ReadBufferSize, IcyMaxMeta)]; int readCount = 0; while (!Closed) { try { while (readCount < IcyMetaInt) { int read = IcyStream.Read(buffer, 0, Math.Min(ReadBufferSize, IcyMetaInt - readCount)); if (read == 0) { Close(); return; } readCount += read; FfmpegProcess.StandardInput.BaseStream.Write(buffer, 0, read); errorCount = 0; } readCount = 0; var metaByte = IcyStream.ReadByte(); if (metaByte < 0) { Close(); return; } if (metaByte > 0) { metaByte *= 16; while (readCount < metaByte) { int read = IcyStream.Read(buffer, 0, metaByte - readCount); if (read == 0) { Close(); return; } readCount += read; } readCount = 0; var metaString = Tools.Utf8Encoder.GetString(buffer, 0, metaByte).TrimEnd('\0'); Log.Debug("Meta: {0}", metaString); OnMetaUpdated?.Invoke(ParseIcyMeta(metaString)); } } catch (Exception ex) { errorCount++; if (errorCount >= 50) { Log.Error(ex, "Failed too many times trying to access ffmpeg. Closing stream."); Close(); return; } if (ex is InvalidOperationException) { Log.Debug(ex, "Waiting for ffmpeg"); Thread.Sleep(100); } else { Log.Debug(ex, "Stream read/write error"); } } } } private static SongInfoChanged ParseIcyMeta(string metaString) { var songInfo = new SongInfoChanged(); var match = IcyMetadataMacher.Match(metaString); if (match.Success) { for (int i = 0; i < match.Groups[1].Captures.Count; i++) { switch (match.Groups[2].Captures[i].Value.ToUpperInvariant()) { case "STREAMTITLE": songInfo.Title = match.Groups[3].Captures[i].Value; break; } } } return songInfo; } } } } ================================================ FILE: TS3AudioBot/Audio/IPlayerSource.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Threading.Tasks; using TSLib.Audio; namespace TS3AudioBot.Audio { public interface IPlayerSource : IAudioPassiveProducer { event EventHandler OnSongEnd; event EventHandler OnSongUpdated; TimeSpan? Length { get; } TimeSpan? Position { get; } Task Seek(TimeSpan position); } } ================================================ FILE: TS3AudioBot/Audio/IVoiceTarget.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using TSLib; using TSLib.Audio; namespace TS3AudioBot.Audio { /// Used to specify playing mode and active targets to send to. public interface IVoiceTarget { TargetSendMode SendMode { get; set; } ulong GroupWhisperTargetId { get; } GroupWhisperType GroupWhisperType { get; } GroupWhisperTarget GroupWhisperTarget { get; } void SetGroupWhisper(GroupWhisperType type, GroupWhisperTarget target, ulong targetId); IReadOnlyCollection WhisperClients { get; } IReadOnlyCollection WhisperChannel { get; } /// Adds a channel to the audio streaming list. /// When set to true this channel will be cleared with /// the next call (unless overwritten with false). /// The id of the channel. void WhisperChannelSubscribe(bool temp, params ChannelId[] channel); /// Removes a channel from the audio streaming list. /// When set to true this channel will be cleared with /// the next call (unless overwritten with false). /// The id of the channel. void WhisperChannelUnsubscribe(bool temp, params ChannelId[] channel); void ClearTemporary(); void WhisperClientSubscribe(params ClientId[] userId); void WhisperClientUnsubscribe(params ClientId[] userId); } } ================================================ FILE: TS3AudioBot/Audio/PlayInfo.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Diagnostics.CodeAnalysis; using TSLib; namespace TS3AudioBot.Audio { public sealed class PlayInfo { /// Defaults to: invoker.Uid - Can be set if the owner of a song differs from the invoker. public Uid? ResourceOwnerUid { get; set; } /// Starts the song at the specified time if set. public TimeSpan? StartOffset { get; set; } public PlayInfo(TimeSpan? startOffset = null) { StartOffset = startOffset; } public PlayInfo Merge(PlayInfo other) => Merge(this, other); [return: NotNullIfNotNull("self")] [return: NotNullIfNotNull("other")] public static PlayInfo? Merge(PlayInfo? self, PlayInfo? other) { if (other is null) return self; if (self is null) return other; self.ResourceOwnerUid ??= other.ResourceOwnerUid; self.StartOffset ??= other.StartOffset; return self; } public static PlayInfo MergeDefault(PlayInfo? self, PlayInfo? other) => Merge(self, other) ?? new PlayInfo(); } public interface IMetaContainer { public PlayInfo? PlayInfo { get; set; } } public static class MetaContainerExtensions { public static T MergeMeta(this T container, PlayInfo? other) where T : IMetaContainer { container.PlayInfo = PlayInfo.Merge(container.PlayInfo, other); return container; } } } ================================================ FILE: TS3AudioBot/Audio/PlayInfoEventArgs.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using TS3AudioBot.ResourceFactories; namespace TS3AudioBot.Audio { public sealed class PlayInfoEventArgs : EventArgs { public InvokerData Invoker { get; } public PlayResource PlayResource { get; } public AudioResource ResourceData => PlayResource.AudioResource; public PlayInfo? PlayInfo => PlayResource.PlayInfo; public string? SourceLink { get; } public PlayInfoEventArgs(InvokerData invoker, PlayResource playResource, string? sourceLink) { Invoker = invoker; PlayResource = playResource; SourceLink = sourceLink; } } } ================================================ FILE: TS3AudioBot/Audio/PlayManager.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using TS3AudioBot.Config; using TS3AudioBot.Environment; using TS3AudioBot.Helper; using TS3AudioBot.Localization; using TS3AudioBot.Playlists; using TS3AudioBot.ResourceFactories; using TSLib.Helper; namespace TS3AudioBot.Audio { /// Provides a convenient inferface for enqueing, playing and registering song events. public class PlayManager { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private readonly ConfBot confBot; private readonly Player playerConnection; private readonly PlaylistManager playlistManager; private readonly ResolveContext resourceResolver; private readonly Stats stats; public PlayInfoEventArgs? CurrentPlayData { get; private set; } public bool IsPlaying => CurrentPlayData != null; public event AsyncEventHandler? OnResourceUpdated; public event AsyncEventHandler? BeforeResourceStarted; public event AsyncEventHandler? AfterResourceStarted; public event AsyncEventHandler? ResourceStopped; public event AsyncEventHandler? PlaybackStopped; public PlayManager(ConfBot config, Player playerConnection, PlaylistManager playlistManager, ResolveContext resourceResolver, Stats stats) { confBot = config; this.playerConnection = playerConnection; this.playlistManager = playlistManager; this.resourceResolver = resourceResolver; this.stats = stats; } public Task Enqueue(InvokerData invoker, AudioResource ar, PlayInfo? meta = null) => Enqueue(invoker, new PlaylistItem(ar, meta)); public async Task Enqueue(InvokerData invoker, string message, string? audioType = null, PlayInfo? meta = null) { PlayResource playResource; try { playResource = await resourceResolver.Load(message, audioType); } catch { stats.TrackSongLoad(audioType, false, true); throw; } await Enqueue(invoker, PlaylistItem.From(playResource).MergeMeta(meta)); } public Task Enqueue(InvokerData invoker, IEnumerable items) { var startOff = playlistManager.CurrentList.Items.Count; playlistManager.Queue(items.Select(x => UpdateItem(invoker, x))); return PostEnqueue(invoker, startOff); } public Task Enqueue(InvokerData invoker, PlaylistItem item) { var startOff = playlistManager.CurrentList.Items.Count; playlistManager.Queue(UpdateItem(invoker, item)); return PostEnqueue(invoker, startOff); } private static PlaylistItem UpdateItem(InvokerData invoker, PlaylistItem item) { item.PlayInfo ??= new PlayInfo(); item.PlayInfo.ResourceOwnerUid = invoker.ClientUid; return item; } private async Task PostEnqueue(InvokerData invoker, int startIndex) { if (IsPlaying) return; playlistManager.Index = startIndex; await StartCurrent(invoker); } /// Tries to play the passed /// The invoker of this resource. Used for responses and association. /// The resource to load and play. /// Allows overriding certain settings for the resource. Can be null. /// Ok if successful, or an error message otherwise. public async Task Play(InvokerData invoker, AudioResource ar, PlayInfo? meta = null) { if (ar is null) throw new ArgumentNullException(nameof(ar)); PlayResource playResource; try { playResource = await resourceResolver.Load(ar); } catch { stats.TrackSongLoad(ar.AudioType, false, true); throw; } await Play(invoker, playResource.MergeMeta(meta)); } /// Tries to play the passed link. /// The invoker of this resource. Used for responses and association. /// The link to resolve, load and play. /// The associated resource type string to a factory. /// Allows overriding certain settings for the resource. Can be null. /// Ok if successful, or an error message otherwise. public async Task Play(InvokerData invoker, string link, string? audioType = null, PlayInfo? meta = null) { PlayResource playResource; try { playResource = await resourceResolver.Load(link, audioType); } catch { stats.TrackSongLoad(audioType, false, true); throw; } await Play(invoker, playResource.MergeMeta(meta)); } public Task Play(InvokerData invoker, IEnumerable items, int index = 0) { playlistManager.Clear(); playlistManager.Queue(items.Select(x => UpdateItem(invoker, x))); playlistManager.Index = index; return StartCurrent(invoker); } public Task Play(InvokerData invoker, PlaylistItem item) { if (item is null) throw new ArgumentNullException(nameof(item)); if (item.AudioResource is null) throw new Exception("Invalid playlist item"); playlistManager.Clear(); playlistManager.Queue(item); playlistManager.Index = 0; return StartResource(invoker, item); } public Task Play(InvokerData invoker) => StartCurrent(invoker); /// Plays the passed /// The invoker of this resource. Used for responses and association. /// The associated resource type string to a factory. /// Allows overriding certain settings for the resource. /// Ok if successful, or an error message otherwise. public Task Play(InvokerData invoker, PlayResource play) { playlistManager.Clear(); playlistManager.Queue(PlaylistItem.From(play)); playlistManager.Index = 0; stats.TrackSongLoad(play.AudioResource.AudioType, true, true); return StartResource(invoker, play); } private async Task StartResource(InvokerData invoker, PlaylistItem item) { PlayResource playResource; try { playResource = await resourceResolver.Load(item.AudioResource); } catch { stats.TrackSongLoad(item.AudioResource.AudioType, false, false); throw; } stats.TrackSongLoad(item.AudioResource.AudioType, true, false); await StartResource(invoker, playResource.MergeMeta(item.PlayInfo)); } private async Task StartResource(InvokerData invoker, PlayResource play) { var sourceLink = resourceResolver.RestoreLink(play.AudioResource); var playInfo = new PlayInfoEventArgs(invoker, play, sourceLink); await BeforeResourceStarted.InvokeAsync(this, playInfo); if (string.IsNullOrWhiteSpace(play.PlayUri)) { Log.Error("Internal resource error: link is empty (resource:{0})", play); throw Error.LocalStr(strings.error_playmgr_internal_error); } Log.Debug("AudioResource start: {0}", play); try { await playerConnection.Play(play); } catch (AudioBotException ex) { Log.Error("Error return from player: {0}", ex.Message); throw Error.Exception(ex).LocalStr(strings.error_playmgr_internal_error); } playerConnection.Volume = Tools.Clamp(playerConnection.Volume, confBot.Audio.Volume.Min, confBot.Audio.Volume.Max); CurrentPlayData = playInfo; // TODO meta as readonly await AfterResourceStarted.InvokeAsync(this, playInfo); } private async Task StartCurrent(InvokerData invoker, bool manually = true) { var pli = playlistManager.Current; if (pli is null) throw Error.LocalStr(strings.error_playlist_is_empty); try { await StartResource(invoker, pli); } catch (AudioBotException ex) { Log.Warn("Skipping: {0} because {1}", pli, ex.Message); await Next(invoker, manually); } } public async Task Next(InvokerData invoker, bool manually = true) { PlaylistItem? pli = null; for (int i = 0; i < 10; i++) { pli = playlistManager.Next(manually); if (pli is null) break; try { await StartResource(invoker, pli); return; } catch (AudioBotException ex) { Log.Warn("Skipping: {0} because {1}", pli, ex.Message); } } if (pli is null) throw Error.LocalStr(strings.info_playmgr_no_next_song); else throw Error.LocalStr(string.Format(strings.error_playmgr_many_songs_failed, "!next")); } public async Task Previous(InvokerData invoker, bool manually = true) { PlaylistItem? pli = null; for (int i = 0; i < 10; i++) { pli = playlistManager.Previous(manually); if (pli is null) break; try { await StartResource(invoker, pli); return; } catch (AudioBotException ex) { Log.Warn("Skipping: {0} because {1}", pli, ex.Message); } } if (pli is null) throw Error.LocalStr(strings.info_playmgr_no_previous_song); else throw Error.LocalStr(string.Format(strings.error_playmgr_many_songs_failed, "!previous")); } public async Task SongStoppedEvent(object? sender, EventArgs e) => await StopInternal(true); public Task Stop() => StopInternal(false); private async Task StopInternal(bool songEndedByCallback) { await ResourceStopped.InvokeAsync(this, new SongEndEventArgs(songEndedByCallback)); if (songEndedByCallback) { try { await Next(CurrentPlayData?.Invoker ?? InvokerData.Anonymous, false); return; } catch (AudioBotException ex) { Log.Info("Song queue ended: {0}", ex.Message); } } else { playerConnection.Stop(); } CurrentPlayData = null; PlaybackStopped?.Invoke(this, EventArgs.Empty); } public async Task Update(SongInfoChanged newInfo) { var data = CurrentPlayData; if (data is null) return; if (newInfo.Title != null) data.ResourceData.ResourceTitle = newInfo.Title; // further properties... try { await OnResourceUpdated.InvokeAsync(this, data); } catch (AudioBotException ex) { Log.Warn(ex, "Error in OnResourceUpdated event."); } } public static PlayInfo? ParseAttributes(string[] attrs) { if (attrs is null || attrs.Length == 0) return null; var meta = new PlayInfo(); foreach (var attr in attrs) { if (attr.StartsWith("@")) { meta.StartOffset = TextUtil.ParseTime(attr.Substring(1)); } } return meta; } } } ================================================ FILE: TS3AudioBot/Audio/Player.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Threading.Tasks; using TS3AudioBot.Config; using TS3AudioBot.Helper; using TS3AudioBot.ResourceFactories; using TSLib; using TSLib.Audio; using TSLib.Helper; using TSLib.Scheduler; namespace TS3AudioBot.Audio { public class Player : IDisposable { private const Codec SendCodec = Codec.OpusMusic; private readonly DedicatedTaskScheduler scheduler; public IPlayerSource? CurrentPlayerSource { get; private set; } public StallCheckPipe StallCheckPipe { get; } public VolumePipe VolumePipe { get; } public FfmpegProducer FfmpegProducer { get; } public PreciseTimedPipe TimePipe { get; } public PassiveMergePipe MergePipe { get; } public EncoderPipe EncoderPipe { get; } public IAudioPassiveConsumer? PlayerSink { get; private set; } public Player(ConfRoot confRoot, ConfBot config, DedicatedTaskScheduler scheduler, Id id) { this.scheduler = scheduler; FfmpegProducer = new FfmpegProducer(confRoot.Tools.Ffmpeg, scheduler, id); StallCheckPipe = new StallCheckPipe(); VolumePipe = new VolumePipe(); Volume = config.Audio.Volume.Default; EncoderPipe = new EncoderPipe(SendCodec) { Bitrate = ScaleBitrate(config.Audio.Bitrate) }; TimePipe = new PreciseTimedPipe(EncoderPipe, id) { ReadBufferSize = EncoderPipe.PacketSize }; MergePipe = new PassiveMergePipe(); config.Audio.Bitrate.Changed += (s, e) => EncoderPipe.Bitrate = ScaleBitrate(e.NewValue); MergePipe.Into(TimePipe).Chain().Chain(StallCheckPipe).Chain(VolumePipe).Chain(EncoderPipe); } public void SetTarget(IAudioPassiveConsumer target) { PlayerSink = target; EncoderPipe.Chain(target); } private static int ScaleBitrate(int value) => Tools.Clamp(value, 1, 255) * 1000; public event AsyncEventHandler? OnSongEnd; public event AsyncEventHandler? OnSongUpdated; private void TriggerSongEnd(object? o, EventArgs e) => scheduler.InvokeAsync(() => OnSongEnd.InvokeAsync(this, EventArgs.Empty)); private void TriggerSongUpdated(object? o, SongInfoChanged e) => scheduler.InvokeAsync(() => OnSongUpdated.InvokeAsync(this, e)); public async Task Play(PlayResource res) { if (res is MediaPlayResource mres && mres.IsIcyStream) await FfmpegProducer.AudioStartIcy(res.PlayUri); else await FfmpegProducer.AudioStart(res.PlayUri, res.PlayInfo?.StartOffset); Play(FfmpegProducer); } public void Play(IPlayerSource source) { var oldSource = CurrentPlayerSource; if (oldSource != source) { // Clean up old CleanSource(oldSource); // Set events source.OnSongEnd += TriggerSongEnd; source.OnSongUpdated += TriggerSongUpdated; // Update pipes MergePipe.Add(source); CurrentPlayerSource = source; } // Start Ticker TimePipe.AudioTimer.Reset(); TimePipe.Paused = false; } private void CleanSource(IPlayerSource? source) { if (source is null) return; source.OnSongEnd -= TriggerSongEnd; source.OnSongUpdated -= TriggerSongUpdated; MergePipe.Remove(source); source.Dispose(); } public void Stop() { CurrentPlayerSource?.Dispose(); if (MergePipe.Count <= 1) TimePipe.Paused = true; } public void StopAll() { Stop(); TimePipe.Paused = true; MergePipe.Dispose(); } public TimeSpan? Length => CurrentPlayerSource?.Length; public TimeSpan? Position => CurrentPlayerSource?.Position; public Task Seek(TimeSpan position) => CurrentPlayerSource?.Seek(position) ?? Task.CompletedTask; public float Volume { get => AudioValues.FactorToHumanVolume(VolumePipe.Volume); set => VolumePipe.Volume = AudioValues.HumanVolumeToFactor(value); } public bool Paused { get => TimePipe.Paused; set => TimePipe.Paused = value; } // Extras public void SetStall() => StallCheckPipe.SetStall(); [Obsolete(AttributeStrings.UnderDevelopment)] public void MixInStreamOnce(IPlayerSource producer) { producer.OnSongEnd += (s, e) => { MergePipe.Remove(producer); producer.Dispose(); }; MergePipe.Add(producer); TimePipe.Paused = false; } public void Dispose() { StopAll(); CleanSource(CurrentPlayerSource); TimePipe.Dispose(); FfmpegProducer.Dispose(); EncoderPipe.Dispose(); } } } ================================================ FILE: TS3AudioBot/Audio/SongEndEventArgs.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TS3AudioBot.Audio { public class SongEndEventArgs : EventArgs { public bool SongEndedByCallback { get; } public SongEndEventArgs(bool songEndedByCallback) { SongEndedByCallback = songEndedByCallback; } } } ================================================ FILE: TS3AudioBot/Audio/SongInfoChanged.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TS3AudioBot.Audio { public class SongInfoChanged : EventArgs { public string? Title { get; set; } } } ================================================ FILE: TS3AudioBot/Audio/StallCheckPipe.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using TSLib.Audio; namespace TS3AudioBot.Audio { public class StallCheckPipe : IAudioPipe { private const uint StallCountInterval = 10; private const uint StallNoErrorCountMax = 5; public bool Active => OutStream?.Active ?? false; public IAudioPassiveConsumer? OutStream { get; set; } private bool isStall; private uint stallCount; private uint stallNoErrorCount; public StallCheckPipe() { isStall = false; stallCount = 0; } public void Write(Span data, Meta? meta) { if (OutStream is null) return; if (isStall) { // TODO maybe do time-cooldown instead of call-count-cooldown if (++stallCount % StallCountInterval == 0) { stallNoErrorCount++; if (stallNoErrorCount > StallNoErrorCountMax) { stallCount = 0; isStall = false; } } else { return; } } OutStream?.Write(data, meta); } public void SetStall() { stallNoErrorCount = 0; isStall = true; } } } ================================================ FILE: TS3AudioBot/Audio/StreamAudioPlayerSource.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Threading.Tasks; using TSLib.Audio; namespace TS3AudioBot.Audio { public class StreamAudioPlayerSource : IPlayerSource, IAudioActiveConsumer { private bool hasFired = false; public IAudioPassiveProducer? InStream { get; set; } public TimeSpan? Length => null; public TimeSpan? Position => null; public event EventHandler? OnSongEnd; event EventHandler IPlayerSource.OnSongUpdated { add { } remove { } } public StreamAudioPlayerSource() { } public StreamAudioPlayerSource(IAudioPassiveProducer stream) : this() { InStream = stream; } public int Read(byte[] buffer, int offset, int length, out Meta? meta) { var stream = InStream; if (stream is null) { meta = default; return 0; } var read = stream.Read(buffer, offset, length, out meta); if (read == 0 && !hasFired) { hasFired = true; OnSongEnd?.Invoke(this, EventArgs.Empty); return 0; } return read; } public void Reset() => hasFired = false; public void Dispose() => InStream?.Dispose(); public Task Seek(TimeSpan position) { throw new NotSupportedException(); } } } ================================================ FILE: TS3AudioBot/Bot.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.IO; using System.Linq; using System.Threading.Tasks; using TS3AudioBot.Algorithm; using TS3AudioBot.Audio; using TS3AudioBot.CommandSystem; using TS3AudioBot.CommandSystem.Text; using TS3AudioBot.Config; using TS3AudioBot.Dependency; using TS3AudioBot.Environment; using TS3AudioBot.Helper; using TS3AudioBot.History; using TS3AudioBot.Localization; using TS3AudioBot.Playlists; using TS3AudioBot.Plugins; using TS3AudioBot.ResourceFactories; using TS3AudioBot.Sessions; using TSLib; using TSLib.Full; using TSLib.Helper; using TSLib.Messages; using TSLib.Scheduler; namespace TS3AudioBot { /// Core class managing all bots and utility modules. public sealed class Bot { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private readonly ConfBot config; private readonly TickWorker idleTickWorker; private bool isClosed; internal BotInjector Injector { get; } internal DedicatedTaskScheduler Scheduler { get; } public Id Id { get; } /// This is the template name. Can be null. public string? Name => config.Name; public bool QuizMode { get; set; } private readonly ResolveContext resourceResolver; private readonly Ts3Client ts3client; private readonly TsFullClient ts3FullClient; private readonly SessionManager sessionManager; private readonly PlayManager playManager; private readonly IVoiceTarget targetManager; private readonly Player player; private readonly Stats stats; private readonly LocalizationManager localization; public Bot(Id id, ConfBot config, BotInjector injector) { this.Id = id; this.config = config; this.Injector = injector; // Registering config changes config.Language.Changed += async (s, e) => { var langResult = await localization.LoadLanguage(e.NewValue, true); if (!langResult.Ok) Log.Error("Failed to load language file ({0})", langResult.Error); }; config.Events.IdleDelay.Changed += (s, e) => EnableIdleTickWorker(); config.Events.OnIdle.Changed += (s, e) => EnableIdleTickWorker(); var builder = new DependencyBuilder(Injector); Injector.HideParentModule(); Injector.HideParentModule(); Injector.AddModule(this); Injector.AddModule(config); Injector.AddModule(Injector); Injector.AddModule(config.Playlists); Injector.AddModule(config.History); Injector.AddModule(Id); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); if (config.History.Enabled) { builder.RequestModule(); } builder.RequestModule(); if (!builder.Build()) { Log.Error("Missing bot module dependency"); throw new Exception("Could not load all bot modules"); } Injector.ClearHiddenParentModules(); resourceResolver = Injector.GetModuleOrThrow(); ts3FullClient = Injector.GetModuleOrThrow(); ts3client = Injector.GetModuleOrThrow(); player = Injector.GetModuleOrThrow(); Scheduler = Injector.GetModuleOrThrow(); var customTarget = Injector.GetModuleOrThrow(); player.SetTarget(customTarget); Injector.AddModule(ts3FullClient.Book); playManager = Injector.GetModuleOrThrow(); targetManager = Injector.GetModuleOrThrow(); sessionManager = Injector.GetModuleOrThrow(); stats = Injector.GetModuleOrThrow(); var commandManager = Injector.GetModuleOrThrow(); localization = Injector.GetModuleOrThrow(); idleTickWorker = Scheduler.Invoke(() => Scheduler.CreateTimer(OnIdle, TimeSpan.MaxValue, false)).Result; player.OnSongEnd += playManager.SongStoppedEvent; player.OnSongUpdated += (s, e) => playManager.Update(e); // Update idle status events playManager.BeforeResourceStarted += (s, e) => { DisableIdleTickWorker(); return Task.CompletedTask; }; playManager.PlaybackStopped += (s, e) => { EnableIdleTickWorker(); return Task.CompletedTask; }; // Used for custom scripts, like voice_mode, onsongstart playManager.BeforeResourceStarted += BeforeResourceStarted; playManager.AfterResourceStarted += AfterResourceStarted; // Update the own status text to the current song title playManager.AfterResourceStarted += (s, e) => UpdateBotStatus(); playManager.PlaybackStopped += (s, e) => UpdateBotStatus(); playManager.OnResourceUpdated += (s, e) => UpdateBotStatus(); // Log our resource in the history if (Injector.TryGet(out var historyManager)) playManager.AfterResourceStarted += (s, e) => { if (e.PlayInfo != null) historyManager.LogAudioResource(new HistorySaveData(e.PlayResource.AudioResource, e.PlayInfo.ResourceOwnerUid)); return Task.CompletedTask; }; // Update our thumbnail playManager.AfterResourceStarted += (s, e) => GenerateStatusImage(true, e); playManager.PlaybackStopped += (s, e) => GenerateStatusImage(false, null); // Stats playManager.AfterResourceStarted += (s, e) => { stats.TrackSongStart(Id, e.ResourceData.AudioType); return Task.CompletedTask; }; playManager.ResourceStopped += (s, e) => { stats.TrackSongStop(Id); return Task.CompletedTask; }; // Register callback for all messages happening ts3client.OnMessageReceived += OnMessageReceived; // Register callback to remove open private sessions, when user disconnects ts3FullClient.OnEachClientLeftView += OnClientLeftView; ts3client.OnBotConnected += OnBotConnected; ts3client.OnBotDisconnected += OnBotDisconnected; ts3client.OnBotStoppedReconnecting += OnBotStoppedReconnecting; // Alone mode ts3client.OnAloneChanged += OnAloneChanged; ts3client.OnAloneChanged += (s, e) => { customTarget.Alone = e.Alone; return Task.CompletedTask; }; // Whisper stall ts3client.OnWhisperNoTarget += (s, e) => player.SetStall(); commandManager.RegisterCollection(MainCommands.Bag); // TODO remove after plugin rework var pluginManager = Injector.GetModuleOrThrow(); foreach (var plugin in pluginManager.Plugins) if (plugin.Type == PluginType.CorePlugin || plugin.Type == PluginType.Commands) commandManager.RegisterCollection(plugin.CorePlugin.Bag); // Restore all alias from the config foreach (var alias in config.Commands.Alias.GetAllItems()) commandManager.RegisterAlias(alias.Key, alias.Value).UnwrapToLog(Log); } public Task> Run() { Scheduler.VerifyOwnThread(); Log.Info("Bot \"{0}\" connecting to \"{1}\"", config.Name, config.Connect.Address); return Task.FromResult(ts3client.Connect()); } public async Task Stop() { Scheduler.VerifyOwnThread(); Injector.GetModule()?.RemoveBot(this); if (!isClosed) isClosed = true; else return; Log.Info("Bot ({0}) disconnecting.", Id); DisableIdleTickWorker(); Injector.GetModule()?.StopPlugins(this); Injector.GetModule()?.Stop(); Injector.GetModule()?.Dispose(); var tsClient = Injector.GetModule(); if (tsClient != null) await tsClient.Disconnect(); Injector.GetModule()?.Dispose(); config.ClearEvents(); } private async Task OnBotConnected(object? sender, EventArgs e) { EnableIdleTickWorker(); var badges = config.Connect.Badges.Value; if (!string.IsNullOrEmpty(badges)) ts3client?.ChangeBadges(badges); var onStart = config.Events.OnConnect.Value; if (!string.IsNullOrEmpty(onStart)) { var info = CreateExecInfo(); await CallScript(info, onStart, false, true); } } private async Task OnBotDisconnected(object? sender, DisconnectEventArgs e) { DisableIdleTickWorker(); var onStop = config.Events.OnDisconnect.Value; if (!string.IsNullOrEmpty(onStop)) { var info = CreateExecInfo(); await CallScript(info, onStop, false, true); } } private Task OnBotStoppedReconnecting(object? sender, EventArgs e) { return Stop(); } private async Task OnMessageReceived(object? sender, TextMessage textMessage) { if (textMessage?.Message == null) { Log.Warn("Invalid TextMessage: {@textMessage}", textMessage); return; } Log.Debug("TextMessage: {@textMessage}", textMessage); if (!localization.LanguageLoaded) { var langResult = await localization.LoadLanguage(config.Language, false); if (!langResult.Ok) Log.Error("Failed to load language file ({0})", langResult.Error); } localization.ApplyLanguage(); textMessage.Message = textMessage.Message.TrimStart(' '); if (!textMessage.Message.StartsWith("!", StringComparison.Ordinal)) return; Log.Info("User {0} requested: {1}", textMessage.InvokerName, textMessage.Message); ts3client.InvalidateClientBuffer(); ChannelId? channelId = null; ClientDbId? databaseId = null; ChannelGroupId? channelGroup = null; ServerGroupId[]? serverGroups = null; if (ts3FullClient.Book.Clients.TryGetValue(textMessage.InvokerId, out var bookClient)) { channelId = bookClient.Channel; databaseId = bookClient.DatabaseId; serverGroups = bookClient.ServerGroups.ToArray(); channelGroup = bookClient.ChannelGroup; } else if ((await ts3FullClient.ClientInfo(textMessage.InvokerId)).Get(out var infoClient, out var infoClientError)) { channelId = infoClient.ChannelId; databaseId = infoClient.DatabaseId; serverGroups = infoClient.ServerGroups; channelGroup = infoClient.ChannelGroup; } else { try { var cachedClient = await ts3client.GetCachedClientById(textMessage.InvokerId); channelId = cachedClient.ChannelId; databaseId = cachedClient.DatabaseId; channelGroup = cachedClient.ChannelGroup; } catch (AudioBotException cachedClientError) { Log.Warn( "The bot is missing teamspeak permissions to view the communicating client. " + "Some commands or permission checks might not work " + "(clientlist:{0}, clientinfo:{1}).", cachedClientError.Message, infoClientError.ErrorFormat()); } } var invoker = new ClientCall(textMessage.InvokerUid ?? Uid.Anonymous, textMessage.Message, clientId: textMessage.InvokerId, visibiliy: textMessage.Target, nickName: textMessage.InvokerName, channelId: channelId, databaseId: databaseId, serverGroups: serverGroups, channelGroup: channelGroup); var session = sessionManager.GetOrCreateSession(textMessage.InvokerId); var info = CreateExecInfo(invoker, session); // check if the user has an open request if (session.ResponseProcessor != null) { await TryCatchCommand(info, answer: true, async () => { var msg = await session.ResponseProcessor(textMessage.Message); if (!string.IsNullOrEmpty(msg)) await info.Write(msg).CatchToLog(Log); }); session.ClearResponse(); return; } await CallScript(info, textMessage.Message, answer: true, false); } private void OnClientLeftView(object? sender, ClientLeftView eventArgs) { targetManager.WhisperClientUnsubscribe(eventArgs.ClientId); sessionManager.RemoveSession(eventArgs.ClientId); } private async Task BeforeResourceStarted(object? sender, PlayInfoEventArgs e) { const string DefaultVoiceScript = "!whisper off"; const string DefaultWhisperScript = "!xecute (!whisper subscription) (!unsubscribe temporary) (!subscribe channeltemp (!getmy channel))"; var mode = config.Audio.SendMode.Value; string script; if (mode.StartsWith("!", StringComparison.Ordinal)) script = mode; else if (mode.Equals("voice", StringComparison.OrdinalIgnoreCase)) script = DefaultVoiceScript; else if (mode.Equals("whisper", StringComparison.OrdinalIgnoreCase)) script = DefaultWhisperScript; else { Log.Error("Invalid voice mode"); return; } var info = CreateExecInfo(e.Invoker); await CallScript(info, script, false, true); } private async Task AfterResourceStarted(object? sender, PlayInfoEventArgs e) { var onSongStart = config.Events.OnSongStart.Value; if (!string.IsNullOrEmpty(onSongStart)) { var info = CreateExecInfo(); await CallScript(info, onSongStart, false, true); } } #region Status: Description, Avatar public Task UpdateBotStatus() { return Scheduler.InvokeAsync(UpdateBotStatusInternal); } private async Task UpdateBotStatusInternal() { Scheduler.VerifyOwnThread(); if (isClosed) return; if (!config.SetStatusDescription) return; string? setString; if (playManager.IsPlaying) { setString = QuizMode ? strings.info_botstatus_quiztime : playManager.CurrentPlayData?.ResourceData?.ResourceTitle; } else { setString = strings.info_botstatus_sleeping; } } public Task GenerateStatusImage(bool playing, PlayInfoEventArgs? startEvent) { return Scheduler.InvokeAsync(() => GenerateStatusImageInternal(playing, startEvent)); } private async Task GenerateStatusImageInternal(bool playing, PlayInfoEventArgs? startEvent) { Scheduler.VerifyOwnThread(); if (!config.GenerateStatusAvatar || isClosed) return; static Stream? GetRandomFile(string? basePath, string prefix) { try { if (string.IsNullOrEmpty(basePath)) return null; var avatarPath = new DirectoryInfo(Path.Combine(basePath, BotPaths.Avatars)); if (!avatarPath.Exists) return null; var avatars = avatarPath.EnumerateFiles(prefix).ToArray(); if (avatars.Length == 0) return null; var pickedAvatar = Tools.PickRandom(avatars); return pickedAvatar.Open(FileMode.Open, FileAccess.Read, FileShare.Read); } catch (Exception ex) { Log.Warn(ex, "Failed to load local avatar"); return null; } } Stream? setStream = null; if (playing) { if (startEvent != null && !QuizMode) { try { await resourceResolver.GetThumbnail(startEvent.PlayResource, async thumbStream => setStream = (await ImageUtil.ResizeImageSave(thumbStream)).Stream); } catch (AudioBotException ex) { Log.Debug(ex, "Failed to fetch thumbnail image"); } } setStream ??= GetRandomFile(config.LocalConfigDir, "play*"); } else { setStream ??= GetRandomFile(config.LocalConfigDir, "sleep*"); setStream ??= Util.GetEmbeddedFile("TS3AudioBot.Media.SleepingKitty.png"); var result = await ts3FullClient.UploadAvatar(setStream); result.UnwrapToLog(Log); } if (setStream != null) { } else { var result = await ts3FullClient.DeleteAvatar(); result.UnwrapToLog(Log); } } #endregion #region Script Execution private async Task CallScript(ExecutionInformation info, string command, bool answer, bool skipRights) { Log.Debug("Calling script (skipRights:{0}, answer:{1}): {2}", skipRights, answer, command); stats.TrackCommandCall(answer); info.AddModule(new CallerInfo(false) { SkipRightsChecks = skipRights, CommandComplexityMax = config.Commands.CommandComplexity, IsColor = config.Commands.Color, }); await TryCatchCommand(info, answer, async () => { // parse and execute the command var res = await CommandManager.Execute(info, command); if (!answer) return; // Write result to user var s = res.AsString(); if (!string.IsNullOrEmpty(s)) await info.Write(s).CatchToLog(Log); }); } private ExecutionInformation CreateExecInfo(InvokerData? invoker = null, UserSession? session = null) { var info = new ExecutionInformation(Injector); if (invoker is ClientCall ci) info.AddModule(ci); info.AddModule(invoker ?? InvokerData.Anonymous); info.AddModule(session ?? new AnonymousSession()); info.AddModule(Filter.GetFilterByNameOrDefault(config.Commands.Matcher)); return info; } private async Task TryCatchCommand(ExecutionInformation info, bool answer, Func action) { try { await action.Invoke(); } catch (AudioBotException ex) { NLog.LogLevel commandErrorLevel = answer ? NLog.LogLevel.Debug : NLog.LogLevel.Warn; Log.Log(commandErrorLevel, ex, "Command Error ({0})", ex.Message); if (answer) { await info.Write(TextMod.Format(config.Commands.Color, strings.error_call_error.Mod().Color(Color.Red).Bold(), ex.Message)) .CatchToLog(Log); } } catch (Exception ex) { Log.Error(ex, "Unexpected command error: {0}", ex.Message); if (answer) { await info.Write(TextMod.Format(config.Commands.Color, strings.error_call_unexpected_error.Mod().Color(Color.Red).Bold(), ex.Message)) .CatchToLog(Log); } } } #endregion #region Event: Idle private async void OnIdle() { // DisableIdleTickWorker(); // fire once only ?? var onIdle = config.Events.OnIdle.Value; if (!string.IsNullOrEmpty(onIdle)) { var info = CreateExecInfo(); await CallScript(info, onIdle, false, true); } } private void EnableIdleTickWorker() { var idleTime = config.Events.IdleDelay.Value; if (idleTime <= TimeSpan.Zero || string.IsNullOrEmpty(config.Events.OnIdle.Value)) { DisableIdleTickWorker(); return; } idleTickWorker.Interval = idleTime; idleTickWorker.Enable(); } private void DisableIdleTickWorker() => idleTickWorker.Disable(); #endregion #region Event: Alone/Party private async Task OnAloneChanged(object? sender, AloneChanged e) { Scheduler.VerifyOwnThread(); string script; TimeSpan delay; if (e.Alone) { script = config.Events.OnAlone.Value; delay = config.Events.AloneDelay.Value; } else { script = config.Events.OnParty.Value; delay = config.Events.PartyDelay.Value; } if (string.IsNullOrEmpty(script)) return; if (delay > TimeSpan.Zero) // TODO: Async (Add cancellation token for better consistency) await Task.Delay(delay); var info = CreateExecInfo(); await CallScript(info, script, false, true); } #endregion public BotInfo GetInfo() => new BotInfo { Id = Id, Name = config.Name, Server = ts3FullClient.ConnectionData?.Address, Status = ts3FullClient.Connected ? BotStatus.Connected : BotStatus.Connecting, }; } public class BotInfo { public int? Id { get; set; } public string? Name { get; set; } public string? Server { get; set; } public BotStatus Status { get; set; } public override string ToString() => $"Id: {Id} Name: {Name} Server: {Server} Status: {Status}"; // LOC: TODO } public enum BotStatus { Offline, Connecting, Connected, } } ================================================ FILE: TS3AudioBot/BotManager.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using TS3AudioBot.Config; using TS3AudioBot.Dependency; using TS3AudioBot.Helper; using TSLib; using TSLib.Helper; namespace TS3AudioBot { public class BotManager { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private List? activeBots = new List(); private readonly object lockObj = new object(); private readonly ConfRoot confRoot; private readonly CoreInjector coreInjector; public BotManager(ConfRoot confRoot, CoreInjector coreInjector) { this.confRoot = confRoot; this.coreInjector = coreInjector; } public async Task RunBots(bool interactive) { var botConfigList = confRoot.GetAllBots(); if (botConfigList is null) return; if (botConfigList.Length == 0) { if (!interactive) { Log.Warn("No bots are configured in the load list."); return; } Console.WriteLine("It seems like there are no bots configured."); Console.WriteLine("Fill out this quick setup to get started."); var newBot = CreateNewBot(); newBot.Run.Value = true; var address = await Interactive.LoopActionAsync("Please enter the ip, domain or nickname (with port; default: 9987) where to connect to:", async addr => { if (await TsDnsResolver.TryResolve(addr) != null) return true; Console.WriteLine("The address seems invalid or could not be resolved, continue anyway? [y/N]"); return Interactive.UserAgree(defaultTo: false); }); if (address is null) return; newBot.Connect.Address.Value = address; Console.WriteLine("Please enter the server password (or leave empty for none):"); newBot.Connect.ServerPassword.Password.Value = Console.ReadLine(); if (!newBot.SaveNew(ConfigHelper.DefaultBotName)) { Log.Error("Could not save new bot. Ensure that the bot has access to the directory."); return; } if (!confRoot.Save()) Log.Error("Could not save root config. The bot won't start by default."); var runResult = await RunBot(newBot); if (!runResult.Ok) Log.Error("Could not run bot ({0})", runResult.Error); return; } var launchBotTasks = new List>>(botConfigList.Length); foreach (var instance in botConfigList) { if (!instance.Run) continue; launchBotTasks.Add(RunBot(instance).ContinueWith(async t => { var result = await t; if (!result.Ok) { Log.Error("Could not instantiate bot: {0}", result.Error); } return result; }).Unwrap()); } await Task.WhenAll(launchBotTasks); } public ConfBot CreateNewBot() => confRoot.CreateBot(); public Task> CreateAndRunNewBot() { var botConf = CreateNewBot(); return RunBot(botConf); } public async Task> RunBotTemplate(string name) { var config = confRoot.GetBotConfig(name); if (!config.Ok) return config.Error.Message; return await RunBot(config.Value); } public async Task> RunBot(ConfBot config) { var (bot, info) = InstantiateNewBot(config); if (info != null) return info; if (bot is null) return "Failed to create new Bot"; return await bot.Scheduler.InvokeAsync>(async () => { var initializeResult = await bot.Run(); if (!initializeResult.Ok) { await StopBot(bot); return $"Bot failed to initialize ({initializeResult.Error})"; } return bot.GetInfo(); }); } private (Bot? bot, BotInfo? info) InstantiateNewBot(ConfBot config) { lock (lockObj) { if (!string.IsNullOrEmpty(config.Name)) { var maybeBot = GetBotSave(config.Name); if (maybeBot != null) return (null, maybeBot.GetInfo()); } var id = GetFreeId(); if (id == null) return (null, null); // "BotManager is shutting down" var botInjector = new BotInjector(coreInjector); botInjector.AddModule(botInjector); botInjector.AddModule(new Id(id.Value)); botInjector.AddModule(config); if (!botInjector.TryCreate(out var bot)) return (null, null); // "Failed to create new Bot" InsertBot(bot); return (bot, null); } } // !! This method must be called with a lock on lockObj private void InsertBot(Bot bot) { if (activeBots is null) return; activeBots[bot.Id] = bot; } // !! This method must be called with a lock on lockObj // !! The id must be either used withing the same lock or considered invalid. private int? GetFreeId() { if (activeBots is null) return null; for (int i = 0; i < activeBots.Count; i++) { if (activeBots[i] is null) { return i; } } // All slots are full, get a new slot activeBots.Add(null); return activeBots.Count - 1; } // !! This method must be called with a lock on lockObj private Bot? GetBotSave(int id) { if (activeBots is null || id < 0 || id >= activeBots.Count) return null; return activeBots[id]; } // !! This method must be called with a lock on lockObj private Bot? GetBotSave(string name) { if (name is null) throw new ArgumentNullException(nameof(name)); if (activeBots is null) return null; return activeBots.Find(x => x?.Name == name); } public Bot? GetBotLock(int id) { Bot? bot; lock (lockObj) { bot = GetBotSave(id); if (bot is null) return null; if (bot.Id != id) throw new Exception("Got not matching bot id"); } return bot; } public Bot? GetBotLock(string name) { Bot? bot; lock (lockObj) { bot = GetBotSave(name); if (bot is null) return null; if (bot.Name != name) throw new Exception("Got not matching bot name"); } return bot; } internal void IterateAll(Action body) { lock (lockObj) { if (activeBots is null) return; foreach (var bot in activeBots) { if (bot is null) continue; body(bot); } } } public async Task StopBot(Bot bot) { RemoveBot(bot); await bot.Scheduler.InvokeAsync(async () => await bot.Stop()); } internal void RemoveBot(Bot bot) { lock (lockObj) { Bot? botInList; if (activeBots != null && (botInList = GetBotSave(bot.Id)) != null && botInList == bot) { activeBots[bot.Id] = null; } } } public BotInfo[] GetBotInfolist() { lock (lockObj) { if (activeBots is null) return Array.Empty(); return activeBots.Where(x => x != null).Select(x => x!.GetInfo()).ToArray(); } } public uint GetRunningBotCount() { lock (lockObj) { if (activeBots is null) return 0; return (uint)activeBots.Count(x => x != null); } } public async Task StopBots() { List disposeBots; lock (lockObj) { if (activeBots is null) return; disposeBots = activeBots; activeBots = null; } await Task.WhenAll(disposeBots.Where(x => x != null).Select(x => StopBot(x!))); } } } ================================================ FILE: TS3AudioBot/CallerInfo.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot { public class CallerInfo { /// Whether this call was initiated from the api. public bool ApiCall { get; } /// Skips all permission checks when set to true. public bool SkipRightsChecks { get; set; } = false; /// Counts execution token for a single call to prevent endless loops. public int CommandComplexityCurrent { get; set; } = 0; /// The maximum execution token count for a single call. public int CommandComplexityMax { get; set; } = 0; /// Whether the caller wants a colored output. public bool IsColor { get; set; } public CallerInfo(bool isApi) { ApiCall = isApi; } } } ================================================ FILE: TS3AudioBot/ClientCall.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using TSLib; namespace TS3AudioBot { public class ClientCall : InvokerData { /// The original unmodified string which was received by the client. public string TextMessage { get; } public ClientDbId? DatabaseId { get; } public ChannelId? ChannelId { get; } public ClientId? ClientId { get; } public string? NickName { get; } public ServerGroupId[]? ServerGroups { get; } public ChannelGroupId? ChannelGroup { get; } public TextMessageTargetMode? Visibiliy { get; internal set; } public ClientCall(Uid clientUid, string textMessage, ClientDbId? databaseId = null, ChannelId? channelId = null, ClientId? clientId = null, string? nickName = null, TextMessageTargetMode? visibiliy = null, ServerGroupId[]? serverGroups = null, ChannelGroupId? channelGroup = null) : base(clientUid) { TextMessage = textMessage; DatabaseId = databaseId; ChannelId = channelId; ClientId = clientId; NickName = nickName; Visibiliy = visibiliy; ServerGroups = serverGroups; ChannelGroup = channelGroup; } } } ================================================ FILE: TS3AudioBot/CommandSystem/Ast/AstCommand.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using System.Text; namespace TS3AudioBot.CommandSystem.Ast { internal class AstCommand : AstNode { public override AstType Type => AstType.Command; public List Parameter { get; } = new List(); public AstCommand(string fullRequest) : base(fullRequest) { } public override void Write(StringBuilder strb, int depth) { strb.Space(depth); if (Parameter.Count == 0) { strb.Append(""); } else { if (Parameter[0] is AstValue comName) strb.Append("!").Append(comName.Value); else strb.Append(""); for (int i = 1; i < Parameter.Count; i++) { strb.AppendLine(); Parameter[i].Write(strb, depth + 1); } } } } } ================================================ FILE: TS3AudioBot/CommandSystem/Ast/AstError.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Text; namespace TS3AudioBot.CommandSystem.Ast { internal class AstError : AstNode { public override AstType Type => AstType.Error; public string Description { get; } public AstError(AstNode referenceNode, string description) : this(referenceNode.FullRequest, referenceNode.Position, referenceNode.Length, description) { } public AstError(string request, int pos, int len, string description) : base(request) { Position = pos; Length = len; Description = description; } public override void Write(StringBuilder strb, int depth) { strb.AppendLine(FullRequest); if (Position == 1) strb.Append('.'); else if (Position > 1) strb.Append(' ', Position); strb.Append('~', Length).Append('^').AppendLine(); strb.Append("Error: ").AppendLine(Description); } } } ================================================ FILE: TS3AudioBot/CommandSystem/Ast/AstNode.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Text; namespace TS3AudioBot.CommandSystem.Ast { public abstract class AstNode { public abstract AstType Type { get; } public string FullRequest { get; } public int Position { get; set; } public int Length { get; set; } protected AstNode(string fullRequest) { FullRequest = fullRequest; } public abstract void Write(StringBuilder strb, int depth); public sealed override string ToString() { var strb = new StringBuilder(); Write(strb, 0); return strb.ToString(); } } internal static class AstNodeExtensions { public const int SpacePerTab = 2; public static StringBuilder Space(this StringBuilder strb, int depth) => strb.Append(' ', depth * SpacePerTab); } } ================================================ FILE: TS3AudioBot/CommandSystem/Ast/AstType.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.CommandSystem.Ast { public enum AstType { Command, Value, Error, } } ================================================ FILE: TS3AudioBot/CommandSystem/Ast/AstValue.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Text; namespace TS3AudioBot.CommandSystem.Ast { internal class AstValue : AstNode { private string? value; private string? tailString; public override AstType Type => AstType.Value; public StringType StringType { get; } public int TailLength { get; set; } public string Value { get => value ??= FullRequest.Substring(Position, Length); set { this.value = value; tailString = value; } } public string TailString { get { if (tailString is null) { if (TailLength == 0) tailString = FullRequest.Substring(Position); else tailString = FullRequest.Substring(Position, TailLength); } return tailString; } } public AstValue(string fullRequest, StringType stringType) : base(fullRequest) { StringType = stringType; } public override void Write(StringBuilder strb, int depth) => strb.Space(depth).Append(Value); } } ================================================ FILE: TS3AudioBot/CommandSystem/Ast/StringType.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.CommandSystem.Ast { internal enum StringType { FreeString, QuotedString, } } ================================================ FILE: TS3AudioBot/CommandSystem/BotCommand.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using TS3AudioBot.CommandSystem.Commands; using TS3AudioBot.Localization; namespace TS3AudioBot.CommandSystem { [DebuggerDisplay("{DebuggerDisplay, nq}")] [JsonObject(MemberSerialization.OptIn)] public class BotCommand : FunctionCommand { private readonly string helpLookupName; private string? cachedFullQualifiedName; [JsonProperty(PropertyName = "Name")] public string InvokeName { get; } private readonly string[] requiredRights; public string RequiredRight => requiredRights[0]; [JsonProperty(PropertyName = "Description")] public string? Description => LocalizationManager.GetString(helpLookupName); public UsageAttribute[] UsageList { get; } public string FullQualifiedName { get { if (cachedFullQualifiedName is null) { var strb = new StringBuilder(); strb.Append(InvokeName); strb.Append(" ("); strb.Append(string.Join(", ", CommandParameter.Where(p => !p.Kind.IsNormal()).Select(p => p.Type.FullName).OrderBy(p => p))); strb.Append("|"); strb.Append(string.Join(", ", CommandParameter.Where(p => p.Kind.IsNormal()).Select(p => p.Type.FullName))); strb.Append(")"); cachedFullQualifiedName = strb.ToString(); } return cachedFullQualifiedName; } } [JsonProperty(PropertyName = "Return")] public string Return { get; set; } [JsonProperty(PropertyName = "Parameter")] public (string name, string type, bool optional)[] Parameter { get; } [JsonProperty(PropertyName = "Modules")] public (string type, bool optional)[] Modules { get; } public string DebuggerDisplay { get { var strb = new StringBuilder(); strb.Append('!').Append(InvokeName); strb.Append(" : "); foreach (var param in UsageList) strb.Append(param.UsageSyntax).Append('/'); return strb.ToString(); } } public BotCommand(CommandBuildInfo buildInfo) : base(buildInfo.Method, buildInfo.Parent) { InvokeName = buildInfo.CommandData.CommandNameSpace; helpLookupName = buildInfo.CommandData.OverrideHelpName ?? ("cmd_" + InvokeName.Replace(" ", "_") + "_help"); requiredRights = new[] { "cmd." + string.Join(".", InvokeName.Split(' ')) }; UsageList = buildInfo.UsageList; // Serialization Return = UnwrapReturnType(CommandReturn).Name; Parameter = ( from x in CommandParameter where x.Kind.IsNormal() select (x.Name, UnwrapParamType(x.Type).Name, x.Optional)).ToArray(); Modules = ( from x in CommandParameter where x.Kind == ParamKind.Dependency select (x.Type.Name, x.Optional)).ToArray(); } public override string ToString() { var strb = new StringBuilder(); strb.Append("\n!") .Append(InvokeName); foreach (var (name, _, optional) in Parameter) { strb.Append(' '); if (optional) strb.Append("[<").Append(name).Append(">]"); else strb.Append('<').Append(name).Append('>'); } strb.Append(": ") .Append(Description ?? strings.error_no_help ?? ""); if (UsageList.Length > 0) { int longest = UsageList.Max(p => p.UsageSyntax.Length) + 1; foreach (var para in UsageList) strb.Append("\n!").Append(InvokeName).Append(" ").Append(para.UsageSyntax) .Append(' ', longest - para.UsageSyntax.Length).Append(para.UsageHelp); } return strb.ToString(); } public override async ValueTask Execute(ExecutionInformation info, IReadOnlyList arguments) { // Check call complexity info.UseComplexityTokens(1); // Check permissions if (!await info.HasRights(requiredRights)) throw new CommandException(string.Format(strings.error_missing_right, InvokeName, RequiredRight), CommandExceptionReason.MissingRights); return await base.Execute(info, arguments); } } public class CommandBuildInfo { public object? Parent { get; } public MethodInfo Method { get; } public CommandAttribute CommandData { get; } public UsageAttribute[] UsageList { get; set; } public CommandBuildInfo(object? p, MethodInfo m, CommandAttribute comAtt) { Parent = p; Method = m; if (!m.IsStatic && p is null) throw new ArgumentException("Got instance method without accociated object"); CommandData = comAtt; UsageList = Array.Empty(); } } } ================================================ FILE: TS3AudioBot/CommandSystem/CommandAttribute.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TS3AudioBot.CommandSystem { /// /// Marks a method as callable from the CommandSystem. /// The containing class must be registered in the CommandSystem to use this method. /// [AttributeUsage(AttributeTargets.Method, Inherited = false)] public sealed class CommandAttribute : Attribute { public string CommandNameSpace { get; } public string? OverrideHelpName { get; } public CommandAttribute(string commandNameSpace, string? overrideHelpName = null) { CommandNameSpace = commandNameSpace; OverrideHelpName = overrideHelpName; } } /// /// Gives an example on how to use this method. /// Can be used to clarify different functionality from various overloads. /// [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)] public sealed class UsageAttribute : Attribute { public string UsageSyntax { get; } public string UsageHelp { get; } public UsageAttribute(string syntax, string help) { UsageSyntax = syntax; UsageHelp = help; } } } ================================================ FILE: TS3AudioBot/CommandSystem/CommandException.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Runtime.Serialization; using TSLib.Messages; namespace TS3AudioBot.CommandSystem { [Serializable] public class CommandException : AudioBotException { public CommandExceptionReason Reason { get; } protected CommandException() : this(CommandExceptionReason.Unknown) { } public CommandException(string message) : base(message) { Reason = CommandExceptionReason.CommandError; } protected CommandException(CommandExceptionReason reason) { Reason = reason; } public CommandException(string message, CommandExceptionReason reason) : base(message) { Reason = reason; } public CommandException(string message, Exception inner, CommandExceptionReason reason) : base(message, inner) { Reason = reason; } protected CommandException(SerializationInfo info, StreamingContext context) : base(info, context) { } } [Serializable] public class MissingContextCommandException : CommandException { public Type MissingType { get; } protected MissingContextCommandException(Type missingType) : base(CommandExceptionReason.MissingContext) { MissingType = missingType; } public MissingContextCommandException(string message, Type missingType) : base(message, CommandExceptionReason.MissingContext) { MissingType = missingType; } public MissingContextCommandException(string message, Exception inner, Type missingType) : base(message, inner, CommandExceptionReason.MissingContext) { MissingType = missingType; } } [Serializable] public class TeamSpeakErrorCommandException : CommandException { public CommandError Error { get; } protected TeamSpeakErrorCommandException(CommandError error) : base(CommandExceptionReason.MissingContext) { Error = error; } public TeamSpeakErrorCommandException(string message, CommandError error) : base(message, CommandExceptionReason.MissingContext) { Error = error; } public TeamSpeakErrorCommandException(string message, Exception inner, CommandError error) : base(message, inner, CommandExceptionReason.MissingContext) { Error = error; } } public enum CommandExceptionReason { Unknown = 0, InternalError, Unauthorized, CommandError = 10, MissingRights, AmbiguousCall, MissingParameter, NoReturnMatch, FunctionNotFound, NotSupported, MissingContext, } } ================================================ FILE: TS3AudioBot/CommandSystem/CommandManager.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; using System.Threading.Tasks; using TS3AudioBot.CommandSystem.Ast; using TS3AudioBot.CommandSystem.CommandResults; using TS3AudioBot.CommandSystem.Commands; using TS3AudioBot.CommandSystem.Text; using TS3AudioBot.Dependency; using TS3AudioBot.Helper; using TS3AudioBot.Localization; using TS3AudioBot.Rights; using TSLib.Helper; namespace TS3AudioBot.CommandSystem { /// Mangement for the bot command system. public class CommandManager { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private static readonly Regex CommandNamespaceValidator = new Regex(@"^[a-z\d]+( [a-z\d]+)*$", Util.DefaultRegexConfig & ~RegexOptions.IgnoreCase); private readonly Dictionary aliasPaths = new Dictionary(); private readonly HashSet commandPaths = new HashSet(); private readonly HashSet baggedCommands = new HashSet(); private readonly RightsManager? rightsManager; public CommandGroup RootGroup { get; } = new CommandGroup(); public CommandManager(RightsManager? rightsManager) { this.rightsManager = rightsManager; } public IEnumerable AllCommands => baggedCommands.SelectMany(x => x.BagCommands); public IEnumerable AllRights => AllCommands.Select(x => x.RequiredRight).Concat(baggedCommands.SelectMany(x => x.AdditionalRights)); #region Management public void RegisterCollection(ICommandBag bag) { if (baggedCommands.Contains(bag)) return; CheckDistinct(bag.BagCommands); baggedCommands.Add(bag); foreach (var command in bag.BagCommands) { var result = LoadCommand(command); if (!result.Ok) { Log.Error("Failed to load command bag: " + result.Error); UnregisterCollection(bag); throw new InvalidOperationException(result.Error); } } rightsManager?.SetRightsList(AllRights); } public void UnregisterCollection(ICommandBag bag) { if (baggedCommands.Remove(bag)) { foreach (var com in bag.BagCommands) { UnloadCommand(com); } rightsManager?.SetRightsList(AllRights); } } public E RegisterAlias(string path, string command) { if (aliasPaths.ContainsKey(path)) return new LocalStr("Already exists"); // TODO var dac = new AliasCommand(command); var res = LoadICommand(dac, path); if (!res) return new LocalStr(res.Error); // TODO aliasPaths.Add(path, dac); return R.Ok; } public E UnregisterAlias(string path) { if (!aliasPaths.TryGetValue(path, out var com)) return new LocalStr("Does not exist"); // TODO UnloadICommand(com, path); aliasPaths.Remove(path); return R.Ok; } public IEnumerable AllAlias => aliasPaths.Keys; public AliasCommand? GetAlias(string path) => aliasPaths.TryGetValue(path, out var ali) ? ali : null; public static IEnumerable GetBotCommands(object? obj, Type? type = null) => GetBotCommands(GetCommandMethods(obj, type)); public static IEnumerable GetBotCommands(IEnumerable methods) { foreach (var botData in methods) { botData.UsageList = botData.Method.GetCustomAttributes().ToArray(); yield return new BotCommand(botData); } } public static IEnumerable GetCommandMethods(object? obj, Type? type = null) { if (obj is null && type is null) throw new ArgumentNullException(nameof(type), "No type information given."); return GetCommandMethodsIterator(); IEnumerable GetCommandMethodsIterator() { var objType = type ?? obj!.GetType(); foreach (var method in objType.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance)) { var comAtt = method.GetCustomAttribute(); if (comAtt is null) continue; if (obj is null && !method.IsStatic) { Log.Warn("Method '{0}' needs an instance, but no instance was provided. It will be ignored.", method.Name); continue; } yield return new CommandBuildInfo(obj, method, comAtt); } } } private static void CheckDistinct(IReadOnlyCollection list) { if (list.Select(c => c.FullQualifiedName).Distinct().Count() < list.Count) { var duplicates = list.GroupBy(c => c.FullQualifiedName).Where(g => g.Count() > 1).Select(g => g.Key); throw new InvalidOperationException("The object contains duplicates: " + string.Join(", ", duplicates)); } } private E LoadCommand(BotCommand com) { if (commandPaths.Contains(com.FullQualifiedName)) return "Command already exists: " + com.InvokeName; commandPaths.Add(com.FullQualifiedName); return LoadICommand(com, com.InvokeName); } private E LoadICommand(ICommand com, string path) { if (!CommandNamespaceValidator.IsMatch(path)) return "Command has an invalid invoke name: " + path; string[] comPath = path.Split(' '); var buildResult = BuildAndGet(comPath.Take(comPath.Length - 1)); if (!buildResult) return GenerateError(buildResult.Error, com as BotCommand); var result = InsertInto(buildResult.Value, com, comPath.Last()); if (!result) return GenerateError(result.Error, com as BotCommand); return R.Ok; } private R BuildAndGet(IEnumerable comPath) { CommandGroup group = RootGroup; // this for loop iterates through the separate names of // the command to be added. foreach (var comPathPart in comPath) { switch (group.GetCommand(comPathPart)) { // if a group to hold the next level command doesn't exist // it will be created here case null: var nextGroup = new CommandGroup(); group.AddCommand(comPathPart, nextGroup); group = nextGroup; break; // if the group already exists we can take it. case CommandGroup cgCommand: group = cgCommand; break; // if the element is anything else, we have to replace it // with a group and put the old element back into it. case FunctionCommand fnCommand: var subGroup = new CommandGroup(); group.RemoveCommand(comPathPart); group.AddCommand(comPathPart, subGroup); var insertResult = InsertInto(group, fnCommand, comPathPart); if (!insertResult.Ok) return insertResult.Error; group = subGroup; break; default: return "An overloaded command cannot be replaced by a CommandGroup"; } } return group; } private static E InsertInto(CommandGroup group, ICommand com, string name) { var subCommand = group.GetCommand(name); switch (subCommand) { case null: // the group we are trying to insert has no element with the current // name, so just insert it group.AddCommand(name, com); return R.Ok; case CommandGroup insertCommand: // to add a command to CommandGroup will have to treat it as a subcommand // with an empty string as a name var noparamCommand = insertCommand.GetCommand(string.Empty); if (noparamCommand is null) { insertCommand.AddCommand(string.Empty, com); if (com is BotCommand botCom && botCom.NormalParameters > 0) Log.Warn("\"{0}\" has at least one parameter and won't be reachable due to an overloading function.", botCom.FullQualifiedName); return R.Ok; } else return "An empty named function under a group cannot be overloaded."; } if (!(com is FunctionCommand funcCom)) return $"The command cannot be inserted into a complex node ({name})."; switch (subCommand) { case FunctionCommand subFuncCommand: // if we have is a simple function, we need to create a overloader // and then add both functions to it group.RemoveCommand(name); var overloader = new OverloadedFunctionCommand(); overloader.AddCommand(subFuncCommand); overloader.AddCommand(funcCom); group.AddCommand(name, overloader); break; case OverloadedFunctionCommand insertCommand: // if we have a overloaded function, we can simply add it insertCommand.AddCommand(funcCom); break; default: return "Unknown node to insert to."; } return R.Ok; } private static E GenerateError(string msg, BotCommand? involvedCom) { return $"Command error path: {involvedCom?.InvokeName}" + $"Command: {involvedCom?.FullQualifiedName}" + $"Error: {msg}"; } private void UnloadCommand(BotCommand com) { if (!commandPaths.Remove(com.FullQualifiedName)) return; UnloadICommand(com, com.InvokeName); } private void UnloadICommand(ICommand com, string path) { var comPath = path.Split(' '); var node = new CommandUnloadNode(null, RootGroup); // build up the list to our desired node for (int i = 0; i < comPath.Length - 1; i++) { if (!(node.Self.GetCommand(comPath[i]) is CommandGroup nextGroup)) break; node = new CommandUnloadNode(node, nextGroup); } var subGroup = node.Self.GetCommand(comPath.Last()); switch (subGroup) { // nothing to remove case null: return; // if the subnode is a plain FunctionCommand then we found our command to delete case FunctionCommand _: case AliasCommand _: node.Self.RemoveCommand(com); break; // here we can delete our command from the overloader case OverloadedFunctionCommand subOverloadGroup: if (com is FunctionCommand funcCom) subOverloadGroup.RemoveCommand(funcCom); else return; break; // now to the special case when a command gets inserted with an empty string case CommandGroup insertGroup: // since we check precisely that only one command and only a simple FunctionCommand // can be added with an empty string, wen can delete it safely this way insertGroup.RemoveCommand(string.Empty); // add the node for cleanup node = new CommandUnloadNode(node, insertGroup); break; } // and finally clean all empty nodes up while (node != null) { if (node.Self.IsEmpty) node.ParentNode?.Self.RemoveCommand(node.Self); if (node.ParentNode is null) break; node = node.ParentNode; } } private class CommandUnloadNode { public CommandUnloadNode? ParentNode { get; set; } public CommandGroup Self { get; set; } public CommandUnloadNode(CommandUnloadNode? parentNode, CommandGroup self) { ParentNode = parentNode; Self = self; } } #endregion #region Execution internal static ICommand AstToCommandResult(AstNode node) { switch (node.Type) { case AstType.Error: throw new CommandException("Found an unconvertable ASTNode of type Error", CommandExceptionReason.InternalError); case AstType.Command: var cmd = (AstCommand)node; var arguments = new ICommand[cmd.Parameter.Count]; int tailCandidates = 0; for (int i = cmd.Parameter.Count - 1; i >= 1; i--) { var para = cmd.Parameter[i]; if (!(para is AstValue astVal) || astVal.StringType != StringType.FreeString) break; arguments[i] = new ResultCommand(new TailString(astVal.Value, astVal.TailString)); tailCandidates++; } for (int i = 0; i < cmd.Parameter.Count - tailCandidates; i++) arguments[i] = AstToCommandResult(cmd.Parameter[i]); return new RootCommand(arguments); case AstType.Value: var astNode = (AstValue)node; return new ResultCommand(astNode.Value); default: throw Tools.UnhandledDefault(node.Type); } } public static async Task Execute(ExecutionInformation info, string command) { var ast = CommandParser.ParseCommandRequest(command); var cmd = AstToCommandResult(ast); return new ICmdResult(await cmd.Execute(info, Array.Empty())); } public static async Task Execute(ExecutionInformation info, IReadOnlyList arguments) => new ICmdResult(await info.GetModuleOrThrow().RootGroup.Execute(info, arguments)); public static string GetTree(ICommand com) { var strb = new TextModBuilder(); GetTree(com, strb, 0); return strb.ToString(); } private static void GetTree(ICommand com, TextModBuilder strb, int indent) { switch (com) { case CommandGroup group: strb.AppendFormat("\n".Mod().Color(Color.Red)); foreach (var subCom in group.Commands) { strb.Append(new string(' ', (indent + 1) * 2)).Append(subCom.Key); GetTree(subCom.Value, strb, indent + 1); } break; case FunctionCommand _: strb.AppendFormat("\n".Mod().Color(Color.Green)); break; case OverloadedFunctionCommand ofunc: strb.AppendFormat($"\n".Mod().Color(Color.Blue)); break; case AliasCommand _: strb.AppendFormat($"\n".Mod().Color(Color.Yellow)); break; default: strb.AppendFormat("\n"); break; } } #endregion } public readonly struct ICmdResult { private readonly object? result; public ICmdResult(object? result) { this.result = result; } public object? AsRaw() => result; public string? AsString() => result?.ToString(); } } ================================================ FILE: TS3AudioBot/CommandSystem/CommandParser.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Text; using TS3AudioBot.CommandSystem.Ast; namespace TS3AudioBot.CommandSystem { internal static class CommandParser { public const char DefaultCommandChar = '!'; public const char DefaultDelimeterChar = ' '; // This switch follows more or less a DEA to this EBNF // COMMAND-EBNF := | $.*^ // COMMAND := '!' (\s+ )* // ARGUMENT := '(' ')'? | | // FREESTRING := [^)]+ // QUOTESTRING := '"' []* '"' public static AstNode ParseCommandRequest(string request, char commandChar = DefaultCommandChar, char delimeterChar = DefaultDelimeterChar) { AstCommand? root = null; var comAst = new Stack(); var build = BuildStatus.ParseCommand; var strb = new StringBuilder(); var strPtr = new StringPtr(request); var startTrim = request.AsSpan().TrimStart(); if (startTrim.IsEmpty || startTrim[0] != commandChar) { return new AstValue(request, StringType.FreeString) { Length = request.Length, Position = 0, Value = request, }; } while (!strPtr.End) { AstCommand buildCom; switch (build) { case BuildStatus.ParseCommand: // Got a command buildCom = new AstCommand(request); // Consume CommandChar if left over if (strPtr.Char == commandChar) strPtr.Next(commandChar); if (root is null) root = buildCom; else comAst.Peek().Parameter.Add(buildCom); comAst.Push(buildCom); build = BuildStatus.SelectParam; break; case BuildStatus.SelectParam: strPtr.SkipChar(delimeterChar); if (strPtr.End) { build = BuildStatus.End; } else { switch (strPtr.Char) { case '"': case '\'': build = BuildStatus.ParseQuotedString; //goto case BuildStatus.ParseQuotedString; break; case '(': if (!strPtr.HasNext) { build = BuildStatus.ParseFreeString; } else if (strPtr.IsNext(commandChar)) { strPtr.Next('('); build = BuildStatus.ParseCommand; } else { build = BuildStatus.ParseFreeString; } break; case ')': if (comAst.Count <= 0) { build = BuildStatus.End; } else { buildCom = comAst.Pop(); foreach (var param in buildCom.Parameter) if (param is AstValue astVal) astVal.TailLength = strPtr.Index - param.Position; if (comAst.Count <= 0) build = BuildStatus.End; } strPtr.Next(); break; default: build = BuildStatus.ParseFreeString; break; } } break; case BuildStatus.ParseFreeString: var valFreeAst = new AstValue(request, StringType.FreeString); using (strPtr.TrackNode(valFreeAst)) { for (; !strPtr.End; strPtr.Next()) { if ((strPtr.Char == '(' && strPtr.HasNext && strPtr.IsNext(commandChar)) || strPtr.Char == ')' || strPtr.Char == delimeterChar) { break; } } } buildCom = comAst.Peek(); buildCom.Parameter.Add(valFreeAst); build = BuildStatus.SelectParam; break; case BuildStatus.ParseQuotedString: strb.Clear(); char quoteChar; if (strPtr.TryNext('"')) quoteChar = '"'; else if (strPtr.TryNext('\'')) quoteChar = '\''; else throw new Exception("Parser error"); var valQuoAst = new AstValue(request, StringType.QuotedString); using (strPtr.TrackNode(valQuoAst)) { bool escaped = false; for (; !strPtr.End; strPtr.Next()) { if (strPtr.Char == '\\') { escaped = true; } else if (strPtr.Char == quoteChar) { if (!escaped) { strPtr.Next(); break; } else { strb.Length--; escaped = false; } } else { escaped = false; } strb.Append(strPtr.Char); } } valQuoAst.Value = strb.ToString(); buildCom = comAst.Peek(); buildCom.Parameter.Add(valQuoAst); build = BuildStatus.SelectParam; break; case BuildStatus.End: strPtr.JumpToEnd(); break; default: throw new InvalidOperationException(); } } return root ?? throw new InvalidOperationException("No ast was built"); } private class StringPtr { private readonly string text; public char Char => text[Index]; public bool End => Index >= text.Length; public bool HasNext => Index + 1 < text.Length; public int Index { get; private set; } public StringPtr(string str) { text = str; Index = 0; } public void Next() { Index++; } public void Next(char mustBe) { if (Char != mustBe) throw new InvalidOperationException(); Next(); } public bool TryNext(char mustBe) { if (Char != mustBe) return false; Next(); return true; } public bool IsNext(char what) => HasNext && text[Index + 1] == what; public void SkipChar(char c = ' ') { while (Index < text.Length && text[Index] == c) Index++; } public void JumpToEnd() => Index = text.Length + 1; public NodeTracker TrackNode(AstNode? node = null) { return new NodeTracker(this, node); } public readonly ref struct NodeTracker { private readonly int indexStart; private readonly StringPtr parent; private readonly AstNode? node; public NodeTracker(StringPtr p, AstNode? node = null) { parent = p; indexStart = parent.Index; this.node = node; } public readonly void Apply(AstNode node) { node.Position = indexStart; node.Length = parent.Index - indexStart; } public readonly (int start, int end) Done() => (indexStart, parent.Index); public readonly void Dispose() { if (node != null) Apply(node); } } } private enum BuildStatus { ParseCommand, SelectParam, ParseFreeString, ParseQuotedString, End, } } } ================================================ FILE: TS3AudioBot/CommandSystem/CommandResults/IAudioResourceResult.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using TS3AudioBot.ResourceFactories; namespace TS3AudioBot.CommandSystem.CommandResults { public interface IAudioResourceResult { AudioResource AudioResource { get; } } } ================================================ FILE: TS3AudioBot/CommandSystem/CommandResults/IWrappedResult.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.CommandSystem.CommandResults { public interface IWrappedResult { object? Content { get; } } } ================================================ FILE: TS3AudioBot/CommandSystem/CommandResults/PickObjectCommand.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Reflection; namespace TS3AudioBot.CommandSystem.CommandResults { public class Pick : IWrappedResult { private readonly string pickPath; private readonly T baseObj; private bool isPicked; private object? pickedValue; public object? Content { get { if (!isPicked) { isPicked = true; pickedValue = null; pickedValue = DoPick(); } return pickedValue; } } public Pick(T obj, string pickPath) { baseObj = obj; this.pickPath = pickPath; } private object? DoPick() { if (baseObj == null) return null; // TODO maybe error ? if (string.IsNullOrEmpty(pickPath)) return baseObj; var type = baseObj.GetType(); var prop = type.GetProperty(pickPath, BindingFlags.Public | BindingFlags.Instance); if (prop is null) throw new CommandException("Property not found" /* TODO LOC */); return prop.GetValue(baseObj); } } } ================================================ FILE: TS3AudioBot/CommandSystem/CommandResults/TailString.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.CommandSystem.CommandResults { public class TailString : IWrappedResult { public string Content { get; } public string Tail { get; } object? IWrappedResult.Content => Content; public TailString(string contentArg, string tailArg) { Content = contentArg; Tail = tailArg; } public override string ToString() => Content; } } ================================================ FILE: TS3AudioBot/CommandSystem/CommandSystemExtensions.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Threading.Tasks; using TS3AudioBot.Algorithm; using TS3AudioBot.CommandSystem.Commands; using TS3AudioBot.Dependency; namespace TS3AudioBot.CommandSystem { public static class CommandSystemExtensions { public static IFilter GetFilter(this IInjector injector) { if (injector.TryGet(out var filter)) return filter; return Filter.DefaultFilter; } public static Lazy GetFilterLazy(this IInjector injector) => new Lazy(() => injector.GetFilter(), false); public static async ValueTask ExecuteToString(this ICommand com, ExecutionInformation info, IReadOnlyList arguments) { var res = await com.Execute(info, arguments); return res?.ToString() ?? ""; } } } ================================================ FILE: TS3AudioBot/CommandSystem/CommandSystemTypes.cs ================================================ // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using TS3AudioBot.CommandSystem.CommandResults; using TSLib; namespace TS3AudioBot.CommandSystem { public static class CommandSystemTypes { /// /// The order of types, the first item has the highest priority, /// items not in the list have higher priority as they are special types. /// public static readonly Type[] TypeOrder = { typeof(bool), typeof(sbyte), typeof(byte), typeof(short), typeof(ushort), typeof(int), typeof(uint), typeof(long), typeof(ulong), typeof(float), typeof(double), typeof(TimeSpan), typeof(DateTime), typeof(string) }; public static readonly HashSet BasicTypes = new HashSet(TypeOrder); public static readonly HashSet AdvancedTypes = new HashSet(new Type[] { typeof(IAudioResourceResult), typeof(System.Collections.IEnumerable), typeof(ResourceFactories.AudioResource), typeof(History.AudioLogEntry), typeof(Playlists.PlaylistItem), }.Concat(TsTypes.All)); } } ================================================ FILE: TS3AudioBot/CommandSystem/Commands/AliasCommand.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using TS3AudioBot.Dependency; namespace TS3AudioBot.CommandSystem.Commands { public class AliasCommand : ICommand { private readonly ICommand aliasCommand; public string AliasString { get; } public AliasCommand(string command) { var ast = CommandParser.ParseCommandRequest(command); aliasCommand = CommandManager.AstToCommandResult(ast); AliasString = command; } public async ValueTask Execute(ExecutionInformation info, IReadOnlyList arguments) { info.UseComplexityTokens(1); IReadOnlyList? backupArguments = null; if (!info.TryGet(out var aliasContext)) { aliasContext = new AliasContext(); info.AddModule(aliasContext); } else { backupArguments = aliasContext.Arguments; } aliasContext.Arguments = arguments.Select(c => new LazyCommand(c)).ToArray(); var ret = await aliasCommand.Execute(info, Array.Empty()); aliasContext.Arguments = backupArguments; return ret; } } public class AliasContext { public IReadOnlyList? Arguments { get; set; } } } ================================================ FILE: TS3AudioBot/CommandSystem/Commands/AppliedCommand.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using System.Threading.Tasks; namespace TS3AudioBot.CommandSystem.Commands { public class AppliedCommand : ICommand { private readonly ICommand internCommand; private readonly IReadOnlyList internArguments; public AppliedCommand(ICommand command, IReadOnlyList arguments) { internCommand = command; internArguments = arguments; } public virtual async ValueTask Execute(ExecutionInformation info, IReadOnlyList arguments) { var merged = new ICommand[internArguments.Count + arguments.Count]; internArguments.CopyTo(0, merged, 0); arguments.CopyTo(0, merged, internArguments.Count); return await internCommand.Execute(info, merged); } public override string ToString() => $"F\"{internCommand}\"({string.Join(", ", internArguments)})"; } } ================================================ FILE: TS3AudioBot/CommandSystem/Commands/CommandGroup.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using TS3AudioBot.Localization; namespace TS3AudioBot.CommandSystem.Commands { public class CommandGroup : ICommand { private readonly IDictionary commands = new Dictionary(); public void AddCommand(string name, ICommand command) => commands.Add(name, command ?? throw new ArgumentNullException(nameof(command))); public bool RemoveCommand(string name) => commands.Remove(name); public bool RemoveCommand(ICommand command) { var com = commands.FirstOrDefault(kvp => kvp.Value == command); if (com.Key is null || com.Value is null) return false; return commands.Remove(com.Key); } public bool ContainsCommand(string name) => commands.ContainsKey(name); public ICommand? GetCommand(string name) => commands.TryGetValue(name, out var com) ? com : null; public bool IsEmpty => commands.Count == 0; public IEnumerable> Commands => commands; public virtual async ValueTask Execute(ExecutionInformation info, IReadOnlyList arguments) { string result; if (arguments.Count == 0) result = string.Empty; else result = await arguments[0].ExecuteToString(info, Array.Empty()); var filter = info.GetFilter(); var commandResults = filter.Filter(commands, result).ToArray(); // The special case when the command is empty and only might match because of fuzzy matching. // We only allow this if the command explicitly allows an empty overload. if (string.IsNullOrEmpty(result) && (commandResults.Length == 0 || commandResults.Length > 1 || (commandResults.Length == 1 && !string.IsNullOrEmpty(commandResults[0].Key)))) { throw new CommandException(string.Format(strings.cmd_help_info_contains_subfunctions, SuggestionsJoinTrim(commands.Keys)), CommandExceptionReason.AmbiguousCall); } // We found too many matching commands if (commandResults.Length > 1) throw new CommandException(string.Format(strings.cmd_help_error_ambiguous_command, SuggestionsJoinTrim(commandResults.Select(g => g.Key))), CommandExceptionReason.AmbiguousCall); // We either found no matching command if (commandResults.Length == 0) throw new CommandException(string.Format(strings.cmd_help_info_contains_subfunctions, SuggestionsJoinTrim(commands.Keys)), CommandExceptionReason.AmbiguousCall); var argSubList = arguments.TrySegment(1); return await commandResults[0].Value.Execute(info, argSubList); } private static string SuggestionsJoinTrim(IEnumerable commands) => string.Join(", ", commands.Where(x => !string.IsNullOrEmpty(x))); public override string ToString() => ""; } } ================================================ FILE: TS3AudioBot/CommandSystem/Commands/FunctionCommand.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Threading.Tasks; using TS3AudioBot.CommandSystem.CommandResults; using TS3AudioBot.Dependency; using TS3AudioBot.Helper; using TS3AudioBot.Localization; using TS3AudioBot.Web.Api; using TSLib.Helper; using static TS3AudioBot.CommandSystem.CommandSystemTypes; using TryFromFn = System.Func; namespace TS3AudioBot.CommandSystem.Commands { public class FunctionCommand : ICommand { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); // Needed for non-static member methods private readonly object? callee; /// The method that will be called internally by this command. private readonly MethodInfo internCommand; private readonly bool isPlainTask; private readonly PropertyInfo? taskValueProp; /// All parameter types, including special types. public ParamInfo[] CommandParameter { get; } /// Return type of method. public Type CommandReturn { get; } /// Count of parameter, without special types. public int NormalParameters { get; } /// /// How many free arguments have to be applied to this function. /// This includes only user-supplied arguments, e.g. the is not included. /// private int RequiredParameters { get; } public FunctionCommand(MethodInfo command, object? obj = null, int? requiredParameters = null) { internCommand = command; CommandParameter = PrecomputeTypes(command.GetParameters()); CommandReturn = command.ReturnType; if (CommandReturn.IsConstructedGenericType && CommandReturn.GetGenericTypeDefinition() == typeof(Task<>)) taskValueProp = CommandReturn.GetProperty(nameof(Task.Result)); isPlainTask = CommandReturn == typeof(Task); callee = obj; NormalParameters = CommandParameter.Count(p => p.Kind.IsNormal()); RequiredParameters = requiredParameters ?? CommandParameter.Count(p => !p.Optional && p.Kind.IsNormal()); } // Provide some constructors that take lambda expressions directly public FunctionCommand(Delegate command, int? requiredParameters = null) : this(command.Method, command.Target, requiredParameters) { } public FunctionCommand(Action command) : this(command.Method, command.Target) { } public FunctionCommand(Func command) : this(command.Method, command.Target) { } public FunctionCommand(Action command) : this(command.Method, command.Target) { } public FunctionCommand(Func command) : this(command.Method, command.Target) { } protected virtual async ValueTask ExecuteFunction(object?[] parameters) { try { var ret = internCommand.Invoke(callee, parameters); if (ret is Task task) { await task; if (isPlainTask) return null; var taskProp = taskValueProp; if (taskValueProp is null) { Log.Warn("Performing really slow Task get, declare your command better to prevent this"); var taskType = task.GetType(); if (taskType.IsConstructedGenericType && taskType.GetGenericTypeDefinition() == typeof(Task<>)) { taskProp = taskType.GetProperty(nameof(Task.Result)) ?? throw new Exception("Result not found on Task"); } } if (taskProp is null) return null; return taskProp.GetValue(task); } else { return ret; } } catch (TargetInvocationException ex) when (!(ex.InnerException is null)) { System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); throw ex.InnerException; } } /// /// Try to fit the given arguments to the underlying function. /// This function will throw an exception if the parameters can't be applied. /// The parameters that are extracted from the arguments will be returned if they can be applied successfully. /// /// The current call . /// The arguments that are applied to this function. /// The possible return types. /// How many arguments could be set. private async ValueTask<(object?[] paramObjs, int takenArguments)> FitArguments(ExecutionInformation info, IReadOnlyList arguments) { var parameters = new object?[CommandParameter.Length]; var filterLazy = info.GetFilterLazy(); // takenArguments: Index through arguments which have been moved into a parameter // p: Iterate through parameters var takenArguments = 0; for (int p = 0; p < parameters.Length; p++) { var arg = CommandParameter[p]; var argType = arg.Type; switch (arg.Kind) { case ParamKind.SpecialArguments: parameters[p] = arguments; break; case ParamKind.Dependency: if (info.TryGet(argType, out var obj)) parameters[p] = obj; else if (arg.Optional) parameters[p] = null; else throw new MissingContextCommandException($"Command '{internCommand.Name}' missing execution context '{argType.Name}'", argType); break; case ParamKind.NormalCommand: if (takenArguments >= arguments.Count) { parameters[p] = GetDefault(argType); break; } parameters[p] = arguments[takenArguments]; takenArguments++; break; case ParamKind.NormalParam: case ParamKind.NormalTailString: if (takenArguments >= arguments.Count) { parameters[p] = GetDefault(argType); break; } var argResultP = await arguments[takenArguments].Execute(info, Array.Empty()); if (arg.Kind == ParamKind.NormalTailString && argResultP is TailString tailString) parameters[p] = tailString.Tail; else parameters[p] = ConvertParam(argResultP, argType, arg, filterLazy); takenArguments++; break; case ParamKind.NormalArray: if (takenArguments >= arguments.Count) { parameters[p] = GetDefault(argType); break; } var typeArr = argType.GetElementType()!; var args = Array.CreateInstance(typeArr, arguments.Count - takenArguments); for (int i = 0; i < args.Length; i++, takenArguments++) { var argResultA = await arguments[takenArguments].Execute(info, Array.Empty()); var convResult = ConvertParam(argResultA, typeArr, arg, filterLazy); args.SetValue(convResult, i); } parameters[p] = args; break; default: throw Tools.UnhandledDefault(arg.Kind); } } // Check if we were able to set enough arguments int wantArgumentCount = Math.Min(parameters.Length, RequiredParameters); if (takenArguments < wantArgumentCount) throw ThrowAtLeastNArguments(wantArgumentCount); return (parameters, takenArguments); } public virtual async ValueTask Execute(ExecutionInformation info, IReadOnlyList arguments) { var (parameters, availableArguments) = await FitArguments(info, arguments); // Check if we were able to set enough arguments int wantArgumentCount = Math.Min(parameters.Length, RequiredParameters); if (availableArguments < wantArgumentCount) throw ThrowAtLeastNArguments(wantArgumentCount); return await ExecuteFunction(parameters); } private static ParamInfo[] PrecomputeTypes(ParameterInfo[] parameterInfos) { var precomputed = new ParamInfo[parameterInfos.Length]; bool foundTail = false; for (int i = parameterInfos.Length - 1; i >= 0; i--) { var parameterInfo = parameterInfos[i]; var arg = parameterInfo.ParameterType; ParamKind kind; if (arg == typeof(IReadOnlyList)) kind = ParamKind.SpecialArguments; else if (arg == typeof(ICommand)) kind = ParamKind.NormalCommand; else if (arg.IsArray) kind = ParamKind.NormalArray; else if (arg.IsEnum || BasicTypes.Contains(arg) || BasicTypes.Contains(UnwrapParamType(arg)) || AdvancedTypes.Contains(arg) || AdvancedTypes.Contains(UnwrapParamType(arg))) kind = ParamKind.NormalParam; // TODO How to distinguish between special type and dependency? else kind = ParamKind.Dependency; TryFromFn? tryFrom = null; if (kind == ParamKind.NormalParam || kind == ParamKind.NormalArray) { var finalType = arg; if (kind == ParamKind.NormalArray) finalType = finalType.GetElementType() ?? throw new InvalidOperationException("Not an array?"); finalType = UnwrapParamType(finalType); var method = finalType.GetMethod("TryFrom", BindingFlags.Public | BindingFlags.Static); if (method != null) { if (method.ReturnType == typeof(object)) { // return directly: (object) -> object tryFrom = (TryFromFn)method.CreateDelegate(typeof(TryFromFn)); } else if (method.ReturnType.IsClass) { // have: [object]->class // can be casted with covariance to [object]->object tryFrom = (TryFromFn)method.CreateDelegate(typeof(Func<,>).MakeGenericType(typeof(object), method.ReturnType)); } else if(method.ReturnType.IsValueType) { static TryFromFn? TryCreateWith(MethodInfo method, Type retType) { if (method.ReturnType != retType) return null; try { var tryFromToObjectWrapper = new DynamicMethod( "TryFromToObjectWrapper", typeof(object), new[] { typeof(object) }, typeof(FunctionCommand).Module); var il = tryFromToObjectWrapper.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Call, method); il.Emit(OpCodes.Box, retType); il.Emit(OpCodes.Ret); return (TryFromFn)tryFromToObjectWrapper.CreateDelegate(typeof(TryFromFn)); } catch { return null; } } // have: [object]->value // box with (object)([object]->value) tryFrom ??= TryCreateWith(method, method.ReturnType); // have: [object]->value? // box with (object)([object]->value?) tryFrom ??= TryCreateWith(method, typeof(Nullable<>).MakeGenericType(method.ReturnType)); } } } if (kind.IsNormal()) { // If we have the last normal parameter, check if it fits the criteria // to be extened to a tail string. // If it does not, we set foundTail to true anyway, since no other // fitting parameter would be a tail anymore if (!foundTail && arg == typeof(string)) kind = ParamKind.NormalTailString; foundTail = true; } precomputed[i] = new ParamInfo( parameterInfo, kind, parameterInfo.IsOptional || parameterInfo.GetCustomAttribute() != null, tryFrom); } return precomputed; } public static Type UnwrapParamType(Type type) { if (type.IsConstructedGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) return type.GenericTypeArguments[0]; return type; } public static Type UnwrapReturnType(Type type) { if (type.IsConstructedGenericType) { var genDef = type.GetGenericTypeDefinition(); if (genDef == typeof(Nullable<>)) return type.GenericTypeArguments[0]; if (genDef == typeof(JsonValue<>)) return type.GenericTypeArguments[0]; if (genDef == typeof(JsonArray<>)) return type.GenericTypeArguments[0].MakeArrayType(); } return type; } [return: NotNullIfNotNull("value")] private static object? UnwrapReturn(object? value) { if (value is null) return null; if (value is IWrappedResult wrapped) return wrapped.Content; var type = value.GetType(); if (type.IsConstructedGenericType) { var genDef = type.GetGenericTypeDefinition(); if (genDef == typeof(Nullable<>)) return type.GetProperty("Value")!.GetValue(value); } return value; } public static CommandException ThrowAtLeastNArguments(int count) { if (count <= 0) throw new ArgumentOutOfRangeException(nameof(count), count, "The count must be at least 1"); var throwString = count switch { 1 => strings.error_cmd_at_least_one_argument, 2 => strings.error_cmd_at_least_two_argument, 3 => strings.error_cmd_at_least_three_argument, 4 => strings.error_cmd_at_least_four_argument, _ => string.Format(strings.error_cmd_at_least_n_arguments, count), }; return new CommandException(throwString, CommandExceptionReason.MissingParameter); } [return: NotNullIfNotNull("value")] public static object? ConvertParam(object? value, Type targetType, ParamInfo param, Lazy filter) { if (value is null) return null; if (targetType == typeof(string)) return value.ToString(); var valueType = value.GetType(); if (targetType == valueType || targetType.IsAssignableFrom(valueType)) return value; value = UnwrapReturn(value); valueType = value.GetType(); if (targetType == valueType || targetType.IsAssignableFrom(valueType)) return value; if (param.TryFrom != null) { var tryResult = param.TryFrom(value); if (tryResult != null) { return tryResult; } } if (targetType.IsEnum) { var strValue = value.ToString() ?? throw new ArgumentNullException(nameof(value)); var enumVals = Enum.GetValues(targetType).Cast(); var result = filter.Value.Filter(enumVals.Select(x => new KeyValuePair(x.ToString(), x)), strValue).Select(x => x.Value).FirstOrDefault(); if (result is null) throw new CommandException(string.Format(strings.error_cmd_could_not_convert_to, strValue, targetType.Name), CommandExceptionReason.MissingParameter); return result; } var unwrappedTargetType = UnwrapParamType(targetType); if (valueType == typeof(string) && unwrappedTargetType == typeof(TimeSpan)) { var time = TextUtil.ParseTime((string)value); if (time is null) throw new CommandException(string.Format(strings.error_cmd_could_not_convert_to, value, nameof(TimeSpan)), CommandExceptionReason.MissingParameter); return time.Value; } // Autoconvert try { return Convert.ChangeType(value, unwrappedTargetType, CultureInfo.InvariantCulture); } catch (FormatException ex) { throw new CommandException(string.Format(strings.error_cmd_could_not_convert_to, value, unwrappedTargetType.Name), ex, CommandExceptionReason.MissingParameter); } catch (OverflowException ex) { throw new CommandException(strings.error_cmd_number_too_big, ex, CommandExceptionReason.MissingParameter); } catch (InvalidCastException ex) { throw new CommandException(string.Format(strings.error_cmd_could_not_convert_to, value, unwrappedTargetType.Name), ex, CommandExceptionReason.MissingParameter); } } private static object? GetDefault(Type type) { if (type.IsArray) { var typeArr = type.GetElementType()!; return Array.CreateInstance(typeArr, 0); } if (type.IsValueType) { return Activator.CreateInstance(type); } return null; } } public enum ParamKind { Unknown, SpecialArguments, Dependency, NormalCommand, NormalParam, NormalArray, NormalTailString, } [DebuggerDisplay("{Kind} {Name,nq}{Optional ? \"?\" : \"\",nq} ({Type.Name,nq})")] public class ParamInfo { public ParamKind Kind { get; } public bool Optional { get; } public ParameterInfo Param { get; } public TryFromFn? TryFrom { get; } public Type Type => Param.ParameterType; public string Name => Param.Name ?? ""; public ParamInfo(ParameterInfo param, ParamKind kind, bool optional, TryFromFn? tryFrom) { Param = param; Kind = kind; Optional = optional; TryFrom = tryFrom; } } public static class FunctionCommandExtensions { public static bool IsNormal(this ParamKind kind) => kind == ParamKind.NormalParam || kind == ParamKind.NormalArray || kind == ParamKind.NormalCommand || kind == ParamKind.NormalTailString; } } ================================================ FILE: TS3AudioBot/CommandSystem/Commands/ICommand.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using System.Threading.Tasks; namespace TS3AudioBot.CommandSystem.Commands { public interface ICommand { /// Execute this command. /// All global informations for this execution. /// /// The arguments for this command. /// They are evaluated lazy which means they will only be evaluated if needed. /// /// /// The possible return types that should be returned by this execution. /// They are ordered by priority so, if possible, the first return type should be picked, then the second and so on. /// /// These types can contain primitive types, the actual return value will then be wrapped into a . /// null inside the list allows an empty result. /// /// /// The result of this command. /// null is an empty result. /// ValueTask Execute(ExecutionInformation info, IReadOnlyList arguments); } } ================================================ FILE: TS3AudioBot/CommandSystem/Commands/LazyCommand.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using System.Threading.Tasks; namespace TS3AudioBot.CommandSystem.Commands { public class LazyCommand : ICommand { private readonly ICommand innerCommand; private bool executed = false; /// /// The cached result, if available. /// private object? result; public LazyCommand(ICommand innerCommandArg) { innerCommand = innerCommandArg; } public virtual async ValueTask Execute(ExecutionInformation info, IReadOnlyList arguments) { if (!executed) { result = await innerCommand.Execute(info, arguments); executed = true; return result; } return result; } public override string ToString() => $"L({innerCommand})"; } } ================================================ FILE: TS3AudioBot/CommandSystem/Commands/OverloadedFunctionCommand.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using TS3AudioBot.Localization; namespace TS3AudioBot.CommandSystem.Commands { public class OverloadedFunctionCommand : ICommand { public List Functions { get; } public OverloadedFunctionCommand() : this(Array.Empty()) { } public OverloadedFunctionCommand(IEnumerable functionsArg) { Functions = functionsArg.ToList(); } public void AddCommand(FunctionCommand command) { Functions.Add(command); SortList(); } public bool RemoveCommand(FunctionCommand command) => Functions.Remove(command); private void SortList() { Functions.Sort((f1, f2) => { // The first function in the list should be the most specialized. // If the execute the command we will iterate through the list from the beginning // and choose the first matching function. // Sort out special arguments // and remove the nullable wrapper var params1 = (from p in f1.CommandParameter where p.Kind.IsNormal() select FunctionCommand.UnwrapParamType(p.Type)).ToList(); var params2 = (from p in f2.CommandParameter where p.Kind.IsNormal() select FunctionCommand.UnwrapParamType(p.Type)).ToList(); for (int i = 0; i < params1.Count; i++) { // Prefer functions with higher parameter count if (i >= params2.Count) return -1; // Not found returns -1, so more important than any found index int i1 = Array.IndexOf(CommandSystemTypes.TypeOrder, params1[i]); int i2 = Array.IndexOf(CommandSystemTypes.TypeOrder, params2[i]); // Prefer lower argument if (i1 < i2) return -1; if (i1 > i2) return 1; } if (params2.Count > params1.Count) return 1; return 0; }); } public virtual async ValueTask Execute(ExecutionInformation info, IReadOnlyList arguments) { // Make arguments lazy, we only want to execute them once arguments = arguments.Select(c => new LazyCommand(c)).ToArray(); CommandException? contextException = null; foreach (var f in Functions) { // Try to call each overload try { return await f.Execute(info, arguments); } catch (CommandException cmdEx) when (cmdEx.Reason == CommandExceptionReason.MissingParameter || cmdEx.Reason == CommandExceptionReason.MissingContext) { // When we encounter a missing module problem we store it for later, as it is more helpful // im most cases to know that some commands *could* have matched if the module were there. if (cmdEx.Reason == CommandExceptionReason.MissingContext) contextException = cmdEx; } } if (contextException != null) System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(contextException).Throw(); throw new CommandException(strings.error_cmd_no_matching_overload, CommandExceptionReason.MissingParameter); } public override string ToString() => ""; } } ================================================ FILE: TS3AudioBot/CommandSystem/Commands/ResultCommand.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using System.Threading.Tasks; namespace TS3AudioBot.CommandSystem.Commands { /// /// A command that stores a result and returns it. /// public class ResultCommand : ICommand { public object? Content { get; } public ResultCommand(object? contentArg) { Content = contentArg; } #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously public virtual async ValueTask Execute(ExecutionInformation info, IReadOnlyList arguments) #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously { return Content; } public override string ToString() => ""; } } ================================================ FILE: TS3AudioBot/CommandSystem/Commands/RootCommand.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using TS3AudioBot.Dependency; namespace TS3AudioBot.CommandSystem.Commands { /// /// A special group founction that extracts the root group from the current execution context /// public class RootCommand : ICommand { private readonly IReadOnlyList internArguments; public RootCommand(IReadOnlyList arguments) { internArguments = arguments; } public virtual async ValueTask Execute(ExecutionInformation info, IReadOnlyList arguments) { if (!info.TryGet(out var cmdSys)) throw new CommandException("Could not find local commandsystem tree", CommandExceptionReason.MissingContext); IReadOnlyList merged; if (arguments.Count == 0) merged = internArguments; else if (internArguments.Count == 0) merged = arguments; else merged = internArguments.Concat(arguments).ToArray(); return await cmdSys.RootGroup.Execute(info, merged); } public override string ToString() => $"RootCmd({string.Join(", ", internArguments)})"; } } ================================================ FILE: TS3AudioBot/CommandSystem/ExecutionInformation.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using TS3AudioBot.Dependency; namespace TS3AudioBot.CommandSystem { public class ExecutionInformation : ChainedInjector { public ExecutionInformation() : this(NullInjector.Instance) { } public ExecutionInformation(IInjector parent) : base(parent, new BasicInjector()) { this.AddModule(this); } } } ================================================ FILE: TS3AudioBot/CommandSystem/ICommandBag.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; namespace TS3AudioBot.CommandSystem { public interface ICommandBag { IReadOnlyCollection BagCommands { get; } IReadOnlyCollection AdditionalRights { get; } } } ================================================ FILE: TS3AudioBot/CommandSystem/StaticList.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; namespace TS3AudioBot.CommandSystem { internal static class StaticList { public static IReadOnlyList TrySegment(this IReadOnlyList list, int start) { if (start == 0) return list; if (start >= list.Count) return Array.Empty(); return list switch { T[] array => new ArraySegment(array, start, array.Length - start), ArraySegment arrayseg => arrayseg[start..], _ => list.Skip(start).ToArray(), }; } public static IReadOnlyList TrySegment(this IReadOnlyList list, int start, int length) { return list switch { T[] array => new ArraySegment(array, start, length), ArraySegment arrayseg => arrayseg.Slice(start, length), _ => list.Skip(start).Take(length).ToArray(), }; } public static void CopyTo(this IReadOnlyList list, int srcOffset, T[] target, int dstOffset) => CopyTo(list, srcOffset, target, dstOffset, list.Count - srcOffset); public static void CopyTo(this IReadOnlyList list, int srcOffset, T[] target, int dstOffset, int length) { switch (list) { case T[] array: Array.Copy(array, srcOffset, target, dstOffset, length); break; case ArraySegment segArray: if (srcOffset + length > segArray.Count) throw new ArgumentOutOfRangeException(nameof(length)); Array.Copy(segArray.Array!, segArray.Offset + srcOffset, target, dstOffset, length); break; default: for (int i = 0; i < length; i++) target[dstOffset + i] = list[srcOffset + i]; break; } } } } ================================================ FILE: TS3AudioBot/CommandSystem/Text/AppliedTextMod.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.CommandSystem.Text { public readonly struct AppliedTextMod { public string? Text { get; } public TextMod Mod { get; } public AppliedTextMod(string? text) { Text = text; Mod = TextMod.None; } public AppliedTextMod(string? text, TextMod mod) { Text = text; Mod = mod; } public readonly AppliedTextMod Color(Color color) => new AppliedTextMod(Text, Mod.Color(color)); public readonly AppliedTextMod Bold() => new AppliedTextMod(Text, Mod.Bold()); public readonly AppliedTextMod Italic() => new AppliedTextMod(Text, Mod.Italic()); public readonly AppliedTextMod Underline() => new AppliedTextMod(Text, Mod.Underline()); public readonly AppliedTextMod Strike() => new AppliedTextMod(Text, Mod.Strike()); public static implicit operator AppliedTextMod(string? text) => new AppliedTextMod(text); public override readonly string? ToString() => Text; } } ================================================ FILE: TS3AudioBot/CommandSystem/Text/Color.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Text; namespace TS3AudioBot.CommandSystem.Text { public readonly struct Color { public byte R { get; } public byte G { get; } public byte B { get; } public ColorFlags Flags { get; } public static readonly Color Black = new Color(0, 0, 0); public static readonly Color DarkGray = new Color(64, 64, 64); public static readonly Color Gray = new Color(128, 128, 128); public static readonly Color LightGray = new Color(192, 192, 192); public static readonly Color Red = new Color(255, 0, 0); public static readonly Color Green = new Color(0, 255, 0); public static readonly Color Blue = new Color(0, 0, 255); public static readonly Color Yellow = new Color(255, 255, 0); public static readonly Color Cyan = new Color(0, 255, 255); public static readonly Color Pink = new Color(255, 0, 255); public static readonly Color Orange = new Color(255, 128, 0); public static readonly Color White = new Color(255, 255, 255); public static readonly Color Transparent = new Color(0, 0, 0, ColorFlags.Transparent); private static readonly Dictionary ColorOptimizer = new Dictionary(); static Color() { var colors = new[] { ( new Color(0, 255, 255), "aqua" ), ( new Color(240, 255, 255), "azure" ), ( new Color(245, 245, 220), "beige" ), ( new Color(255, 228, 196), "bisque" ), ( new Color(0, 0, 0), "black" ), ( new Color(0, 0, 255), "blue" ), ( new Color(165, 42, 42), "brown" ), ( new Color(255, 127, 80), "coral" ), ( new Color(0, 255, 255), "cyan" ), ( new Color(255, 215, 0), "gold" ), ( new Color(128, 128, 128), "gray" ), ( new Color(0, 128, 0), "green" ), ( new Color(75, 0, 130), "indigo" ), ( new Color(255, 255, 240), "ivory" ), ( new Color(240, 230, 140), "khaki" ), ( new Color(0, 255, 0), "lime" ), ( new Color(250, 240, 230), "linen" ), ( new Color(128, 0, 0), "maroon" ), ( new Color(0, 0, 128), "navy" ), ( new Color(128, 128, 0), "olive" ), ( new Color(255, 165, 0), "orange" ), ( new Color(218, 112, 214), "orchid" ), ( new Color(205, 133, 63), "peru" ), ( new Color(255, 192, 203), "pink" ), ( new Color(221, 160, 221), "plum" ), ( new Color(128, 0, 128), "purple" ), ( new Color(255, 0, 0), "red" ), ( new Color(250, 128, 114), "salmon" ), ( new Color(160, 82, 45), "sienna" ), ( new Color(192, 192, 192), "silver" ), ( new Color(255, 250, 250), "snow" ), ( new Color(210, 180, 140), "tan" ), ( new Color(0, 128, 128), "teal" ), ( new Color(255, 99, 71), "tomato" ), ( new Color(238, 130, 238), "violet" ), ( new Color(245, 222, 179), "wheat" ), ( new Color(255, 255, 255), "white" ), ( new Color(255, 255, 0), "yellow" ), }; foreach (var values in colors) { var col = values.Item1; if (values.Item2.Length < 4 || (values.Item2.Length < 7 && (!IsDouble(col.R) || !IsDouble(col.G) || !IsDouble(col.B)))) { if (!ColorOptimizer.TryGetValue(col, out var name) || name.Length > values.Item2.Length) { ColorOptimizer[col] = values.Item2; } } } } public Color(byte r, byte g, byte b) : this(r, g, b, ColorFlags.Solid) { } public Color(byte r, byte g, byte b, ColorFlags flags) { R = r; G = g; B = b; Flags = flags; } private static bool IsDouble(byte num) => (num & 0x0F) == (num >> 4); public readonly void GetL(StringBuilder strb) { if (Flags.HasFlag(ColorFlags.Transparent)) strb.Append("[COLOR=transparent]"); else if (ColorOptimizer.TryGetValue(this, out var optValue)) strb.AppendFormat("[COLOR={0}]", optValue); else if (IsDouble(R) && IsDouble(G) && IsDouble(B)) strb.AppendFormat("[COLOR=#{0:X}{1:X}{2:X}]", R & 0x0F, G & 0x0F, B & 0x0F); else strb.AppendFormat("[COLOR=#{0:X2}{1:X2}{2:X2}]", R, G, B); } public override readonly bool Equals(object? obj) { if (obj is Color col) { return this == col; } return false; } public override readonly int GetHashCode() => (int)Flags << 24 | R << 16 | G << 8 | B; public override readonly string ToString() { var strb = new StringBuilder(); GetL(strb); return strb.ToString(); } public static bool operator ==(Color a, Color b) => a.R == b.R && a.G == b.G && a.B == b.B && a.Flags == b.Flags; public static bool operator !=(Color a, Color b) => a.R != b.R || a.G != b.G || a.B != b.B || a.Flags != b.Flags; } [Flags] public enum ColorFlags : byte { Solid = 0, Transparent = 1 << 0, } } ================================================ FILE: TS3AudioBot/CommandSystem/Text/LongTextBehaviour.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.CommandSystem.Text { public enum LongTextBehaviour { /// Splits the message preferably at line breaks. Split, /// Splits at exact maximum length per message. SplitHard, /// Discards the message. Drop, } } ================================================ FILE: TS3AudioBot/CommandSystem/Text/LongTextTransform.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using TSLib.Commands; using TSLib.Helper; namespace TS3AudioBot.CommandSystem.Text { public static class LongTextTransform { private static readonly byte[] SeparatorWeight = new byte[] { (byte)'\n', (byte)',', (byte)' ' }; public static IEnumerable Split(string text, LongTextBehaviour behaviour, int maxMessageSize, int limit = int.MaxValue) { if (maxMessageSize < 4) throw new ArgumentOutOfRangeException(nameof(maxMessageSize), "The minimum split length must be at least 4 bytes to fit all utf8 characters"); // Assuming worst case that each UTF-8 character which epands to 4 bytes. // If the message is still shorter we can safely return in 1 block. if (text.Length * 4 <= maxMessageSize) return new[] { text }; var bytes = Tools.Utf8Encoder.GetBytes(text); // If the entire text UTF-8 encoded fits in one message we can return early. if (bytes.Length * 2 < maxMessageSize) return new[] { text }; var list = new List(); Span splitIndices = stackalloc Ind[SeparatorWeight.Length]; var block = bytes.AsSpan(); while (block.Length > 0) { int tokenCnt = 0; int i = 0; bool filled = false; for (; i < block.Length; i++) { tokenCnt += TsString.IsDoubleChar(block[i]) ? 2 : 1; if (tokenCnt > maxMessageSize) { if (behaviour == LongTextBehaviour.Drop) return Enumerable.Empty(); filled = true; break; } for (int j = 0; j < SeparatorWeight.Length; j++) { if (block[i] == SeparatorWeight[j]) { splitIndices[j] = new Ind(i, tokenCnt); } } } if (!filled) { list.Add(block.NewUtf8String()); break; } bool hasSplit = false; if (behaviour != LongTextBehaviour.SplitHard) { for (int j = 0; j < SeparatorWeight.Length; j++) { if (!hasSplit && splitIndices[j].i > 0) { list.Add(block.Slice(0, splitIndices[j].i + 1).NewUtf8String()); block = block.Slice(splitIndices[j].i + 1); hasSplit = true; } } splitIndices.Fill(new Ind()); } if (!hasSplit) { // UTF-8 adjustment while (i > 0 && (block[i] & 0xC0) == 0x80) i--; list.Add(block.Slice(0, i).NewUtf8String()); block = block.Slice(i); } if (--limit == 0) break; } return list; } private readonly struct Ind { public readonly int i; public readonly int tok; public Ind(int i, int tok) { this.i = i; this.tok = tok; } public override readonly string ToString() => $"i:{i} tok:{tok}"; } } } ================================================ FILE: TS3AudioBot/CommandSystem/Text/TextMod.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TS3AudioBot.CommandSystem.Text { public readonly struct TextMod : IEquatable { public static readonly TextMod None = new TextMod(0, null); public TextModFlag Flags { get; } public Color? HasColor { get; } public TextMod(TextModFlag flags, Color? color = null) { Flags = flags; HasColor = color; } public readonly TextMod Color(Color color) => new TextMod(Flags | TextModFlag.Color, color); public readonly TextMod Bold() => new TextMod(Flags | TextModFlag.Bold, HasColor); public readonly TextMod Italic() => new TextMod(Flags | TextModFlag.Italic, HasColor); public readonly TextMod Strike() => new TextMod(Flags | TextModFlag.Strike, HasColor); public readonly TextMod Underline() => new TextMod(Flags | TextModFlag.Underline, HasColor); public static string Format(AppliedTextMod format, params AppliedTextMod[] para) => new TextModBuilder().AppendFormat(format, para).ToString(); public static string Format(bool color, AppliedTextMod format, params AppliedTextMod[] para) { if (color) return Format(format, para); if (string.IsNullOrEmpty(format.Text)) return string.Empty; return string.Format(format.Text, para); } public readonly bool Equals(TextMod other) => Flags == other.Flags && HasColor == other.HasColor; public override readonly bool Equals(object? obj) => obj is TextMod tm && Equals(tm); public static bool operator ==(TextMod a, TextMod b) => a.Flags == b.Flags && a.HasColor == b.HasColor; public static bool operator !=(TextMod a, TextMod b) => a.Flags != b.Flags || a.HasColor != b.HasColor; public override readonly int GetHashCode() => ((int)Flags << 28) | HasColor.GetHashCode(); } } ================================================ FILE: TS3AudioBot/CommandSystem/Text/TextModBuilder.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Text; using System.Text.RegularExpressions; namespace TS3AudioBot.CommandSystem.Text { public class TextModBuilder { private readonly bool color; private readonly StringBuilder strb; private TextMod cur = TextMod.None; public int Length { get => strb.Length; set => strb.Length = value; } public TextModBuilder(bool color = true) : this(new StringBuilder(), color) { } public TextModBuilder(StringBuilder strb, bool color = true) { this.strb = strb ?? throw new ArgumentNullException(nameof(strb)); this.color = color; } public TextModBuilder Append(AppliedTextMod atm) => Append(atm.Text, atm.Mod); public TextModBuilder Append(string? text, TextMod mod) { if (color) StartText(strb, text, ref cur, mod); else strb.Append(text); return this; } public TextModBuilder AppendLine(AppliedTextMod atm) { Append(atm.Text, atm.Mod); strb.Append('\n'); return this; } public TextModBuilder AppendLine(string? text, TextMod mod) { Append(text, mod); strb.Append('\n'); return this; } public TextModBuilder AppendFormat(AppliedTextMod format, params AppliedTextMod[] para) { if (para.Length == 0) { Append(format); } else { var parts = Regex.Split(format.Text, @"{\d+}"); for (int i = 0; i < parts.Length - 1; i++) { Append(parts[i], format.Mod); Append(para[i]); } Append(parts[^1], format.Mod); } return this; } private static void StartText(StringBuilder strb, string? text, ref TextMod cur, TextMod mod) { if (string.IsNullOrEmpty(text)) return; var curFlags = cur.Flags; var modFlags = mod.Flags; var close = curFlags & ~modFlags; if ((curFlags & modFlags).HasFlag(TextModFlag.Color) && cur.HasColor != mod.HasColor) close |= TextModFlag.Color; var trimClose = GetShortest(close); curFlags = End(strb, curFlags, trimClose); curFlags &= (~(trimClose - 1) | modFlags); curFlags = Start(strb, curFlags, mod); cur = new TextMod(curFlags, mod.HasColor); strb.Append(text); } private static TextModFlag Start(StringBuilder strb, TextModFlag cur, TextMod mod) { var flag = ~cur & mod.Flags; if (flag.HasFlag(TextModFlag.Bold)) strb.Append("[B]"); if (flag.HasFlag(TextModFlag.Italic)) strb.Append("[I]"); if (flag.HasFlag(TextModFlag.Strike)) strb.Append("[S]"); if (flag.HasFlag(TextModFlag.Underline)) strb.Append("[U]"); if (flag.HasFlag(TextModFlag.Color)) mod.HasColor!.Value.GetL(strb); return cur | mod.Flags; } private static TextModFlag End(StringBuilder strb, TextModFlag cur, TextModFlag mod) { var flag = mod; if (flag.HasFlag(TextModFlag.Bold)) strb.Append("[/B]"); if (flag.HasFlag(TextModFlag.Italic)) strb.Append("[/I]"); if (flag.HasFlag(TextModFlag.Strike)) strb.Append("[/S]"); if (flag.HasFlag(TextModFlag.Underline)) strb.Append("[/U]"); if (flag.HasFlag(TextModFlag.Color)) strb.Append("[/COLOR]"); return cur & ~mod; } private static TextModFlag GetShortest(TextModFlag mod) { if (mod.HasFlag(TextModFlag.Bold)) return TextModFlag.Bold; if (mod.HasFlag(TextModFlag.Italic)) return TextModFlag.Italic; if (mod.HasFlag(TextModFlag.Strike)) return TextModFlag.Strike; if (mod.HasFlag(TextModFlag.Underline)) return TextModFlag.Underline; if (mod.HasFlag(TextModFlag.Color)) return TextModFlag.Color; return 0; } public override string ToString() => strb.ToString(); } } ================================================ FILE: TS3AudioBot/CommandSystem/Text/TextModFlag.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TS3AudioBot.CommandSystem.Text { [Flags] public enum TextModFlag { None = 0, Color = 1 << 0, Underline = 1 << 1, Strike = 1 << 2, Italic = 1 << 3, Bold = 1 << 4, } } ================================================ FILE: TS3AudioBot/CommandSystem/Text/TextModHelper.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.CommandSystem.Text { public static class TextModHelper { public static AppliedTextMod Mod(this string str) => str; } } ================================================ FILE: TS3AudioBot/Config/Config.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.IO; using System.Linq; using TS3AudioBot.Helper; using TS3AudioBot.Localization; namespace TS3AudioBot.Config { public partial class ConfRoot { private string? fileName; private readonly Dictionary botConfCache = new Dictionary(); public static ConfRoot? Open(string file) { var loadResult = Load(file); if (!loadResult.Ok) { Log.Error(loadResult.Error, "Could not load core config."); return null; } if (!loadResult.Value.CheckAndSet(file)) return null; return loadResult.Value; } public static ConfRoot? Create(string file) { var newFile = CreateRoot(); if (!newFile.CheckAndSet(file)) return newFile; var saveResult = newFile.Save(file, true); if (!saveResult.Ok) { Log.Error(saveResult.Error, "Failed to save config file '{0}'.", file); return null; } return newFile; } public static ConfRoot? OpenOrCreate(string file) => File.Exists(file) ? Open(file) : Create(file); private bool CheckAndSet(string file) { fileName = file; if (!CheckPaths()) return false; // further checks... return true; } private bool CheckPaths() { try { if (!Directory.Exists(Configs.BotsPath.Value)) Directory.CreateDirectory(Configs.BotsPath.Value); } catch (Exception ex) { Log.Error(ex, "Could not create bot config subdirectory."); return false; } return true; } public bool Save() => Save(fileName!, true); // apply root_path to input path public string GetFilePath(string _) { throw new NotImplementedException(); } internal R NameToPath(string name) { var nameResult = Util.IsSafeFileName(name); if (!nameResult.Ok) return nameResult.Error; return new FileInfo(Path.Combine(Configs.BotsPath.Value, name, FilesConst.BotConfig)); } public ConfBot CreateBot() { var config = CreateRoot(); InitializeBotConfig(config); return config; } public ConfBot[]? GetAllBots() { try { return Directory.EnumerateDirectories(Configs.BotsPath.Value) .Select(filePath => new DirectoryInfo(filePath).Name) .SelectOk(GetBotConfig) .ToArray(); } catch (Exception ex) { Log.Error(ex, "Could not access bot config subdirectory."); return null; } } public R GetBotConfig(string name) { var file = NameToPath(name); if (!file.Ok) return new Exception(file.Error.Str); if (!botConfCache.TryGetValue(name, out var botConf)) { var botConfResult = Load(file.Value.FullName); if (!botConfResult.Ok) { Log.Warn(botConfResult.Error, "Failed to load bot config \"{0}\"", name); return botConfResult.Error; } botConf = botConfResult.Value; InitializeBotConfig(botConf); botConf.Name = name; botConfCache[name] = botConf; } return botConf; } private void InitializeBotConfig(ConfBot config) { Bot.Derive(config); config.Parent = this; } public void ClearBotConfigCache() { botConfCache.Clear(); } public void ClearBotConfigCache(string name) { botConfCache.Remove(name); } internal void AddToConfigCache(ConfBot config) { var name = config.Name; if (!string.IsNullOrEmpty(name) && !botConfCache.ContainsKey(name)) botConfCache[name] = config; } public E CreateBotConfig(string name) { var file = NameToPath(name); if (!file.Ok) return file.Error; if (file.Value.Exists) return new LocalStr("The file already exists."); // LOC: TODO try { file.Value.Directory.Create(); using (File.Open(file.Value.FullName, FileMode.CreateNew)) return R.Ok; } catch (Exception ex) { Log.Debug(ex, "Config file could not be created"); return new LocalStr("Could not create config."); // LOC: TODO } } public E DeleteBotConfig(string name) { var file = NameToPath(name); if (!file.Ok) return file.Error; if (botConfCache.Remove(name, out var conf)) conf.Name = null; if (!file.Value.Exists) return R.Ok; try { file.Value.Delete(); file.Value.Directory.Delete(true); return R.Ok; } catch (Exception ex) { Log.Debug(ex, "Config file could not be deleted"); return new LocalStr("Could not delete config."); // LOC: TODO } } public E CopyBotConfig(string from, string to) { var fileFrom = NameToPath(from); if (!fileFrom.Ok) return fileFrom.Error; var fileTo = NameToPath(to); if (!fileTo.Ok) return fileTo.Error; if (!fileFrom.Value.Exists) return new LocalStr("The source bot does not exist."); if (fileTo.Value.Exists) return new LocalStr("The target bot already exists, delete it before to overwrite."); try { fileTo.Value.Directory.Create(); File.Copy(fileFrom.Value.FullName, fileTo.Value.FullName, false); return R.Ok; } catch (Exception ex) { Log.Error(ex, "Config file could not be copied"); return new LocalStr("Could not copy config."); // LOC: TODO } } } public partial class ConfBot { public string? Name { get; set; } public string? LocalConfigDir => Name is null ? null : Path.Combine(GetParent().Configs.BotsPath.Value, Name); public E SaveNew(string name) { var parent = GetParent(); var file = parent.NameToPath(name); if (!file.Ok) return file.Error; if (file.Value.Exists) return new LocalStr("The file already exists."); // LOC: TODO var result = SaveInternal(file.Value.FullName); if (!result.Ok) return result; Name = name; parent.AddToConfigCache(this); return R.Ok; } public E SaveWhenExists() { if (string.IsNullOrEmpty(Name)) return R.Ok; var file = GetParent().NameToPath(Name); if (!file.Ok) return file.Error; if (!file.Value.Exists) return R.Ok; return SaveInternal(file.Value.FullName); } private E SaveInternal(string file) { var result = Save(file, false); if (!result.Ok) { Log.Error(result.Error, "An error occoured saving the bot config."); return new LocalStr(string.Format("An error occoured saving the bot config.")); // LOC: TODO } return R.Ok; } internal ConfRoot GetParent() => (Parent as ConfRoot) ?? throw new InvalidOperationException("Bot is not under root"); } } ================================================ FILE: TS3AudioBot/Config/ConfigArray.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Nett; using Newtonsoft.Json; using System; using System.Collections.Generic; using TS3AudioBot.Helper; namespace TS3AudioBot.Config { public class ConfigArray : ConfigValue> where T : notnull { public ConfigArray(string key, IReadOnlyList defaultVal, string doc = "") : base(key, defaultVal, doc) { } public override void FromToml(TomlObject? tomlObject) { if (tomlObject != null && tomlObject.TryGetValueArray(out var array)) { Value = array; } } public override void ToJson(JsonWriter writer) { writer.WriteStartArray(); foreach (var item in Value) { writer.WriteValue(item); } writer.WriteEndArray(); } public override E FromJson(JsonReader reader) { try { if (reader.Read() && (reader.TokenType == JsonToken.StartArray)) { var list = new List(); while (reader.TryReadValue(out var value)) { list.Add(value); } if (reader.TokenType != JsonToken.EndArray) return $"Expected end of array but found {reader.TokenType}"; Value = list; return R.Ok; } return $"Wrong type, expected {typeof(T).Name}, got {reader.TokenType}"; } catch (JsonReaderException ex) { return $"Could not read value: {ex.Message}"; } } } } ================================================ FILE: TS3AudioBot/Config/ConfigDynamicTable.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Nett; using System; using System.Collections.Generic; using System.Diagnostics; namespace TS3AudioBot.Config { [DebuggerDisplay("dyntable:{Key}")] public class ConfigDynamicTable : ConfigEnumerable, IDynamicTable where T : ConfigPart { private readonly Dictionary dynamicTables = new Dictionary(); private readonly Func createFactory; public ConfigDynamicTable(Func createFactory) { this.createFactory = createFactory; } public override void FromToml(TomlObject? tomlObject) { base.FromToml(tomlObject); dynamicTables.Clear(); if (tomlObject != null) { if (!(tomlObject is TomlTable tomlTable)) throw new InvalidCastException(); foreach (var child in tomlTable.Rows) { var childConfig = Init(createFactory(child.Key), this, child.Value); dynamicTables.Add(child.Key, childConfig); } } } public override IEnumerable GetAllChildren() => GetAllItems(); public override ConfigPart? GetChild(string key) => GetItem(key); public ConfigPart GetOrCreateChild(string key) => GetOrCreateItem(key); public override void Derive(ConfigPart derived) { // TODO (or rather probably ignore, as deriving is a bit ambiguous) } public T? GetItem(string key) => dynamicTables.TryGetValue(key, out var item) ? item : null; public IEnumerable GetAllItems() => dynamicTables.Values; public T CreateItem(string key) { var childConfig = Init(createFactory(key), this, null); dynamicTables.Add(key, childConfig); return childConfig; } public T GetOrCreateItem(string key) => GetItem(key) ?? CreateItem(key); public void RemoveItem(string key) { dynamicTables.Remove(key); TomlObject.Remove(key); } } public interface IDynamicTable { ConfigPart GetOrCreateChild(string key); } } ================================================ FILE: TS3AudioBot/Config/ConfigEnumerable.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Nett; using Newtonsoft.Json; using System; using System.Collections.Generic; namespace TS3AudioBot.Config { public abstract class ConfigEnumerable : ConfigPart { private static readonly object EmptyObject = new object(); protected virtual TomlTable.TableTypes TableType { get => TomlTable.TableTypes.Default; } #pragma warning disable CS8618 // !NRT loaded in FromToml public TomlTable TomlObject { get; set; } #pragma warning restore CS8618 public override bool ExpectsString => false; public override void ClearEvents() { foreach (var child in GetAllChildren()) child.ClearEvents(); } public override void FromToml(TomlObject? tomlObject) { if (tomlObject is null) { if (Parent is null) TomlObject = Toml.Create(); else TomlObject = Parent.TomlObject.Add(Key, EmptyObject, TableType).Added; } else { if (tomlObject is TomlTable tomlTable) TomlObject = tomlTable; else throw new InvalidCastException(); } } public override void ToToml(bool writeDefaults, bool writeDocumentation) { if (writeDocumentation) CreateDocumentation(TomlObject); foreach (var part in GetAllChildren()) { part.ToToml(writeDefaults, writeDocumentation); } } public override void ToJson(JsonWriter writer) { writer.WriteStartObject(); foreach (var item in GetAllChildren()) { writer.WritePropertyName(item.Key); item.ToJson(writer); } writer.WriteEndObject(); } public override E FromJson(JsonReader reader) { try { if (!reader.Read() || (reader.TokenType != JsonToken.StartObject)) return $"Wrong type, expected start of object but found {reader.TokenType}"; while (reader.Read() && (reader.TokenType == JsonToken.PropertyName)) { var childName = (string?)reader.Value; if (childName is null) return "No child found"; var child = GetChild(childName); if (child is null) { if (this is IDynamicTable dynTable) child = dynTable.GetOrCreateChild(childName); else return "No child found"; } child.FromJson(reader); } if (reader.TokenType != JsonToken.EndObject) return $"Expected end of array but found {reader.TokenType}"; return R.Ok; } catch (JsonReaderException ex) { return $"Could not read value: {ex.Message}"; } } // Virtual table methods public abstract ConfigPart? GetChild(string key); public abstract IEnumerable GetAllChildren(); // Static factory methods protected static T Create(string key, string doc = "") where T : ConfigEnumerable, new() { return new T { Key = key, Documentation = doc, }; } protected static T Create(string key, ConfigEnumerable? parent, TomlObject? fromToml, string doc = "") where T : ConfigEnumerable, new() { return Init(Create(key, doc), parent, fromToml); } protected static T Init(T part, ConfigEnumerable? parent, TomlObject? fromToml) where T : ConfigPart { part.Parent = parent; part.FromToml(fromToml); return part; } public static T CreateRoot() where T : ConfigEnumerable, new() => Create(null!, null, null, ""); public static R Load(string path) where T : ConfigEnumerable, new() { TomlTable rootToml; try { rootToml = Toml.ReadFile(path); } catch (Exception ex) { return ex; } return Create(null!, null, rootToml); } public E Save(string path, bool writeDefaults, bool writeDocumentation = true) { try { lock (this) { ToToml(writeDefaults, writeDocumentation); Toml.WriteFile(TomlObject, path); } } catch (Exception ex) { return ex; } return R.Ok; } } } ================================================ FILE: TS3AudioBot/Config/ConfigHelper.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using System; using System.Linq; using System.Xml; using TS3AudioBot.CommandSystem; namespace TS3AudioBot.Config { public static class ConfigHelper { public const string DefaultBotName = "default"; public static ConfigPart[] ByPathAsArray(this ConfigPart config, string path) { try { return config.ByPath(path).ToArray(); } catch (Exception ex) { throw new CommandException("Invalid TomlPath expression", ex, CommandExceptionReason.CommandError); } } public static E TryReadValue(this JsonReader reader, out T value) { if (reader.Read() && (reader.TokenType == JsonToken.Boolean || reader.TokenType == JsonToken.Date || reader.TokenType == JsonToken.Float || reader.TokenType == JsonToken.Integer || reader.TokenType == JsonToken.String)) { var jValue = reader.Value; if (jValue is null) { value = default!; return "Read null"; } try { if (typeof(T) == typeof(TimeSpan)) { if (reader.TokenType == JsonToken.String) { var timeStr = ((string)jValue).ToUpperInvariant(); if (!timeStr.StartsWith("P")) { if (!timeStr.Contains("T")) timeStr = "PT" + timeStr; else timeStr = "P" + timeStr; } value = (T)(object)XmlConvert.ToTimeSpan(timeStr); return R.Ok; } } else if (typeof(T).IsEnum) { if (reader.TokenType == JsonToken.String) { value = (T)Enum.Parse(typeof(T), (string)jValue, true); return R.Ok; } } else { value = (T)Convert.ChangeType(jValue, typeof(T)); return R.Ok; } } catch (Exception ex) when (ex is InvalidCastException || ex is OverflowException || ex is FormatException) { } } value = default!; return $"Wrong type, expected {typeof(T).Name}, got {reader.TokenType}"; } } } ================================================ FILE: TS3AudioBot/Config/ConfigPart.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Nett; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using TS3AudioBot.Helper; using static TS3AudioBot.Helper.TomlTools; namespace TS3AudioBot.Config { [DebuggerDisplay("unknown:{Key}")] public abstract class ConfigPart : IJsonSerializable { protected static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); public string? Documentation { get; protected set; } public string Key { get; protected set; } // must be a field otherwise it will be found as a child for ConfigTable public ConfigEnumerable? Parent; #pragma warning disable CS8618 // !NRT, all ConfigParts are create via Create protected ConfigPart() { } #pragma warning restore CS8618 protected ConfigPart(string key) { Key = key; } public abstract bool ExpectsString { get; } public abstract void FromToml(TomlObject? tomlObject); public abstract void ToToml(bool writeDefaults, bool writeDocumentation); public abstract void Derive(ConfigPart derived); public abstract E FromJson(JsonReader reader); public abstract void ToJson(JsonWriter writer); public abstract void ClearEvents(); protected void CreateDocumentation(TomlObject tomlObject) { var docs = tomlObject.Comments.Where(x => x.Text.StartsWith("#")).ToArray(); tomlObject.ClearComments(); if (!string.IsNullOrEmpty(Documentation)) tomlObject.AddComment(Documentation); if (docs.Length > 0) tomlObject.AddComments(docs); } public override string ToString() => this.ToJson(); // *** Path accessor *** public IEnumerable ByPath(string path) { if (string.IsNullOrEmpty(path)) return new[] { this }; var pathM = path.AsMemory(); return ProcessIdentifier(pathM); } private IEnumerable ProcessIdentifier(ReadOnlyMemory pathM) { if (pathM.IsEmpty) return Enumerable.Empty(); var path = pathM.Span; switch (path[0]) { case '*': { var rest = pathM[1..]; if (rest.IsEmpty) return GetAllSubItems(); if (IsArray(rest.Span)) return GetAllSubItems().SelectMany(x => x.ProcessArray(rest)); else if (IsDot(rest.Span)) return GetAllSubItems().SelectMany(x => x.ProcessDot(rest)); else throw new ArgumentException("Invalid expression after wildcard", nameof(pathM)); } case '[': throw new ArgumentException("Invalid array open bracket", nameof(pathM)); case ']': throw new ArgumentException("Invalid array close bracket", nameof(pathM)); case '.': throw new ArgumentException("Invalid dot", nameof(pathM)); default: { var subItemName = path; var rest = ReadOnlyMemory.Empty; bool cont = false; for (int i = 0; i < path.Length; i++) { // todo allow in future if (path[i] == '*') throw new ArgumentException("Invalid wildcard position", nameof(pathM)); var currentSub = path[i..]; if (!IsIdentifier(currentSub)) // if (!IsName) { cont = true; subItemName = path[..i]; rest = pathM[i..]; break; } } var item = GetSubItemByName(subItemName); if (item is null) return Enumerable.Empty(); if (cont) { if (IsArray(rest.Span)) return item.ProcessArray(rest); else if (IsDot(rest.Span)) return item.ProcessDot(rest); else throw new ArgumentException("Invalid expression name identifier", nameof(pathM)); } return new[] { item }; } } } private IEnumerable ProcessArray(ReadOnlyMemory pathM) { var path = pathM.Span; if (path[0] != '[') throw new ArgumentException("Expected array open breacket", nameof(pathM)); for (int i = 1; i < path.Length; i++) { if (path[i] == ']') { if (i == 0) throw new ArgumentException("Empty array indexer", nameof(pathM)); var indexer = path[1..i]; var rest = pathM.Slice(i + 1); bool cont = rest.Length > 0; // select if (indexer.Length == 1 && indexer[0] == '*') { var ret = GetAllArrayItems(); if (cont) { if (IsArray(rest.Span)) return ret.SelectMany(x => x.ProcessArray(rest)); else if (IsDot(rest.Span)) return ret.SelectMany(x => x.ProcessDot(rest)); else throw new ArgumentException("Invalid expression after array indexer", nameof(pathM)); } return ret; } else { var ret = GetArrayItemByIndex(indexer); if (ret is null) return Enumerable.Empty(); if (cont) { if (IsArray(rest.Span)) return ret.ProcessArray(rest); else if (IsDot(rest.Span)) return ret.ProcessDot(rest); else throw new ArgumentException("Invalid expression after array indexer", nameof(pathM)); } return new[] { ret }; } } } throw new ArgumentException("Missing array close bracket", nameof(pathM)); } private IEnumerable ProcessDot(ReadOnlyMemory pathM) { var path = pathM.Span; if (!IsDot(path)) throw new ArgumentException("Expected dot", nameof(pathM)); var rest = pathM[1..]; if (!IsIdentifier(rest.Span)) throw new ArgumentException("Expected identifier after dot", nameof(pathM)); return ProcessIdentifier(rest); } private ConfigPart? GetArrayItemByIndex(ReadOnlySpan index) { var indexNum = new string(index.ToArray()); //if (!System.Buffers.Text.Utf8Parser.TryParse(index, out int indexNum, out int bytesConsumed)) //throw new ArgumentException("Invalid array indexer"); if (this is ConfigEnumerable table) { return table.GetChild(indexNum); } /*else if (this is ConfigValue<[]ARRAY> array) { // TODO }*/ return null; } private IEnumerable GetAllArrayItems() { if (this is ConfigEnumerable table) return table.GetAllChildren(); return Enumerable.Empty(); } private ConfigPart? GetSubItemByName(ReadOnlySpan name) { var indexNum = new string(name.ToArray()); if (this is ConfigEnumerable table) return table.GetChild(indexNum); return null; } private IEnumerable GetAllSubItems() { if (this is ConfigEnumerable table) return table.GetAllChildren(); return Enumerable.Empty(); } } } ================================================ FILE: TS3AudioBot/Config/ConfigStructs.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Nett; using System; using System.Collections.Generic; using TS3AudioBot.CommandSystem.Text; using TS3AudioBot.Helper; using TS3AudioBot.ResourceFactories.Youtube; namespace TS3AudioBot.Config { public partial class ConfRoot : ConfigTable { public ConfBot Bot { get; } = Create("bot", "! IMPORTANT !\n" + "All config tables here starting with 'bot.*' will only be used as default values for each bot.\n" + "To make bot-instance specific changes go to the 'Bots' folder (configs.bots_path) and set your configuration values in the desired bot config."); public ConfConfigs Configs { get; } = Create("configs"); public ConfDb Db { get; } = Create("db"); public ConfFactories Factories { get; } = Create("factories"); public ConfTools Tools { get; } = Create("tools"); public ConfRights Rights { get; } = Create("rights"); public ConfPlugins Plugins { get; } = Create("plugins"); public ConfWeb Web { get; } = Create("web"); //public ConfigValue ActiveDocumentation { get; } = new ConfigValue("_active_doc", true); } public class ConfConfigs : ConfigTable { //public ConfigValue RootPath { get; } = new ConfigValue("root_path", "."); // TODO enable when done public ConfigValue BotsPath { get; } = new ConfigValue("bots_path", "bots", "Path to a folder where the configuration files for each bot template will be stored."); public ConfigValue SendStats { get; } = new ConfigValue("send_stats", true, "Enable to contribute to the global stats tracker to help us improve our service.\n" + "We do NOT send/store any IPs, identifiable information or logs for this.\n" + "If you want to check how a stats packet looks like you can run the bot with 'TS3AudioBot --stats-example'.\n" + "To disable contributing without config you can run the bot with 'TS3AudioBot --stats-disabled'. This will ignore the config value."); } public class ConfDb : ConfigTable { public ConfigValue Path { get; } = new ConfigValue("path", "ts3audiobot.db", "The path to the database file for persistent data."); } public class ConfFactories : ConfigTable { public ConfPath Media { get; } = Create("media", "The default path to look for local resources."); public ConfResolverYoutube Youtube { get; } = Create("youtube"); } public class ConfResolverYoutube : ConfigTable { public ConfigValue ResolverPriority { get; } = new ConfigValue( "prefer_resolver", LoaderPriority.Internal, "Changes how to try to resolve youtube songs\n" + " - youtubedl : uses youtube-dl only\n" + " - internal : uses the internal resolver, then youtube-dl"); public ConfigValue ApiKey { get; } = new ConfigValue("youtube_api_key", "", "Set your own youtube api key to keep using the old youtube factory loader.\n" + "This feature is unsupported and may break at any time"); } public class ConfTools : ConfigTable { // youtube-dl can be empty by default as we make some thorough lookups. public ConfPath YoutubeDl { get; } = Create("youtube-dl", "Path to the youtube-dl binary or local git repository."); public ConfToolsFfmpeg Ffmpeg { get; } = Create("ffmpeg", "The path to ffmpeg."); //public ConfPath Ffprobe { get; } = Create("ffprobe"); } public class ConfToolsFfmpeg : ConfigTable { public ConfigValue Path { get; } = new ConfigValue("path", "ffmpeg"); } public class ConfRights : ConfigTable { public ConfigValue Path { get; } = new ConfigValue("path", "rights.toml", "Path to the permission file. The file will be generated if it doesn't exist."); } public class ConfPlugins : ConfigTable { public ConfigValue Path { get; } = new ConfigValue("path", "plugins", "The path to the plugins folder."); public ConfPluginsLoad Load { get; } = Create("load"); } public class ConfPluginsLoad : ConfigTable { // TODO: dynamic table } public class ConfWeb : ConfigTable { public ConfigArray Hosts { get; } = new ConfigArray("hosts", new[] { "*" }, "An array of all urls the web api should be possible to be accessed with."); public ConfigValue Port { get; } = new ConfigValue("port", 58913, "The port for the web server."); public ConfWebApi Api { get; } = Create("api"); public ConfWebInterface Interface { get; } = Create("interface"); } public class ConfWebApi : ConfigTable { public ConfigValue Enabled { get; } = new ConfigValue("enabled", true, "If you want to enable the web api."); public ConfigValue CommandComplexity { get; } = new ConfigValue("command_complexity", 64, "Limits the maximum command complexity to prevent endless loops."); public ConfigValue Matcher { get; } = new ConfigValue("matcher", "exact", "See: bot.commands.matcher"); } public class ConfWebInterface : ConfigTable { public ConfigValue Enabled { get; } = new ConfigValue("enabled", true, "If you want to enable the webinterface."); public ConfigValue Path { get; } = new ConfigValue("path", "", "The webinterface folder to host. Leave empty to let the bot look for default locations."); } public partial class ConfBot : ConfigTable { public ConfigValue BotGroupId { get; } = new ConfigValue("bot_group_id", 0, "This field will be automatically set when you call '!bot setup'.\n" + "The bot will use the specified group to set/update the required permissions and add himself into it.\n" + "You can set this field manually if you already have a preexisting group the bot should add himself to."); public ConfigValue GenerateStatusAvatar { get; } = new ConfigValue("generate_status_avatar", true, "Tries to fetch a cover image when playing."); public ConfigValue SetStatusDescription { get; } = new ConfigValue("set_status_description", true, "Sets the description of the bot to the current song title."); public ConfigValue Language { get; } = new ConfigValue("language", "en", "The language the bot should use to respond to users. (Make sure you have added the required language packs)"); public ConfigValue Run { get; } = new ConfigValue("run", false, "Starts the instance when the TS3AudioBot is launched."); public ConfCommands Commands { get; } = Create("commands"); public ConfConnect Connect { get; } = Create("connect"); public ConfReconnect Reconnect { get; } = Create("reconnect"); public ConfAudio Audio { get; } = Create("audio"); public ConfPlaylists Playlists { get; } = Create("playlists"); public ConfHistory History { get; } = Create("history"); public ConfEvents Events { get; } = Create("events"); } public class ConfCommands : ConfigTable { public ConfigValue Matcher { get; } = new ConfigValue("matcher", "ic3", "Defines how the bot tries to match your !commands. Possible types:\n" + " - exact : Only when the command matches exactly.\n" + " - substring : The shortest command starting with the given prefix.\n" + " - ic3 : 'interleaved continuous character chain' A fuzzy algorithm similar to hamming distance but preferring characters at the start." /* "hamming : " */); public ConfigValue LongMessage { get; } = new ConfigValue("long_message", LongTextBehaviour.Split, "Defines how the bot handles messages which are too long for a single ts3 message. Options are:\n" + " - split : The message will be split up into multiple messages.\n" + " - drop : Does not send the message."); public ConfigValue LongMessageSplitLimit { get; } = new ConfigValue("long_message_split_limit", 1, "Limits the split count for long messages. When for example set to 1 the message will simply be trimmed to one message."); public ConfigValue Color { get; } = new ConfigValue("color", true, "Enables colors and text highlights for respones."); public ConfigValue CommandComplexity { get; } = new ConfigValue("command_complexity", 64, "Limits the maximum command complexity to prevent endless loops."); public ConfCommandsAlias Alias { get; } = Create("alias"); } public class ConfCommandsAlias : ConfigDynamicTable> { public ConfCommandsAlias() : base(key => new ConfigValue(key, "")) { } } public class ConfConnect : ConfigTable { public ConfigValue Address { get; } = new ConfigValue("address", "", "The address, ip or nickname (and port; default: 9987) of the TeamSpeak3 server"); public ConfigValue Channel { get; } = new ConfigValue("channel", "", "Default channel when connecting. Use a channel path or \"/\".\n" + "Examples: \"Home/Lobby\", \"/5\", \"Home/Afk \\\\/ Not Here\"."); public ConfigValue Badges { get; } = new ConfigValue("badges", "", "The client badges. You can set a comma seperated string with max three GUID's. Here is a list: http://yat.qa/ressourcen/abzeichen-badges/"); public ConfigValue Name { get; } = new ConfigValue("name", "TS3AudioBot", "Client nickname when connecting."); public ConfPassword ServerPassword { get; } = Create("server_password", "The server password. Leave empty for none."); public ConfPassword ChannelPassword { get; } = Create("channel_password", "The default channel password. Leave empty for none."); public ConfTsVersion ClientVersion { get; } = Create("client_version", "Overrides the displayed version for the ts3 client. Leave empty for default."); public ConfIdentity Identity { get; } = Create("identity"); } public class ConfReconnect : ConfigTable { public ConfigArray OnTimeout { get; } = new ConfigArray("ontimeout", new[] { "1s", "2s", "5s", "10s", "30s", "1m", "5m", "repeat last" }) { Validator = ConfTimeExtensions.ValidateTime }; public ConfigArray OnKick { get; } = new ConfigArray("onkick", Array.Empty()) { Validator = ConfTimeExtensions.ValidateTime }; public ConfigArray OnBan { get; } = new ConfigArray("onban", Array.Empty()) { Validator = ConfTimeExtensions.ValidateTime }; public ConfigArray OnError { get; } = new ConfigArray("onerror", new[] { "30s", "repeat last" }) { Validator = ConfTimeExtensions.ValidateTime }; public ConfigArray OnShutdown { get; } = new ConfigArray("onshutdown", new[] { "5m" }) { Validator = ConfTimeExtensions.ValidateTime }; //public ConfigValue MaxReconnect { get; } = new ConfigValue("max_combined_reconnects", -1, "Each reconnect kind has an own counter and resets when "); } public class ConfIdentity : ConfigTable { public ConfigValue PrivateKey { get; } = new ConfigValue("key", "", "||| DO NOT MAKE THIS KEY PUBLIC ||| The client identity. You can import a teamspeak3 identity here too."); public ConfigValue Offset { get; } = new ConfigValue("offset", 0, "The client identity offset determining the security level."); public ConfigValue Level { get; } = new ConfigValue("level", -1, "The client identity security level which should be calculated before connecting\n" + "or -1 to generate on demand when connecting."); } public class ConfAudio : ConfigTable { public ConfAudioVolume Volume { get; } = Create("volume", "When a new song starts the volume will be trimmed to between min and max.\n" + "When the current volume already is between min and max nothing will happen.\n" + "To completely or partially disable this feature, set min to 0 and/or max to 100."); public ConfigValue MaxUserVolume { get; } = new ConfigValue("max_user_volume", 100, "The maximum volume a normal user can request. Only user with the 'ts3ab.admin.volume' permission can request higher volumes."); public ConfigValue Bitrate { get; } = new ConfigValue("bitrate", 48, "Specifies the bitrate (in kbps) for sending audio.\n" + "Values between 8 and 98 are supported, more or less can work but without guarantees.\n" + "Reference values: 16 - very poor (~3KiB/s), 24 - poor (~4KiB/s), 32 - okay (~5KiB/s), 48 - good (~7KiB/s), 64 - very good (~9KiB/s), 96 - deluxe (~13KiB/s)"); public ConfigValue SendMode { get; } = new ConfigValue("send_mode", "voice", "How the bot should play music. Options are:\n" + " - whisper : Whispers to the channel where the request came from. Other users can join with '!subscribe'.\n" + " - voice : Sends via normal voice to the current channel. '!subscribe' will not work in this mode.\n" + " - !... : A custom command. Use '!xecute (!a) (!b)' for example to execute multiple commands."); } public class ConfAudioVolume : ConfigTable { protected override TomlTable.TableTypes TableType => TomlTable.TableTypes.Inline; public ConfigValue Default { get; } = new ConfigValue("default", 50); public ConfigValue Min { get; } = new ConfigValue("min", 25); public ConfigValue Max { get; } = new ConfigValue("max", 75); } public class ConfPlaylists : ConfigTable { //public ConfigValue MaxItemCount { get; } = new ConfigValue("max_item_count", 1000); // TODO } public class ConfHistory : ConfigTable { public ConfigValue Enabled { get; } = new ConfigValue("enabled", true, "Enable or disable history features completely to save resources."); public ConfigValue FillDeletedIds { get; } = new ConfigValue("fill_deleted_ids", true, "Whether or not deleted history ids should be filled up with new songs."); } public class ConfData : ConfigTable { //public ConfigValue MaxItemCount { get; } = new ConfigValue("disk_data", "1M"); // TODO } public class ConfEvents : ConfigTable { public ConfigValue OnConnect { get; } = new ConfigValue("onconnect", "", "Called when the bot is connected."); public ConfigValue OnDisconnect { get; } = new ConfigValue("ondisconnect", "", "Called when the bot gets disconnected."); public ConfigValue OnIdle { get; } = new ConfigValue("onidle", "", "Called when the bot does not play anything for a certain amount of time."); public ConfigValue IdleDelay { get; } = new ConfigValue("idletime", TimeSpan.Zero, "Specifies how long the bot has to be idle until the 'onidle' event gets fired.\n" + "You can specify the time in the ISO-8601 format \"PT30S\" or like: 15s, 1h, 3m30s"); public ConfigValue OnAlone { get; } = new ConfigValue("onalone", "", "Called when the last client leaves the channel of the bot. Delay can be specified"); public ConfigValue AloneDelay { get; } = new ConfigValue("alone_delay", TimeSpan.Zero, "Specifies how long the bot has to be alone until the 'onalone' event gets fired.\n" + "You can specify the time in the ISO-8601 format \"PT30S\" or like: 15s, 1h, 3m30s"); public ConfigValue OnParty { get; } = new ConfigValue("onparty", "", "Called when the bot was alone and a client joins his channel. Delay can be specified."); public ConfigValue PartyDelay { get; } = new ConfigValue("party_delay", TimeSpan.Zero, "Specifies how long the bot has to be alone until the 'onalone' event gets fired.\n" + "You can specify the time in the ISO-8601 format \"PT30S\" or like: 15s, 1h, 3m30s"); public ConfigValue OnSongStart { get; } = new ConfigValue("onsongstart", "", "Called when a new song starts."); } // Utility config structs public class ConfPath : ConfigTable { protected override TomlTable.TableTypes TableType => TomlTable.TableTypes.Inline; public ConfigValue Path { get; } = new ConfigValue("path", string.Empty); } public class ConfPassword : ConfigTable { protected override TomlTable.TableTypes TableType => TomlTable.TableTypes.Inline; public ConfigValue Password { get; } = new ConfigValue("pw", string.Empty); public ConfigValue Hashed { get; } = new ConfigValue("hashed", false); public ConfigValue AutoHash { get; } = new ConfigValue("autohash", false); public TSLib.Password Get() { if (string.IsNullOrEmpty(Password)) return TSLib.Password.Empty; var pass = Hashed ? TSLib.Password.FromHash(Password) : TSLib.Password.FromPlain(Password); if (AutoHash && !Hashed) { Password.Value = pass.HashedPassword; Hashed.Value = true; } return pass; } } public class ConfTsVersion : ConfigTable { protected override TomlTable.TableTypes TableType => TomlTable.TableTypes.Inline; public ConfigValue Build { get; } = new ConfigValue("build", string.Empty); public ConfigValue Platform { get; } = new ConfigValue("platform", string.Empty); public ConfigValue Sign { get; } = new ConfigValue("sign", string.Empty); } public static class ConfTimeExtensions { public static TimeSpan? GetValueAsTime(this ConfigArray conf, int index) { var value = conf.Value; if (value.Count == 0) return null; var last = value[^1]; var repeat = last == "repeat" || last == "repeat last"; // "repeat" might get removed for other loops, but for now keep as hidden alternative var max = repeat ? value.Count - 2 : value.Count - 1; if (index <= max) return TextUtil.ParseTime(value[index]); else return TextUtil.ParseTime(value[max]); } public static E ValidateTime(IReadOnlyList value) { if (value.Count == 0) return R.Ok; var last = value[^1]; var repeat = last == "repeat" || last == "repeat last"; if (repeat && value.Count == 1) return $"Specified 'repeat' without any previous value."; var max = repeat ? value.Count - 2 : value.Count - 1; for (int i = 0; i <= max; i++) { var r = TextUtil.ValidateTime(value[i]); if (!r.Ok) return r; } return R.Ok; } } } ================================================ FILE: TS3AudioBot/Config/ConfigTable.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Nett; using System.Collections.Generic; using System.Diagnostics; using System.Linq; namespace TS3AudioBot.Config { [DebuggerDisplay("table:{Key}")] public abstract class ConfigTable : ConfigEnumerable { protected List Properties { get; } = new List(); protected ConfigTable() { GetMember(); foreach (var configPart in Properties) configPart.Parent = this; } private IEnumerable GetConfigPartProperties() { return GetType() .GetProperties() .Where(x => typeof(ConfigPart).IsAssignableFrom(x.PropertyType)); } private void GetMember() { Properties.Clear(); Properties.AddRange(GetConfigPartProperties().Select(x => (ConfigPart)x.GetValue(this)!)); } public override void FromToml(TomlObject? tomlObject) { base.FromToml(tomlObject); foreach (var part in Properties) { var child = TomlObject.TryGetValue(part.Key); part.FromToml(child); } } public override void Derive(ConfigPart derived) { foreach (var prop in GetConfigPartProperties()) { var self = (ConfigPart)prop.GetValue(this)!; var other = (ConfigPart)prop.GetValue(derived)!; self.Derive(other); } } public override ConfigPart? GetChild(string key) => Properties.Find(x => x.Key == key); public override IEnumerable GetAllChildren() => Properties; } } ================================================ FILE: TS3AudioBot/Config/ConfigUpgrade2.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.IO; using System.Text.RegularExpressions; using TS3AudioBot.Helper; namespace TS3AudioBot.Config { /// /// Upgrades the /bots/ folder structure from each Bot being a 'bot_(name).toml' /// file to each bot having its own folder with '/(name)/bot.toml'. /// internal static class ConfigUpgrade2 { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private static readonly Regex BotFileMatcher = new Regex(@"^bot_(.+)\.toml$", Util.DefaultRegexConfig); private const string NewBotConfigFileName = "bot.toml"; public static void Upgrade(string path) { string[] files; try { files = Directory.GetFiles(path); } catch (Exception ex) { Log.Error(ex, "Failed to get 'Bots' directory. Your bots might not be available. Refer to our GitHub for upgrade actions."); return; } foreach (var file in files) { try { var fi = new FileInfo(file); var match = BotFileMatcher.Match(fi.Name); if (match.Success) { var name = match.Groups[1].Value; Directory.CreateDirectory(Path.Combine(path, name)); fi.MoveTo(Path.Combine(path, name, NewBotConfigFileName)); } } catch (Exception ex) { Log.Error(ex, "Failed to move Bot '{0}' to the new folder structure.", file); } } } } } ================================================ FILE: TS3AudioBot/Config/ConfigValue.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Nett; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using TS3AudioBot.Helper; namespace TS3AudioBot.Config { [DebuggerDisplay("{Key}:{Value}")] public class ConfigValue : ConfigPart where T : notnull { public override bool ExpectsString => typeof(T) == typeof(string) || typeof(T) == typeof(TimeSpan) || typeof(T).IsEnum; private ConfigValue? backingValue; private bool hasValue = false; public T Default { get; } private T value; public T Value { get { if (hasValue) return value; if (backingValue != null) return backingValue.Value; return Default; } set { hasValue = true; if (EqualityComparer.Default.Equals(this.value, value)) return; this.value = value; if (Changed != null) { var args = new ConfigChangedEventArgs(value); Changed?.Invoke(this, args); } } } public Func>? Validator { get; set; } public event EventHandler>? Changed; public ConfigValue(string key, T defaultVal, string doc = "") : base(key) { Documentation = doc; Default = defaultVal; value = default!; } private void InvokeChange(object? sender, ConfigChangedEventArgs args) => Changed?.Invoke(sender, args); public override void ClearEvents() => Changed = null; public override void FromToml(TomlObject? tomlObject) { if (tomlObject == null) return; if (!tomlObject.TryGetValue(out var tomlValue)) { Log.Warn("Failed to read '{0}', got {1} with {2}", Key, tomlObject.ReadableTypeName, tomlObject.DumpToJson()); return; } var validate = Validator?.Invoke(tomlValue) ?? R.Ok; if (!validate.Ok) { Log.Warn("Invalid value in '{0}', {1}", Key, validate.Error); return; } Value = tomlValue; } public override void ToToml(bool writeDefaults, bool writeDocumentation) { // Keys with underscore are read-only if (Key.StartsWith("_")) return; if (Parent is null) throw new InvalidOperationException("Value is not in a tree"); // Set field if either // - this value is set // - or we explicitely want to write out default values var selfToml = Parent.TomlObject.TryGetValue(Key); if (hasValue || (writeDefaults && selfToml is null)) { selfToml = Parent.TomlObject.Set(Key, Value); } if (writeDocumentation && selfToml != null) { CreateDocumentation(selfToml); } } public override void Derive(ConfigPart derived) { if (derived is ConfigValue derivedValue) { derivedValue.backingValue = this; Changed -= derivedValue.InvokeChange; Changed += derivedValue.InvokeChange; } } public override void ToJson(JsonWriter writer) { writer.WriteValue(Value); } public override E FromJson(JsonReader reader) { try { var err = reader.TryReadValue(out var tomlValue); if (err.Ok) { Value = tomlValue; return R.Ok; } return err; } catch (JsonReaderException ex) { return $"Could not read value: {ex.Message}"; } } public override string ToString() => Value.ToString() ?? ""; public static implicit operator T(ConfigValue conf) => conf.Value; } public class ConfigChangedEventArgs : EventArgs { public T NewValue { get; } public ConfigChangedEventArgs(T newValue) { NewValue = newValue; } } } ================================================ FILE: TS3AudioBot/Core.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using NLog; using System; using System.Threading.Tasks; using TS3AudioBot.CommandSystem; using TS3AudioBot.Config; using TS3AudioBot.Dependency; using TS3AudioBot.Environment; using TS3AudioBot.Helper; using TS3AudioBot.Plugins; using TS3AudioBot.ResourceFactories; using TS3AudioBot.Rights; using TS3AudioBot.Sessions; using TS3AudioBot.Web; using TSLib.Scheduler; namespace TS3AudioBot { public sealed class Core { private static readonly Logger Log = LogManager.GetCurrentClassLogger(); private readonly string configFilePath; private bool forceNextExit; private readonly DedicatedTaskScheduler scheduler; private readonly CoreInjector injector; public Core(DedicatedTaskScheduler scheduler, string? configFilePath = null) { this.scheduler = scheduler; // setting defaults this.configFilePath = configFilePath ?? FilesConst.CoreConfig; injector = new CoreInjector(); } public async Task Run(ParameterData setup) { scheduler.VerifyOwnThread(); AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler; TaskScheduler.UnobservedTaskException += UnobservedTaskExceptionHandler; Console.CancelKeyPress += ConsoleInterruptHandler; var config = ConfRoot.OpenOrCreate(configFilePath); if (config is null) throw new Exception("Could not create config"); ConfigUpgrade2.Upgrade(config.Configs.BotsPath.Value); config.Save(); var builder = new DependencyBuilder(injector); injector.AddModule(this); injector.AddModule(scheduler); injector.AddModule(injector); injector.AddModule(config); injector.AddModule(config.Db); injector.AddModule(config.Plugins); injector.AddModule(config.Web); injector.AddModule(config.Web.Interface); injector.AddModule(config.Web.Api); injector.AddModule(config.Rights); injector.AddModule(config.Factories); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); builder.RequestModule(); if (!builder.Build()) throw new Exception("Could not load all core modules"); Upgrader.PerformUpgrades(injector); YoutubeDlHelper.DataObj = config.Tools.YoutubeDl; injector.GetModuleOrThrow().RegisterCollection(MainCommands.Bag); injector.GetModuleOrThrow().CreateConfigIfNotExists(setup.Interactive); injector.GetModuleOrThrow().StartWebServer(); injector.GetModuleOrThrow().StartTimer(setup.SendStats); await injector.GetModuleOrThrow().RunBots(setup.Interactive); } public void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e) { Log.Fatal(e.ExceptionObject as Exception, "Critical program failure!"); StopAsync().RunSynchronously(); } public static void UnobservedTaskExceptionHandler(object? sender, UnobservedTaskExceptionEventArgs e) { Log.Error(e.Exception, "Unobserved Task error!"); } public void ConsoleInterruptHandler(object sender, ConsoleCancelEventArgs e) { if (e.SpecialKey == ConsoleSpecialKey.ControlC) { if (!forceNextExit) { Log.Info("Got interrupt signal, trying to soft-exit."); e.Cancel = true; forceNextExit = true; Stop(); } else { Log.Info("Got multiple interrupt signals, trying to force-exit."); System.Environment.Exit(0); } } } public void Stop() => _ = scheduler.InvokeAsync(StopAsync); private async Task StopAsync() { Log.Info("TS3AudioBot shutting down."); var botManager = injector.GetModule(); if (botManager != null) await botManager.StopBots(); injector.GetModule()?.Dispose(); injector.GetModule()?.Dispose(); injector.GetModule()?.Dispose(); injector.GetModule()?.Dispose(); injector.GetModule()?.Dispose(); Log.Info("Bye"); } } } ================================================ FILE: TS3AudioBot/DbStore.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using LiteDB; using System; using System.IO; using TS3AudioBot.Config; namespace TS3AudioBot { public class DbStore : IDisposable { private const string DbMetaInformationTable = "dbmeta"; private readonly LiteDatabase database; private readonly LiteCollection metaTable; public DbStore(ConfDb config) { var historyFile = Path.GetFullPath(config.Path); database = new LiteDatabase(historyFile); metaTable = database.GetCollection(DbMetaInformationTable); } public DbMetaData GetMetaData(string table) { var meta = metaTable.FindById(table); if (meta is null) { meta = new DbMetaData { Id = table, Version = 0, CustomData = null }; metaTable.Insert(meta); } return meta; } public void UpdateMetaData(DbMetaData metaData) { metaTable.Upsert(metaData); } public LiteCollection GetCollection(string name) { return database.GetCollection(name); } public void DropCollection(string name) => database.DropCollection(name); public void CleanFile() { database.Shrink(); } public void Dispose() { database.Dispose(); } } public class DbMetaData { public string? Id { get; set; } public int Version { get; set; } public string? CustomData { get; set; } } } ================================================ FILE: TS3AudioBot/Dependency/BasicInjector.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; namespace TS3AudioBot.Dependency { public class BasicInjector : IInjector { private readonly Dictionary dynamicObjects; public BasicInjector() { dynamicObjects = new Dictionary(); } public object? GetModule(Type type) => dynamicObjects.TryGetValue(type, out var mod) ? mod : null; public void AddModule(Type type, object obj) => dynamicObjects[type] = obj; public IEnumerable GetAllModules() => dynamicObjects.Values; } } ================================================ FILE: TS3AudioBot/Dependency/ChainedInjector.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TS3AudioBot.Dependency { public class ChainedInjector : IInjector where T : class, IInjector { public IInjector ParentInjector { get; set; } public T OwnInjector { get; protected set; } public ChainedInjector(IInjector parent, T own) { ParentInjector = parent ?? throw new ArgumentNullException(nameof(parent)); OwnInjector = own ?? throw new ArgumentNullException(nameof(parent)); } public virtual object? GetModule(Type type) => OwnInjector.GetModule(type) ?? ParentInjector.GetModule(type); public virtual void AddModule(Type type, object obj) => OwnInjector.AddModule(type, obj); } } ================================================ FILE: TS3AudioBot/Dependency/DependencyBuilder.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; namespace TS3AudioBot.Dependency { public sealed class CoreInjector : BasicInjector { } public sealed class BotInjector : ChainedInjector { private HashSet? hiddenParentModules = null; public BotInjector(IInjector parent) : base(parent, new BasicInjector()) { } public override object? GetModule(Type type) { var ownObj = OwnInjector.GetModule(type); if (ownObj != null) return ownObj; if (hiddenParentModules != null && hiddenParentModules.Contains(type)) return null; return ParentInjector.GetModule(type); } public void HideParentModule(Type type) { hiddenParentModules ??= new HashSet(); hiddenParentModules.Add(type); } public void HideParentModule() => HideParentModule(typeof(T)); public void ClearHiddenParentModules() => hiddenParentModules = null; } /// /// The DependencyBuilder will try to create a dependency graph of all Modules /// which are available or requested and instantitate them (if possible). /// public class DependencyBuilder { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private readonly IInjector injector; private readonly LinkedList modules = new LinkedList(); public DependencyBuilder(IInjector injector) { this.injector = injector; } public DependencyBuilder RequestModule() where TService : class => RequestModule(); public DependencyBuilder RequestModule() where TImplementation : class, TService => RequestModule(typeof(TService), typeof(TImplementation)); private DependencyBuilder RequestModule(Type tService, Type tImplementation) { Log.Trace("Requested Service {0} with {1}", tService.Name, tImplementation.Name); var mod = new Module(tService, tImplementation); for (var cur = modules.First; cur != null; cur = cur.Next) { if (mod.ConstructorParam.Contains(cur.Value.TService) || mod.TImplementation == cur.Value.TService) { modules.AddBefore(cur, mod); return this; } } modules.AddLast(mod); return this; } /// Creates all modules. /// True if all are initialized, false otherwise. public bool Build() { for (var curNode = modules.Last; curNode != null; curNode = curNode.Previous, modules.RemoveLast()) { var cur = curNode.Value; var obj = injector.GetModule(cur.TImplementation); if (obj != null) { injector.AddModule(cur.TService, obj); } else { if (!injector.TryCreate(cur.TImplementation, out obj)) return false; injector.AddModule(cur.TService, obj); } } return true; } internal static Type[]? GetContructorParam(Type type) { var fod = type.GetConstructors().FirstOrDefault(); if (fod == null) return null; return fod.GetParameters().Select(p => p.ParameterType).ToArray(); } public override string ToString() { return $"Unresolved: {modules.Count}"; } } } ================================================ FILE: TS3AudioBot/Dependency/IInjector.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TS3AudioBot.Dependency { /// /// This provides the base contract for 'injector' classes. /// An injector is basically a dictionary to look up objects by type. /// public interface IInjector { object? GetModule(Type type); void AddModule(Type type, object obj); } } ================================================ FILE: TS3AudioBot/Dependency/InjectorExtensions.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; namespace TS3AudioBot.Dependency { public static class InjectorExtensions { public static T? GetModule(this IInjector injector) where T : class { return (T?)injector.GetModule(typeof(T)); } public static T GetModuleOrThrow(this IInjector injector) where T : class { var t = (T?)injector.GetModule(typeof(T)); if (t is null) throw new Exception($"{typeof(T).Name} was not found"); return t; } public static bool TryGet(this IInjector injector, [NotNullWhen(true)] out T? obj) where T : class { obj = injector.GetModule(); return obj != null; } public static bool TryGet(this IInjector injector, Type t, [NotNullWhen(true)] out object? obj) { obj = injector.GetModule(t); return obj != null; } public static void AddModule(this IInjector injector, T obj) where T : notnull { injector.AddModule(typeof(T), obj); } public static bool TryCreate(this IInjector injector, [NotNullWhen(true)] out T? obj) where T : class { if (injector.TryCreate(typeof(T), out var oobj)) { obj = (T)oobj; return true; } else { obj = default; return false; } } public static bool TryCreate(this IInjector injector, Type type, [NotNullWhen(true)] out object? obj) { var param = DependencyBuilder.GetContructorParam(type); if (param == null) throw new ArgumentException("Invalid type, no constructors"); var call = new object[param.Length]; for (int i = 0; i < param.Length; i++) { if (!injector.TryGet(param[i], out var dep)) { obj = default; return false; } call[i] = dep; } obj = Activator.CreateInstance(type, call) ?? throw new ArgumentException("Activator didn't do his job..."); return true; } public static void FillProperties(this IInjector injector, object obj) { var type = obj.GetType(); var props = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Where(p => p.CanRead && p.CanWrite); foreach (var prop in props) { if (injector.TryGet(prop.PropertyType, out var dep)) prop.SetValue(obj, dep); } } } } ================================================ FILE: TS3AudioBot/Dependency/Module.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Linq; namespace TS3AudioBot.Dependency { internal class Module { public Type TImplementation { get; } public Type TService { get; } public Type[] ConstructorParam { get; } public Module(Type tService, Type tImplementation) { TService = tService; TImplementation = tImplementation; ConstructorParam = DependencyBuilder.GetContructorParam(TImplementation) ?? throw new ArgumentException("Invalid type"); } public override string ToString() => $"{TService.Name}({(TService != TImplementation ? TImplementation.Name : "-")}) => {string.Join(",", ConstructorParam.Select(x => x.Name))}"; } } ================================================ FILE: TS3AudioBot/Dependency/NullInjector.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TS3AudioBot.Dependency { public sealed class NullInjector : IInjector { public static readonly IInjector Instance = new NullInjector(); private NullInjector() { } public object? GetModule(Type type) => null; public void AddModule(Type type, object obj) { } } } ================================================ FILE: TS3AudioBot/Environment/Stats.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using LiteDB; using Newtonsoft.Json; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using TS3AudioBot.Config; using TS3AudioBot.Helper; using TSLib.Helper; using TSLib.Scheduler; namespace TS3AudioBot.Environment { public class Stats { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private const string StatsTable = "stats"; private const string StatsTableAcc = "stats_acc"; private const int OverallId = 1; private const int StatsVersion = 1; private static readonly TimeSpan CheckInterval = TimeSpan.FromMinutes(1); private static readonly TimeSpan SendInterval = TimeSpan.FromDays(1); private static readonly JsonSerializerSettings JsonSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None, }; private readonly ConfRoot conf; private readonly DbStore database; private readonly BotManager botManager; private readonly TickWorker ticker; private bool uploadParamEnabled; private bool UploadEnabled => uploadParamEnabled && conf.Configs.SendStats; private readonly DbMetaData meta; private readonly StatsData overallStats; private readonly StatsMeta statsPoints; private readonly LiteCollection trackEntries; private readonly LiteCollection accEntries; private readonly StatsData CurrentStatsData = new StatsData() { SongStats = new ConcurrentDictionary() }; private DateTime runtimeLastTrack; // bot id -> factory private readonly ConcurrentDictionary runningSongsPerFactory = new ConcurrentDictionary(); public Stats(ConfRoot conf, DbStore database, BotManager botManager, DedicatedTaskScheduler scheduler) { this.conf = conf; this.database = database; this.botManager = botManager; uploadParamEnabled = true; runtimeLastTrack = Tools.Now; ticker = scheduler.CreateTimer(TrackPoint, CheckInterval, false); meta = database.GetMetaData(StatsTable); trackEntries = database.GetCollection(StatsTable); trackEntries.EnsureIndex(x => x.Id, true); trackEntries.EnsureIndex(x => x.Time); accEntries = database.GetCollection(StatsTableAcc); accEntries.EnsureIndex(x => x.Id, true); if (meta.Version != StatsVersion || meta.CustomData is null) { statsPoints = new StatsMeta { LastSend = Tools.Now, }; meta.Version = StatsVersion; UpdateMeta(); } else { statsPoints = JsonConvert.DeserializeObject(meta.CustomData, JsonSettings) ?? new StatsMeta(); // Upgrade steps here } overallStats = accEntries.FindById(OverallId) ?? new StatsData { Id = OverallId }; } private void UpdateMeta() { meta.CustomData = JsonConvert.SerializeObject(statsPoints, JsonSettings); database.UpdateMetaData(meta); } public void StartTimer(bool upload) { uploadParamEnabled = upload; ticker.Enable(); } private async Task SendStats(StatsPing sendPacket) { try { Log.Debug("Send: {@data}", sendPacket); var request = WebWrapper .Request("https://splamy.de/api/tab/stats") .WithMethod(HttpMethod.Post); request.Content = new StringContent(JsonConvert.SerializeObject(sendPacket), Tools.Utf8Encoder, "application/json"); await request.ToAction(response => { Log.Debug("Stats response {0}", response.StatusCode); return Task.CompletedTask; }); } catch (Exception ex) { Log.Debug(ex, "Could not upload stats"); } } private StatsPing GetStatsTill(DateTime date) { var sendPacket = GetDefaultStatsPing(); uint count = 0; uint avgBots = 0; var entries = trackEntries.Find(x => x.Time > date); foreach (var entry in entries) { count++; sendPacket.Add(entry); avgBots += entry.RunningBots; } sendPacket.RunningBots = count == 0 ? 0 : (uint)(avgBots / (float)count + .5f); return sendPacket; } private async void TrackPoint() { var nextId = statsPoints.GenNextIndex(); var now = Tools.Now; CurrentStatsData.Time = now; CurrentStatsData.Id = nextId; var trackTime = now - runtimeLastTrack; runtimeLastTrack = now; CurrentStatsData.TotalUptime += trackTime; CurrentStatsData.RunningBots = botManager.GetRunningBotCount(); CurrentStatsData.BotsRuntime = TimeSpan.FromTicks(trackTime.Ticks * CurrentStatsData.RunningBots); foreach (var factory in runningSongsPerFactory.Values) CurrentStatsData.SongStats.GetOrNew(factory).Playtime += trackTime; Log.Debug("Track: {@data}", CurrentStatsData); trackEntries.Upsert(CurrentStatsData); overallStats.Add(CurrentStatsData); accEntries.Upsert(overallStats); CurrentStatsData.Reset(); if (UploadEnabled && statsPoints.LastSend + SendInterval < now) { var sendData = GetStatsTill(statsPoints.LastSend); await SendStats(sendData); statsPoints.LastSend = now; } UpdateMeta(); } // Track operations public void TrackSongLoad(string? factory, bool successful, bool fromUser) { var statsFactory = CurrentStatsData.SongStats.GetOrNew(factory ?? ""); statsFactory.PlayRequests++; if (successful) statsFactory.PlaySucessful++; if (fromUser) statsFactory.PlayFromUser++; } public void TrackCommandCall(bool byUser) { CurrentStatsData.CommandCalls++; if (byUser) CurrentStatsData.CommandFromUser++; } public void TrackCommandApiCall() { CurrentStatsData.CommandCalls++; CurrentStatsData.CommandFromApi++; } public void TrackSongStart(Id bot, string factory) { factory ??= ""; runningSongsPerFactory[bot] = factory; var statsFactory = CurrentStatsData.SongStats.GetOrNew(factory); statsFactory.Playtime -= (Tools.Now - runtimeLastTrack); } public void TrackSongStop(Id bot) { if (runningSongsPerFactory.TryRemove(bot, out var factory)) { var statsFactory = CurrentStatsData.SongStats.GetOrNew(factory); statsFactory.Playtime += (Tools.Now - runtimeLastTrack); } } private static StatsPing GetDefaultStatsPing() { return new StatsPing { BotVersion = SystemData.AssemblyData.ToString(), Platform = SystemData.PlatformData, Runtime = SystemData.RuntimeData.FullName, }; } public static string CreateExample() { var sendData = GetDefaultStatsPing(); sendData.TotalUptime = TimeSpan.FromHours(12.34); sendData.BotsRuntime = TimeSpan.FromHours(4.20); sendData.CommandCalls = 1234; sendData.CommandFromApi = 100; sendData.RunningBots = 3; sendData.SongStats = new Dictionary() { { "youtube", new StatsFactory { PlayRequests = 100, PlayFromUser = 42, Playtime = TimeSpan.FromMinutes(12.34), SearchRequests = 5, }} }; return JsonConvert.SerializeObject(sendData, Formatting.Indented); } } internal class StatsPing : StatsData { // Meta public string? BotVersion { get; set; } public string? Platform { get; set; } public string? Runtime { get; set; } } internal class StatsMeta { public const int RingOff = 1; public const int RingSize = 60 * 24 * 7; /* min * day * week */ public int CurrentIndex { get; set; } = 0; public DateTime LastSend = DateTime.MinValue; public int GenNextIndex() { CurrentIndex = (CurrentIndex + 1) % RingSize; return CurrentIndex + RingOff; } } internal class StatsData { [JsonIgnore] public int Id { get; set; } [JsonIgnore] public DateTime Time { get; set; } public uint RunningBots { get; set; } public TimeSpan BotsRuntime { get; set; } = TimeSpan.Zero; public TimeSpan TotalUptime { get; set; } = TimeSpan.Zero; public IDictionary SongStats { get; set; } = new Dictionary(); public uint CommandCalls { get; set; } ///How many actually were started by a user (and not i.e. by event) public uint CommandFromUser { get; set; } public uint CommandFromApi { get; set; } public bool ShouldSerializeSongStats() => SongStats.Count > 0; public bool ShouldSerializeCommandCalls() => CommandCalls != 0; public bool ShouldSerializeCommandFromUser() => CommandFromUser != 0; public bool ShouldSerializeCommandFromApi() => CommandFromApi != 0; public void Add(StatsData other) { TotalUptime += other.TotalUptime; BotsRuntime += other.BotsRuntime; foreach (var kvp in other.SongStats) SongStats.GetOrNew(kvp.Key).Add(kvp.Value); CommandCalls += other.CommandCalls; CommandFromUser += other.CommandFromUser; CommandFromApi += other.CommandFromApi; } public void Reset() { TotalUptime = TimeSpan.Zero; RunningBots = 0; BotsRuntime = TimeSpan.Zero; SongStats.Clear(); CommandCalls = 0; CommandFromUser = 0; CommandFromApi = 0; } } internal class StatsFactory { public uint PlayRequests { get; set; } public uint PlaySucessful { get; set; } ///How many actually were started by a user (and not i.e. from a playlist) public uint PlayFromUser { get; set; } public uint SearchRequests { get; set; } public TimeSpan Playtime { get; set; } public bool ShouldSerializePlayRequests() => PlayRequests != 0; public bool ShouldSerializePlaySucessful() => PlaySucessful != 0; public bool ShouldSerializePlayFromUser() => PlayFromUser != 0; public bool ShouldSerializeSearchRequests() => SearchRequests != 0; public bool ShouldSerializePlaytime() => Playtime != TimeSpan.Zero; public void Add(StatsFactory other) { PlayRequests += other.PlayRequests; PlaySucessful += other.PlaySucessful; PlayFromUser += other.PlayFromUser; SearchRequests += other.SearchRequests; Playtime += other.Playtime; } public void Reset() { PlayRequests = 0; PlaySucessful = 0; PlayFromUser = 0; SearchRequests = 0; Playtime = TimeSpan.Zero; } } } ================================================ FILE: TS3AudioBot/Environment/SystemData.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Text.RegularExpressions; using TS3AudioBot.Helper; using TSLib.Helper; namespace TS3AudioBot.Environment { public static class SystemData { private static readonly Regex PlatformRegex = new Regex(@"(\w+)=(.*)", RegexOptions.IgnoreCase | RegexOptions.ECMAScript | RegexOptions.Multiline); private static readonly Regex SemVerRegex = new Regex(@"(\d+)(?:\.(\d+)){1,3}", RegexOptions.IgnoreCase | RegexOptions.ECMAScript | RegexOptions.Multiline); public static BuildData AssemblyData { get; } = new BuildData(); public static string PlatformData { get; } = GenPlatformDat(); private static string GenPlatformDat() { string? platform = null; string? version = null; string bitness = System.Environment.Is64BitProcess ? "64bit" : "32bit"; if (Tools.IsLinux) { var values = new Dictionary(); RunBash("cat /etc/*[_-][Rr]elease", x => { var lines = x.ReadToEnd().Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); foreach (var line in lines) { var match = PlatformRegex.Match(line); if (!match.Success) continue; values[match.Groups[1].Value.ToUpperInvariant()] = TextUtil.StripQuotes(match.Groups[2].Value); } if (values.Count > 0) { platform = values.TryGetValue("NAME", out string? value) ? value : values.TryGetValue("ID", out value) ? value : values.TryGetValue("DISTRIB_ID", out value) ? value : values.TryGetValue("PRETTY_NAME", out value) ? value : null; version = values.TryGetValue("VERSION", out value) ? value : values.TryGetValue("VERSION_ID", out value) ? value : values.TryGetValue("DISTRIB_RELEASE", out value) ? value : null; } if (platform is null && version is null) { foreach (var line in lines) { var match = SemVerRegex.Match(line); if (match.Success) { version = line; break; } } } platform ??= "Linux"; version ??= ""; }); } else { platform = "Windows"; version = System.Environment.OSVersion.Version.ToString(); } return $"{platform} {version} ({bitness})"; } private static void RunBash(string param, Action action) { try { using var p = new Process { StartInfo = new ProcessStartInfo { FileName = "bash", Arguments = $"-c \"{param}\"", CreateNoWindow = true, UseShellExecute = false, RedirectStandardOutput = true, }, EnableRaisingEvents = true, }; p.Start(); p.WaitForExit(200); action.Invoke(p.StandardOutput); } catch { } } public static PlatformVersion RuntimeData { get; } = GenRuntimeData(); private static PlatformVersion GenRuntimeData() { var ver = GetNetCoreVersion(); if (ver != null) return ver; ver = GetMonoVersion(); if (ver != null) return ver; ver = GetNetFrameworkVersion(); if (ver != null) return ver; return new PlatformVersion(Runtime.Unknown, "? (?)", null); } private static PlatformVersion? GetNetCoreVersion() { var assembly = typeof(System.Runtime.GCSettings).GetTypeInfo().Assembly; var assemblyPath = assembly.CodeBase?.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries); if (assemblyPath is null) return null; int netCoreAppIndex = Array.IndexOf(assemblyPath, "Microsoft.NETCore.App"); if (netCoreAppIndex <= 0 || netCoreAppIndex >= assemblyPath.Length - 2) return null; var version = assemblyPath[netCoreAppIndex + 1]; var semVer = ParseToSemVer(version); return new PlatformVersion(Runtime.Core, $".NET Core ({version})", semVer); } private static PlatformVersion? GetMonoVersion() { var type = Type.GetType("Mono.Runtime"); if (type is null) return null; var displayName = type.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static); if (displayName is null) return new PlatformVersion(Runtime.Mono, "Mono (?)", null); var version = displayName.Invoke(null, null) as string; var semVer = ParseToSemVer(version); return new PlatformVersion(Runtime.Mono, $"Mono ({version})", semVer); } private static PlatformVersion GetNetFrameworkVersion() { var version = System.Environment.Version.ToString(); var semVer = ParseToSemVer(version); return new PlatformVersion(Runtime.Net, $".NET Framework {version}", semVer); } private static Version? ParseToSemVer(string? version) { if (version is null) return null; var semMatch = SemVerRegex.Match(version); if (!semMatch.Success) return null; if (!int.TryParse(semMatch.Groups[1].Value, out var major)) major = 0; if (!int.TryParse(semMatch.Groups[2].Captures[0].Value, out var minor)) minor = 0; if (semMatch.Groups[2].Captures.Count <= 1 || !int.TryParse(semMatch.Groups[2].Captures[1].Value, out var patch)) patch = 0; if (semMatch.Groups[2].Captures.Count <= 2 || int.TryParse(semMatch.Groups[2].Captures[2].Value, out var revision)) revision = 0; return new Version(major, minor, patch, revision); } } public enum Runtime { Unknown, Net, Core, Mono, } public partial class BuildData { public string Version = ""; public string Branch = ""; public string CommitSha = ""; public string BuildConfiguration = ""; public BuildData() { GetDataInternal(); } public string ToLongString() => $"\nVersion: {Version}\nBranch: {Branch}\nCommitHash: {CommitSha}"; public override string ToString() => $"{Version}/{Branch}/{(CommitSha.Length > 8 ? CommitSha.Substring(0, 8) : CommitSha)}"; partial void GetDataInternal(); } public class PlatformVersion { public Runtime Runtime; public string FullName; public Version? SemVer; public PlatformVersion(Runtime runtime, string fullName, Version? semVer) { Runtime = runtime; FullName = fullName; SemVer = semVer; } public override string ToString() => FullName; } public static class SemVerExtension { public static string AsSemVer(this Version version) => $"{version.Major}.{version.Minor}.{version.Build}" + (version.Revision != 0 ? $".{version.Revision}" : null); } } ================================================ FILE: TS3AudioBot/Environment/SystemMonitor.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; using TSLib.Helper; using TSLib.Scheduler; namespace TS3AudioBot.Environment { public class SystemMonitor { private static readonly Process CurrentProcess = Process.GetCurrentProcess(); private readonly ReaderWriterLockSlim historyLock = new ReaderWriterLockSlim(); private readonly Queue history = new Queue(); private bool historyChanged = true; private SystemMonitorReport? lastReport = null; private DateTime lastSnapshotTime = DateTime.MinValue; private TimeSpan lastCpuTime = TimeSpan.Zero; public DateTime StartTime { get; } = Tools.Now; public SystemMonitor(DedicatedTaskScheduler scheduler) { _ = scheduler.CreateTimer(CreateSnapshot, TimeSpan.FromSeconds(1), true); } public void CreateSnapshot() { CurrentProcess.Refresh(); //TODO: foreach (ProcessThread thread in CurrentProcess.Threads) { } var currentSnapshotTime = Tools.Now; var currentCpuTime = CurrentProcess.TotalProcessorTime; var timeDiff = currentSnapshotTime - lastSnapshotTime; var cpuDiff = currentCpuTime - lastCpuTime; var cpu = cpuDiff.Ticks / (float)timeDiff.Ticks; lastSnapshotTime = currentSnapshotTime; lastCpuTime = currentCpuTime; historyLock.EnterWriteLock(); try { history.Enqueue(new SystemMonitorSnapshot { Memory = CurrentProcess.WorkingSet64, Cpu = cpu, }); while (history.Count > 60) history.Dequeue(); historyChanged = true; } finally { historyLock.ExitWriteLock(); } } public SystemMonitorReport GetReport() { try { historyLock.EnterReadLock(); if (historyChanged || lastReport == null) { lastReport = new SystemMonitorReport ( memory: history.Select(x => x.Memory).ToArray(), cpu: history.Select(x => x.Cpu).ToArray() ); historyChanged = false; } return lastReport; } finally { historyLock.ExitReadLock(); } } } public class SystemMonitorReport { public long[] Memory { get; } public float[] Cpu { get; } public SystemMonitorReport(long[] memory, float[] cpu) { Memory = memory; Cpu = cpu; } } public struct SystemMonitorSnapshot { public float Cpu { get; set; } public long Memory { get; set; } } } ================================================ FILE: TS3AudioBot/Error.cs ================================================ using System; using System.Runtime.Serialization; namespace TS3AudioBot { public static class Error { public static AudioBotException LocalStr(string text) => new AudioBotException().LocalStr(text); public static AudioBotException Exception(Exception ex) => new AudioBotException(ex); public static AudioBotException Str(string text) => new AudioBotException().Str(text); public static AudioBotException LocalStr(this AudioBotException ex, string text) { ex.LocalStr = text; return ex; } public static AudioBotException Str(this AudioBotException ex, string text) { ex.Str = text; return ex; } public static void Throw(this AudioBotException ex) => throw ex; } [Serializable] public class AudioBotException : Exception { public string? LocalStr { get; set; } public string? Str { get; set; } public Exception? InnerCustomException { get; set; } public override string Message => LocalStr ?? Str ?? ""; public AudioBotException(Exception? ex = null) : base(null, ex) { } public AudioBotException(string message, Exception? inner = null) : base(null, inner) { LocalStr = message; } protected AudioBotException(SerializationInfo info, StreamingContext context) : base(info, context) { } } } ================================================ FILE: TS3AudioBot/Helper/AttributeStrings.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Helper { internal static class AttributeStrings { public const string UnderDevelopment = "This feature is unstable and might change"; } } ================================================ FILE: TS3AudioBot/Helper/Const.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Helper { internal static class SessionConst { public const string SearchResult = "tab_searchresult"; } public static class BotPaths { public const string Playlists = "playlists"; public const string Avatars = "avatars"; public const string Music = "music"; } public static class FilesConst { public const string CoreConfig = "ts3audiobot.toml"; public const string BotConfig = "bot.toml"; } } ================================================ FILE: TS3AudioBot/Helper/Diagnose/SelfDiagnoseLevel.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Helper.Diagnose { public enum SelfDiagnoseLevel { Info, Warning, Error } } ================================================ FILE: TS3AudioBot/Helper/Diagnose/SelfDiagnoseMessage.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; namespace TS3AudioBot.Helper.Diagnose { public class SelfDiagnoseMessage { public string Description { get; } public string Category { get; } public string Level => LevelValue.ToString(); [JsonIgnore] public SelfDiagnoseLevel LevelValue { get; } public SelfDiagnoseMessage(string description, string category, SelfDiagnoseLevel levelValue) { Description = description; Category = category; LevelValue = levelValue; } } } ================================================ FILE: TS3AudioBot/Helper/IJsonConfig.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using System; using System.IO; using System.Text; namespace TS3AudioBot.Helper { public interface IJsonSerializable { bool ExpectsString { get; } void ToJson(JsonWriter writer); E FromJson(JsonReader reader); } public static class JsonSerializableExtensions { public static E FromJson(this IJsonSerializable jsonConfig, string json) { if (jsonConfig.ExpectsString) json = JsonConvert.SerializeObject(json); using var sr = new StringReader(json); using var reader = new JsonTextReader(sr); return jsonConfig.FromJson(reader); } public static string ToJson(this IJsonSerializable jsonConfig) { var sb = new StringBuilder(); var sw = new StringWriter(sb); using (var writer = new JsonTextWriter(sw)) { writer.Formatting = Formatting.Indented; jsonConfig.ToJson(writer); } return sb.ToString(); } } public class IJsonSerializableConverter : JsonConverter { public override bool CanRead => false; public override bool CanWrite => true; public override bool CanConvert(Type objectType) { return typeof(IJsonSerializable).IsAssignableFrom(objectType); } public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { if (value is null) { writer.WriteNull(); } else { var obj = (IJsonSerializable)value; obj.ToJson(writer); } } } } ================================================ FILE: TS3AudioBot/Helper/ImageUtil.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Gif; using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.Processing; using System; using System.IO; using System.Threading.Tasks; namespace TS3AudioBot.Helper { internal static class ImageUtil { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); public const int ResizeMaxWidthDefault = 320; public static async Task ResizeImageSave(Stream imgStream, int resizeMaxWidth = ResizeMaxWidthDefault) { try { using var limitStream = new LimitStream(imgStream, Limits.MaxImageStreamSize); using var mem = new MemoryStream(); await limitStream.CopyToAsync(mem); mem.Seek(0, SeekOrigin.Begin); return ResizeImage(mem, resizeMaxWidth); } catch (ImageFormatException) { Log.Debug("Dropping image because of unknown format"); throw Error.LocalStr("Dropping image because of unknown format"); // TODO } catch (EntityTooLargeException) { Log.Debug("Dropping image because too large"); throw Error.LocalStr("Dropping image because too large"); // TODO } } private static ImageHolder ResizeImage(Stream imgStream, int resizeMaxWidth) { using var img = Image.Load(imgStream); if (img.Width > Limits.MaxImageDimension || img.Height > Limits.MaxImageDimension || img.Width == 0 || img.Height == 0) throw Error.LocalStr("Dropping image because too large"); // TODO if (img.Width <= resizeMaxWidth) return SaveAdaptive(img); float ratio = img.Width / (float)img.Height; img.Mutate(x => x.Resize(resizeMaxWidth, (int)(resizeMaxWidth / ratio))); return SaveAdaptive(img); } private static ImageHolder SaveAdaptive(Image img) { IImageFormat format; if (img.Frames.Count > 1) { format = GifFormat.Instance; } else { format = JpegFormat.Instance; } var mime = format.DefaultMimeType; var mem = new MemoryStream(); img.Save(mem, format); mem.Seek(0, SeekOrigin.Begin); return new ImageHolder(mem, mime); } } class ImageHolder : IDisposable { public Stream Stream { get; } public string Mime { get; } public ImageHolder(Stream stream, string mime) { Stream = stream; Mime = mime; } public void Dispose() => Stream.Dispose(); } } ================================================ FILE: TS3AudioBot/Helper/Interactive.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Threading.Tasks; namespace TS3AudioBot.Helper { public static class Interactive { public static bool UserAgree(bool defaultTo = true) { while (true) { var key = Console.ReadKey(true).Key; if (key == ConsoleKey.Y || (defaultTo && key == ConsoleKey.Enter)) return true; if (key == ConsoleKey.N || (!defaultTo && key == ConsoleKey.Enter)) return false; } } public static string? LoopAction(string question, Func action) { string text; do { Console.WriteLine(question); text = Console.ReadLine(); if (text is null) return null; } while (!action(text)); return text; } public static async Task LoopActionAsync(string question, Func> action) { string text; do { Console.WriteLine(question); text = Console.ReadLine(); if (text is null) return null; } while (!await action(text)); return text; } } } ================================================ FILE: TS3AudioBot/Helper/LimitStream.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.IO; namespace TS3AudioBot.Helper { public class LimitStream : Stream { private readonly Stream baseStream; public LimitStream(Stream baseStream, long maxLength) { this.baseStream = baseStream; MaxLength = maxLength; } public long MaxLength { get; } public long IOBytes { get; private set; } public override bool CanRead => baseStream.CanRead; public override bool CanSeek => false; public override bool CanWrite => baseStream.CanWrite; public override long Length => baseStream.Length; public override long Position { get => baseStream.Position; set => baseStream.Position = value; } public override void Flush() => baseStream.Flush(); public override int Read(byte[] buffer, int offset, int count) { if (IOBytes + count > MaxLength) { count = (int)(MaxLength - IOBytes); if (count <= 0) throw new EntityTooLargeException(MaxLength); } int read = baseStream.Read(buffer, offset, count); IOBytes += read; return read; } public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException(); public override void SetLength(long value) => baseStream.SetLength(value); public override void Write(byte[] buffer, int offset, int count) { if (IOBytes + count > MaxLength) throw new EntityTooLargeException(MaxLength); IOBytes += count; baseStream.Write(buffer, offset, count); } protected override void Dispose(bool disposing) { if (disposing) { baseStream.Dispose(); } } } [Serializable] public class EntityTooLargeException : Exception { private const string ErrMsg = "Content exceeds the limit of {0} bytes"; public EntityTooLargeException() { } public EntityTooLargeException(long maxLen) : base(string.Format(ErrMsg, maxLen)) { } } } ================================================ FILE: TS3AudioBot/Helper/TextUtil.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Globalization; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Xml; namespace TS3AudioBot.Helper { public static class TextUtil { public static Answer GetAnswer(string answer) { if (string.IsNullOrEmpty(answer)) return Answer.Unknown; if (answer.StartsWith("!y", StringComparison.OrdinalIgnoreCase)) return Answer.Yes; else if (answer.StartsWith("!n", StringComparison.OrdinalIgnoreCase)) return Answer.No; else return Answer.Unknown; } private static readonly Regex BbMatch = new Regex(@"\[URL\](.+?)\[\/URL\]", Util.DefaultRegexConfig); public static string ExtractUrlFromBb(string ts3Link) { if (ts3Link.Contains("[URL]")) { var match = BbMatch.Match(ts3Link); if (match.Success) return match.Groups[1].Value; } return ts3Link; } public static string StripQuotes(string quotedString, bool throwWhenIncorrect = false) { if (quotedString.Length <= 1 || !quotedString.StartsWith("\"", StringComparison.Ordinal) || !quotedString.EndsWith("\"", StringComparison.Ordinal)) { if (throwWhenIncorrect) throw new ArgumentException("The string is not properly quoted"); else return quotedString; } return quotedString[1..^1]; } public static string GenToken(int length) { const string tokenChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; using var rng = RandomNumberGenerator.Create(); var buffer = new byte[length]; rng.GetBytes(buffer); var strb = new StringBuilder(buffer.Length); for (int i = 0; i < buffer.Length; i++) strb.Append(tokenChars[((tokenChars.Length - 1) * buffer[i]) / 255]); return strb.ToString(); } private static readonly Regex TimeReg = new Regex(@"^(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?(?:(\d+)ms)?$", Util.DefaultRegexConfig); public static TimeSpan? ParseTime(string value) { if (value is null) return null; return ParseTimeAsSimple(value) ?? ParseTimeAsDigital(value) ?? ParseTimeAsXml(value); } private static TimeSpan? ParseTimeAsSimple(string value) { static int AsNum(string svalue) { if (string.IsNullOrEmpty(svalue)) return 0; return int.TryParse(svalue, out var num) ? num : 0; } var match = TimeReg.Match(value); if (match.Success) { try { return new TimeSpan( AsNum(match.Groups[1].Value), AsNum(match.Groups[2].Value), AsNum(match.Groups[3].Value), AsNum(match.Groups[4].Value), AsNum(match.Groups[5].Value)); } catch { } } return null; } private static TimeSpan? ParseTimeAsDigital(string value) { if (value.Contains(":")) { string[] splittime = value.Split(':'); if (splittime.Length == 2 && int.TryParse(splittime[0], out var minutes) && double.TryParse(splittime[1], NumberStyles.Integer | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var seconds)) { return TimeSpan.FromSeconds(seconds) + TimeSpan.FromMinutes(minutes); } } else { if (double.TryParse(value, NumberStyles.Integer | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var seconds)) return TimeSpan.FromSeconds(seconds); } return null; } private static TimeSpan? ParseTimeAsXml(string value) { try { return XmlConvert.ToTimeSpan(value); } catch (FormatException) { return null; } } public static E ValidateTime(string value) { if (ParseTime(value) != null) return R.Ok; return $"Value '{value}' is not a valid time."; } } public enum Answer { Unknown, Yes, No } } ================================================ FILE: TS3AudioBot/Helper/TomlTools.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Nett; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Text; namespace TS3AudioBot.Helper { public static class TomlTools { // *** Convenience method for getting values out of a toml object. *** public static bool TryGetValueArray(this TomlObject tomlObj, [NotNullWhen(true)] out T[]? value) where T : notnull { if (tomlObj.TomlType == TomlObjectType.Array) { var tomlArray = (TomlArray)tomlObj; value = new T[tomlArray.Length]; for (int i = 0; i < tomlArray.Length; i++) { if (!tomlArray.Items[i].TryGetValue(out value[i]!)) { value = null; return false; } } return true; } else if (tomlObj.TryGetValue(out T retSingleVal)) { value = new[] { retSingleVal }; return true; } value = null; return false; } public static bool TryGetValue(this TomlObject tomlObj, [MaybeNullWhen(false)] out T value) where T : notnull { switch (tomlObj.TomlType) { case TomlObjectType.Int: if (typeof(T) == typeof(long)) { // The base storage type for TomlInt is long, so we can simply return it. value = (T)(object)((TomlInt)tomlObj).Value; return true; } else if (typeof(T) == typeof(ulong)) { // ulong is the only type which needs to be casted so we can use it. // This might not be the greatest solution, but we can express ulong.MaxValue with -1 for example. value = (T)(object)(ulong)((TomlInt)tomlObj).Value; return true; } else if (typeof(T) == typeof(uint) || typeof(T) == typeof(int) || typeof(T) == typeof(ushort) || typeof(T) == typeof(short) || typeof(T) == typeof(byte) || typeof(T) == typeof(sbyte) || typeof(T) == typeof(float) || typeof(T) == typeof(double)) { // All other types will be converted to catch overflow issues. try { value = (T)Convert.ChangeType(((TomlInt)tomlObj).Value, typeof(T)); return true; } catch (OverflowException) { } } break; case TomlObjectType.Float: if (typeof(T) == typeof(double)) { // Same here, double is the base type for TomlFloat. value = (T)(object)((TomlFloat)tomlObj).Value; return true; } else if (typeof(T) == typeof(float)) { // double -> float cast works as we expect it. value = (T)(object)(float)((TomlFloat)tomlObj).Value; return true; } break; case TomlObjectType.Bool: case TomlObjectType.DateTime: case TomlObjectType.TimeSpan: if (tomlObj is TomlValue tomlValue && typeof(T) == tomlValue.Value.GetType()) { value = tomlValue.Value; return true; } break; case TomlObjectType.String: if (typeof(T).IsEnum) { try { value = (T)Enum.Parse(typeof(T), ((TomlString)tomlObj).Value, true); return true; } catch (ArgumentException) { } catch (OverflowException) { } } else if (typeof(T) == typeof(string)) { value = ((TomlValue)tomlObj).Value; return true; } else if (typeof(T) == typeof(TimeSpan)) { var timeSpanMaybe = TextUtil.ParseTime(((TomlString)tomlObj).Value); if (timeSpanMaybe != null) { value = (T)(object)timeSpanMaybe.Value; return true; } } break; } value = default!; return false; } public static string SerializeTime(TimeSpan time) { if (time.TotalMilliseconds < 1) return "0s"; var strb = new StringBuilder(); if (time.TotalDays >= 1) { strb.Append(time.TotalDays.ToString("F0")).Append('d'); time -= TimeSpan.FromDays(time.Days); } if (time.Hours > 0) strb.Append(time.Hours).Append("h"); if (time.Minutes > 0) strb.Append(time.Minutes).Append("m"); if (time.Seconds > 0) strb.Append(time.Seconds).Append("s"); if (time.Milliseconds > 0) strb.Append(time.Milliseconds).Append("ms"); return strb.ToString(); } // *** Convenience method for setting values to a toml object. *** public static TomlObject Set(this TomlTable tomlTable, string key, T value) { if (tomlTable is null) throw new ArgumentNullException(nameof(tomlTable)); if (key is null) throw new ArgumentNullException(nameof(key)); if (value is null) throw new ArgumentNullException(nameof(value)); // I literally have no idea how to write it better with this toml library. // Note for TimeSpan: since TimeSpan as Nett (de)serializes it is not standartized we have to cast it manually TomlObject retobj = tomlTable.TryGetValue(key); if (retobj is null) { if (typeof(T) == typeof(bool)) return tomlTable.Add(key, (bool)(object)value).Added; else if (typeof(T) == typeof(string)) return tomlTable.Add(key, (string)(object)value).Added; else if (typeof(T) == typeof(double)) return tomlTable.Add(key, (double)(object)value).Added; else if (typeof(T) == typeof(float)) return tomlTable.Add(key, (float)(object)value).Added; else if (typeof(T) == typeof(ushort)) return tomlTable.Add(key, /*auto*/(ushort)(object)value).Added; else if (typeof(T) == typeof(int)) return tomlTable.Add(key, (int)(object)value).Added; else if (typeof(T) == typeof(long)) return tomlTable.Add(key, (long)(object)value).Added; else if (typeof(T) == typeof(ulong)) return tomlTable.Add(key, (long)(ulong)(object)value).Added; else if (typeof(T) == typeof(TimeSpan)) return tomlTable.Add(key, SerializeTime((TimeSpan)(object)value)).Added; else if (typeof(T) == typeof(DateTime)) return tomlTable.Add(key, (DateTime)(object)value).Added; else if (typeof(T).IsEnum) return tomlTable.Add(key, value.ToString()).Added; else if (value is IEnumerable enubool) return tomlTable.Add(key, enubool).Added; else if (value is IEnumerable enustring) return tomlTable.Add(key, enustring).Added; else if (value is IEnumerable enudouble) return tomlTable.Add(key, enudouble).Added; else if (value is IEnumerable enufloat) return tomlTable.Add(key, enufloat).Added; else if (value is IEnumerable enuushort) return tomlTable.Add(key, enuushort.Select(x => (int)x)).Added; else if (value is IEnumerable enuint) return tomlTable.Add(key, enuint).Added; else if (value is IEnumerable enulong) return tomlTable.Add(key, enulong).Added; else if (value is IEnumerable enuulong) return tomlTable.Add(key, enuulong.Select(x => (long)x)).Added; else if (value is IEnumerable enuTimeSpan) return tomlTable.Add(key, enuTimeSpan.Select(SerializeTime)).Added; else if (value is IEnumerable enuDateTime) return tomlTable.Add(key, enuDateTime).Added; } else { TomlComment[]? docs = null; if (retobj.Comments.Any()) docs = retobj.Comments.ToArray(); if (typeof(T) == typeof(bool)) retobj = tomlTable.Update(key, (bool)(object)value).Added; else if (typeof(T) == typeof(string)) retobj = tomlTable.Update(key, (string)(object)value).Added; else if (typeof(T) == typeof(double)) retobj = tomlTable.Update(key, (double)(object)value).Added; else if (typeof(T) == typeof(float)) retobj = tomlTable.Update(key, (float)(object)value).Added; else if (typeof(T) == typeof(ushort)) retobj = tomlTable.Update(key, /*auto*/(ushort)(object)value).Added; else if (typeof(T) == typeof(int)) retobj = tomlTable.Update(key, /*auto*/(int)(object)value).Added; else if (typeof(T) == typeof(long)) retobj = tomlTable.Update(key, (long)(object)value).Added; else if (typeof(T) == typeof(ulong)) retobj = tomlTable.Update(key, (long)(ulong)(object)value).Added; else if (typeof(T) == typeof(TimeSpan)) retobj = tomlTable.Update(key, SerializeTime((TimeSpan)(object)value)).Added; else if (typeof(T) == typeof(DateTime)) retobj = tomlTable.Update(key, (DateTime)(object)value).Added; else if (typeof(T).IsEnum) retobj = tomlTable.Update(key, value.ToString()).Added; else if (value is IEnumerable enubool) return tomlTable.Update(key, enubool).Added; else if (value is IEnumerable enustring) return tomlTable.Update(key, enustring).Added; else if (value is IEnumerable enudouble) return tomlTable.Update(key, enudouble).Added; else if (value is IEnumerable enufloat) return tomlTable.Update(key, enufloat).Added; else if (value is IEnumerable enuushort) return tomlTable.Update(key, enuushort.Select(x => (int)x)).Added; else if (value is IEnumerable enuint) return tomlTable.Update(key, enuint).Added; else if (value is IEnumerable enulong) return tomlTable.Update(key, enulong).Added; else if (value is IEnumerable enuulong) return tomlTable.Update(key, enuulong.Select(x => (long)x)).Added; else if (value is IEnumerable enuTimeSpan) return tomlTable.Update(key, enuTimeSpan.Select(SerializeTime)).Added; else if (value is IEnumerable enuDateTime) return tomlTable.Update(key, enuDateTime).Added; else throw new NotSupportedException("The type is not supported"); if (docs != null) retobj.AddComments(docs); return retobj; } throw new NotSupportedException("The type is not supported"); } // *** TomlPath engine *** public static IEnumerable ByPath(this TomlObject obj, string path) { var pathM = path.AsMemory(); return ProcessIdentifier(obj, pathM); } private static IEnumerable ProcessIdentifier(TomlObject obj, ReadOnlyMemory pathM) { if (pathM.IsEmpty) return Enumerable.Empty(); var path = pathM.Span; switch (path[0]) { case '*': { var rest = pathM[1..]; if (rest.IsEmpty) return obj.GetAllSubItems(); if (IsArray(rest.Span)) return obj.GetAllSubItems().SelectMany(x => ProcessArray(x, rest)); else if (IsDot(rest.Span)) return obj.GetAllSubItems().SelectMany(x => ProcessDot(x, rest)); else throw new ArgumentException("Invalid expression after wildcard", nameof(pathM)); } case '[': throw new ArgumentException("Invalid array open bracket", nameof(pathM)); case ']': throw new ArgumentException("Invalid array close bracket", nameof(pathM)); case '.': throw new ArgumentException("Invalid dot", nameof(pathM)); default: { var subItemName = path; var rest = ReadOnlyMemory.Empty; bool cont = false; for (int i = 0; i < path.Length; i++) { // todo allow in future if (path[i] == '*') throw new ArgumentException("Invalid wildcard position", nameof(pathM)); var currentSub = path[i..]; if (!IsIdentifier(currentSub)) // if (!IsName) { cont = true; subItemName = path[..i]; rest = pathM[i..]; break; } } var item = obj.GetSubItemByName(subItemName); if (item is null) return Enumerable.Empty(); if (cont) { if (IsArray(rest.Span)) return ProcessArray(item, rest); else if (IsDot(rest.Span)) return ProcessDot(item, rest); else throw new ArgumentException("Invalid expression name identifier", nameof(pathM)); } return new[] { item }; } } } private static IEnumerable ProcessArray(TomlObject obj, ReadOnlyMemory pathM) { var path = pathM.Span; if (path[0] != '[') throw new ArgumentException("Expected array open breacket", nameof(pathM)); for (int i = 1; i < path.Length; i++) { if (path[i] == ']') { if (i == 0) throw new ArgumentException("Empty array indexer", nameof(pathM)); var indexer = path[1..i]; var rest = pathM.Slice(i + 1); bool cont = rest.Length > 0; // select if (indexer.Length == 1 && indexer[0] == '*') { var ret = obj.GetAllArrayItems(); if (cont) { if (IsArray(rest.Span)) return ret.SelectMany(x => ProcessArray(x, rest)); else if (IsDot(rest.Span)) return ret.SelectMany(x => ProcessDot(x, rest)); else throw new ArgumentException("Invalid expression after array indexer", nameof(pathM)); } return ret; } else { var ret = obj.GetArrayItemByIndex(indexer); if (ret is null) return Enumerable.Empty(); if (cont) { if (IsArray(rest.Span)) return ProcessArray(ret, rest); else if (IsDot(rest.Span)) return ProcessDot(ret, rest); else throw new ArgumentException("Invalid expression after array indexer", nameof(pathM)); } return new[] { ret }; } } } throw new ArgumentException("Missing array close bracket", nameof(pathM)); } private static IEnumerable ProcessDot(TomlObject obj, ReadOnlyMemory pathM) { var path = pathM.Span; if (!IsDot(path)) throw new ArgumentException("Expected dot", nameof(pathM)); var rest = pathM[1..]; if (!IsIdentifier(rest.Span)) throw new ArgumentException("Expected identifier after dot", nameof(pathM)); return ProcessIdentifier(obj, rest); } internal static bool IsArray(ReadOnlySpan name) => name.Length >= 1 && (name[0] == '['); internal static bool IsIdentifier(ReadOnlySpan name) => name.Length >= 1 && (name[0] != '[' && name[0] != ']' && name[0] != '.'); internal static bool IsDot(ReadOnlySpan name) => name.Length >= 1 && (name[0] == '.'); private static TomlObject? GetArrayItemByIndex(this TomlObject obj, ReadOnlySpan index) { int indexNum = int.Parse(new string(index.ToArray())); if (indexNum < 0) return null; //if (!System.Buffers.Text.Utf8Parser.TryParse(index, out int indexNum, out int bytesConsumed)) //throw new ArgumentException("Invalid array indexer"); if (obj.TomlType == TomlObjectType.Array) { var tomlTable = (TomlArray)obj; if (indexNum < tomlTable.Length) return tomlTable[indexNum]; } else if (obj.TomlType == TomlObjectType.ArrayOfTables) { var tomlTableArray = (TomlTableArray)obj; if (indexNum >= tomlTableArray.Count) return tomlTableArray[indexNum]; } return null; } private static IEnumerable GetAllArrayItems(this TomlObject obj) { if (obj.TomlType == TomlObjectType.Array) return ((TomlArray)obj).Items; else if (obj.TomlType == TomlObjectType.ArrayOfTables) return ((TomlTableArray)obj).Items; return Enumerable.Empty(); } private static TomlObject? GetSubItemByName(this TomlObject obj, ReadOnlySpan name) { if (obj.TomlType == TomlObjectType.Table) return ((TomlTable)obj).TryGetValue(new string(name.ToArray())); return null; } private static IEnumerable GetAllSubItems(this TomlObject obj) { if (obj.TomlType == TomlObjectType.Table) return ((TomlTable)obj).Values; return Enumerable.Empty(); } // *** Toml Serializer *** public static string DumpToJson(this TomlObject obj) { var sb = new StringBuilder(); var sw = new StringWriter(sb); using (var writer = new JsonTextWriter(sw)) { writer.Formatting = Formatting.Indented; DumpToJson(obj, writer); } return sb.ToString(); } public static void DumpToJson(this TomlObject obj, JsonWriter writer) { switch (obj.TomlType) { case TomlObjectType.Bool: writer.WriteValue(((TomlBool)obj).Value); break; case TomlObjectType.Int: writer.WriteValue(((TomlInt)obj).Value); break; case TomlObjectType.Float: writer.WriteValue(((TomlFloat)obj).Value); break; case TomlObjectType.String: writer.WriteValue(((TomlString)obj).Value); break; case TomlObjectType.DateTime: writer.WriteValue(((TomlLocalDateTime)obj).Value); break; case TomlObjectType.TimeSpan: writer.WriteValue(((TomlDuration)obj).Value); break; case TomlObjectType.Array: case TomlObjectType.ArrayOfTables: writer.WriteStartArray(); IEnumerable list; if (obj.TomlType == TomlObjectType.Array) list = ((TomlArray)obj).Items; else list = ((TomlTableArray)obj).Items; foreach (var item in list) DumpToJson(item, writer); writer.WriteEndArray(); break; case TomlObjectType.Table: writer.WriteStartObject(); foreach (var kvp in (TomlTable)obj) { writer.WritePropertyName(kvp.Key); DumpToJson(kvp.Value, writer); } writer.WriteEndObject(); break; } } } } ================================================ FILE: TS3AudioBot/Helper/Util.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using TS3AudioBot.CommandSystem; using TS3AudioBot.Localization; using TSLib.Messages; namespace TS3AudioBot.Helper { public static class Util { public const RegexOptions DefaultRegexConfig = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ECMAScript; private static readonly Regex SafeFileNameMatcher = new Regex(@"^[\w-_]+$", DefaultRegexConfig); private static readonly string[] byteSuffix = { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; public static string FormatBytesHumanReadable(long bytes) { if (bytes == 0) return "0B"; var order = (int)Math.Log(Math.Abs(bytes), 1024); return (bytes >> (10 * order)) + byteSuffix[order]; } public static string FromSeed(int seed) { var seedstr = new char[7]; uint plainseed = unchecked((uint)seed); for (int i = 0; i < 7; i++) { if (plainseed > 0) { plainseed--; var remainder = plainseed % 26; seedstr[i] = (char)(remainder + 'a'); plainseed = (plainseed - remainder) / 26; } else { seedstr[i] = '\0'; } } return new string(seedstr).TrimEnd('\0'); } public static int ToSeed(string seed) { long finalValue = 0; for (int i = 0; i < seed.Length; i++) { long powVal = (seed[i] - 'a' + 1) * Pow(26, i % 7); finalValue += powVal; finalValue %= ((long)uint.MaxValue + 1); } var uval = (uint)finalValue; return unchecked((int)uval); } private static long Pow(long b, int pow) { long ret = 1; while (pow != 0) { if ((pow & 1) == 1) ret *= b; b *= b; pow >>= 1; } return ret; } public static Stream? GetEmbeddedFile(string name) { var assembly = Assembly.GetExecutingAssembly(); return assembly.GetManifestResourceStream(name); } public static bool TryCast(this JToken token, string key, [MaybeNullWhen(false)] out T value) where T : notnull { value = default!; if (token is null) return false; var jValue = token.SelectToken(key); if (jValue is null) return false; try { var t = jValue.ToObject(); if (t is null) return false; value = t; return true; } catch (JsonReaderException) { return false; } } public static E IsSafeFileName(string name) { if (string.IsNullOrWhiteSpace(name)) return new LocalStr(strings.error_playlist_name_invalid_empty); // TODO change to more generic error if (name.Length > 64) return new LocalStr(strings.error_playlist_name_invalid_too_long); if (!SafeFileNameMatcher.IsMatch(name)) return new LocalStr(strings.error_playlist_name_invalid_character); return R.Ok; } public static IEnumerable SelectOk(this IEnumerable source, Func> selector) where TSource : notnull where TResult : notnull where TErr : notnull => source.Select(selector).Where(x => x.Ok).Select(x => x.Value); public static bool HasExitedSafe(this Process process) { try { return process.HasExited; } catch { return true; } } public static V GetOrNew(this IDictionary dict, K key) where K : notnull where V : new() { if (!dict.TryGetValue(key, out var val)) { val = new V(); dict[key] = val; } return val; } public static async Task CatchToLog(this Task t, NLog.Logger logger, NLog.LogLevel? level = null) { try { await t; } catch (AudioBotException ex) { logger.Log(level ?? NLog.LogLevel.Warn, ex, ex.Message); } } public static async Task Try(this Task t) where T : class { try { return await t; } catch { return null; } } public static T? Try(Func t) where T : class { try { return t(); } catch { return null; } } public static void UnwrapThrow(this E r) { if (!r.Ok) throw new CommandException(r.Error.Str, CommandExceptionReason.CommandError); } public static T UnwrapThrow(this R r) where T : notnull { if (r.Ok) return r.Value; else throw new CommandException(r.Error.Str, CommandExceptionReason.CommandError); } public static bool UnwrapToLog(this E r, NLog.Logger logger, NLog.LogLevel? level = null) { if (!r.Ok) logger.Log(level ?? NLog.LogLevel.Warn, r.Error.Str); return r.Ok; } public static bool UnwrapToLog(this E r, NLog.Logger logger, NLog.LogLevel? level = null) { if (!r.Ok) logger.Log(level ?? NLog.LogLevel.Warn, r.Error.ErrorFormat()); return r.Ok; } } } ================================================ FILE: TS3AudioBot/Helper/WebWrapper.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Text.Json; using System.Threading; using System.Threading.Tasks; using TS3AudioBot.Localization; namespace TS3AudioBot.Helper { public static class WebWrapper { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); public static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(10); private const string TimeoutPropertyKey = "RequestTimeout"; private static readonly HttpClient httpClient = new HttpClient(new RedirectHandler(new HttpClientHandler())); static WebWrapper() { ServicePointManager.DefaultConnectionLimit = int.MaxValue; httpClient.Timeout = DefaultTimeout; httpClient.DefaultRequestHeaders.UserAgent.Clear(); ProductInfoHeaderValue version = ProductInfoHeaderValue.TryParse($"TS3AudioBot/{Environment.SystemData.AssemblyData.Version}", out var v) ? v : new ProductInfoHeaderValue("TS3AudioBot", "1.3.3.7"); httpClient.DefaultRequestHeaders.UserAgent.Add(version); } // Start public static HttpRequestMessage Request(string? link) => Request(CreateUri(link)); public static HttpRequestMessage Request(Uri uri) => new HttpRequestMessage(HttpMethod.Get, uri); // Prepare public static HttpRequestMessage WithMethod(this HttpRequestMessage request, HttpMethod method) { request.Method = method; return request; } public static HttpRequestMessage WithHeader(this HttpRequestMessage request, string name, string value) { request.Headers.Add(name, value); return request; } public static HttpRequestMessage WithTimeout(this HttpRequestMessage request, TimeSpan timeout) { request.Properties[TimeoutPropertyKey] = timeout; return request; } // Return public static async Task Send(this HttpRequestMessage request) { try { using (request) { using var response = await httpClient.SendDefaultAsync(request); } } catch (Exception ex) when (ex is HttpRequestException || ex is OperationCanceledException) { throw ToLoggedError(ex); } } public static async Task AsString(this HttpRequestMessage request) { try { using (request) { using var response = await httpClient.SendDefaultAsync(request); return await response.Content.ReadAsStringAsync(); } } catch (Exception ex) when (ex is HttpRequestException || ex is OperationCanceledException) { throw ToLoggedError(ex); } } public static async Task AsJson(this HttpRequestMessage request) { try { using (request) { using var response = await httpClient.SendDefaultAsync(request); using var stream = await response.Content.ReadAsStreamAsync(); var obj = await JsonSerializer.DeserializeAsync(stream); if (obj is null) throw Error.LocalStr(strings.error_net_empty_response); return obj; } } catch (JsonException ex) { Log.Debug(ex, "Failed to parse json."); throw Error.LocalStr(strings.error_media_internal_invalid + " (json-request)"); } catch (Exception ex) when (ex is HttpRequestException || ex is OperationCanceledException) { throw ToLoggedError(ex); } } public static async Task ToAction(this HttpRequestMessage request, Func body) { try { using (request) { using var response = await httpClient.SendDefaultAsync(request); await body.Invoke(response); } } catch (Exception ex) when (ex is HttpRequestException || ex is OperationCanceledException) { throw ToLoggedError(ex); } } public static async Task ToAction(this HttpRequestMessage request, Func> body) { try { using (request) { using var response = await httpClient.SendDefaultAsync(request); return await body.Invoke(response); } } catch (Exception ex) when (ex is HttpRequestException || ex is OperationCanceledException) { throw ToLoggedError(ex); } } public static Task ToStream(this HttpRequestMessage request, Func body) => request.ToAction(async response => await body(await response.Content.ReadAsStreamAsync())); public static async Task UnsafeResponse(this HttpRequestMessage request) { try { using (request) { var response = await httpClient.SendDefaultAsync(request); return response; } } catch (Exception ex) when (ex is HttpRequestException || ex is OperationCanceledException) { throw ToLoggedError(ex); } } public static async Task UnsafeStream(this HttpRequestMessage request) => await (await request.UnsafeResponse()).Content.ReadAsStreamAsync(); // Util public static string? GetSingle(this HttpHeaders headers, string name) => headers.TryGetValues(name, out var hvals) ? hvals.FirstOrDefault() : null; private static async Task SendDefaultAsync(this HttpClient client, HttpRequestMessage request) { var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); CheckOkReturnCodeOrThrow(response); return response; } private static AudioBotException ToLoggedError(Exception ex) { if (ex is OperationCanceledException webEx) { Log.Debug(webEx, "Request timed out"); throw Error.Exception(ex).LocalStr(strings.error_net_timeout); } Log.Debug(ex, "Unknown request error"); throw Error.Exception(ex).LocalStr(strings.error_net_unknown); } private static Uri CreateUri(string? link) { if (!Uri.TryCreate(link, UriKind.RelativeOrAbsolute, out var uri)) throw Error.LocalStr(strings.error_media_invalid_uri); return uri; } private static void CheckOkReturnCodeOrThrow(HttpResponseMessage response) { if (!response.IsSuccessStatusCode) { Log.Debug("Web error: [{0}] {1}", (int)response.StatusCode, response.StatusCode); throw Error .LocalStr($"{strings.error_net_error_status_code} [{(int)response.StatusCode}] {response.StatusCode}"); } } } // HttpClient does not allow unsafe HTTPS->HTTP redirects. // But we don't care because audio streaming is not security critical // This loop implements a simple redirect following on 301/302 with at most 5 redirects. public class RedirectHandler : DelegatingHandler { private const int MaxRedirects = 5; public RedirectHandler(HttpMessageHandler innerHandler) : base(innerHandler) { } protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { HttpResponseMessage response; for (int i = 0; i < MaxRedirects; i++) { response = await base.SendAsync(request, cancellationToken); if (response.StatusCode == HttpStatusCode.Moved || response.StatusCode == HttpStatusCode.Redirect) { request.RequestUri = response.Headers.Location; } else { return response; } } throw Error.LocalStr(strings.error_media_internal_invalid + " (Max redirects reached)"); } } } ================================================ FILE: TS3AudioBot/History/AudioLogEntry.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Globalization; using TS3AudioBot.CommandSystem.CommandResults; using TS3AudioBot.ResourceFactories; namespace TS3AudioBot.History { public class AudioLogEntry : IAudioResourceResult { /// A unique id for each , given by the history system. public int Id { get; set; } /// Left for legacy reasons. The dbid of the teamspeak user, who played this song first. [Obsolete] public uint? UserInvokeId { get; set; } /// The Uid of the teamspeak user, who played this song first. public string? UserUid { get; set; } /// How often the song has been played. public uint PlayCount { get; set; } /// The last time this song has been played. public DateTime Timestamp { get; set; } public AudioResource AudioResource { get; set; } public AudioLogEntry() { PlayCount = 0; AudioResource = null!; } public AudioLogEntry(int id, AudioResource resource, string userUid) : this() { Id = id; AudioResource = resource; UserUid = userUid; } public void SetName(string newName) { AudioResource.ResourceTitle = newName; } public override string ToString() { return string.Format(CultureInfo.InvariantCulture, "[{0}] @ {1} by {2}: {3}, ({4})", Id, Timestamp, UserUid, AudioResource.ResourceTitle, AudioResource); } } } ================================================ FILE: TS3AudioBot/History/HistoryManager.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using LiteDB; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using TS3AudioBot.Config; using TS3AudioBot.Localization; using TS3AudioBot.ResourceFactories; using TSLib; using TSLib.Helper; namespace TS3AudioBot.History { /// Stores all played songs. Can be used to search and restore played songs. public sealed class HistoryManager { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private const int CurrentHistoryVersion = 1; private const string AudioLogEntriesTable = "audioLogEntries"; private const string ResourceTitleQueryColumn = "lowTitle"; private readonly LiteCollection audioLogEntries; private readonly LinkedList unusedIds = new LinkedList(); private readonly object dbLock = new object(); private readonly ConfHistory config; public IHistoryFormatter Formatter { get; private set; } public uint HighestId => (uint)audioLogEntries.Max().AsInt32; static HistoryManager() { BsonMapper.Global.Entity() .Id(x => x.Id); } public HistoryManager(ConfHistory config, DbStore database) { Formatter = new SmartHistoryFormatter(); this.config = config; var meta = database.GetMetaData(AudioLogEntriesTable); if (meta.Version > CurrentHistoryVersion) { Log.Error("Database table \"{0}\" is higher than the current version. (table:{1}, app:{2}). " + "Please download the latest TS3AudioBot to read the history.", AudioLogEntriesTable, meta.Version, CurrentHistoryVersion); throw new NotSupportedException(); } audioLogEntries = database.GetCollection(AudioLogEntriesTable); audioLogEntries.EnsureIndex(x => x.AudioResource.UniqueId, true); audioLogEntries.EnsureIndex(x => x.Timestamp); audioLogEntries.EnsureIndex(ResourceTitleQueryColumn, $"LOWER($.{nameof(AudioLogEntry.AudioResource)}.{nameof(AudioResource.ResourceTitle)})"); RestoreFromFile(); if (meta.Version == CurrentHistoryVersion) return; if (audioLogEntries.Count() == 0) { meta.Version = CurrentHistoryVersion; database.UpdateMetaData(meta); return; } // Content upgrade switch (meta.Version) { case 0: var all = audioLogEntries.FindAll().ToArray(); foreach (var audioLogEntry in all) { switch (audioLogEntry.AudioResource.AudioType) { case "MediaLink": audioLogEntry.AudioResource.AudioType = "media"; break; case "Youtube": audioLogEntry.AudioResource.AudioType = "youtube"; break; case "Soundcloud": audioLogEntry.AudioResource.AudioType = "soundcloud"; break; case "Twitch": audioLogEntry.AudioResource.AudioType = "twitch"; break; } } audioLogEntries.Update(all); meta.Version = 1; database.UpdateMetaData(meta); goto default; default: Log.Info("Database table \"{0}\" upgraded to {1}", AudioLogEntriesTable, meta.Version); break; } } private void RestoreFromFile() { // TODO load unused id list } public AudioLogEntry? LogAudioResource(HistorySaveData saveData) { if (saveData is null) throw new ArgumentNullException(nameof(saveData)); lock (dbLock) { var ale = FindByUniqueId(saveData.Resource.UniqueId); if (ale is null) { var createResult = CreateLogEntry(saveData); if (!createResult.Ok) { Log.Warn(createResult.Error, "AudioLogEntry could not be created!"); return null; } ale = createResult.Value; } else { LogEntryPlay(ale); } return ale; } } /// Increases the playcount and updates the last playtime. /// The to update. private void LogEntryPlay(AudioLogEntry ale) { if (ale is null) throw new ArgumentNullException(nameof(ale)); // update the playtime ale.Timestamp = Tools.Now; // update the playcount ale.PlayCount++; audioLogEntries.Update(ale); } private R CreateLogEntry(HistorySaveData saveData) { if (string.IsNullOrWhiteSpace(saveData.Resource.ResourceTitle)) return new Exception("Track name is empty"); int nextHid; var first = unusedIds.First; if (config.FillDeletedIds && first != null) { nextHid = first.Value; unusedIds.Remove(first); } else { nextHid = 0; } var userUid = (saveData.InvokerUid ?? Uid.Anonymous).Value ?? Uid.Anonymous.Value!; var ale = new AudioLogEntry(nextHid, saveData.Resource, userUid) { Timestamp = Tools.Now, PlayCount = 1, }; try { audioLogEntries.Insert(ale); return ale; } catch (Exception ex) { return ex; } } private AudioLogEntry? FindByUniqueId(string uniqueId) => audioLogEntries.FindOne(x => x.AudioResource.UniqueId == uniqueId); /// Gets all Entries matching the search criteria. /// The entries are sorted by last playtime descending. /// All search criteria. /// A list of all found entries. public IEnumerable Search(SeachQuery search) { if (search is null) throw new ArgumentNullException(nameof(search)); if (search.MaxResults <= 0) return Array.Empty(); var query = Query.All(nameof(AudioLogEntry.Timestamp), Query.Descending); if (!string.IsNullOrEmpty(search.TitlePart)) { var titleLower = search.TitlePart.ToLowerInvariant(); query = Query.And(query, Query.Where(ResourceTitleQueryColumn, val => val.AsString.Contains(titleLower))); } if (search.UserUid != null) query = Query.And(query, Query.EQ(nameof(AudioLogEntry.UserUid), search.UserUid)); if (search.LastInvokedAfter != null) query = Query.And(query, Query.GTE(nameof(AudioLogEntry.Timestamp), search.LastInvokedAfter.Value)); return audioLogEntries.Find(query, 0, search.MaxResults); } public string SearchParsed(SeachQuery query) => Format(Search(query)); public string Format(AudioLogEntry ale) => Formatter.ProcessQuery(ale, SmartHistoryFormatter.DefaultAleFormat); public string Format(IEnumerable aleList) => Formatter.ProcessQuery(aleList, SmartHistoryFormatter.DefaultAleFormat); public AudioLogEntry? FindEntryByResource(AudioResource resource) { if (resource is null) throw new ArgumentNullException(nameof(resource)); return FindByUniqueId(resource.UniqueId); } /// Gets an by its history id or null if not exising. /// The id of the AudioLogEntry public R GetEntryById(uint id) { var entry = audioLogEntries.FindById((long)id); if (entry != null) return entry; else return new LocalStr(strings.error_history_could_not_find_entry); } /// Removes the from the Database. /// The to delete. public bool RemoveEntry(AudioLogEntry ale) { if (ale is null) throw new ArgumentNullException(nameof(ale)); return audioLogEntries.Delete(ale.Id); } /// Sets the name of a . /// The id of the to rename. /// The new name for the . /// When ale is null or the name is null, empty or only whitespaces public void RenameEntry(AudioLogEntry ale, string newName) { if (ale is null) throw new ArgumentNullException(nameof(ale)); if (string.IsNullOrWhiteSpace(newName)) throw new ArgumentNullException(nameof(newName)); // update the name ale.SetName(newName); audioLogEntries.Update(ale); } public async Task RemoveBrokenLinks(ResolveContext resourceFactory) { const int iterations = 3; var currentIter = audioLogEntries.FindAll().ToList(); for (int i = 0; i < iterations; i++) { Log.Info("Filter iteration {0}", i); currentIter = await FilterList(resourceFactory, currentIter); } foreach (var entry in currentIter) { if (RemoveEntry(entry)) { Log.Info("Removed: {0} - {1}", entry.Id, entry.AudioResource.ResourceTitle); } } } /// /// Goes through a list of and checks if the contained /// is playable/resolvable. /// /// The list to iterate. /// A new list with all working items. private async Task> FilterList(ResolveContext resourceFactory, IReadOnlyCollection list) { int userNotifyCnt = 0; var nextIter = new List(list.Count); foreach (var entry in list) { try { await resourceFactory.Load(entry.AudioResource); } catch (AudioBotException ex) { Log.Debug("Cleaning: ({0}) Reason: {1}", entry.AudioResource.UniqueId, ex.Message); nextIter.Add(entry); } if (++userNotifyCnt % 100 == 0) Log.Debug("Clean in progress {0}", new string('.', userNotifyCnt / 100 % 10)); } return nextIter; } public async Task UpdadeDbIdToUid(Ts3Client ts3Client) { var upgradedEntries = new List(); var dbIdCache = new Dictionary(); foreach (var audioLogEntry in audioLogEntries.FindAll()) { #pragma warning disable CS0612 if (audioLogEntry.UserInvokeId is null) continue; if (audioLogEntry.UserUid != null || audioLogEntry.UserInvokeId.Value == 0) { audioLogEntry.UserInvokeId = null; upgradedEntries.Add(audioLogEntry); continue; } if (!dbIdCache.TryGetValue(audioLogEntry.UserInvokeId.Value, out var data)) { try { var dbData = await ts3Client.GetDbClientByDbId((ClientDbId)audioLogEntry.UserInvokeId.Value); data = (true, dbData.Uid); } catch (AudioBotException) { Log.Warn("Client DbId {0} could not be found.", audioLogEntry.UserInvokeId.Value); data = (false, Uid.Null); } dbIdCache.Add(audioLogEntry.UserInvokeId.Value, data); } if (!data.valid) continue; audioLogEntry.UserInvokeId = null; audioLogEntry.UserUid = data.uid.Value; upgradedEntries.Add(audioLogEntry); #pragma warning restore CS0612 } if (upgradedEntries.Count > 0) audioLogEntries.Update(upgradedEntries); Log.Info("Upgraded {0} entries.", upgradedEntries.Count); } } } ================================================ FILE: TS3AudioBot/History/HistorySaveData.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using TS3AudioBot.ResourceFactories; using TSLib; namespace TS3AudioBot.History { public class HistorySaveData { public AudioResource Resource { get; } public Uid? InvokerUid { get; } public HistorySaveData(AudioResource resource, Uid? invokerUid) { Resource = resource ?? throw new ArgumentNullException(nameof(resource)); InvokerUid = invokerUid; } } } ================================================ FILE: TS3AudioBot/History/IHistoryFormatter.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; namespace TS3AudioBot.History { public interface IHistoryFormatter { string ProcessQuery(AudioLogEntry entry, Func format); string ProcessQuery(IEnumerable entries, Func format); } // needed ? public enum HistoryDisplayColumn { AleId, UserDbId, UserName, AleTitle, } } ================================================ FILE: TS3AudioBot/History/SearchQuery.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TS3AudioBot.History { public class SeachQuery { public string? TitlePart { get; set; } public string? UserUid { get; set; } public DateTime? LastInvokedAfter { get; set; } public int MaxResults { get; set; } public SeachQuery() { TitlePart = null; UserUid = null; LastInvokedAfter = null; MaxResults = 10; } } } ================================================ FILE: TS3AudioBot/History/SmartHistoryFormatter.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using System.Text; using TSLib.Commands; namespace TS3AudioBot.History { public class SmartHistoryFormatter : IHistoryFormatter { // configurable constants private const string LineBreak = "\n"; private const int MinTokenLine = 40; private readonly bool fairDistribute = true; // resulting constants from configuration private static readonly int LineBreakLen = TsString.TokenLength(LineBreak); private static readonly int UseableTokenLine = MinTokenLine - LineBreakLen; public string ProcessQuery(AudioLogEntry entry, Func format) { return SubstringToken(format(entry), TsConst.Default.MaxSizeTextMessage); } public string ProcessQuery(IEnumerable entries, Func format) { //! entryLinesRev[0] is the most recent entry var entryLinesRev = entries.Select(e => { string finStr = format(e); return new Line(finStr, TsString.TokenLength(finStr)); }); //! entryLines[n] is the most recent entry var entryLines = entryLinesRev.Reverse(); var queryTokenLen = entryLines.Sum(eL => eL.TokenLength + LineBreakLen); StringBuilder strb; // If the entire content fits within the ts3 limitation, we can concat and return it. if (queryTokenLen <= TsConst.Default.MaxSizeTextMessage) { if (queryTokenLen == 0) return "Nothing found!"; strb = new StringBuilder(queryTokenLen, queryTokenLen); // we want the most recent entry at the bottom so we reverse the list foreach (var eL in entryLines) strb.Append(eL.Value).Append(LineBreak); return strb.ToString(); } int spareToken = TsConst.Default.MaxSizeTextMessage; int listStart = 0; // Otherwise we go iteratively through the list to test how many entries we can add with our token foreach (var eL in entryLinesRev) { // if we don't have enough token to fit in the next entry (even in shorted form) // then we break and use the last few tokens in the next step to fill up. if (spareToken < 0 || (spareToken < MinTokenLine && spareToken < eL.TokenLength)) break; // now the further execution is legal because of either of those cases // 1) !(spareToken < MinTokenLine): entry will be trimmed to MinTokenLine and fits // 2) !(spareToken < entryLines[i].TokenLength): entry already fits into spareTokens if (eL.TokenLength < MinTokenLine) { spareToken -= eL.TokenLength; listStart++; } else { spareToken -= MinTokenLine; listStart++; } } //! useList[0] is the most recent entry var useList = entryLinesRev.Take(listStart).ToList(); if (fairDistribute) { // If the fairDistribute option is active this loop will start out by trying to give each // entry an equal fraction of all spareToken. for (int i = 0; i < useList.Count; i++) { if (spareToken <= 0) break; int fairBonus = spareToken / (useList.Count - i); int available = Math.Min(fairBonus, useList[i].TokenLength); useList[i].BonusToken = available; spareToken -= available; } } else { // Now distribute the remaining tokens by first come first serve in reverse order // so the more recent an entry is the more token it gets foreach (var eL in useList) { if (spareToken <= 0) break; if (eL.TokenLength > UseableTokenLine) { int available = Math.Min(spareToken, eL.TokenLength - UseableTokenLine); eL.BonusToken = available; spareToken -= available; } } } // now we can just build our result and return strb = new StringBuilder(TsConst.Default.MaxSizeTextMessage - spareToken, TsConst.Default.MaxSizeTextMessage); for (int i = useList.Count - 1; i >= 0; i--) { var eL = useList[i]; if (eL.TokenLength < UseableTokenLine + eL.BonusToken) strb.Append(eL.Value).Append(LineBreak); else strb.Append(SubstringToken(eL.Value, UseableTokenLine + eL.BonusToken)).Append(LineBreak); } return strb.ToString(); } public static string DefaultAleFormat(AudioLogEntry e) => string.Format("{0} ({2}): {1}", e.Id, e.AudioResource.ResourceTitle, e.UserUid, e.PlayCount, e.Timestamp); /// Trims a string to have the given token count at max. /// The string to substring from the left side. /// The max token count. /// The new substring. private static string SubstringToken(string value, int token) { int tokens = 0; for (int i = 0; i < value.Length; i++) { int addToken = TsString.IsDoubleChar(value[i]) ? 2 : 1; if (tokens + addToken > token) return value.Substring(0, i); else tokens += addToken; } return value; } private class Line { public string Value { get; } public int TokenLength { get; } public int BonusToken { get; set; } public Line(string value, int tokenLength) { Value = value; TokenLength = tokenLength; BonusToken = 0; } public override string ToString() => $"[{TokenLength:0000}+{BonusToken:0000}] {Value}"; } } } ================================================ FILE: TS3AudioBot/InvokerData.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using TSLib; namespace TS3AudioBot { public class InvokerData { public Uid ClientUid { get; } public bool IsAnonymous => ClientUid == Uid.Anonymous; public static readonly InvokerData Anonymous = new InvokerData(Uid.Anonymous); public InvokerData(Uid clientUid) { ClientUid = clientUid; } } } ================================================ FILE: TS3AudioBot/Limits.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot { public static class Limits { /// Max stream size to download before aborting. public static long MaxImageStreamSize { get; } = 10_000_000; /// Max image size which is allowed to be resized from. public static long MaxImageDimension { get; } = 10_000; } } ================================================ FILE: TS3AudioBot/Localization/DynamicResourceManager.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using System.Globalization; using System.Reflection; using System.Resources; using System.Threading; namespace TS3AudioBot.Localization { internal class DynamicResourceManager : ResourceManager { private readonly Dictionary dynamicResourceSets = new Dictionary(); public DynamicResourceManager(string baseName, Assembly assembly) : base(baseName, assembly) { } public void SetResourceSet(CultureInfo culture, ResourceSet set) { dynamicResourceSets[culture.Name] = set; } public override ResourceSet? GetResourceSet(CultureInfo culture, bool createIfNotExists, bool tryParents) { if (culture is null) { culture = Thread.CurrentThread.CurrentUICulture; } if (dynamicResourceSets.TryGetValue(culture.Name, out var set)) { return set; } return base.GetResourceSet(culture, createIfNotExists, tryParents); } public override string? GetString(string name, CultureInfo? culture) { if (culture is null) { culture = Thread.CurrentThread.CurrentUICulture; } string? str; if (dynamicResourceSets.TryGetValue(culture.Name, out var set)) { if ((str = set.GetString(name)) != null) return str; } if ((str = base.GetString(name, culture)) != null) return str; if ((str = base.GetString(name, CultureInfo.InvariantCulture)) != null) return str; //$"The localized entry {name} was not found" return null; } } } ================================================ FILE: TS3AudioBot/Localization/LocalStr.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Localization { /// /// Represents a localizable string /// public readonly struct LocalStr { public static readonly LocalStr Empty = new LocalStr(string.Empty); public string Str { get; } public LocalStr(string str) { Str = str; } public override readonly string ToString() => Str; } } ================================================ FILE: TS3AudioBot/Localization/LocalizationManager.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Reflection; using System.Resources; using System.Threading; using System.Threading.Tasks; using TS3AudioBot.Helper; namespace TS3AudioBot.Localization { public class LocalizationManager { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private static readonly Dictionary loadedLanguage = new Dictionary(); private static readonly DynamicResourceManager dynResMan; private CultureInfo? culture; public bool LanguageLoaded => culture != null; static LocalizationManager() { loadedLanguage.Add("en", new LanguageData { IsInternal = true, LoadedSuccessfully = true, }); var resManField = typeof(strings).GetField("resourceMan", BindingFlags.NonPublic | BindingFlags.Static)!; var currentResMan = resManField.GetValue(null); (currentResMan as ResourceManager)?.ReleaseAllResources(); dynResMan = new DynamicResourceManager("TS3AudioBot.Localization.strings", typeof(strings).Assembly); resManField.SetValue(null, dynResMan); } public async ValueTask> LoadLanguage(string lang, bool forceDownload) { try { culture = CultureInfo.GetCultureInfo(lang); } catch (CultureNotFoundException) { return "Language not found"; } var languageDataInfo = loadedLanguage.GetOrNew(culture.Name); if (!languageDataInfo.LoadedSuccessfully) { var result = await LoadLanguageAssembly(languageDataInfo, culture, forceDownload); if (!result.Ok) { culture = CultureInfo.InvariantCulture; return result.Error; } languageDataInfo.LoadedSuccessfully = true; } return R.Ok; } public void ApplyLanguage() { var applyCulture = culture ?? CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.CurrentCulture = CultureInfo.CurrentUICulture = applyCulture; } private static async Task> LoadLanguageAssembly(LanguageData languageDataInfo, CultureInfo culture, bool forceDownload) { Task?>? avaliableToDownload = null; var triedDownloading = languageDataInfo.TriedDownloading; foreach (var currentResolveCulture in GetWithFallbackCultures(culture)) { // Try loading the resource set from memory if (strings.ResourceManager.GetResourceSet(currentResolveCulture, true, false) != null) return R.Ok; // Do not attempt to download or load integrated languages if (languageDataInfo.IsInternal) continue; var tryFile = GetCultureFileInfo(currentResolveCulture); // Check if we need to download the resource if (forceDownload || (!tryFile.Exists && !triedDownloading)) { if (avaliableToDownload is null) { avaliableToDownload = DownloadAvaliableLanguages(); } var list = await avaliableToDownload; if (list is null || !list.Contains(currentResolveCulture.Name)) { if (list != null) Log.Info("Language \"{0}\" is not available on the server", currentResolveCulture.Name); continue; } try { languageDataInfo.TriedDownloading = true; Directory.CreateDirectory(tryFile.DirectoryName); Log.Info("Downloading the resource pack for the language '{0}'", currentResolveCulture.Name); await WebWrapper.Request($"https://splamy.de/api/language/project/ts3ab/language/{currentResolveCulture.Name}/dll").ToAction(async response => { using var fs = File.Open(tryFile.FullName, FileMode.Create, FileAccess.Write, FileShare.None); await response.Content.CopyToAsync(fs); }); } catch (Exception ex) { Log.Warn(ex, "Failed trying to download language '{0}'", currentResolveCulture.Name); } } // Try loading the resource set from file try { var asm = Assembly.LoadFrom(tryFile.FullName); var resStream = asm.GetManifestResourceStream($"TS3AudioBot.Localization.strings.{currentResolveCulture.Name}.resources") ?? throw new NullReferenceException("No stream found"); var rr = new ResourceReader(resStream); var set = new ResourceSet(rr); dynResMan.SetResourceSet(currentResolveCulture, set); if (strings.ResourceManager.GetResourceSet(currentResolveCulture, true, false) != null) return R.Ok; Log.Error("The resource set was not found after initialization"); } catch (Exception ex) { Log.Warn(ex, "Failed to load language file '{0}'", tryFile.FullName); } } return "Could not find language file"; } private static IEnumerable GetWithFallbackCultures(CultureInfo culture) { CultureInfo currentResolveCulture = culture; while (currentResolveCulture != CultureInfo.InvariantCulture) { yield return currentResolveCulture; currentResolveCulture = currentResolveCulture.Parent; } } private static FileInfo GetCultureFileInfo(CultureInfo culture) => new FileInfo(Path.Combine(Directory.GetCurrentDirectory(), culture.Name, "TS3AudioBot.resources.dll")); private static async Task?> DownloadAvaliableLanguages() { try { Log.Info("Checking for requested language online"); var arr = await WebWrapper.Request("https://splamy.de/api/language/project/ts3ab/languages").AsJson(); return new HashSet(arr); } catch (Exception ex) { Log.Warn(ex, "Failed to download language overview list"); } return null; } public static string? GetString(string name) { return strings.ResourceManager.GetString(name); } private class LanguageData { public bool IsInternal { get; set; } = false; public bool LoadedSuccessfully { get; set; } = false; public bool TriedDownloading { get; set; } = false; } } } ================================================ FILE: TS3AudioBot/Localization/strings.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace TS3AudioBot.Localization { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class strings { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal strings() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TS3AudioBot.Localization.strings", typeof(strings).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to This feature is not documented.. /// internal static string _undocumented { get { return ResourceManager.GetString("_undocumented", resourceCulture); } } /// /// Looks up a localized string similar to Adds a new song to the queue.. /// internal static string cmd_add_help { get { return ResourceManager.GetString("cmd_add_help", resourceCulture); } } /// /// Looks up a localized string similar to Creates a new command alias.. /// internal static string cmd_alias_add_help { get { return ResourceManager.GetString("cmd_alias_add_help", resourceCulture); } } /// /// Looks up a localized string similar to Lists all currently registered alias.. /// internal static string cmd_alias_list_help { get { return ResourceManager.GetString("cmd_alias_list_help", resourceCulture); } } /// /// Looks up a localized string similar to Removes an existing alias.. /// internal static string cmd_alias_remove_help { get { return ResourceManager.GetString("cmd_alias_remove_help", resourceCulture); } } /// /// Looks up a localized string similar to Shows the implementation of the alias.. /// internal static string cmd_alias_show_help { get { return ResourceManager.GetString("cmd_alias_show_help", resourceCulture); } } /// /// Looks up a localized string similar to Generates an api token.. /// internal static string cmd_api_token_help { get { return ResourceManager.GetString("cmd_api_token_help", resourceCulture); } } /// /// Looks up a localized string similar to Clears the avatar of the bot.. /// internal static string cmd_bot_avatar_clear_help { get { return ResourceManager.GetString("cmd_bot_avatar_clear_help", resourceCulture); } } /// /// Looks up a localized string similar to Sets an avatar for the bot. /// internal static string cmd_bot_avatar_set_help { get { return ResourceManager.GetString("cmd_bot_avatar_set_help", resourceCulture); } } /// /// Looks up a localized string similar to Set your bot a badge. The badges string starts with 'overwolf=0:badges='. /// internal static string cmd_bot_badges_help { get { return ResourceManager.GetString("cmd_bot_badges_help", resourceCulture); } } /// /// Looks up a localized string similar to Moves the bot to your channel.. /// internal static string cmd_bot_come_help { get { return ResourceManager.GetString("cmd_bot_come_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the status of the channel commander mode.. /// internal static string cmd_bot_commander_help { get { return ResourceManager.GetString("cmd_bot_commander_help", resourceCulture); } } /// /// Looks up a localized string similar to Disables channel commander.. /// internal static string cmd_bot_commander_off_help { get { return ResourceManager.GetString("cmd_bot_commander_off_help", resourceCulture); } } /// /// Looks up a localized string similar to Enables channel commander.. /// internal static string cmd_bot_commander_on_help { get { return ResourceManager.GetString("cmd_bot_commander_on_help", resourceCulture); } } /// /// Looks up a localized string similar to Connects a new bot with the settings from the template name.. /// internal static string cmd_bot_connect_template_help { get { return ResourceManager.GetString("cmd_bot_connect_template_help", resourceCulture); } } /// /// Looks up a localized string similar to Connects a new bot to the given address.. /// internal static string cmd_bot_connect_to_help { get { return ResourceManager.GetString("cmd_bot_connect_to_help", resourceCulture); } } /// /// Looks up a localized string similar to Sets the description of the bot.. /// internal static string cmd_bot_description_set_help { get { return ResourceManager.GetString("cmd_bot_description_set_help", resourceCulture); } } /// /// Looks up a localized string similar to Stop this bot instance.. /// internal static string cmd_bot_disconnect_help { get { return ResourceManager.GetString("cmd_bot_disconnect_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets various information about the bot.. /// internal static string cmd_bot_info_help { get { return ResourceManager.GetString("cmd_bot_info_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the id of the current bot.. /// internal static string cmd_bot_info_id_help { get { return ResourceManager.GetString("cmd_bot_info_id_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets a list of all active bots.. /// internal static string cmd_bot_list_help { get { return ResourceManager.GetString("cmd_bot_list_help", resourceCulture); } } /// /// Looks up a localized string similar to Moves the bot to you or a specified channel.. /// internal static string cmd_bot_move_help { get { return ResourceManager.GetString("cmd_bot_move_help", resourceCulture); } } /// /// Looks up a localized string similar to Gives the bot a new name.. /// internal static string cmd_bot_name_help { get { return ResourceManager.GetString("cmd_bot_name_help", resourceCulture); } } /// /// Looks up a localized string similar to Saves the configuration for the newly connected bot.. /// internal static string cmd_bot_save_help { get { return ResourceManager.GetString("cmd_bot_save_help", resourceCulture); } } /// /// Looks up a localized string similar to Bot setup failed. See logs for more details.. /// internal static string cmd_bot_setup_error { get { return ResourceManager.GetString("cmd_bot_setup_error", resourceCulture); } } /// /// Looks up a localized string similar to Sets all teamspeak rights for the bot to be fully functional.. /// internal static string cmd_bot_setup_help { get { return ResourceManager.GetString("cmd_bot_setup_help", resourceCulture); } } /// /// Looks up a localized string similar to Switches the context to the requested bot.. /// internal static string cmd_bot_use_help { get { return ResourceManager.GetString("cmd_bot_use_help", resourceCulture); } } /// /// Looks up a localized string similar to Removes all songs from the current playlist.. /// internal static string cmd_clear_help { get { return ResourceManager.GetString("cmd_clear_help", resourceCulture); } } /// /// Looks up a localized string similar to Executes a given command or string. /// internal static string cmd_eval_help { get { return ResourceManager.GetString("cmd_eval_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets all information about you.. /// internal static string cmd_getmy_all_help { get { return ResourceManager.GetString("cmd_getmy_all_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets your channel id you are currently in.. /// internal static string cmd_getmy_channel_help { get { return ResourceManager.GetString("cmd_getmy_channel_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets your database id.. /// internal static string cmd_getmy_dbid_help { get { return ResourceManager.GetString("cmd_getmy_dbid_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets your id.. /// internal static string cmd_getmy_id_help { get { return ResourceManager.GetString("cmd_getmy_id_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets your nickname.. /// internal static string cmd_getmy_name_help { get { return ResourceManager.GetString("cmd_getmy_name_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets your unique id.. /// internal static string cmd_getmy_uid_help { get { return ResourceManager.GetString("cmd_getmy_uid_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets all information about a user, searching with his id.. /// internal static string cmd_getuser_all_byid_help { get { return ResourceManager.GetString("cmd_getuser_all_byid_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets all information of a user, searching with his name.. /// internal static string cmd_getuser_all_byname_help { get { return ResourceManager.GetString("cmd_getuser_all_byname_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the channel id a user is currently in, searching with his id.. /// internal static string cmd_getuser_channel_byid_help { get { return ResourceManager.GetString("cmd_getuser_channel_byid_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the database id of a user, searching with his id.. /// internal static string cmd_getuser_dbid_byid_help { get { return ResourceManager.GetString("cmd_getuser_dbid_byid_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the id of a user, searching with his name.. /// internal static string cmd_getuser_id_byname_help { get { return ResourceManager.GetString("cmd_getuser_id_byname_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the user name by dbid, searching with his database id.. /// internal static string cmd_getuser_name_bydbid_help { get { return ResourceManager.GetString("cmd_getuser_name_bydbid_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the nickname of a user, searching with his id.. /// internal static string cmd_getuser_name_byid_help { get { return ResourceManager.GetString("cmd_getuser_name_byid_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the unique id of a user, searching with his database id.. /// internal static string cmd_getuser_uid_bydbid_help { get { return ResourceManager.GetString("cmd_getuser_uid_bydbid_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the unique id of a user, searching with his id.. /// internal static string cmd_getuser_uid_byid_help { get { return ResourceManager.GetString("cmd_getuser_uid_byid_help", resourceCulture); } } /// /// Looks up a localized string similar to Requested command is ambiguous between: {0}. /// internal static string cmd_help_error_ambiguous_command { get { return ResourceManager.GetString("cmd_help_error_ambiguous_command", resourceCulture); } } /// /// Looks up a localized string similar to The command has no further subfunctions after {0}. /// internal static string cmd_help_error_no_further_subfunctions { get { return ResourceManager.GetString("cmd_help_error_no_further_subfunctions", resourceCulture); } } /// /// Looks up a localized string similar to No matching command found! Try !help to get a list of all commands.. /// internal static string cmd_help_error_no_matching_command { get { return ResourceManager.GetString("cmd_help_error_no_matching_command", resourceCulture); } } /// /// Looks up a localized string similar to Seems like something went wrong. No help can be shown for this command path.. /// internal static string cmd_help_error_unknown_error { get { return ResourceManager.GetString("cmd_help_error_unknown_error", resourceCulture); } } /// /// Looks up a localized string similar to ========= Welcome to the TS3AudioBot ========= ///If you need any help with a special command use !help <commandName>. ///Here are all possible commands:. /// internal static string cmd_help_header { get { return ResourceManager.GetString("cmd_help_header", resourceCulture); } } /// /// Looks up a localized string similar to Shows all commands or detailed help about a specific command.. /// internal static string cmd_help_help { get { return ResourceManager.GetString("cmd_help_help", resourceCulture); } } /// /// Looks up a localized string similar to The command contains the following subfunctions: {0}. /// internal static string cmd_help_info_contains_subfunctions { get { return ResourceManager.GetString("cmd_help_info_contains_subfunctions", resourceCulture); } } /// /// Looks up a localized string similar to <id> Adds the song with <id> to the queue. /// internal static string cmd_history_add_help { get { return ResourceManager.GetString("cmd_history_add_help", resourceCulture); } } /// /// Looks up a localized string similar to Do want to clean the history file now? . /// internal static string cmd_history_clean_confirm_clean { get { return ResourceManager.GetString("cmd_history_clean_confirm_clean", resourceCulture); } } /// /// Looks up a localized string similar to Cleans up the history file for better startup performance.. /// internal static string cmd_history_clean_help { get { return ResourceManager.GetString("cmd_history_clean_help", resourceCulture); } } /// /// Looks up a localized string similar to Do want to remove all defective links file now?. /// internal static string cmd_history_clean_removedefective_confirm_clean { get { return ResourceManager.GetString("cmd_history_clean_removedefective_confirm_clean", resourceCulture); } } /// /// Looks up a localized string similar to Checks for all links in the history which cannot be opened anymore and removes them.. /// internal static string cmd_history_clean_removedefective_help { get { return ResourceManager.GetString("cmd_history_clean_removedefective_help", resourceCulture); } } /// /// Looks up a localized string similar to Do you really want to delete the entry "{0}" ///with the id {1}?. /// internal static string cmd_history_delete_confirm { get { return ResourceManager.GetString("cmd_history_delete_confirm", resourceCulture); } } /// /// Looks up a localized string similar to <id> Removes the entry with <id> from the history. /// internal static string cmd_history_delete_help { get { return ResourceManager.GetString("cmd_history_delete_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the last <count> songs from the user with the given <user-dbid>. /// internal static string cmd_history_from_help { get { return ResourceManager.GetString("cmd_history_from_help", resourceCulture); } } /// /// Looks up a localized string similar to {0} is the currently highest song id.. /// internal static string cmd_history_id_last { get { return ResourceManager.GetString("cmd_history_id_last", resourceCulture); } } /// /// Looks up a localized string similar to {0} will be the next song id.. /// internal static string cmd_history_id_next { get { return ResourceManager.GetString("cmd_history_id_next", resourceCulture); } } /// /// Looks up a localized string similar to (last|next) Gets the highest|next song id. /// internal static string cmd_history_id_string_help { get { return ResourceManager.GetString("cmd_history_id_string_help", resourceCulture); } } /// /// Looks up a localized string similar to <id> Displays all saved informations about the song with <id>. /// internal static string cmd_history_id_uint_help { get { return ResourceManager.GetString("cmd_history_id_uint_help", resourceCulture); } } /// /// Looks up a localized string similar to Plays the last song again. /// internal static string cmd_history_last_help { get { return ResourceManager.GetString("cmd_history_last_help", resourceCulture); } } /// /// Looks up a localized string similar to <count> Gets the last <count> played songs.. /// internal static string cmd_history_last_int_help { get { return ResourceManager.GetString("cmd_history_last_int_help", resourceCulture); } } /// /// Looks up a localized string similar to There is no song in the history.. /// internal static string cmd_history_last_is_empty { get { return ResourceManager.GetString("cmd_history_last_is_empty", resourceCulture); } } /// /// Looks up a localized string similar to <id> Playes the song with <id>. /// internal static string cmd_history_play_help { get { return ResourceManager.GetString("cmd_history_play_help", resourceCulture); } } /// /// Looks up a localized string similar to <id> <name> Sets the name of the song with <id> to <name>. /// internal static string cmd_history_rename_help { get { return ResourceManager.GetString("cmd_history_rename_help", resourceCulture); } } /// /// Looks up a localized string similar to The new name must not be empty or only whitespaces.. /// internal static string cmd_history_rename_invalid_name { get { return ResourceManager.GetString("cmd_history_rename_invalid_name", resourceCulture); } } /// /// Looks up a localized string similar to <date> Gets all songs played until <date>.. /// internal static string cmd_history_till_DateTime_help { get { return ResourceManager.GetString("cmd_history_till_DateTime_help", resourceCulture); } } /// /// Looks up a localized string similar to <name> Any of those desciptors: (hour|today|yesterday|week). /// internal static string cmd_history_till_string_help { get { return ResourceManager.GetString("cmd_history_till_string_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets all songs which title contains <string>. /// internal static string cmd_history_title_help { get { return ResourceManager.GetString("cmd_history_title_help", resourceCulture); } } /// /// Looks up a localized string similar to Conditionally executes subcommands.. /// internal static string cmd_if_help { get { return ResourceManager.GetString("cmd_if_help", resourceCulture); } } /// /// Looks up a localized string similar to Unknown comparison operator.. /// internal static string cmd_if_unknown_operator { get { return ResourceManager.GetString("cmd_if_unknown_operator", resourceCulture); } } /// /// Looks up a localized string similar to Show's a small summary of the current playlist and queue status.. /// internal static string cmd_info_help { get { return ResourceManager.GetString("cmd_info_help", resourceCulture); } } /// /// Looks up a localized string similar to Allows you to combine multiple JsonResults into one. /// internal static string cmd_json_merge_help { get { return ResourceManager.GetString("cmd_json_merge_help", resourceCulture); } } /// /// Looks up a localized string similar to Jumps to the requested index in the current queue and starts playing.. /// internal static string cmd_jump_help { get { return ResourceManager.GetString("cmd_jump_help", resourceCulture); } } /// /// Looks up a localized string similar to Guess what?. /// internal static string cmd_kickme_help { get { return ResourceManager.GetString("cmd_kickme_help", resourceCulture); } } /// /// Looks up a localized string similar to I'm not strong enough, master!. /// internal static string cmd_kickme_missing_permission { get { return ResourceManager.GetString("cmd_kickme_missing_permission", resourceCulture); } } /// /// Looks up a localized string similar to Gets a link to the origin of the current song.. /// internal static string cmd_link_help { get { return ResourceManager.GetString("cmd_link_help", resourceCulture); } } /// /// Looks up a localized string similar to <id> Adds a link to your private playlist from the history by <id>.. /// internal static string cmd_list_add_help { get { return ResourceManager.GetString("cmd_list_add_help", resourceCulture); } } /// /// Looks up a localized string similar to Clears a playlist.. /// internal static string cmd_list_clear_help { get { return ResourceManager.GetString("cmd_list_clear_help", resourceCulture); } } /// /// Looks up a localized string similar to You are not allowed to delete others playlists.. /// internal static string cmd_list_delete_cannot_delete_others_playlist { get { return ResourceManager.GetString("cmd_list_delete_cannot_delete_others_playlist", resourceCulture); } } /// /// Looks up a localized string similar to Do you really want to delete the playlist "{0}". /// internal static string cmd_list_delete_confirm { get { return ResourceManager.GetString("cmd_list_delete_confirm", resourceCulture); } } /// /// Looks up a localized string similar to <name> Deletes the playlist with the name <name>. You can only delete playlists which you also have created. Admins can delete every playlist.. /// internal static string cmd_list_delete_help { get { return ResourceManager.GetString("cmd_list_delete_help", resourceCulture); } } /// /// Looks up a localized string similar to <link> Imports a playlist form an other platform like youtube etc.. /// internal static string cmd_list_get_help { get { return ResourceManager.GetString("cmd_list_get_help", resourceCulture); } } /// /// Looks up a localized string similar to <index> Removes the item at <index>.. /// internal static string cmd_list_item_delete_help { get { return ResourceManager.GetString("cmd_list_item_delete_help", resourceCulture); } } /// /// Looks up a localized string similar to <from> <to> Moves a item in a playlist <from> <to> position.. /// internal static string cmd_list_item_move_help { get { return ResourceManager.GetString("cmd_list_item_move_help", resourceCulture); } } /// /// Looks up a localized string similar to Renames an item.. /// internal static string cmd_list_item_name_help { get { return ResourceManager.GetString("cmd_list_item_name_help", resourceCulture); } } /// /// Looks up a localized string similar to Displays all available playlists from all users.. /// internal static string cmd_list_list_help { get { return ResourceManager.GetString("cmd_list_list_help", resourceCulture); } } /// /// Looks up a localized string similar to Opens a playlist to be editable for you. This replaces your current worklist with the opened playlist.. /// internal static string cmd_list_load_help { get { return ResourceManager.GetString("cmd_list_load_help", resourceCulture); } } /// /// Looks up a localized string similar to Loaded "{0}" with {1} songs.. /// internal static string cmd_list_load_response { get { return ResourceManager.GetString("cmd_list_load_response", resourceCulture); } } /// /// Looks up a localized string similar to Appends another playlist to yours.. /// internal static string cmd_list_merge_help { get { return ResourceManager.GetString("cmd_list_merge_help", resourceCulture); } } /// /// Looks up a localized string similar to Displays the name of the playlist you are currently working on.. /// internal static string cmd_list_name_help { get { return ResourceManager.GetString("cmd_list_name_help", resourceCulture); } } /// /// Looks up a localized string similar to Replaces the current freelist with your workinglist and plays from the beginning.. /// internal static string cmd_list_play_help { get { return ResourceManager.GetString("cmd_list_play_help", resourceCulture); } } /// /// Looks up a localized string similar to Appends your playlist to the freelist.. /// internal static string cmd_list_queue_help { get { return ResourceManager.GetString("cmd_list_queue_help", resourceCulture); } } /// /// Looks up a localized string similar to Stores your current workinglist to disk.. /// internal static string cmd_list_save_help { get { return ResourceManager.GetString("cmd_list_save_help", resourceCulture); } } /// /// Looks up a localized string similar to Playlist: "{0}" with {1} songs.. /// internal static string cmd_list_show_header { get { return ResourceManager.GetString("cmd_list_show_header", resourceCulture); } } /// /// Looks up a localized string similar to <name> Displays all songs currently in the playlists with the name <name>. /// internal static string cmd_list_show_help { get { return ResourceManager.GetString("cmd_list_show_help", resourceCulture); } } /// /// Looks up a localized string similar to Plays the next song in the playlist.. /// internal static string cmd_next_help { get { return ResourceManager.GetString("cmd_next_help", resourceCulture); } } /// /// Looks up a localized string similar to Displays the AST of the requested command.. /// internal static string cmd_parse_command_help { get { return ResourceManager.GetString("cmd_parse_command_help", resourceCulture); } } /// /// Looks up a localized string similar to Well, pauses the song. Undo with !play.. /// internal static string cmd_pause_help { get { return ResourceManager.GetString("cmd_pause_help", resourceCulture); } } /// /// Looks up a localized string similar to Automatically tries to decide whether the link is a special resource (like youtube) or a direct resource (like ./hello.mp3) and starts it.. /// internal static string cmd_play_help { get { return ResourceManager.GetString("cmd_play_help", resourceCulture); } } /// /// Looks up a localized string similar to Lists all found plugins.. /// internal static string cmd_plugin_list_help { get { return ResourceManager.GetString("cmd_plugin_list_help", resourceCulture); } } /// /// Looks up a localized string similar to Unloads a plugin.. /// internal static string cmd_plugin_load_help { get { return ResourceManager.GetString("cmd_plugin_load_help", resourceCulture); } } /// /// Looks up a localized string similar to Unloads a plugin.. /// internal static string cmd_plugin_unload_help { get { return ResourceManager.GetString("cmd_plugin_unload_help", resourceCulture); } } /// /// Looks up a localized string similar to Requests a private session with the ServerBot so you can be intimate.. /// internal static string cmd_pm_help { get { return ResourceManager.GetString("cmd_pm_help", resourceCulture); } } /// /// Looks up a localized string similar to Hi {0}. /// internal static string cmd_pm_hi { get { return ResourceManager.GetString("cmd_pm_hi", resourceCulture); } } /// /// Looks up a localized string similar to Writes a message to a particular user.. /// internal static string cmd_pm_user_help { get { return ResourceManager.GetString("cmd_pm_user_help", resourceCulture); } } /// /// Looks up a localized string similar to Plays the previous song in the playlist.. /// internal static string cmd_previous_help { get { return ResourceManager.GetString("cmd_previous_help", resourceCulture); } } /// /// Looks up a localized string similar to Lets you format multiple parameter to one.. /// internal static string cmd_print_help { get { return ResourceManager.GetString("cmd_print_help", resourceCulture); } } /// /// Looks up a localized string similar to Displays the current play queue.. /// internal static string cmd_queue_help { get { return ResourceManager.GetString("cmd_queue_help", resourceCulture); } } /// /// Looks up a localized string similar to Do you really want to quit?. /// internal static string cmd_quit_confirm { get { return ResourceManager.GetString("cmd_quit_confirm", resourceCulture); } } /// /// Looks up a localized string similar to Closes the TS3AudioBot application.. /// internal static string cmd_quit_help { get { return ResourceManager.GetString("cmd_quit_help", resourceCulture); } } /// /// Looks up a localized string similar to Shows the quizmode status.. /// internal static string cmd_quiz_help { get { return ResourceManager.GetString("cmd_quiz_help", resourceCulture); } } /// /// Looks up a localized string similar to Disable to show the songnames again.. /// internal static string cmd_quiz_off_help { get { return ResourceManager.GetString("cmd_quiz_off_help", resourceCulture); } } /// /// Looks up a localized string similar to No cheating! Everybody has to see it!. /// internal static string cmd_quiz_off_no_cheating { get { return ResourceManager.GetString("cmd_quiz_off_no_cheating", resourceCulture); } } /// /// Looks up a localized string similar to Enable to hide the songnames and let your friends guess the title.. /// internal static string cmd_quiz_on_help { get { return ResourceManager.GetString("cmd_quiz_on_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets whether or not to play playlists in random order.. /// internal static string cmd_random_help { get { return ResourceManager.GetString("cmd_random_help", resourceCulture); } } /// /// Looks up a localized string similar to Disables random playlist playback. /// internal static string cmd_random_off_help { get { return ResourceManager.GetString("cmd_random_off_help", resourceCulture); } } /// /// Looks up a localized string similar to Enables random playlist playback. /// internal static string cmd_random_on_help { get { return ResourceManager.GetString("cmd_random_on_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the unique seed for a certain playback order. /// internal static string cmd_random_seed_help { get { return ResourceManager.GetString("cmd_random_seed_help", resourceCulture); } } /// /// Looks up a localized string similar to Sets the unique seed for a certain playback order. /// internal static string cmd_random_seed_int_help { get { return ResourceManager.GetString("cmd_random_seed_int_help", resourceCulture); } } /// /// Looks up a localized string similar to Only letters allowed.. /// internal static string cmd_random_seed_only_letters_allowed { get { return ResourceManager.GetString("cmd_random_seed_only_letters_allowed", resourceCulture); } } /// /// Looks up a localized string similar to Sets the unique seed for a certain playback order. /// internal static string cmd_random_seed_string_help { get { return ResourceManager.GetString("cmd_random_seed_string_help", resourceCulture); } } /// /// Looks up a localized string similar to Repeats the entire playlist.. /// internal static string cmd_repeat_all_help { get { return ResourceManager.GetString("cmd_repeat_all_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the current repeat mode.. /// internal static string cmd_repeat_help { get { return ResourceManager.GetString("cmd_repeat_help", resourceCulture); } } /// /// Looks up a localized string similar to Repeating the playlist.. /// internal static string cmd_repeat_info_all { get { return ResourceManager.GetString("cmd_repeat_info_all", resourceCulture); } } /// /// Looks up a localized string similar to Not repeating.. /// internal static string cmd_repeat_info_off { get { return ResourceManager.GetString("cmd_repeat_info_off", resourceCulture); } } /// /// Looks up a localized string similar to Repeating a single song.. /// internal static string cmd_repeat_info_one { get { return ResourceManager.GetString("cmd_repeat_info_one", resourceCulture); } } /// /// Looks up a localized string similar to Disables repeating.. /// internal static string cmd_repeat_off_help { get { return ResourceManager.GetString("cmd_repeat_off_help", resourceCulture); } } /// /// Looks up a localized string similar to Repeats a single song.. /// internal static string cmd_repeat_one_help { get { return ResourceManager.GetString("cmd_repeat_one_help", resourceCulture); } } /// /// Looks up a localized string similar to Returns the subset of allowed commands the caller (you) can execute.. /// internal static string cmd_rights_can_help { get { return ResourceManager.GetString("cmd_rights_can_help", resourceCulture); } } /// /// Looks up a localized string similar to Error while parsing file, see log for more details.. /// internal static string cmd_rights_reload_error_parsing_file { get { return ResourceManager.GetString("cmd_rights_reload_error_parsing_file", resourceCulture); } } /// /// Looks up a localized string similar to Reloads the rights configuration from file.. /// internal static string cmd_rights_reload_help { get { return ResourceManager.GetString("cmd_rights_reload_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets a random number.. /// internal static string cmd_rng_help { get { return ResourceManager.GetString("cmd_rng_help", resourceCulture); } } /// /// Looks up a localized string similar to Value must be 0 or positive.. /// internal static string cmd_rng_value_must_be_positive { get { return ResourceManager.GetString("cmd_rng_value_must_be_positive", resourceCulture); } } /// /// Looks up a localized string similar to Found the following songs. Use "{0}" to play. Use "{1}" to queue.. /// internal static string cmd_search_header { get { return ResourceManager.GetString("cmd_search_header", resourceCulture); } } /// /// Looks up a localized string similar to Found no results for this query.. /// internal static string cmd_search_no_result { get { return ResourceManager.GetString("cmd_search_no_result", resourceCulture); } } /// /// Looks up a localized string similar to Jumps to a timemark within the current song.. /// internal static string cmd_seek_help { get { return ResourceManager.GetString("cmd_seek_help", resourceCulture); } } /// /// Looks up a localized string similar to The time was not in a correct format, see !help seek for more information.. /// internal static string cmd_seek_invalid_format { get { return ResourceManager.GetString("cmd_seek_invalid_format", resourceCulture); } } /// /// Looks up a localized string similar to The point of time is not within the song length.. /// internal static string cmd_seek_out_of_range { get { return ResourceManager.GetString("cmd_seek_out_of_range", resourceCulture); } } /// /// Looks up a localized string similar to Selects a song from a previous search and plays it.. /// internal static string cmd_select_help { get { return ResourceManager.GetString("cmd_select_help", resourceCulture); } } /// /// Looks up a localized string similar to Reloads the bot template configuration from the file.. /// internal static string cmd_settings_bot_reload_help { get { return ResourceManager.GetString("cmd_settings_bot_reload_help", resourceCulture); } } /// /// Looks up a localized string similar to Duplicates a bot template with a new name.. /// internal static string cmd_settings_copy_help { get { return ResourceManager.GetString("cmd_settings_copy_help", resourceCulture); } } /// /// Looks up a localized string similar to Creates a new bot template.. /// internal static string cmd_settings_create_help { get { return ResourceManager.GetString("cmd_settings_create_help", resourceCulture); } } /// /// Looks up a localized string similar to Deletes a bot template.. /// internal static string cmd_settings_delete_help { get { return ResourceManager.GetString("cmd_settings_delete_help", resourceCulture); } } /// /// Looks up a localized string similar to Please specify a key. E.g {0}. /// internal static string cmd_settings_empty_usage { get { return ResourceManager.GetString("cmd_settings_empty_usage", resourceCulture); } } /// /// Looks up a localized string similar to Gets a value from the bot settings.. /// internal static string cmd_settings_get_help { get { return ResourceManager.GetString("cmd_settings_get_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets a value from the core settings.. /// internal static string cmd_settings_global_get_help { get { return ResourceManager.GetString("cmd_settings_global_get_help", resourceCulture); } } /// /// Looks up a localized string similar to Set a value from the core settings.. /// internal static string cmd_settings_global_set_help { get { return ResourceManager.GetString("cmd_settings_global_set_help", resourceCulture); } } /// /// Looks up a localized string similar to Provides get/set methods to change the settings.. /// internal static string cmd_settings_help { get { return ResourceManager.GetString("cmd_settings_help", resourceCulture); } } /// /// Looks up a localized string similar to Get the desciption for a setting.. /// internal static string cmd_settings_help_help { get { return ResourceManager.GetString("cmd_settings_help_help", resourceCulture); } } /// /// Looks up a localized string similar to Reloads the core configuration from the file.. /// internal static string cmd_settings_reload_help { get { return ResourceManager.GetString("cmd_settings_reload_help", resourceCulture); } } /// /// Looks up a localized string similar to Sets a value from the bot settings.. /// internal static string cmd_settings_set_help { get { return ResourceManager.GetString("cmd_settings_set_help", resourceCulture); } } /// /// Looks up a localized string similar to Tells you the name of the current song.. /// internal static string cmd_song_help { get { return ResourceManager.GetString("cmd_song_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the length and position of the current track.. /// internal static string cmd_song_position_help { get { return ResourceManager.GetString("cmd_song_position_help", resourceCulture); } } /// /// Looks up a localized string similar to Stops the current song.. /// internal static string cmd_stop_help { get { return ResourceManager.GetString("cmd_stop_help", resourceCulture); } } /// /// Looks up a localized string similar to Adds your current channel to the music playback.. /// internal static string cmd_subscribe_channel_help { get { return ResourceManager.GetString("cmd_subscribe_channel_help", resourceCulture); } } /// /// Looks up a localized string similar to Subscribes the specified client to listen from anywhere. /// internal static string cmd_subscribe_client_help { get { return ResourceManager.GetString("cmd_subscribe_client_help", resourceCulture); } } /// /// Looks up a localized string similar to Lets you hear the music independent from the channel you are in.. /// internal static string cmd_subscribe_help { get { return ResourceManager.GetString("cmd_subscribe_help", resourceCulture); } } /// /// Looks up a localized string similar to Adds your current channel to the music playback.. /// internal static string cmd_subscribe_tempchannel_help { get { return ResourceManager.GetString("cmd_subscribe_tempchannel_help", resourceCulture); } } /// /// Looks up a localized string similar to Take a substring from a string.. /// internal static string cmd_take_help { get { return ResourceManager.GetString("cmd_take_help", resourceCulture); } } /// /// Looks up a localized string similar to Not enough arguments to take.. /// internal static string cmd_take_not_enough_arguements { get { return ResourceManager.GetString("cmd_take_not_enough_arguements", resourceCulture); } } /// /// Looks up a localized string similar to Removes your current channel from the music playback.. /// internal static string cmd_unsubscribe_channel_help { get { return ResourceManager.GetString("cmd_unsubscribe_channel_help", resourceCulture); } } /// /// Looks up a localized string similar to Unsubscribes the specified client to listen from anywhere.. /// internal static string cmd_unsubscribe_client_help { get { return ResourceManager.GetString("cmd_unsubscribe_client_help", resourceCulture); } } /// /// Looks up a localized string similar to Only lets you hear the music in active channels again.. /// internal static string cmd_unsubscribe_help { get { return ResourceManager.GetString("cmd_unsubscribe_help", resourceCulture); } } /// /// Looks up a localized string similar to Clears all temporary targets.. /// internal static string cmd_unsubscribe_temporary_help { get { return ResourceManager.GetString("cmd_unsubscribe_temporary_help", resourceCulture); } } /// /// Looks up a localized string similar to Gets the current build version.. /// internal static string cmd_version_help { get { return ResourceManager.GetString("cmd_version_help", resourceCulture); } } /// /// Looks up a localized string similar to Current volume: {0}. /// internal static string cmd_volume_current { get { return ResourceManager.GetString("cmd_volume_current", resourceCulture); } } /// /// Looks up a localized string similar to Sets the volume level of the music.. /// internal static string cmd_volume_help { get { return ResourceManager.GetString("cmd_volume_help", resourceCulture); } } /// /// Looks up a localized string similar to Careful you are requesting a very high volume! Do you want to apply this?. /// internal static string cmd_volume_high_volume_confirm { get { return ResourceManager.GetString("cmd_volume_high_volume_confirm", resourceCulture); } } /// /// Looks up a localized string similar to The volume level must be between {0} and {1}. /// internal static string cmd_volume_is_limited { get { return ResourceManager.GetString("cmd_volume_is_limited", resourceCulture); } } /// /// Looks up a localized string similar to You are not allowed to set higher volumes.. /// internal static string cmd_volume_missing_high_volume_permission { get { return ResourceManager.GetString("cmd_volume_missing_high_volume_permission", resourceCulture); } } /// /// Looks up a localized string similar to The new volume could not be parsed. /// internal static string cmd_volume_parse_error { get { return ResourceManager.GetString("cmd_volume_parse_error", resourceCulture); } } /// /// Looks up a localized string similar to Set how to send music.. /// internal static string cmd_whisper_all_help { get { return ResourceManager.GetString("cmd_whisper_all_help", resourceCulture); } } /// /// Looks up a localized string similar to Set a specific teamspeak whisper group.. /// internal static string cmd_whisper_group_help { get { return ResourceManager.GetString("cmd_whisper_group_help", resourceCulture); } } /// /// Looks up a localized string similar to This type requires an additional target.. /// internal static string cmd_whisper_group_missing_target { get { return ResourceManager.GetString("cmd_whisper_group_missing_target", resourceCulture); } } /// /// Looks up a localized string similar to This type does not take an additional target.. /// internal static string cmd_whisper_group_superfluous_target { get { return ResourceManager.GetString("cmd_whisper_group_superfluous_target", resourceCulture); } } /// /// Looks up a localized string similar to Currently targeting:. /// internal static string cmd_whisper_list_header { get { return ResourceManager.GetString("cmd_whisper_list_header", resourceCulture); } } /// /// Looks up a localized string similar to Set how to send music.. /// internal static string cmd_whisper_list_help { get { return ResourceManager.GetString("cmd_whisper_list_help", resourceCulture); } } /// /// Looks up a localized string similar to Nowhere!. /// internal static string cmd_whisper_list_target_none { get { return ResourceManager.GetString("cmd_whisper_list_target_none", resourceCulture); } } /// /// Looks up a localized string similar to This channel via voice!. /// internal static string cmd_whisper_list_target_voice { get { return ResourceManager.GetString("cmd_whisper_list_target_voice", resourceCulture); } } /// /// Looks up a localized string similar to Channel. /// internal static string cmd_whisper_list_target_whisper_channel { get { return ResourceManager.GetString("cmd_whisper_list_target_whisper_channel", resourceCulture); } } /// /// Looks up a localized string similar to Clients. /// internal static string cmd_whisper_list_target_whisper_clients { get { return ResourceManager.GetString("cmd_whisper_list_target_whisper_clients", resourceCulture); } } /// /// Looks up a localized string similar to A whisper group {0} {1} ({2})!. /// internal static string cmd_whisper_list_target_whispergroup { get { return ResourceManager.GetString("cmd_whisper_list_target_whispergroup", resourceCulture); } } /// /// Looks up a localized string similar to Enables normal voice mode.. /// internal static string cmd_whisper_off_help { get { return ResourceManager.GetString("cmd_whisper_off_help", resourceCulture); } } /// /// Looks up a localized string similar to Enables default whisper subscription mode.. /// internal static string cmd_whisper_subscription_help { get { return ResourceManager.GetString("cmd_whisper_subscription_help", resourceCulture); } } /// /// Looks up a localized string similar to Evaluates all parameter.. /// internal static string cmd_xecute_help { get { return ResourceManager.GetString("cmd_xecute_help", resourceCulture); } } /// /// Looks up a localized string similar to This bot does not exist.. /// internal static string error_bot_does_not_exist { get { return ResourceManager.GetString("error_bot_does_not_exist", resourceCulture); } } /// /// Looks up a localized string similar to Error: {0}. /// internal static string error_call_error { get { return ResourceManager.GetString("error_call_error", resourceCulture); } } /// /// Looks up a localized string similar to An unexpected error occurred: {0}. /// internal static string error_call_unexpected_error { get { return ResourceManager.GetString("error_call_unexpected_error", resourceCulture); } } /// /// Looks up a localized string similar to Need at least four arguments to evaluate.. /// internal static string error_cmd_at_least_four_argument { get { return ResourceManager.GetString("error_cmd_at_least_four_argument", resourceCulture); } } /// /// Looks up a localized string similar to Need at least {0} arguments to evaluate.. /// internal static string error_cmd_at_least_n_arguments { get { return ResourceManager.GetString("error_cmd_at_least_n_arguments", resourceCulture); } } /// /// Looks up a localized string similar to Need at least one argument to evaluate.. /// internal static string error_cmd_at_least_one_argument { get { return ResourceManager.GetString("error_cmd_at_least_one_argument", resourceCulture); } } /// /// Looks up a localized string similar to Need at least three arguments to evaluate.. /// internal static string error_cmd_at_least_three_argument { get { return ResourceManager.GetString("error_cmd_at_least_three_argument", resourceCulture); } } /// /// Looks up a localized string similar to Need at least two arguments to evaluate.. /// internal static string error_cmd_at_least_two_argument { get { return ResourceManager.GetString("error_cmd_at_least_two_argument", resourceCulture); } } /// /// Looks up a localized string similar to The command exceeded the maximum calling complexity.. /// internal static string error_cmd_complexity_reached { get { return ResourceManager.GetString("error_cmd_complexity_reached", resourceCulture); } } /// /// Looks up a localized string similar to Could not convert "{0}" to {1}.. /// internal static string error_cmd_could_not_convert_to { get { return ResourceManager.GetString("error_cmd_could_not_convert_to", resourceCulture); } } /// /// Looks up a localized string similar to No matching function overload could be found.. /// internal static string error_cmd_no_matching_overload { get { return ResourceManager.GetString("error_cmd_no_matching_overload", resourceCulture); } } /// /// Looks up a localized string similar to The number is too big.. /// internal static string error_cmd_number_too_big { get { return ResourceManager.GetString("error_cmd_number_too_big", resourceCulture); } } /// /// Looks up a localized string similar to Found more than one matching key: {0}. /// internal static string error_config_multiple_keys_found { get { return ResourceManager.GetString("error_config_multiple_keys_found", resourceCulture); } } /// /// Looks up a localized string similar to No config key matching the pattern found.. /// internal static string error_config_no_key_found { get { return ResourceManager.GetString("error_config_no_key_found", resourceCulture); } } /// /// Looks up a localized string similar to The value could not be parsed.. /// internal static string error_config_value_parse_error { get { return ResourceManager.GetString("error_config_value_parse_error", resourceCulture); } } /// /// Looks up a localized string similar to Could not create new instance.. /// internal static string error_could_not_create_bot { get { return ResourceManager.GetString("error_could_not_create_bot", resourceCulture); } } /// /// Looks up a localized string similar to This feature is currently unavailable.. /// internal static string error_feature_unavailable { get { return ResourceManager.GetString("error_feature_unavailable", resourceCulture); } } /// /// Looks up a localized string similar to Entry could not be stored.. /// internal static string error_history_could_not_create_entry { get { return ResourceManager.GetString("error_history_could_not_create_entry", resourceCulture); } } /// /// Looks up a localized string similar to Could not find entry with this id.. /// internal static string error_history_could_not_find_entry { get { return ResourceManager.GetString("error_history_could_not_find_entry", resourceCulture); } } /// /// Looks up a localized string similar to Invalid token-valid duration.. /// internal static string error_invalid_token_duration { get { return ResourceManager.GetString("error_invalid_token_duration", resourceCulture); } } /// /// Looks up a localized string similar to Invoker casted Ghost Walk.. /// internal static string error_invoker_not_visible { get { return ResourceManager.GetString("error_invoker_not_visible", resourceCulture); } } /// /// Looks up a localized string similar to The file still in use.. /// internal static string error_io_in_use { get { return ResourceManager.GetString("error_io_in_use", resourceCulture); } } /// /// Looks up a localized string similar to The bot does not have the required system permission.. /// internal static string error_io_missing_permission { get { return ResourceManager.GetString("error_io_missing_permission", resourceCulture); } } /// /// Looks up a localized string similar to An unknown error occoured.. /// internal static string error_io_unknown_error { get { return ResourceManager.GetString("error_io_unknown_error", resourceCulture); } } /// /// Looks up a localized string similar to The id could not get parsed.. /// internal static string error_media_failed_to_parse_id { get { return ResourceManager.GetString("error_media_failed_to_parse_id", resourceCulture); } } /// /// Looks up a localized string similar to The resource could not be found.. /// internal static string error_media_file_not_found { get { return ResourceManager.GetString("error_media_file_not_found", resourceCulture); } } /// /// Looks up a localized string similar to No image could not be found.. /// internal static string error_media_image_not_found { get { return ResourceManager.GetString("error_media_image_not_found", resourceCulture); } } /// /// Looks up a localized string similar to Invalid or malformed response parts.. /// internal static string error_media_internal_invalid { get { return ResourceManager.GetString("error_media_internal_invalid", resourceCulture); } } /// /// Looks up a localized string similar to Empty or missing response parts.. /// internal static string error_media_internal_missing { get { return ResourceManager.GetString("error_media_internal_missing", resourceCulture); } } /// /// Looks up a localized string similar to The image is invalid.. /// internal static string error_media_invalid_image { get { return ResourceManager.GetString("error_media_invalid_image", resourceCulture); } } /// /// Looks up a localized string similar to Invalid uri.. /// internal static string error_media_invalid_uri { get { return ResourceManager.GetString("error_media_invalid_uri", resourceCulture); } } /// /// Looks up a localized string similar to No stream extracted.. /// internal static string error_media_no_stream_extracted { get { return ResourceManager.GetString("error_media_no_stream_extracted", resourceCulture); } } /// /// Looks up a localized string similar to You cannot execute '{0}'. You are missing the '{1}' right!. /// internal static string error_missing_right { get { return ResourceManager.GetString("error_missing_right", resourceCulture); } } /// /// Looks up a localized string similar to Missing session context.. /// internal static string error_missing_session_context { get { return ResourceManager.GetString("error_missing_session_context", resourceCulture); } } /// /// Looks up a localized string similar to Request got empty response.. /// internal static string error_net_empty_response { get { return ResourceManager.GetString("error_net_empty_response", resourceCulture); } } /// /// Looks up a localized string similar to Got error status code.. /// internal static string error_net_error_status_code { get { return ResourceManager.GetString("error_net_error_status_code", resourceCulture); } } /// /// Looks up a localized string similar to No connection could be established.. /// internal static string error_net_no_connection { get { return ResourceManager.GetString("error_net_no_connection", resourceCulture); } } /// /// Looks up a localized string similar to Request timed out.. /// internal static string error_net_timeout { get { return ResourceManager.GetString("error_net_timeout", resourceCulture); } } /// /// Looks up a localized string similar to Unknown request error.. /// internal static string error_net_unknown { get { return ResourceManager.GetString("error_net_unknown", resourceCulture); } } /// /// Looks up a localized string similar to No active token found.. /// internal static string error_no_active_token { get { return ResourceManager.GetString("error_no_active_token", resourceCulture); } } /// /// Looks up a localized string similar to No help found.. /// internal static string error_no_help { get { return ResourceManager.GetString("error_no_help", resourceCulture); } } /// /// Looks up a localized string similar to No invoker in context.. /// internal static string error_no_invoker_in_context { get { return ResourceManager.GetString("error_no_invoker_in_context", resourceCulture); } } /// /// Looks up a localized string similar to Missing session context.. /// internal static string error_no_session_in_context { get { return ResourceManager.GetString("error_no_session_in_context", resourceCulture); } } /// /// Looks up a localized string similar to No target channel found.. /// internal static string error_no_target_channel { get { return ResourceManager.GetString("error_no_target_channel", resourceCulture); } } /// /// Looks up a localized string similar to No teamspeak connection in context.. /// internal static string error_no_teamspeak_in_context { get { return ResourceManager.GetString("error_no_teamspeak_in_context", resourceCulture); } } /// /// Looks up a localized string similar to No Uid found to register token for.. /// internal static string error_no_uid_found { get { return ResourceManager.GetString("error_no_uid_found", resourceCulture); } } /// /// Looks up a localized string similar to This command is not available as API.. /// internal static string error_not_available_from_api { get { return ResourceManager.GetString("error_not_available_from_api", resourceCulture); } } /// /// Looks up a localized string similar to Not found.. /// internal static string error_not_found { get { return ResourceManager.GetString("error_not_found", resourceCulture); } } /// /// Looks up a localized string similar to Can't find a fitting return type to return.. /// internal static string error_nothing_to_return { get { return ResourceManager.GetString("error_nothing_to_return", resourceCulture); } } /// /// Looks up a localized string similar to The playlist file is corrupted. Only admins can modify it until fixed.. /// internal static string error_playlist_broken_file { get { return ResourceManager.GetString("error_playlist_broken_file", resourceCulture); } } /// /// Looks up a localized string similar to You cannot access a playlist which you dont own.. /// internal static string error_playlist_cannot_access_not_owned { get { return ResourceManager.GetString("error_playlist_cannot_access_not_owned", resourceCulture); } } /// /// Looks up a localized string similar to Nothing to play.... /// internal static string error_playlist_is_empty { get { return ResourceManager.GetString("error_playlist_is_empty", resourceCulture); } } /// /// Looks up a localized string similar to Index must be within playlist length.. /// internal static string error_playlist_item_index_out_of_range { get { return ResourceManager.GetString("error_playlist_item_index_out_of_range", resourceCulture); } } /// /// Looks up a localized string similar to The name contains invalid characters; please only use [a-zA-Z0-9_-].. /// internal static string error_playlist_name_invalid_character { get { return ResourceManager.GetString("error_playlist_name_invalid_character", resourceCulture); } } /// /// Looks up a localized string similar to An empty name is not valid.. /// internal static string error_playlist_name_invalid_empty { get { return ResourceManager.GetString("error_playlist_name_invalid_empty", resourceCulture); } } /// /// Looks up a localized string similar to The name length must be <64.. /// internal static string error_playlist_name_invalid_too_long { get { return ResourceManager.GetString("error_playlist_name_invalid_too_long", resourceCulture); } } /// /// Looks up a localized string similar to No playlist directory has been set up.. /// internal static string error_playlist_no_store_directory { get { return ResourceManager.GetString("error_playlist_no_store_directory", resourceCulture); } } /// /// Looks up a localized string similar to The playlist could not be found.. /// internal static string error_playlist_not_found { get { return ResourceManager.GetString("error_playlist_not_found", resourceCulture); } } /// /// Looks up a localized string similar to Special list not found.. /// internal static string error_playlist_special_not_found { get { return ResourceManager.GetString("error_playlist_special_not_found", resourceCulture); } } /// /// Looks up a localized string similar to Internal error.. /// internal static string error_playmgr_internal_error { get { return ResourceManager.GetString("error_playmgr_internal_error", resourceCulture); } } /// /// Looks up a localized string similar to A few songs failed to start, use {0} to continue.. /// internal static string error_playmgr_many_songs_failed { get { return ResourceManager.GetString("error_playmgr_many_songs_failed", resourceCulture); } } /// /// Looks up a localized string similar to Plugin error: {0}. /// internal static string error_plugin_error { get { return ResourceManager.GetString("error_plugin_error", resourceCulture); } } /// /// Looks up a localized string similar to Could not load.. /// internal static string error_resfac_could_not_load { get { return ResourceManager.GetString("error_resfac_could_not_load", resourceCulture); } } /// /// Looks up a localized string similar to Considered multiple factories but all failed.. /// internal static string error_resfac_multiple_factories_failed { get { return ResourceManager.GetString("error_resfac_multiple_factories_failed", resourceCulture); } } /// /// Looks up a localized string similar to No registered factory for "{0}" found.. /// internal static string error_resfac_no_registered_factory { get { return ResourceManager.GetString("error_resfac_no_registered_factory", resourceCulture); } } /// /// Looks up a localized string similar to Nothing to select.... /// internal static string error_select_empty { get { return ResourceManager.GetString("error_select_empty", resourceCulture); } } /// /// Looks up a localized string similar to Cannot move there.. /// internal static string error_ts_cannot_move { get { return ResourceManager.GetString("error_ts_cannot_move", resourceCulture); } } /// /// Looks up a localized string similar to Cannot set commander mode.. /// internal static string error_ts_cannot_set_commander { get { return ResourceManager.GetString("error_ts_cannot_set_commander", resourceCulture); } } /// /// Looks up a localized string similar to Missing teamspeak permissions.. /// internal static string error_ts_code_2568 { get { return ResourceManager.GetString("error_ts_code_2568", resourceCulture); } } /// /// Looks up a localized string similar to Invalid channel password.. /// internal static string error_ts_code_781 { get { return ResourceManager.GetString("error_ts_code_781", resourceCulture); } } /// /// Looks up a localized string similar to Teamspeak Error: {0}. /// internal static string error_ts_error { get { return ResourceManager.GetString("error_ts_error", resourceCulture); } } /// /// Looks up a localized string similar to The file to upload is too big.. /// internal static string error_ts_file_too_big { get { return ResourceManager.GetString("error_ts_file_too_big", resourceCulture); } } /// /// Looks up a localized string similar to The new name is too long or invalid.. /// internal static string error_ts_invalid_name { get { return ResourceManager.GetString("error_ts_invalid_name", resourceCulture); } } /// /// Looks up a localized string similar to The message to send is longer than the allowed maximum.. /// internal static string error_ts_msg_too_long { get { return ResourceManager.GetString("error_ts_msg_too_long", resourceCulture); } } /// /// Looks up a localized string similar to No client found.. /// internal static string error_ts_no_client_found { get { return ResourceManager.GetString("error_ts_no_client_found", resourceCulture); } } /// /// Looks up a localized string similar to Unknown Teamspeak Error.. /// internal static string error_ts_unknown_error { get { return ResourceManager.GetString("error_ts_unknown_error", resourceCulture); } } /// /// Looks up a localized string similar to Unrecognized descriptor.. /// internal static string error_unrecognized_descriptor { get { return ResourceManager.GetString("error_unrecognized_descriptor", resourceCulture); } } /// /// Looks up a localized string similar to Please use this command in a private session.. /// internal static string error_use_private { get { return ResourceManager.GetString("error_use_private", resourceCulture); } } /// /// Looks up a localized string similar to Your value is out of range. Select one between {0} and {1}.. /// internal static string error_value_not_in_range { get { return ResourceManager.GetString("error_value_not_in_range", resourceCulture); } } /// /// Looks up a localized string similar to No youtube-dl response. /// internal static string error_ytdl_empty_response { get { return ResourceManager.GetString("error_ytdl_empty_response", resourceCulture); } } /// /// Looks up a localized string similar to Failed to run youtube-dl.. /// internal static string error_ytdl_failed_to_run { get { return ResourceManager.GetString("error_ytdl_failed_to_run", resourceCulture); } } /// /// Looks up a localized string similar to Youtube-Dl could not be found. The song/video cannot be played due to restrictions.. /// internal static string error_ytdl_not_found { get { return ResourceManager.GetString("error_ytdl_not_found", resourceCulture); } } /// /// Looks up a localized string similar to youtube-dl failed to load the resource.. /// internal static string error_ytdl_song_failed_to_load { get { return ResourceManager.GetString("error_ytdl_song_failed_to_load", resourceCulture); } } /// /// Looks up a localized string similar to This might take a while and make the bot unresponsive in meanwhile.. /// internal static string info_bot_might_be_unresponsive { get { return ResourceManager.GetString("info_bot_might_be_unresponsive", resourceCulture); } } /// /// Looks up a localized string similar to <Quiztime!>. /// internal static string info_botstatus_quiztime { get { return ResourceManager.GetString("info_botstatus_quiztime", resourceCulture); } } /// /// Looks up a localized string similar to <Sleeping>. /// internal static string info_botstatus_sleeping { get { return ResourceManager.GetString("info_botstatus_sleeping", resourceCulture); } } /// /// Looks up a localized string similar to Cleanup done!. /// internal static string info_cleanup_done { get { return ResourceManager.GetString("info_cleanup_done", resourceCulture); } } /// /// Looks up a localized string similar to There is nothing on right now.... /// internal static string info_currently_not_playing { get { return ResourceManager.GetString("info_currently_not_playing", resourceCulture); } } /// /// Looks up a localized string similar to Now playing: {0}. /// internal static string info_currently_playing { get { return ResourceManager.GetString("info_currently_playing", resourceCulture); } } /// /// Looks up a localized string similar to <empty>. /// internal static string info_empty { get { return ResourceManager.GetString("info_empty", resourceCulture); } } /// /// Looks up a localized string similar to number. /// internal static string info_number { get { return ResourceManager.GetString("info_number", resourceCulture); } } /// /// Looks up a localized string similar to off. /// internal static string info_off { get { return ResourceManager.GetString("info_off", resourceCulture); } } /// /// Looks up a localized string similar to Ok. /// internal static string info_ok { get { return ResourceManager.GetString("info_ok", resourceCulture); } } /// /// Looks up a localized string similar to on. /// internal static string info_on { get { return ResourceManager.GetString("info_on", resourceCulture); } } /// /// Looks up a localized string similar to No next song could be played.. /// internal static string info_playmgr_no_next_song { get { return ResourceManager.GetString("info_playmgr_no_next_song", resourceCulture); } } /// /// Looks up a localized string similar to No previous song could be played.. /// internal static string info_playmgr_no_previous_song { get { return ResourceManager.GetString("info_playmgr_no_previous_song", resourceCulture); } } /// /// Looks up a localized string similar to Sorry, you have to guess!. /// internal static string info_quizmode_is_active { get { return ResourceManager.GetString("info_quizmode_is_active", resourceCulture); } } /// /// Looks up a localized string similar to Removed "{0}". /// internal static string info_removed { get { return ResourceManager.GetString("info_removed", resourceCulture); } } /// /// Looks up a localized string similar to Channel commander is {0}. /// internal static string info_status_channelcommander { get { return ResourceManager.GetString("info_status_channelcommander", resourceCulture); } } /// /// Looks up a localized string similar to Quizmode is {0}. /// internal static string info_status_quizmode { get { return ResourceManager.GetString("info_status_quizmode", resourceCulture); } } /// /// Looks up a localized string similar to Random is {0}. /// internal static string info_status_random { get { return ResourceManager.GetString("info_status_random", resourceCulture); } } } } ================================================ FILE: TS3AudioBot/Localization/strings.resx ================================================ text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Adds a new song to the queue. Generates an api token. Gets the status of the channel commander mode. Enables channel commander. Disables channel commander. Moves the bot to your channel. Gets various information about the bot. Gets the id of the current bot. Gets a list of all active bots. Moves the bot to you or a specified channel. Gives the bot a new name. Set your bot a badge. The badges string starts with 'overwolf=0:badges=' Sets all teamspeak rights for the bot to be fully functional. Switches the context to the requested bot. Removes all songs from the current playlist. Stop this bot instance. Executes a given command or string Gets your id. Gets your unique id. Gets your nickname. Gets your database id. Gets your channel id you are currently in. Gets all information about you. Gets the unique id of a user, searching with his id. Gets the nickname of a user, searching with his id. Gets the database id of a user, searching with his id. Gets the channel id a user is currently in, searching with his id. Gets all information about a user, searching with his id. Gets the id of a user, searching with his name. Gets all information of a user, searching with his name. Gets the user name by dbid, searching with his database id. Gets the unique id of a user, searching with his database id. Shows all commands or detailed help about a specific command. <id> Adds the song with <id> to the queue Cleans up the history file for better startup performance. <id> Removes the entry with <id> from the history Gets the last <count> songs from the user with the given <user-dbid> <id> Displays all saved informations about the song with <id> (last|next) Gets the highest|next song id <count> Gets the last <count> played songs. Plays the last song again <id> Playes the song with <id> <id> <name> Sets the name of the song with <id> to <name> <date> Gets all songs played until <date>. <name> Any of those desciptors: (hour|today|yesterday|week) Gets all songs which title contains <string> Allows you to combine multiple JsonResults into one Guess what? Gets a link to the origin of the current song. <id> Adds a link to your private playlist from the history by <id>. Clears a playlist. <name> Deletes the playlist with the name <name>. You can only delete playlists which you also have created. Admins can delete every playlist. <link> Imports a playlist form an other platform like youtube etc. <from> <to> Moves a item in a playlist <from> <to> position. <index> Removes the item at <index>. Displays all available playlists from all users. Opens a playlist to be editable for you. This replaces your current worklist with the opened playlist. Appends another playlist to yours. Displays the name of the playlist you are currently working on. Replaces the current freelist with your workinglist and plays from the beginning. Appends your playlist to the freelist. Stores your current workinglist to disk. <name> Displays all songs currently in the playlists with the name <name> Plays the next song in the playlist. Requests a private session with the ServerBot so you can be intimate. Displays the AST of the requested command. Well, pauses the song. Undo with !play. Automatically tries to decide whether the link is a special resource (like youtube) or a direct resource (like ./hello.mp3) and starts it. Lists all found plugins. Unloads a plugin. Unloads a plugin. Plays the previous song in the playlist. Lets you format multiple parameter to one. Closes the TS3AudioBot application. Shows the quizmode status. Enable to hide the songnames and let your friends guess the title. Disable to show the songnames again. Gets whether or not to play playlists in random order. Enables random playlist playback Disables random playlist playback Gets the unique seed for a certain playback order Sets the unique seed for a certain playback order Sets the unique seed for a certain playback order Gets the current repeat mode. Repeats a single song. Disables repeating. Returns the subset of allowed commands the caller (you) can execute. Reloads the rights configuration from file. Gets a random number. Jumps to a timemark within the current song. Tells you the name of the current song. Stops the current song. Lets you hear the music independent from the channel you are in. Adds your current channel to the music playback. Adds your current channel to the music playback. Take a substring from a string. Only lets you hear the music in active channels again. Removes your current channel from the music playback. Clears all temporary targets. Gets the current build version. Sets the volume level of the music. Set how to send music. Set a specific teamspeak whisper group. Set how to send music. Enables normal voice mode. Enables default whisper subscription mode. Evaluates all parameter. Requested command is ambiguous between: {0} The command has no further subfunctions after {0} No matching command found! Try !help to get a list of all commands. Seems like something went wrong. No help can be shown for this command path. ========= Welcome to the TS3AudioBot ========= If you need any help with a special command use !help <commandName>. Here are all possible commands: The command contains the following subfunctions: {0} Do want to clean the history file now? Do want to remove all defective links file now? Do you really want to delete the entry "{0}" with the id {1}? {0} is the currently highest song id. {0} will be the next song id. There is no song in the history. The new name must not be empty or only whitespaces. Unknown comparison operator. I'm not strong enough, master! You are not allowed to delete others playlists. Do you really want to delete the playlist "{0}"? Loaded "{0}" with {1} songs. Playlist: "{0}" with {1} songs. Hi {0} Do you really want to quit? No cheating! Everybody has to see it! Only letters allowed. Error while parsing file, see log for more details. Value must be 0 or positive. The time was not in a correct format, see !help seek for more information. The point of time is not within the song length. Please specify a key. E.g {0} Found more than one matching key: {0} No config key matching the pattern found. Not enough arguments to take. Current volume: {0} Careful you are requesting a very high volume! Do you want to apply this? The volume level must be between {0} and {1} You are not allowed to set higher volumes. The new volume could not be parsed This type requires an additional target. This type does not take an additional target. Currently targeting: Nowhere! This channel via voice! A whisper group {0} {1} ({2})! Channel Clients This bot does not exist. Error: {0} An unexpected error occurred: {0} Need at least four arguments to evaluate. Need at least one argument to evaluate. Need at least two arguments to evaluate. Could not create new instance. Invalid token-valid duration. Invoker casted Ghost Walk. Missing session context. Can't find a fitting return type to return. This command is not available as API. Not found. No active token found. No invoker in context. No target channel found. No teamspeak connection in context. No Uid found to register token for. Nothing to play... Index must be within playlist length. The playlist could not be found. Plugin error: {0} Unrecognized descriptor. Please use this command in a private session. This might take a while and make the bot unresponsive in meanwhile. Channel commander is {0} Cleanup done! There is nothing on right now... Now playing: {0} <empty> Ok Sorry, you have to guess! Removed "{0}" <Quiztime!> <Sleeping> Bot setup failed. See logs for more details. This feature is currently unavailable. Entry could not be stored. Could not find entry with this id. The playlist file is corrupted. Only admins can modify it until fixed. Cannot move there. Cannot set commander mode. Teamspeak Error: {0} The new name is too long or invalid. The message to send is longer than the allowed maximum. No client found. Unknown Teamspeak Error. off on Quizmode is {0} Random is {0} The value could not be parsed. The file still in use. The bot does not have the required system permission. An unknown error occoured. The id could not get parsed. The resource could not be found. No image could not be found. Invalid or malformed response parts. Empty or missing response parts. The image is invalid. Invalid uri. No stream extracted. Request got empty response. Got error status code. No connection could be established. Request timed out. Unknown request error. You cannot access a playlist which you dont own. The name contains invalid characters; please only use [a-zA-Z0-9_-]. An empty name is not valid. The name length must be <64. No playlist directory has been set up. Special list not found. Internal error. A few songs failed to start, use {0} to continue. Could not load. Considered multiple factories but all failed. No registered factory for "{0}" found. No youtube-dl response Failed to run youtube-dl. Youtube-Dl could not be found. The song/video cannot be played due to restrictions. youtube-dl failed to load the resource. No next song could be played. No previous song could be played. No help found. Missing session context. Missing teamspeak permissions. Connects a new bot to the given address. Connects a new bot with the settings from the template name. Saves the configuration for the newly connected bot. Checks for all links in the history which cannot be opened anymore and removes them. Conditionally executes subcommands. Gets a value from the bot settings. Gets a value from the core settings. Set a value from the core settings. Provides get/set methods to change the settings. Get the desciption for a setting. Sets a value from the bot settings. This feature is not documented. Sets an avatar for the bot Gets the length and position of the current track. You cannot execute '{0}'. You are missing the '{1}' right! Repeats the entire playlist. Repeating the playlist. Not repeating. Repeating a single song. Clears the avatar of the bot. Could not convert "{0}" to {1}. No matching function overload could be found. The number is too big. Need at least {0} arguments to evaluate. Need at least three arguments to evaluate. Sets the description of the bot. Reloads the bot template configuration from the file. Creates a new bot template. Deletes a bot template. Reloads the core configuration from the file. Duplicates a bot template with a new name. Displays the current play queue. Show's a small summary of the current playlist and queue status. Renames an item. The command exceeded the maximum calling complexity. Creates a new command alias. Lists all currently registered alias. Removes an existing alias. Shows the implementation of the alias. Writes a message to a particular user. Found the following songs. Use "{0}" to play. Use "{1}" to queue. Found no results for this query. Nothing to select... Your value is out of range. Select one between {0} and {1}. number Selects a song from a previous search and plays it. The file to upload is too big. Invalid channel password. Subscribes the specified client to listen from anywhere Unsubscribes the specified client to listen from anywhere. Jumps to the requested index in the current queue and starts playing. ================================================ FILE: TS3AudioBot/MainCommands.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using CliWrap; using CliWrap.Buffered; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using TS3AudioBot.Algorithm; using TS3AudioBot.Audio; using TS3AudioBot.CommandSystem; using TS3AudioBot.CommandSystem.Ast; using TS3AudioBot.CommandSystem.CommandResults; using TS3AudioBot.CommandSystem.Commands; using TS3AudioBot.CommandSystem.Text; using TS3AudioBot.Config; using TS3AudioBot.Dependency; using TS3AudioBot.Environment; using TS3AudioBot.Helper; using TS3AudioBot.Helper.Diagnose; using TS3AudioBot.History; using TS3AudioBot.Localization; using TS3AudioBot.Playlists; using TS3AudioBot.Plugins; using TS3AudioBot.ResourceFactories; using TS3AudioBot.Rights; using TS3AudioBot.Sessions; using TS3AudioBot.Web; using TS3AudioBot.Web.Api; using TS3AudioBot.Web.Model; using TSLib; using TSLib.Audio; using TSLib.Full.Book; using TSLib.Helper; using TSLib.Messages; namespace TS3AudioBot { public static class MainCommands { internal static ICommandBag Bag { get; } = new MainCommandsBag(); internal class MainCommandsBag : ICommandBag { public IReadOnlyCollection BagCommands { get; } = CommandManager.GetBotCommands(null, typeof(MainCommands)).ToArray(); public IReadOnlyCollection AdditionalRights { get; } = new string[] { RightHighVolume, RightDeleteAllPlaylists }; } public const string RightHighVolume = "ts3ab.admin.volume"; public const string RightDeleteAllPlaylists = "ts3ab.admin.list"; private const string YesNoOption = " !(yes|no)"; // [...] = Optional // = Placeholder for a text // [text] = Option for fixed text // (a|b) = either or switch // ReSharper disable UnusedMember.Global [Command("add")] public static async Task CommandAdd(PlayManager playManager, InvokerData invoker, string url, params string[] attributes) => await playManager.Enqueue(invoker, url, meta: PlayManager.ParseAttributes(attributes)); [Command("add")] public static async Task CommandAdd(PlayManager playManager, InvokerData invoker, IAudioResourceResult rsc, params string[] attributes) => await playManager.Enqueue(invoker, rsc.AudioResource, meta: PlayManager.ParseAttributes(attributes)); [Command("alias add")] public static void CommandAliasAdd(CommandManager commandManager, ConfBot confBot, string commandName, string command) { commandManager.RegisterAlias(commandName, command).UnwrapThrow(); var confEntry = confBot.Commands.Alias.GetOrCreateItem(commandName); confEntry.Value = command; confBot.SaveWhenExists().UnwrapThrow(); } [Command("alias remove")] public static void CommandAliasRemove(CommandManager commandManager, ConfBot confBot, string commandName) { commandManager.UnregisterAlias(commandName).UnwrapThrow(); confBot.Commands.Alias.RemoveItem(commandName); confBot.SaveWhenExists().UnwrapThrow(); } [Command("alias list")] public static JsonArray CommandAliasList(CommandManager commandManager) => new JsonArray(commandManager.AllAlias.ToArray(), x => string.Join(",", x)); [Command("alias show")] public static string? CommandAliasShow(CommandManager commandManager, string commandName) => commandManager.GetAlias(commandName)?.AliasString; [Command("api token")] [Usage("[]", "Optionally specifies a duration this key is valid in hours.")] public static string CommandApiToken(TokenManager tokenManager, ClientCall invoker, double? validHours = null) { if (invoker.Visibiliy != null && invoker.Visibiliy != TextMessageTargetMode.Private) throw new CommandException(strings.error_use_private, CommandExceptionReason.CommandError); if (invoker.IsAnonymous || invoker.ClientUid == Uid.Null) throw new MissingContextCommandException(strings.error_no_uid_found, typeof(ClientCall)); TimeSpan? validSpan = null; try { if (validHours != null) validSpan = TimeSpan.FromHours(validHours.Value); } catch (OverflowException oex) { throw new CommandException(strings.error_invalid_token_duration, oex, CommandExceptionReason.CommandError); } return tokenManager.GenerateToken(invoker.ClientUid.Value!, validSpan); } [Command("bot avatar set")] public static async Task CommandBotAvatarSet(Ts3Client ts3Client, string url) { url = TextUtil.ExtractUrlFromBb(url); await WebWrapper.Request(url).ToAction(async x => { using var stream = await x.Content.ReadAsStreamAsync(); using var image = await ImageUtil.ResizeImageSave(stream); await ts3Client.UploadAvatar(image.Stream); }); } [Command("bot avatar clear")] public static Task CommandBotAvatarClear(Ts3Client ts3Client) => ts3Client.DeleteAvatar(); [Command("bot badges")] public static Task CommandBotBadges(Ts3Client ts3Client, string badges) => ts3Client.ChangeBadges(badges); [Command("bot description set")] public static Task CommandBotDescriptionSet(Ts3Client ts3Client, string description) => ts3Client.ChangeDescription(description); [Command("bot diagnose", "_undocumented")] public static async Task> CommandBotDiagnose(Player player, IVoiceTarget target, Connection book, ConfRoot rootConf, WebServer webServer) { var problems = new List(); // ** Diagnose common playback problems and more ** var self = book.Self(); var curChan = book.CurrentChannel(); // Check talk power if (self != null && curChan != null && !self.TalkPowerGranted && self.TalkPower < curChan.NeededTalkPower) problems.Add(new SelfDiagnoseMessage("The bot does not have enough talk power.", "play", SelfDiagnoseLevel.Warning)); // Check volume 0 if (player.Volume == 0) problems.Add(new SelfDiagnoseMessage("The volume level is at 0.", "play", SelfDiagnoseLevel.Warning)); // Check if send mode hasn't been selected yet if (target.SendMode == TargetSendMode.None) problems.Add(new SelfDiagnoseMessage("Send mode is currently 'None', use '!whisper off' for example to send via voice.", "play", SelfDiagnoseLevel.Warning)); // - Check if ffmpeg exists // - Check ffmpeg https support (https://gitter.im/TS3AudioBot/Lobby?at=5eaf1e14f0377f1631656b7a) // Seems like CentOS 7 for e.g. by default has no https try { var ffPath = rootConf.Tools.Ffmpeg.Path.Value; var result = await Cli.Wrap(ffPath) .WithArguments(new[] { "-hide_banner", "-protocols" }) .ExecuteBufferedAsync(); var protos = new HashSet(result.StandardOutput .Split('\n') .Select(x => x.Trim()) .SkipWhile(x => x != "Input:").Skip(1) .TakeWhile(x => x != "Output:")); foreach (var wantProto in new[] { "http", "https", "hls" }) { if (!protos.Contains(wantProto)) problems.Add(new SelfDiagnoseMessage($"Your ffmpeg binary is missing '{wantProto}'. Some streams might not play.", "play", SelfDiagnoseLevel.Warning)); } } catch (Exception ex) { problems.Add(new SelfDiagnoseMessage($"Could not find or run ffmpeg binary. Playback will NOT work. ({ex.Message})", "play", SelfDiagnoseLevel.Error)); } // Check if web path is found { if (!rootConf.Web.Interface.Enabled) problems.Add(new SelfDiagnoseMessage($"WebInterface is disabled.", "web", SelfDiagnoseLevel.Info)); var webPath = webServer.FindWebFolder(); if (rootConf.Web.Interface.Enabled && (webPath is null || !Directory.Exists(webPath) || !System.IO.File.Exists(Path.Combine(webPath, "index.html")))) problems.Add(new SelfDiagnoseMessage($"WebInterface is enabled, but the required files are missing.", "web", SelfDiagnoseLevel.Error)); } return new JsonArray(problems, x => { if (x.Count == 0) return "No problems detected"; var strb = new StringBuilder("The following issues have been found:"); foreach (var prob in x) strb.Append("\n- ").Append(prob.Level).Append(": ").Append(prob.Description); return strb.ToString(); }); } [Command("bot disconnect")] public static async Task CommandBotDisconnect(Bot bot) => await bot.Stop(); [Command("bot commander")] public static async Task> CommandBotCommander(Ts3Client ts3Client) { var value = await ts3Client.IsChannelCommander(); return new JsonValue(value, string.Format(strings.info_status_channelcommander, value ? strings.info_on : strings.info_off)); } [Command("bot commander on")] public static Task CommandBotCommanderOn(Ts3Client ts3Client) => ts3Client.SetChannelCommander(true); [Command("bot commander off")] public static Task CommandBotCommanderOff(Ts3Client ts3Client) => ts3Client.SetChannelCommander(false); [Command("bot come")] public static Task CommandBotCome(Ts3Client ts3Client, ClientCall invoker, string? password = null) { var channel = invoker?.ChannelId; if (channel == null) throw new CommandException(strings.error_no_target_channel, CommandExceptionReason.CommandError); return ts3Client.MoveTo(channel.Value, password); } [Command("bot connect template")] public static async Task CommandBotConnectTo(BotManager bots, string name) { var botInfo = await bots.RunBotTemplate(name); if (!botInfo.Ok) throw new CommandException(strings.error_could_not_create_bot + $" ({botInfo.Error})", CommandExceptionReason.CommandError); return botInfo.Value; } [Command("bot connect to")] public static async Task CommandBotConnectNew(BotManager bots, string address, string? password = null) { var botConf = bots.CreateNewBot(); botConf.Connect.Address.Value = address; if (!string.IsNullOrEmpty(password)) botConf.Connect.ServerPassword.Password.Value = password; var botInfo = await bots.RunBot(botConf); if (!botInfo.Ok) throw new CommandException(strings.error_could_not_create_bot + $" ({botInfo.Error})", CommandExceptionReason.CommandError); return botInfo.Value; } [Command("bot info")] public static BotInfo CommandBotInfo(Bot bot) => bot.GetInfo(); [Command("bot info client", "_undocumented")] public static Client? CommandBotInfoClient(Connection book, ApiCall _) => book.Self(); [Command("bot info template", "cmd_bot_info_help")] public static BotInfo CommandBotInfo(BotManager botManager, ConfRoot config, string name) { var bot = botManager.GetBotLock(name); if (bot != null) return CommandBotInfo(bot); var botInfo = GetOfflineBotInfo(config, name).UnwrapThrow(); return botInfo; } [Command("bot list")] public static JsonArray CommandBotList(BotManager bots, ConfRoot config) { var botInfoList = bots.GetBotInfolist(); var botConfigList = config.GetAllBots() ?? Array.Empty(); var infoList = new Dictionary(); foreach (var botInfo in botInfoList) { if (string.IsNullOrEmpty(botInfo.Name)) continue; infoList[botInfo.Name] = botInfo; } foreach (var botConfig in botConfigList) { var name = botConfig.Name; if (name is null || infoList.ContainsKey(name)) continue; infoList[name] = GetOfflineBotInfo(botConfig); } return new JsonArray(infoList.Values.Concat(botInfoList.Where(x => string.IsNullOrEmpty(x.Name))).ToArray(), bl => string.Join("\n", bl.Select(x => x.ToString()))); } private static R GetOfflineBotInfo(ConfRoot config, string name) { var result = config.GetBotConfig(name); if (!result.Ok) return new LocalStr(result.Error.Message); var botConfig = result.Value; return GetOfflineBotInfo(botConfig); } private static BotInfo GetOfflineBotInfo(ConfBot botConfig) { return new BotInfo { Id = null, Name = botConfig.Name, Server = botConfig.Connect.Address, Status = BotStatus.Offline, }; } [Command("bot move")] public static Task CommandBotMove(Ts3Client ts3Client, ulong channel, string? password = null) => ts3Client.MoveTo((ChannelId)channel, password); [Command("bot name")] public static Task CommandBotName(Ts3Client ts3Client, string name) => ts3Client.ChangeName(name); [Command("bot save")] public static void CommandBotSetup(ConfBot botConfig, string name) => botConfig.SaveNew(name).UnwrapThrow(); [Command("bot setup")] public static async Task CommandBotSetup(Ts3Client ts3Client, string? adminToken = null) { await ts3Client.SetupRights(adminToken); } [Command("bot template", "cmd_bot_use_help")] public static async Task CommandBotTemplate(ExecutionInformation info, BotManager bots, string botName, ICommand cmd) { var bot = bots.GetBotLock(botName); return await CommandBotUseInternal(info, bot, cmd); } [Command("bot use")] public static async Task CommandBotUse(ExecutionInformation info, BotManager bots, int botId, ICommand cmd) { var bot = bots.GetBotLock(botId); return await CommandBotUseInternal(info, bot, cmd); } private static async Task CommandBotUseInternal(ExecutionInformation info, Bot? bot, ICommand cmd) { if (bot is null) throw new CommandException(strings.error_bot_does_not_exist, CommandExceptionReason.CommandError); var backParent = info.ParentInjector; info.ParentInjector = bot.Injector; try { return await bot.Scheduler.InvokeAsync(() => cmd.Execute(info, Array.Empty()).AsTask()); } finally { info.ParentInjector = backParent; } } [Command("clear")] public static void CommandClear(PlaylistManager playlistManager) => playlistManager.Clear(); [Command("command parse", "cmd_parse_command_help")] public static JsonValue CommandParse(string parameter) { var node = CommandParser.ParseCommandRequest(parameter); var strb = new StringBuilder(); strb.AppendLine(); node.Write(strb, 0); return new JsonValue(node, strb.ToString()); } [Command("command tree", "_undocumented")] public static string CommandTree(CommandManager commandManager) { return CommandManager.GetTree(commandManager.RootGroup); } [Command("data song cover get", "_undocumented")] public static DataStream CommandData(ResolveContext resourceFactory, PlayManager playManager) => new DataStream(async response => { var cur = playManager.CurrentPlayData; if (cur is null) throw Error.LocalStr(strings.info_currently_not_playing); await resourceFactory.GetThumbnail(cur.PlayResource, async stream => { using var image = await ImageUtil.ResizeImageSave(stream); response.ContentType = image.Mime; await image.Stream.CopyToAsync(response.Body); }); }); [Command("eval")] [Usage(" ", "Executes the given command on arguments")] [Usage("", "Concat the strings and execute them with the command system")] public static async Task CommandEval(ExecutionInformation info, IReadOnlyList arguments) { // Evaluate the first argument on the rest of the arguments if (arguments.Count == 0) throw new CommandException(strings.error_cmd_at_least_one_argument, CommandExceptionReason.MissingParameter); var leftArguments = arguments.TrySegment(1); var arg0 = await arguments[0].Execute(info, Array.Empty()); switch (arg0) { case ICommand command: return await command.Execute(info, leftArguments); case null: return null; default: var cmdStr = arg0.ToString()!; // We got a string back so parse and evaluate it var cmd = CommandManager.AstToCommandResult(CommandParser.ParseCommandRequest(cmdStr)); return await cmd.Execute(info, leftArguments); } } [Command("from", "_undocumented")] public static async Task CommandFrom(PlayManager playManager, InvokerData invoker, string factoryName, string url) => await playManager.Play(invoker, url, factoryName); [Command("get", "_undocumented")] [Usage(" ", "Get an element out of a list")] public static object? CommandGet(uint index, System.Collections.IEnumerable list) { foreach (var i in list) { if (index == 0) return i; index--; } return null; } [Command("getmy id")] public static ushort CommandGetId(ClientCall invoker) => invoker.ClientId?.Value ?? throw new CommandException(strings.error_not_found, CommandExceptionReason.CommandError); [Command("getmy uid")] public static string? CommandGetUid(ClientCall invoker) => invoker.ClientUid.Value; [Command("getmy name")] public static string CommandGetName(ClientCall invoker) => invoker.NickName ?? throw new CommandException(strings.error_not_found, CommandExceptionReason.CommandError); [Command("getmy dbid")] public static ulong CommandGetDbId(ClientCall invoker) => invoker.DatabaseId?.Value ?? throw new CommandException(strings.error_not_found, CommandExceptionReason.CommandError); [Command("getmy channel")] public static ulong CommandGetChannel(ClientCall invoker) => invoker.ChannelId?.Value ?? throw new CommandException(strings.error_not_found, CommandExceptionReason.CommandError); [Command("getmy all")] public static JsonValue CommandGetUser(ClientCall invoker) => new JsonValue(invoker, $"Client: Id:{invoker.ClientId} DbId:{invoker.DatabaseId} ChanId:{invoker.ChannelId} Uid:{invoker.ClientUid}"); // LOC: TODO [Command("getuser uid byid")] public static async Task CommandGetUidById(Ts3Client ts3Client, ushort id) => (await ts3Client.GetFallbackedClientById((ClientId)id)).Uid?.Value ?? ""; [Command("getuser name byid")] public static async Task CommandGetNameById(Ts3Client ts3Client, ushort id) => (await ts3Client.GetFallbackedClientById((ClientId)id)).Name; [Command("getuser dbid byid")] public static async Task CommandGetDbIdById(Ts3Client ts3Client, ushort id) => (await ts3Client.GetFallbackedClientById((ClientId)id)).DatabaseId.Value; [Command("getuser channel byid")] public static async Task CommandGetChannelById(Ts3Client ts3Client, ushort id) => (await ts3Client.GetFallbackedClientById((ClientId)id)).ChannelId.Value; [Command("getuser all byid")] public static async Task> CommandGetUserById(Ts3Client ts3Client, ushort id) { var client = await ts3Client.GetFallbackedClientById((ClientId)id); return new JsonValue(client, $"Client: Id:{client.ClientId} DbId:{client.DatabaseId} ChanId:{client.ChannelId} Uid:{client.Uid}"); } [Command("getuser id byname")] public static async Task CommandGetIdByName(Ts3Client ts3Client, string username) => (await ts3Client.GetClientByName(username)).ClientId.Value; [Command("getuser all byname")] public static async Task> CommandGetUserByName(Ts3Client ts3Client, string username) { var client = await ts3Client.GetClientByName(username); return new JsonValue(client, $"Client: Id:{client.ClientId} DbId:{client.DatabaseId} ChanId:{client.ChannelId} Uid:{client.Uid}"); } [Command("getuser name bydbid")] public static async Task CommandGetNameByDbId(Ts3Client ts3Client, ulong dbId) => (await ts3Client.GetDbClientByDbId((ClientDbId)dbId)).Name; [Command("getuser uid bydbid")] public static async Task CommandGetUidByDbId(Ts3Client ts3Client, ulong dbId) => (await ts3Client.GetDbClientByDbId((ClientDbId)dbId)).Uid.Value; private static readonly TextMod HelpCommand = new TextMod(TextModFlag.Bold); private static readonly TextMod HelpCommandParam = new TextMod(TextModFlag.Italic); [Command("help")] public static string CommandHelp(CallerInfo callerInfo) { var tmb = new TextModBuilder(callerInfo.IsColor); tmb.AppendLine("TS3AudioBot at your service!"); tmb.AppendLine("To get some basic help on how to get started use one of the following commands:"); tmb.Append("!help play", HelpCommand).AppendLine(" : basics for playing songs"); tmb.Append("!help playlists", HelpCommand).AppendLine(" : how to manage playlists"); tmb.Append("!help history", HelpCommand).AppendLine(" : viewing and accesing the play history"); tmb.Append("!help bot", HelpCommand).AppendLine(" : useful features to configure your bot"); tmb.Append("!help all", HelpCommand).AppendLine(" : show all commands"); tmb.Append("!help command", HelpCommand).Append(" ", HelpCommandParam).AppendLine(" : help text of a specific command"); var str = tmb.ToString(); return str; } [Command("help all", "_undocumented")] public static JsonArray CommandHelpAll(CommandManager commandManager) { var botComList = commandManager.RootGroup.Commands.Select(c => c.Key).ToArray(); return new JsonArray(botComList, bcl => { var strb = new StringBuilder(); foreach (var botCom in bcl) strb.Append(botCom).Append(", "); strb.Length -= 2; return strb.ToString(); }); } [Command("help command", "_undocumented")] public static JsonObject CommandHelpCommand(CommandManager commandManager, IFilter? filter = null, params string[] command) { if (command.Length == 0) { return new JsonEmpty(strings.error_cmd_at_least_one_argument); } CommandGroup? group = commandManager.RootGroup; ICommand? target = group; filter ??= Filter.DefaultFilter; var realPath = new List(); for (int i = 0; i < command.Length; i++) { var possibilities = filter.Filter(group.Commands, command[i]).ToList(); if (possibilities.Count <= 0) throw new CommandException(strings.cmd_help_error_no_matching_command, CommandExceptionReason.CommandError); if (possibilities.Count > 1) throw new CommandException(string.Format(strings.cmd_help_error_ambiguous_command, string.Join(", ", possibilities.Select(kvp => kvp.Key))), CommandExceptionReason.CommandError); realPath.Add(possibilities[0].Key); target = possibilities[0].Value; if (i < command.Length - 1) { group = target as CommandGroup; if (group is null) throw new CommandException(string.Format(strings.cmd_help_error_no_further_subfunctions, string.Join(" ", realPath, 0, i)), CommandExceptionReason.CommandError); } } switch (target) { case BotCommand targetB: return JsonValue.Create(targetB); case CommandGroup targetCg: var subList = targetCg.Commands.Select(g => g.Key).ToArray(); return new JsonArray(subList, string.Format(strings.cmd_help_info_contains_subfunctions, string.Join(", ", subList))); case OverloadedFunctionCommand targetOfc: var strb = new StringBuilder(); foreach (var botCom in targetOfc.Functions.OfType()) strb.Append(botCom); return JsonValue.Create(strb.ToString()); case AliasCommand targetAlias: return JsonValue.Create(string.Format("'{0}' is an alias for:\n{1}", string.Join(" ", realPath), targetAlias.AliasString)); default: throw new CommandException(strings.cmd_help_error_unknown_error, CommandExceptionReason.CommandError); } } [Command("help play", "_undocumented")] public static string CommandHelpPlay() { return ""; } [Command("history add")] public static async Task CommandHistoryQueue(HistoryManager historyManager, PlayManager playManager, InvokerData invoker, uint hid) { var ale = historyManager.GetEntryById(hid).UnwrapThrow(); await playManager.Enqueue(invoker, ale.AudioResource); } [Command("history clean")] public static JsonEmpty CommandHistoryClean(DbStore database, CallerInfo caller, UserSession? session = null) { if (caller.ApiCall) { database.CleanFile(); return new JsonEmpty(string.Empty); } Task ResponseHistoryClean(string message) { if (TextUtil.GetAnswer(message) == Answer.Yes) { database.CleanFile(); return Task.FromResult(strings.info_cleanup_done); } return Task.FromResult(null); } session.SetResponse(ResponseHistoryClean); return new JsonEmpty($"{strings.cmd_history_clean_confirm_clean} {strings.info_bot_might_be_unresponsive} {YesNoOption}"); } [Command("history clean removedefective")] public static async Task CommandHistoryCleanRemove(HistoryManager historyManager, ResolveContext resourceFactory, CallerInfo caller, UserSession? session = null) { if (caller.ApiCall) { await historyManager.RemoveBrokenLinks(resourceFactory); return new JsonEmpty(string.Empty); } async Task ResponseHistoryCleanRemove(string message) { if (TextUtil.GetAnswer(message) == Answer.Yes) { await historyManager.RemoveBrokenLinks(resourceFactory); return strings.info_cleanup_done; } return null; } session.SetResponse(ResponseHistoryCleanRemove); return new JsonEmpty($"{strings.cmd_history_clean_removedefective_confirm_clean} {strings.info_bot_might_be_unresponsive} {YesNoOption}"); } [Command("history clean upgrade", "_undocumented")] public static async Task CommandHistoryCleanUpgrade(HistoryManager historyManager, Ts3Client ts3Client) { await historyManager.UpdadeDbIdToUid(ts3Client); } [Command("history delete")] public static JsonEmpty CommandHistoryDelete(HistoryManager historyManager, CallerInfo caller, uint id, UserSession? session = null) { var ale = historyManager.GetEntryById(id).UnwrapThrow(); if (caller.ApiCall) { historyManager.RemoveEntry(ale); return new JsonEmpty(string.Empty); } Task ResponseHistoryDelete(string message) { Answer answer = TextUtil.GetAnswer(message); if (answer == Answer.Yes) { historyManager.RemoveEntry(ale); } return Task.FromResult(null); } session.SetResponse(ResponseHistoryDelete); var name = ale.AudioResource.ResourceTitle; if (name?.Length > 100) name = name.Substring(100) + "..."; return new JsonEmpty(string.Format(strings.cmd_history_delete_confirm + YesNoOption, name, id)); } [Command("history from")] public static JsonArray CommandHistoryFrom(HistoryManager historyManager, string userUid, int? amount = null) { var query = new SeachQuery { UserUid = userUid }; if (amount != null) query.MaxResults = amount.Value; var results = historyManager.Search(query).ToArray(); return new JsonArray(results, historyManager.Format); } [Command("history id", "cmd_history_id_uint_help")] public static JsonValue CommandHistoryId(HistoryManager historyManager, uint id) { var result = historyManager.GetEntryById(id).UnwrapThrow(); return new JsonValue(result, r => historyManager.Format(r)); } [Command("history id", "cmd_history_id_string_help")] public static JsonValue CommandHistoryId(HistoryManager historyManager, string special) { if (special == "last") return new JsonValue(historyManager.HighestId, string.Format(strings.cmd_history_id_last, historyManager.HighestId)); else if (special == "next") return new JsonValue(historyManager.HighestId + 1, string.Format(strings.cmd_history_id_next, historyManager.HighestId + 1)); else throw new CommandException("Unrecognized name descriptor", CommandExceptionReason.CommandError); } [Command("history last", "cmd_history_last_int_help")] public static JsonArray CommandHistoryLast(HistoryManager historyManager, int amount) { var query = new SeachQuery { MaxResults = amount }; var results = historyManager.Search(query).ToArray(); return new JsonArray(results, historyManager.Format); } [Command("history last", "cmd_history_last_help")] public static async Task CommandHistoryLast(HistoryManager historyManager, PlayManager playManager, InvokerData invoker) { var ale = historyManager.Search(new SeachQuery { MaxResults = 1 }).FirstOrDefault(); if (ale is null) throw new CommandException(strings.cmd_history_last_is_empty, CommandExceptionReason.CommandError); await playManager.Play(invoker, ale.AudioResource); } [Command("history play")] public static async Task CommandHistoryPlay(HistoryManager historyManager, PlayManager playManager, InvokerData invoker, uint hid) { var ale = historyManager.GetEntryById(hid).UnwrapThrow(); await playManager.Play(invoker, ale.AudioResource); } [Command("history rename")] public static void CommandHistoryRename(HistoryManager historyManager, uint id, string newName) { var ale = historyManager.GetEntryById(id).UnwrapThrow(); if (string.IsNullOrWhiteSpace(newName)) throw new CommandException(strings.cmd_history_rename_invalid_name, CommandExceptionReason.CommandError); historyManager.RenameEntry(ale, newName); } [Command("history till", "cmd_history_till_DateTime_help")] public static JsonArray CommandHistoryTill(HistoryManager historyManager, DateTime time) { var query = new SeachQuery { LastInvokedAfter = time }; var results = historyManager.Search(query).ToArray(); return new JsonArray(results, historyManager.Format); } [Command("history till", "cmd_history_till_string_help")] public static JsonArray CommandHistoryTill(HistoryManager historyManager, string time) { var tillTime = (time.ToLowerInvariant()) switch { "hour" => DateTime.Now.AddHours(-1), "today" => DateTime.Today, "yesterday" => DateTime.Today.AddDays(-1), "week" => DateTime.Today.AddDays(-7), _ => throw new CommandException(strings.error_unrecognized_descriptor, CommandExceptionReason.CommandError), }; var query = new SeachQuery { LastInvokedAfter = tillTime }; var results = historyManager.Search(query).ToArray(); return new JsonArray(results, historyManager.Format); } [Command("history title")] public static JsonArray CommandHistoryTitle(HistoryManager historyManager, string part) { var query = new SeachQuery { TitlePart = part }; var results = historyManager.Search(query).ToArray(); return new JsonArray(results, historyManager.Format); } [Command("if")] [Usage(" ", "Compares the two arguments and returns or executes the then-argument")] [Usage(" ", "Same as before and return the else-arguments if the condition is false")] public static async Task CommandIf(ExecutionInformation info, string arg0, string cmp, string arg1, ICommand then, ICommand? other = null) { Func comparer = cmp switch { "<" => (a, b) => a < b, ">" => (a, b) => a > b, "<=" => (a, b) => a <= b, ">=" => (a, b) => a >= b, "==" => (a, b) => Math.Abs(a - b) < 1e-6, "!=" => (a, b) => Math.Abs(a - b) > 1e-6, _ => throw new CommandException(strings.cmd_if_unknown_operator, CommandExceptionReason.CommandError), }; bool cmpResult; // Try to parse arguments into doubles if (double.TryParse(arg0, NumberStyles.Number, CultureInfo.InvariantCulture, out var d0) && double.TryParse(arg1, NumberStyles.Number, CultureInfo.InvariantCulture, out var d1)) { cmpResult = comparer(d0, d1); } else { cmpResult = comparer(string.CompareOrdinal(arg0, arg1), 0); } // If branch if (cmpResult) return await then.Execute(info, Array.Empty()); // Else branch if (other != null) return await other.Execute(info, Array.Empty()); return null; } private static readonly TextMod SongDone = new TextMod(TextModFlag.Color, Color.Gray); private static readonly TextMod SongCurrent = new TextMod(TextModFlag.Bold); private static int GetIndexExpression(PlaylistManager playlistManager, string expression) { int index; if (string.IsNullOrEmpty(expression)) { index = playlistManager.Index; } else if (expression.StartsWith("@")) { var subOffset = expression.AsSpan(1).Trim(); if (subOffset.IsEmpty) index = 0; else if (!int.TryParse(subOffset, out index)) throw new CommandException(strings.error_unrecognized_descriptor, CommandExceptionReason.CommandError); index += playlistManager.Index; } else if (!int.TryParse(expression, NumberStyles.Integer, CultureInfo.InvariantCulture, out index)) { throw new CommandException(strings.error_unrecognized_descriptor, CommandExceptionReason.CommandError); } return index; } [Command("info")] public static JsonValue CommandInfo(ResolveContext resourceFactory, PlaylistManager playlistManager, string? offset = null, int? count = null) => CommandInfo(resourceFactory, playlistManager, GetIndexExpression(playlistManager, offset ?? "@-1"), count); [Command("info")] public static JsonValue CommandInfo(ResolveContext resourceFactory, PlaylistManager playlistManager, int offset, int? count = null) { const int maxSongs = 20; var playIndex = playlistManager.Index; var plist = playlistManager.CurrentList; int offsetV = Tools.Clamp(offset, 0, plist.Items.Count); int countV = Tools.Clamp(count ?? 3, 0, Math.Min(maxSongs, plist.Items.Count - offsetV)); var items = plist.Items.Skip(offsetV).Take(countV).Select(x => resourceFactory.ToApiFormat(x)).ToArray(); var plInfo = new QueueInfo(".mix", plist.Title) { SongCount = plist.Items.Count, DisplayOffset = offsetV, Items = items, PlaybackIndex = playIndex, }; return JsonValue.Create(plInfo, x => { if (x.SongCount == 0 || x.Items is null) return strings.info_currently_not_playing; var tmb = new TextModBuilder(); tmb.AppendFormat(strings.cmd_list_show_header, x.Title.Mod().Bold(), x.SongCount.ToString()).Append("\n"); for (int i = 0; i < x.Items.Length; i++) { var line = $"{x.DisplayOffset + i}: {x.Items[i].Title}"; var plIndex = x.DisplayOffset + i; if (plIndex == x.PlaybackIndex) tmb.AppendLine("> " + line, SongCurrent); else if (plIndex < x.PlaybackIndex) tmb.AppendLine(line, SongDone); else if (plIndex > x.PlaybackIndex) tmb.AppendLine(line); else break; // ? } return tmb.ToString(); }); } [Command("json merge")] public static async Task> CommandJsonMerge(ExecutionInformation info, ApiCall _, IReadOnlyList arguments) { if (arguments.Count == 0) return new JsonArray(Array.Empty(), string.Empty); var jsonArr = new object?[arguments.Count]; for (int i = 0; i < arguments.Count; i++) { object? res; try { res = await arguments[i].Execute(info, Array.Empty()); } catch (AudioBotException) { continue; } if (res is JsonObject o) jsonArr[i] = o.GetSerializeObject(); else jsonArr[i] = res; } return new JsonArray(jsonArr, string.Empty); } [Command("json api", "_undocumented")] public static JsonObject CommandJsonApi(CommandManager commandManager, ApiCall _, BotManager? botManager = null) { var bots = botManager?.GetBotInfolist() ?? Array.Empty(); var api = OpenApiGenerator.Generate(commandManager, bots); return new JsonValue(api, string.Empty); } [Command("jump")] public static async Task CommandJump(PlayManager playManager, PlaylistManager playlistManager, InvokerData invoker, string offset) { playlistManager.Index = GetIndexExpression(playlistManager, offset); await playManager.Play(invoker); } [Command("kickme")] public static Task CommandKickme(Ts3Client ts3Client, ClientCall invoker) => CommandKickme(ts3Client, invoker, false); [Command("kickme far", "cmd_kickme_help")] public static Task CommandKickmeFar(Ts3Client ts3Client, ClientCall invoker) => CommandKickme(ts3Client, invoker, true); private static async Task CommandKickme(Ts3Client ts3Client, ClientCall invoker, bool far) { if (invoker.ClientId is null) return; try { if (far) await ts3Client.KickClientFromServer(invoker.ClientId.Value); else await ts3Client.KickClientFromChannel(invoker.ClientId.Value); } catch (Exception ex) { throw new CommandException(strings.cmd_kickme_missing_permission, ex, CommandExceptionReason.CommandError); } } [Command("list add")] public static async Task> CommandListAdd(ResolveContext resourceFactory, PlaylistManager playlistManager, string listId, string link /* TODO param */) { PlaylistItemGetData? getData = null; var playResource = await resourceFactory.Load(link); playlistManager.ModifyPlaylist(listId, plist => { var item = PlaylistItem.From(playResource); plist.Add(item).UnwrapThrow(); getData = resourceFactory.ToApiFormat(item); //getData.Index = plist.Items.Count - 1; }).UnwrapThrow(); return JsonValue.Create(getData!, strings.info_ok); } [Command("list clear")] public static void CommandListClear(PlaylistManager playlistManager, string listId) => playlistManager.ModifyPlaylist(listId, plist => plist.Clear()).UnwrapThrow(); [Command("list create", "_undocumented")] public static void CommandListCreate(PlaylistManager playlistManager, string listId, string? title = null) => playlistManager.CreatePlaylist(listId, title ?? listId).UnwrapThrow(); [Command("list delete")] public static JsonEmpty CommandListDelete(PlaylistManager playlistManager, UserSession session, string listId) { Task ResponseListDelete(string message) { if (TextUtil.GetAnswer(message) == Answer.Yes) { playlistManager.DeletePlaylist(listId).UnwrapThrow(); } return Task.FromResult(null); } session.SetResponse(ResponseListDelete); return new JsonEmpty(string.Format(strings.cmd_list_delete_confirm + YesNoOption, listId)); } [Command("list delete")] public static void CommandListDelete(PlaylistManager playlistManager, ApiCall _, string listId) => playlistManager.DeletePlaylist(listId).UnwrapThrow(); [Command("list from", "_undocumented")] public static async Task> PropagiateLoad(PlaylistManager playlistManager, ResolveContext resolver, string resolverName, string listId, string url) { var getList = await resolver.LoadPlaylistFrom(url, resolverName); return ImportMerge(playlistManager, resolver, getList, listId); } [Command("list import", "cmd_list_get_help")] // TODO readjust help texts public static async Task> CommandListImport(PlaylistManager playlistManager, ResolveContext resolver, string listId, string link) { var getList = await resolver.LoadPlaylistFrom(link); return ImportMerge(playlistManager, resolver, getList, listId); } private static JsonValue ImportMerge(PlaylistManager playlistManager, ResolveContext resolver, Playlist addList, string listId) { if (!playlistManager.ExistsPlaylist(listId)) playlistManager.CreatePlaylist(listId).UnwrapThrow(); playlistManager.ModifyPlaylist(listId, playlist => { playlist.AddRange(addList.Items).UnwrapThrow(); }).UnwrapThrow(); return CommandListShow(playlistManager, resolver, listId, null, null); } [Command("list insert", "_undocumented")] // TODO Doc public static async Task> CommandListAdd(PlaylistManager playlistManager, ResolveContext resourceFactory, string listId, int index, string link /* TODO param */) { PlaylistItemGetData? getData = null; var playResource = await resourceFactory.Load(link); playlistManager.ModifyPlaylist(listId, plist => { if (index < 0 || index >= plist.Items.Count) throw new CommandException(strings.error_playlist_item_index_out_of_range, CommandExceptionReason.CommandError); var item = PlaylistItem.From(playResource); plist.Insert(index, item).UnwrapThrow(); getData = resourceFactory.ToApiFormat(item); //getData.Index = plist.Items.Count - 1; }).UnwrapThrow(); return JsonValue.Create(getData!, strings.info_ok); } [Command("list item get", "_undocumented")] public static PlaylistItem CommandListItemMove(PlaylistManager playlistManager, string name, int index) { var plist = playlistManager.LoadPlaylist(name).UnwrapThrow(); if (index < 0 || index >= plist.Items.Count) throw new CommandException(strings.error_playlist_item_index_out_of_range, CommandExceptionReason.CommandError); return plist[index]; } [Command("list item move")] // TODO return modified elements public static void CommandListItemMove(PlaylistManager playlistManager, string listId, int from, int to) { playlistManager.ModifyPlaylist(listId, playlist => { if (from < 0 || from >= playlist.Items.Count || to < 0 || to >= playlist.Items.Count) { throw new CommandException(strings.error_playlist_item_index_out_of_range, CommandExceptionReason.CommandError); } if (from == to) return; var plitem = playlist[from]; playlist.RemoveAt(from); playlist.Insert(to, plitem).UnwrapThrow(); }).UnwrapThrow(); } [Command("list item delete")] // TODO return modified elements public static JsonEmpty CommandListItemDelete(PlaylistManager playlistManager, string listId, int index /* TODO param */) { PlaylistItem? deletedItem = null; playlistManager.ModifyPlaylist(listId, plist => { if (index < 0 || index >= plist.Items.Count) throw new CommandException(strings.error_playlist_item_index_out_of_range, CommandExceptionReason.CommandError); deletedItem = plist[index]; plist.RemoveAt(index); }).UnwrapThrow(); return new JsonEmpty(string.Format(strings.info_removed, deletedItem)); } [Command("list item name")] // TODO return modified elements public static void CommandListItemName(PlaylistManager playlistManager, string listId, int index, string title) { playlistManager.ModifyPlaylist(listId, plist => { if (index < 0 || index >= plist.Items.Count) throw new CommandException(strings.error_playlist_item_index_out_of_range, CommandExceptionReason.CommandError); plist[index].AudioResource.ResourceTitle = title; }).UnwrapThrow(); } [Command("list list")] [Usage("", "Filters all lists cantaining the given pattern.")] public static JsonArray CommandListList(PlaylistManager playlistManager, string? pattern = null) { var files = playlistManager.GetAvailablePlaylists(pattern).UnwrapThrow(); if (files.Length <= 0) return new JsonArray(files, strings.error_playlist_not_found); return new JsonArray(files, fi => string.Join(", ", fi.Select(x => x.Id))); } [Command("list merge")] public static void CommandListMerge(PlaylistManager playlistManager, string baseListId, string mergeListId) // future overload?: (IROP, IROP) -> IROP { var otherList = playlistManager.LoadPlaylist(mergeListId).UnwrapThrow(); playlistManager.ModifyPlaylist(baseListId, playlist => { playlist.AddRange(otherList.Items).UnwrapThrow(); }).UnwrapThrow(); } [Command("list name")] public static void CommandListName(PlaylistManager playlistManager, string listId, string title) => playlistManager.ModifyPlaylist(listId, plist => plist.SetTitle(title)).UnwrapThrow(); [Command("list play")] public static async Task CommandListPlayInternal(PlaylistManager playlistManager, PlayManager playManager, InvokerData invoker, string listId, int? index = null) { var plist = playlistManager.LoadPlaylist(listId).UnwrapThrow(); if (plist.Items.Count == 0) throw new CommandException(strings.error_playlist_is_empty); if (index != null && (index.Value < 0 || index.Value >= plist.Items.Count)) throw new CommandException(strings.error_playlist_item_index_out_of_range); await playManager.Play(invoker, plist.Items, index ?? 0); } [Command("list queue")] public static async Task CommandListQueue(PlaylistManager playlistManager, PlayManager playManager, InvokerData invoker, string listId) { var plist = playlistManager.LoadPlaylist(listId).UnwrapThrow(); await playManager.Enqueue(invoker, plist.Items); } [Command("list show")] [Usage(" ", "Lets you specify the starting index from which songs should be listed.")] public static JsonValue CommandListShow(PlaylistManager playlistManager, ResolveContext resourceFactory, string listId, int? offset = null, int? count = null) { const int maxSongs = 20; var plist = playlistManager.LoadPlaylist(listId).UnwrapThrow(); int offsetV = Tools.Clamp(offset ?? 0, 0, plist.Items.Count); int countV = Tools.Clamp(count ?? maxSongs, 0, Math.Min(maxSongs, plist.Items.Count - offsetV)); var items = plist.Items.Skip(offsetV).Take(countV).Select(x => resourceFactory.ToApiFormat(x)).ToArray(); var plInfo = new PlaylistInfo(listId, plist.Title) { SongCount = plist.Items.Count, DisplayOffset = offsetV, Items = items, }; return JsonValue.Create(plInfo, x => { var tmb = new TextModBuilder(); tmb.AppendFormat(strings.cmd_list_show_header, x.Title.Mod().Bold(), x.SongCount.ToString()).Append("\n"); var index = x.DisplayOffset; foreach (var plitem in x.Items!) tmb.Append((index++).ToString()).Append(": ").AppendLine(plitem.Title); return tmb.ToString(); }); } [Command("next")] public static async Task CommandNext(PlayManager playManager, InvokerData invoker) => await playManager.Next(invoker); [Command("param", "_undocumented")] // TODO add documentation, when name decided public static async Task CommandParam(ExecutionInformation info, int index) { if (!info.TryGet(out var ctx) || ctx.Arguments is null) throw new CommandException("No parameter available", CommandExceptionReason.CommandError); if (index < 0 || index >= ctx.Arguments.Count) return null; var backup = ctx.Arguments; ctx.Arguments = null; var result = await backup[index].Execute(info, Array.Empty()); ctx.Arguments = backup; return result; } [Command("pm")] public static string CommandPm(ClientCall invoker) { invoker.Visibiliy = TextMessageTargetMode.Private; return string.Format(strings.cmd_pm_hi, invoker.NickName ?? "Anonymous"); } [Command("pm channel", "_undocumented")] // TODO public static Task CommandPmChannel(Ts3Client ts3Client, string message) => ts3Client.SendChannelMessage(message); [Command("pm server", "_undocumented")] // TODO public static Task CommandPmServer(Ts3Client ts3Client, string message) => ts3Client.SendServerMessage(message); [Command("pm user")] public static Task CommandPmUser(Ts3Client ts3Client, ushort clientId, string message) => ts3Client.SendMessage(message, (ClientId)clientId); [Command("pause")] public static void CommandPause(Player playerConnection) => playerConnection.Paused = !playerConnection.Paused; [Command("play")] public static async Task CommandPlay(PlayManager playManager, Player playerConnection, InvokerData invoker) { if (!playManager.IsPlaying) await playManager.Play(invoker); else playerConnection.Paused = false; } [Command("play")] public static async Task CommandPlay(PlayManager playManager, InvokerData invoker, string url, params string[] attributes) => await playManager.Play(invoker, url, meta: PlayManager.ParseAttributes(attributes)); [Command("play")] public static async Task CommandPlay(PlayManager playManager, InvokerData invoker, IAudioResourceResult rsc, params string[] attributes) => await playManager.Play(invoker, rsc.AudioResource, meta: PlayManager.ParseAttributes(attributes)); [Command("plugin list")] public static JsonArray CommandPluginList(PluginManager pluginManager, Bot? bot = null) => new JsonArray(pluginManager.GetPluginOverview(bot), PluginManager.FormatOverview); [Command("plugin unload")] public static void CommandPluginUnload(PluginManager pluginManager, string identifier, Bot? bot = null) { var result = pluginManager.StopPlugin(identifier, bot); if (result != PluginResponse.Ok) throw new CommandException(string.Format(strings.error_plugin_error, result /*TODO*/), CommandExceptionReason.CommandError); } [Command("plugin load")] public static void CommandPluginLoad(PluginManager pluginManager, string identifier, Bot? bot = null) { var result = pluginManager.StartPlugin(identifier, bot); if (result != PluginResponse.Ok) throw new CommandException(string.Format(strings.error_plugin_error, result /*TODO*/), CommandExceptionReason.CommandError); } [Command("previous")] public static async Task CommandPrevious(PlayManager playManager, InvokerData invoker) => await playManager.Previous(invoker); [Command("print")] public static string CommandPrint(params string[] parameter) { // XXX << Design changes expected >> var strb = new StringBuilder(); foreach (var param in parameter) strb.Append(param); return strb.ToString(); } [Command("quiz")] public static JsonValue CommandQuiz(Bot bot) => new JsonValue(bot.QuizMode, string.Format(strings.info_status_quizmode, bot.QuizMode ? strings.info_on : strings.info_off)); [Command("quiz on")] public static async Task CommandQuizOn(Bot bot, PlayManager playManager) { bot.QuizMode = true; if (playManager.IsPlaying) await bot.GenerateStatusImage(true, playManager.CurrentPlayData); await bot.UpdateBotStatus(); } [Command("quiz off")] public static async Task CommandQuizOff(Bot bot, PlayManager playManager, ClientCall? invoker = null) { if (invoker != null && invoker.Visibiliy == TextMessageTargetMode.Private) throw new CommandException(strings.cmd_quiz_off_no_cheating, CommandExceptionReason.CommandError); bot.QuizMode = false; if (playManager.IsPlaying) await bot.GenerateStatusImage(true, playManager.CurrentPlayData); await bot.UpdateBotStatus(); } [Command("random")] public static JsonValue CommandRandom(PlaylistManager playlistManager) => new JsonValue(playlistManager.Random, string.Format(strings.info_status_random, playlistManager.Random ? strings.info_on : strings.info_off)); [Command("random on")] public static void CommandRandomOn(PlaylistManager playlistManager) => playlistManager.Random = true; [Command("random off")] public static void CommandRandomOff(PlaylistManager playlistManager) => playlistManager.Random = false; [Command("random seed", "cmd_random_seed_help")] public static string CommandRandomSeed(PlaylistManager playlistManager) { string seed = Util.FromSeed(playlistManager.Seed); return string.IsNullOrEmpty(seed) ? strings.info_empty : seed; } [Command("random seed", "cmd_random_seed_string_help")] public static void CommandRandomSeed(PlaylistManager playlistManager, string newSeed) { if (newSeed.Any(c => !char.IsLetter(c))) throw new CommandException(strings.cmd_random_seed_only_letters_allowed, CommandExceptionReason.CommandError); playlistManager.Seed = Util.ToSeed(newSeed.ToLowerInvariant()); } [Command("random seed", "cmd_random_seed_int_help")] public static void CommandRandomSeed(PlaylistManager playlistManager, int newSeed) => playlistManager.Seed = newSeed; [Command("repeat")] public static JsonValue CommandRepeat(PlaylistManager playlistManager) => new JsonValue(playlistManager.Loop, x => x switch { LoopMode.Off => strings.cmd_repeat_info_off, LoopMode.One => strings.cmd_repeat_info_one, LoopMode.All => strings.cmd_repeat_info_all, _ => throw Tools.UnhandledDefault(playlistManager.Loop), }); [Command("repeat off")] public static void CommandRepeatOff(PlaylistManager playlistManager) => playlistManager.Loop = LoopMode.Off; [Command("repeat one")] public static void CommandRepeatOne(PlaylistManager playlistManager) => playlistManager.Loop = LoopMode.One; [Command("repeat all")] public static void CommandRepeatAll(PlaylistManager playlistManager) => playlistManager.Loop = LoopMode.All; [Command("rights can")] public static async Task> CommandRightsCan(ExecutionInformation info, RightsManager rightsManager, params string[] rights) => new JsonArray(await rightsManager.GetRightsSubset(info, rights), r => r.Count > 0 ? string.Join(", ", r) : strings.info_empty); [Command("rights reload")] public static JsonEmpty CommandRightsReload(RightsManager rightsManager) { if (rightsManager.Reload()) return new JsonEmpty(strings.info_ok); // TODO: this can be done nicer by returning the errors and warnings from parsing throw new CommandException(strings.cmd_rights_reload_error_parsing_file, CommandExceptionReason.CommandError); } [Command("rng")] [Usage("", "Gets a number between 0 and 100")] [Usage("", "Gets a number between 0 and ")] [Usage(" ", "Gets a number between and ")] public static int CommandRng(int? first = null, int? second = null) { if (first != null && second != null) { return Tools.Random.Next(Math.Min(first.Value, second.Value), Math.Max(first.Value, second.Value)); } else if (first != null) { if (first.Value <= 0) throw new CommandException(strings.cmd_rng_value_must_be_positive, CommandExceptionReason.CommandError); return Tools.Random.Next(first.Value); } else { return Tools.Random.Next(0, 100); } } [Command("seek")] [Usage("", "Time in seconds")] [Usage("", "Time in Minutes:Seconds")] [Usage("<0h0m0s>", "Time in hours, minutes and seconds")] public static async Task CommandSeek(Player player, TimeSpan position) { //if (!parsed) // throw new CommandException(strings.cmd_seek_invalid_format, CommandExceptionReason.CommandError); if (position < TimeSpan.Zero || position > player.Length) throw new CommandException(strings.cmd_seek_out_of_range, CommandExceptionReason.CommandError); await player.Seek(position); } private static IList GetSearchResult(this UserSession session) { if (!session.Get>(SessionConst.SearchResult, out var sessionList)) throw new CommandException(strings.error_select_empty, CommandExceptionReason.CommandError); return sessionList; } private static AudioResource GetSingleSearchResult(this UserSession session, int index) { var sessionList = session.GetSearchResult(); if (index < 0 || index >= sessionList.Count) throw new CommandException(string.Format(strings.error_value_not_in_range, 0, sessionList.Count), CommandExceptionReason.CommandError); return sessionList[index]; } private static JsonArray FormatSearchResult(IList list, CallerInfo callerInfo) => new JsonArray(list, searchResults => { if (searchResults.Count == 0) return strings.cmd_search_no_result; var tmb = new TextModBuilder(callerInfo.IsColor); tmb.AppendFormat( strings.cmd_search_header.Mod().Bold(), $"!search play <{strings.info_number}>".Mod().Italic(), $"!search add <{strings.info_number}>".Mod().Italic()).Append("\n"); for (int i = 0; i < searchResults.Count; i++) { tmb.AppendFormat("{0}: {1}\n", i.ToString().Mod().Bold(), searchResults[i].ResourceTitle); } return tmb.ToString(); }); [Command("search add", "_undocumented")] // TODO Doc public static async Task CommandSearchAdd(PlayManager playManager, InvokerData invoker, UserSession session, int index) => await playManager.Enqueue(invoker, session.GetSingleSearchResult(index)); [Command("search from", "_undocumented")] // TODO Doc public static async Task> PropagiateSearch(UserSession session, CallerInfo callerInfo, ResolveContext resolver, string resolverName, string query) { var list = await resolver.Search(resolverName, query); session.Set(SessionConst.SearchResult, list); return FormatSearchResult(list, callerInfo); } [Command("search get", "_undocumented")] // TODO Doc public static AudioResource CommandSearchGet(UserSession session, int index) => session.GetSingleSearchResult(index); [Command("search play", "_undocumented")] // TODO Doc public static async Task CommandSeachPlay(PlayManager playManager, ClientCall clientCall, UserSession session, int index) => await playManager.Play(clientCall, session.GetSingleSearchResult(index)); [Command("search show", "_undocumented")] // TODO Doc public static JsonArray CommandSearchShow(UserSession session, CallerInfo callerInfo) => FormatSearchResult(session.GetSearchResult(), callerInfo); [Command("server tree", "_undocumented")] public static JsonValue CommandServerTree(Connection book, ApiCall _) { return JsonValue.Create(book); } [Command("settings")] public static void CommandSettings() => throw new CommandException(string.Format(strings.cmd_settings_empty_usage, "'rights.path', 'web.api.enabled', 'tools.*'"), CommandExceptionReason.MissingParameter); [Command("settings copy")] public static void CommandSettingsCopy(ConfRoot config, string from, string to) => config.CopyBotConfig(from, to).UnwrapThrow(); [Command("settings create")] public static void CommandSettingsCreate(ConfRoot config, string name) => config.CreateBotConfig(name).UnwrapThrow(); [Command("settings delete")] public static void CommandSettingsDelete(ConfRoot config, string name) => config.DeleteBotConfig(name).UnwrapThrow(); [Command("settings get")] public static ConfigPart CommandSettingsGet(ConfBot config, string? path = null) => SettingsGet(config, path); [Command("settings set")] public static void CommandSettingsSet(ConfBot config, string path, string? value = null) { SettingsSet(config, path, value); if (!config.SaveWhenExists()) { throw new CommandException("Value was set but could not be saved to file. All changes are temporary and will be lost when the bot restarts.", CommandExceptionReason.CommandError); } } [Command("settings bot get", "cmd_settings_get_help")] public static async Task CommandSettingsBotGet(BotManager bots, ConfRoot config, string botName, string? path = null) { var bot = bots.GetBotLock(botName); return await GetConf(bot, config, botName, b => CommandSettingsGet(b, path)); } [Command("settings bot set", "cmd_settings_set_help")] public static async Task CommandSettingsBotSet(BotManager bots, ConfRoot config, string botName, string path, string? value = null) { var bot = bots.GetBotLock(botName); await GetConf(bot, config, botName, b => { CommandSettingsSet(b, path, value); return null!; }); } [Command("settings bot reload")] public static void CommandSettingsReload(ConfRoot config, string? name = null) { if (string.IsNullOrEmpty(name)) config.ClearBotConfigCache(); else config.ClearBotConfigCache(name); } [Command("settings global get")] public static ConfigPart CommandSettingsGlobalGet(ConfRoot config, string? path = null) => SettingsGet(config, path); [Command("settings global set")] public static void CommandSettingsGlobalSet(ConfRoot config, string path, string? value = null) { SettingsSet(config, path, value); if (!config.Save()) { throw new CommandException("Value was set but could not be saved to file. All changes are temporary and will be lost when the bot restarts.", CommandExceptionReason.CommandError); } } //[Command("settings global reload")] public static void CommandSettingsGlobalReload(ConfRoot config) { // TODO throw new NotImplementedException(); } private static async Task GetConf(Bot? bot, ConfRoot config, string name, Func scheduledAction) { if (bot != null) { if (bot.Injector.TryGet(out var conf)) return await bot.Scheduler.InvokeAsync(() => Task.FromResult(scheduledAction(conf))); else throw new CommandException("Missing ConfBot", CommandExceptionReason.CommandError); } else { var getTemplateResult = config.GetBotConfig(name); if (!getTemplateResult.Ok) throw new CommandException(strings.error_bot_does_not_exist, getTemplateResult.Error, CommandExceptionReason.CommandError); return await Task.FromResult(scheduledAction(getTemplateResult.Value)); } } private static ConfigPart SettingsGet(ConfigPart config, string? path = null) => config.ByPathAsArray(path ?? "").SettingsGetSingle(); private static void SettingsSet(ConfigPart config, string path, string? value) { var setConfig = config.ByPathAsArray(path).SettingsGetSingle(); if (setConfig is IJsonSerializable jsonConfig) { var result = jsonConfig.FromJson(value ?? ""); if (!result.Ok) throw new CommandException($"Failed to set the value ({result.Error}).", CommandExceptionReason.CommandError); // LOC: TODO } else { throw new CommandException("This value currently cannot be set.", CommandExceptionReason.CommandError); // LOC: TODO } } private static ConfigPart SettingsGetSingle(this ConfigPart[] configPartsList) { if (configPartsList.Length == 0) { throw new CommandException(strings.error_config_no_key_found, CommandExceptionReason.CommandError); } else if (configPartsList.Length == 1) { return configPartsList[0]; } else { throw new CommandException( string.Format( strings.error_config_multiple_keys_found + "\n", string.Join("\n ", configPartsList.Take(3).Select(kvp => kvp.Key))), CommandExceptionReason.CommandError); } } [Command("settings help")] public static string CommandSettingsHelp(ConfRoot config, string path) { var part = SettingsGet(config, path); return string.IsNullOrEmpty(part.Documentation) ? strings.info_empty : part.Documentation; } [Command("song")] public static JsonValue CommandSong(PlayManager playManager, Player player, Bot bot, ClientCall? invoker = null) { if (playManager.CurrentPlayData is null) throw new CommandException(strings.info_currently_not_playing, CommandExceptionReason.CommandError); if (bot.QuizMode && invoker != null && playManager.CurrentPlayData.Invoker.ClientUid != invoker.ClientUid) throw new CommandException(strings.info_quizmode_is_active, CommandExceptionReason.CommandError); var position = player.Position ?? TimeSpan.Zero; var length = player.Length ?? playManager.CurrentPlayData.PlayResource.SongInfo?.Length ?? TimeSpan.Zero; return JsonValue.Create( new CurrentSongInfo { Title = playManager.CurrentPlayData.ResourceData.ResourceTitle, AudioType = playManager.CurrentPlayData.ResourceData.AudioType, Link = playManager.CurrentPlayData.SourceLink, Position = position, Length = length, Paused = player.Paused, }, x => { var tmb = new StringBuilder(); tmb.Append(x.Paused ? "⏸ " : "► "); tmb.AppendFormat("[url={0}]{1}[/url]", x.Link, x.Title); tmb.Append(" ["); tmb.Append(x.Length.TotalHours >= 1 || x.Position.TotalHours >= 1 ? $"{x.Position:hh\\:mm\\:ss}/{x.Length:hh\\:mm\\:ss}" : $"{x.Position:mm\\:ss}/{x.Length:mm\\:ss}"); tmb.Append("]"); return tmb.ToString(); } ); } [Command("stop")] public static void CommandStop(PlayManager playManager) => playManager.Stop(); [Command("subscribe")] public static void CommandSubscribe(IVoiceTarget targetManager, ClientCall invoker) { if (invoker.ClientId != null) targetManager.WhisperClientSubscribe(invoker.ClientId.Value); } [Command("subscribe tempchannel")] public static void CommandSubscribeTempChannel(IVoiceTarget targetManager, ClientCall? invoker = null, ChannelId? channel = null) { var subChan = channel ?? invoker?.ChannelId ?? ChannelId.Null; if (subChan != ChannelId.Null) targetManager.WhisperChannelSubscribe(true, subChan); } [Command("subscribe channel")] public static void CommandSubscribeChannel(IVoiceTarget targetManager, ClientCall? invoker = null, params ChannelId[] channels) { if (channels.Length == 0) { var subChan = invoker?.ChannelId; if (subChan.HasValue) targetManager.WhisperChannelSubscribe(false, subChan.Value); } else targetManager.WhisperChannelSubscribe(false, channels); } [Command("subscribe client")] public static void CommandSubscribeUser(IVoiceTarget targetManager, ClientId client) { targetManager.WhisperClientSubscribe(client); } [Command("system info", "_undocumented")] public static JsonValue CommandSystemInfo(SystemMonitor systemMonitor) { var sysInfo = systemMonitor.GetReport(); return JsonValue.Create(new { memory = sysInfo.Memory, cpu = sysInfo.Cpu, starttime = systemMonitor.StartTime, }, x => new TextModBuilder().AppendFormat( "\ncpu: {0}% \nmemory: {1} \nstartime: {2}".Mod().Bold(), (x.cpu.Last() * 100).ToString("0.#"), Util.FormatBytesHumanReadable(x.memory.Last()), x.starttime.ToString(Thread.CurrentThread.CurrentCulture)).ToString() ); } [Command("system quit", "cmd_quit_help")] public static JsonEmpty CommandSystemQuit(Core core, CallerInfo caller, UserSession? session = null, string? param = null) { const string force = "force"; if (caller.ApiCall || param == force) { core.Stop(); return new JsonEmpty(string.Empty); } Task ResponseQuit(string message) { if (TextUtil.GetAnswer(message) == Answer.Yes) { CommandSystemQuit(core, caller, session, force); } return Task.FromResult(null); } session.SetResponse(ResponseQuit); return new JsonEmpty(strings.cmd_quit_confirm + YesNoOption); } [Command("take")] [Usage(" ", "Take only parts of the text")] [Usage(" ", "Take parts, starting with the part at ")] [Usage(" ", "Specify another delimiter for the parts than spaces")] public static async Task CommandTake(ExecutionInformation info, IReadOnlyList arguments) { if (arguments.Count < 2) throw new CommandException(strings.error_cmd_at_least_two_argument, CommandExceptionReason.MissingParameter); int start = 0; string? delimiter = null; // Get count var res = await arguments[0].ExecuteToString(info, Array.Empty()); if (!int.TryParse(res, out int count) || count < 0) throw new CommandException("Count must be an integer >= 0", CommandExceptionReason.CommandError); // LOC: TODO if (arguments.Count > 2) { // Get start res = await arguments[1].ExecuteToString(info, Array.Empty()); if (!int.TryParse(res, out start) || start < 0) throw new CommandException("Start must be an integer >= 0", CommandExceptionReason.CommandError); // LOC: TODO } // Get delimiter if exists if (arguments.Count > 3) delimiter = await arguments[2].ExecuteToString(info, Array.Empty()); string text = await arguments[Math.Min(arguments.Count - 1, 3)].ExecuteToString(info, Array.Empty()); var splitted = delimiter is null ? text.Split() : text.Split(new[] { delimiter }, StringSplitOptions.None); if (splitted.Length < start + count) throw new CommandException(strings.cmd_take_not_enough_arguements, CommandExceptionReason.CommandError); var splittedarr = splitted.Skip(start).Take(count).ToArray(); return string.Join(delimiter ?? " ", splittedarr); } [Command("unsubscribe")] public static void CommandUnsubscribe(IVoiceTarget targetManager, ClientCall invoker) { if (invoker.ClientId != null) targetManager.WhisperClientUnsubscribe(invoker.ClientId.Value); } [Command("unsubscribe channel")] public static void CommandUnsubscribeChannel(IVoiceTarget targetManager, ClientCall? invoker = null, params ChannelId[] channels) { if (channels.Length == 0) { var subChan = invoker?.ChannelId; if (subChan.HasValue) targetManager.WhisperChannelUnsubscribe(false, subChan.Value); } else { targetManager.WhisperChannelUnsubscribe(false, channels); } } [Command("unsubscribe temporary")] public static void CommandUnsubscribeTemporary(IVoiceTarget targetManager) => targetManager.ClearTemporary(); [Command("unsubscribe client")] public static void CommandUnsubscribeUser(IVoiceTarget targetManager, ClientId client) { targetManager.WhisperClientUnsubscribe(client); } [Command("version")] public static JsonValue CommandVersion() => new JsonValue(SystemData.AssemblyData, d => d.ToLongString()); [Command("volume")] public static JsonValue CommandVolume(Player playerConnection) => new JsonValue(playerConnection.Volume, string.Format(strings.cmd_volume_current, playerConnection.Volume.ToString("0.#"))); [Command("volume")] [Usage("", "A new volume level between 0 and 100.")] [Usage("+/-", "Adds or subtracts a value from the current volume.")] public static void CommandVolume(ExecutionInformation info, Player playerConnection, CallerInfo caller, ConfBot config, string volume, UserSession? session = null) { volume = volume.Trim(); bool relPos = volume.StartsWith("+", StringComparison.Ordinal); bool relNeg = volume.StartsWith("-", StringComparison.Ordinal); string numberString = (relPos || relNeg) ? volume.Remove(0, 1).TrimStart() : volume; if (!float.TryParse(numberString, NumberStyles.Float, CultureInfo.InvariantCulture, out var parsedVolume)) throw new CommandException(strings.cmd_volume_parse_error, CommandExceptionReason.CommandError); float curVolume = playerConnection.Volume; float newVolume; if (relPos) newVolume = curVolume + parsedVolume; else if (relNeg) newVolume = curVolume - parsedVolume; else newVolume = parsedVolume; if (newVolume < AudioValues.MinVolume || newVolume > AudioValues.MaxVolume) throw new CommandException(string.Format(strings.cmd_volume_is_limited, AudioValues.MinVolume, AudioValues.MaxVolume), CommandExceptionReason.CommandError); if (newVolume <= config.Audio.MaxUserVolume || newVolume <= curVolume || caller.ApiCall) { playerConnection.Volume = newVolume; } else if (session != null) { async Task ResponseVolume(string message) { if (TextUtil.GetAnswer(message) == Answer.Yes) { if (await info.HasRights(RightHighVolume)) playerConnection.Volume = newVolume; else return strings.cmd_volume_missing_high_volume_permission; } return null; } session.SetResponse(ResponseVolume); throw new CommandException(strings.cmd_volume_high_volume_confirm + YesNoOption, CommandExceptionReason.CommandError); } } [Command("whisper all")] public static void CommandWhisperAll(IVoiceTarget targetManager) => CommandWhisperGroup(targetManager, GroupWhisperType.AllClients, GroupWhisperTarget.AllChannels); [Command("whisper group")] public static void CommandWhisperGroup(IVoiceTarget targetManager, GroupWhisperType type, GroupWhisperTarget target, ulong? targetId = null) { if (type == GroupWhisperType.ServerGroup || type == GroupWhisperType.ChannelGroup) { if (targetId is null) throw new CommandException(strings.cmd_whisper_group_missing_target, CommandExceptionReason.CommandError); targetManager.SetGroupWhisper(type, target, targetId.Value); targetManager.SendMode = TargetSendMode.WhisperGroup; } else { if (targetId != null) throw new CommandException(strings.cmd_whisper_group_superfluous_target, CommandExceptionReason.CommandError); targetManager.SetGroupWhisper(type, target, 0); targetManager.SendMode = TargetSendMode.WhisperGroup; } } [Command("whisper list")] public static JsonObject CommandWhisperList(IVoiceTarget targetManager) { return JsonValue.Create(new { #pragma warning disable IDE0037 SendMode = targetManager.SendMode, GroupWhisper = targetManager.SendMode == TargetSendMode.WhisperGroup ? new { Target = targetManager.GroupWhisperTarget, TargetId = targetManager.GroupWhisperTargetId, Type = targetManager.GroupWhisperType, } : null, WhisperClients = targetManager.WhisperClients, WhisperChannel = targetManager.WhisperChannel, #pragma warning restore IDE0037 }, x => { var strb = new StringBuilder(strings.cmd_whisper_list_header); strb.AppendLine(); switch (x.SendMode) { case TargetSendMode.None: strb.Append(strings.cmd_whisper_list_target_none); break; case TargetSendMode.Voice: strb.Append(strings.cmd_whisper_list_target_voice); break; case TargetSendMode.Whisper: strb.Append(strings.cmd_whisper_list_target_whisper_clients).Append(": [").Append(string.Join(",", x.WhisperClients)).Append("]\n"); strb.Append(strings.cmd_whisper_list_target_whisper_channel).Append(": [").Append(string.Join(",", x.WhisperChannel)).Append("]"); break; case TargetSendMode.WhisperGroup: if (x.GroupWhisper is null) throw new ArgumentNullException(); strb.AppendFormat(strings.cmd_whisper_list_target_whispergroup, x.GroupWhisper.Type, x.GroupWhisper.Target, x.GroupWhisper.TargetId); break; default: throw Tools.UnhandledDefault(x.SendMode); } return strb.ToString(); }); } [Command("whisper off")] public static void CommandWhisperOff(IVoiceTarget targetManager) => targetManager.SendMode = TargetSendMode.Voice; [Command("whisper subscription")] public static void CommandWhisperSubsription(IVoiceTarget targetManager) => targetManager.SendMode = TargetSendMode.Whisper; [Command("xecute")] public static async Task CommandXecute(ExecutionInformation info, IReadOnlyList arguments) { foreach (var arg in arguments) await arg.Execute(info, Array.Empty()); } // ReSharper enable UnusedMember.Global public static async ValueTask HasRights(this ExecutionInformation info, params string[] rights) { if (!info.TryGet(out var caller)) caller = null; if (caller?.SkipRightsChecks ?? false) return true; if (!info.TryGet(out var rightsManager)) return false; return await rightsManager.HasAllRights(info, rights); } public static async Task Write(this ExecutionInformation info, string message) { if (!info.TryGet(out var ts3Client)) throw new CommandException(strings.error_no_teamspeak_in_context); if (!info.TryGet(out var invoker)) throw new CommandException(strings.error_no_invoker_in_context); if (invoker.Visibiliy is null || invoker.ClientId is null) throw new CommandException(strings.error_invoker_not_visible); var behaviour = LongTextBehaviour.Split; var limit = 1; if (info.TryGet(out var config)) { behaviour = config.Commands.LongMessage; limit = config.Commands.LongMessageSplitLimit; } foreach (var msgPart in LongTextTransform.Split(message, behaviour, ts3Client.ServerConstants.MaxSizeTextMessage, limit)) { switch (invoker.Visibiliy.Value) { case TextMessageTargetMode.Private: await ts3Client.SendMessage(msgPart, invoker.ClientId.Value); break; case TextMessageTargetMode.Channel: await ts3Client.SendChannelMessage(msgPart); break; case TextMessageTargetMode.Server: await ts3Client.SendServerMessage(msgPart); break; default: throw Tools.UnhandledDefault(invoker.Visibiliy.Value); } } } public static void UseComplexityTokens(this ExecutionInformation info, int count) { if (!info.TryGet(out var caller) || caller.CommandComplexityCurrent + count > caller.CommandComplexityMax) throw new CommandException(strings.error_cmd_complexity_reached, CommandExceptionReason.CommandError); caller.CommandComplexityCurrent += count; } } } ================================================ FILE: TS3AudioBot/Playlists/LoopMode.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Playlists { public enum LoopMode { Off, One, All, } } ================================================ FILE: TS3AudioBot/Playlists/Parser/JspfContent.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using PlaylistsNET.Content; using PlaylistsNET.Models; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace TS3AudioBot.Playlists.Parser { public class JspfContent : IPlaylistParser, IPlaylistWriter { public XspfPlaylist GetFromStream(Stream stream) { var serializer = new JsonSerializer(); using var sr = new StreamReader(stream); using var jsonTextReader = new JsonTextReader(sr); return serializer.Deserialize(jsonTextReader) ?? throw new NullReferenceException("Data empty"); } public XspfPlaylist GetFromString(string playlistString) { throw new NotImplementedException(); } public string ToText(XspfPlaylist playlist) { return JsonConvert.SerializeObject(playlist); } } public class XspfPlaylist : IBasePlaylist { [JsonProperty(PropertyName = "title")] public string? Title { get; set; } [JsonProperty(PropertyName = "creator")] public string? Creator { get; set; } [JsonProperty(PropertyName = "track")] public List? PlaylistEntries { get; set; } public string? Path { get; set; } public string? FileName { get; set; } public XspfPlaylist() { } public List GetTracksPaths() => PlaylistEntries.Select(x => x.Location.FirstOrDefault()).Where(x => x != null).ToList(); } public class XspfPlaylistEntry { public XspfPlaylistEntry() { } [JsonProperty(PropertyName = "title")] public string? Title { get; set; } [JsonProperty(PropertyName = "duration")] public long? Duration { get; set; } // MS : TODO timespan converter [JsonProperty(PropertyName = "meta")] [JsonConverter(typeof(JspfMetaConverter))] public List? Meta { get; set; } [JsonProperty(PropertyName = "location")] public List? Location { get; set; } } public class XspfMeta { public string Key { get; set; } public string Value { get; set; } public XspfMeta(string key, string value) { Key = key; Value = value; } } internal class JspfMetaConverter : JsonConverter { public override XspfMeta ReadJson(JsonReader reader, Type objectType, XspfMeta? existingValue, bool hasExistingValue, JsonSerializer serializer) { var key = reader.ReadAsString(); var value = reader.ReadAsString(); if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(value)) throw new FormatException(); return new XspfMeta(key, value); } public override void WriteJson(JsonWriter writer, XspfMeta? value, JsonSerializer serializer) { if (value is null) throw new ArgumentNullException(nameof(value)); writer.WriteStartObject(); writer.WritePropertyName(value.Key); writer.WriteValue(value.Value); writer.WriteEndObject(); } } } ================================================ FILE: TS3AudioBot/Playlists/Playlist.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using TS3AudioBot.Localization; namespace TS3AudioBot.Playlists { public class Playlist : IReadOnlyPlaylist { private const int MaxSongs = 1000; private string title; public string Title { get => title; set => SetTitle(value); } private readonly List items; public IReadOnlyList Items => items; public PlaylistItem this[int i] => items[i]; public Playlist() : this(new List()) { } public Playlist(List items) { this.items = items ?? throw new ArgumentNullException(nameof(items)); title = string.Empty; } public Playlist SetTitle(string newTitle) { newTitle = newTitle.Replace("\r", "").Replace("\n", ""); title = newTitle.Substring(0, Math.Min(newTitle.Length, 256)); return this; } private int GetMaxAdd(int amount) { int remainingSlots = Math.Max(MaxSongs - items.Count, 0); return Math.Min(amount, remainingSlots); } public E Add(PlaylistItem song) { if (GetMaxAdd(1) > 0) { items.Add(song); return R.Ok; } return ErrorFull; } public E AddRange(IEnumerable songs) { var maxAddCount = GetMaxAdd(MaxSongs); if (maxAddCount > 0) { items.AddRange(songs.Take(maxAddCount)); return R.Ok; } return ErrorFull; } public void RemoveAt(int index) => items.RemoveAt(index); public E Insert(int index, PlaylistItem song) { if (GetMaxAdd(1) > 0) { items.Insert(index, song); return R.Ok; } return ErrorFull; } public void Clear() => items.Clear(); private static readonly E ErrorFull = new LocalStr("Playlist is full"); // TODO: Loc } public interface IReadOnlyPlaylist { PlaylistItem this[int i] { get; } string Title { get; } IReadOnlyList Items { get; } } } ================================================ FILE: TS3AudioBot/Playlists/PlaylistApiExtensions.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using TS3AudioBot.ResourceFactories; using TS3AudioBot.Web.Model; namespace TS3AudioBot.Playlists { public static class PlaylistApiExtensions { public static PlaylistItemGetData ToApiFormat(this ResolveContext resourceFactory, PlaylistItem item) { var resource = item.AudioResource; return new PlaylistItemGetData { Link = resourceFactory.RestoreLink(resource), Title = resource.ResourceTitle, AudioType = resource.AudioType, }; } } } ================================================ FILE: TS3AudioBot/Playlists/PlaylistIO.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; using TS3AudioBot.Algorithm; using TS3AudioBot.Config; using TS3AudioBot.Helper; using TS3AudioBot.Localization; using TS3AudioBot.ResourceFactories; using TS3AudioBot.Web.Model; using TSLib.Helper; namespace TS3AudioBot.Playlists { public class PlaylistIO : IDisposable { private readonly ConfBot confBot; private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private readonly Dictionary playlistInfo = new Dictionary(); private readonly LruCache playlistCache = new LruCache(16); private readonly HashSet dirtyList = new HashSet(); private readonly ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim(); private bool reloadFolderCache = true; private const int FileVersion = 3; public PlaylistIO(ConfBot confBot) { this.confBot = confBot; } private FileInfo? NameToFile(string listId) { var localDir = confBot.LocalConfigDir; if (localDir is null) return null; return new FileInfo(Path.Combine(localDir, BotPaths.Playlists, listId)); } public R Read(string listId) => ReadInternal(listId, false, false); private R ReadInternal(string listId, bool hasReadLock, bool hasWriteLock) { try { if (!hasReadLock && !hasWriteLock) { rwLock.EnterReadLock(); hasReadLock = true; } if (playlistCache.TryGetValue(listId, out var playlist)) { return playlist; } if (!hasWriteLock) { rwLock.ExitReadLock(); hasReadLock = false; rwLock.EnterWriteLock(); hasWriteLock = true; } var result = ReadFromFile(listId); if (result.Ok) { playlistCache.Set(listId, result.Value); return result.Value; } else { return result.Error; } } finally { if (hasReadLock) rwLock.ExitReadLock(); if (hasWriteLock) rwLock.ExitWriteLock(); } } private R ReadFromFile(string listId, bool headOnly = false) { var fi = NameToFile(listId); if (fi is null || !fi.Exists) return new LocalStr(strings.error_playlist_not_found); using var sr = new StreamReader(fi.Open(FileMode.Open, FileAccess.Read, FileShare.Read), Tools.Utf8Encoder); var metaRes = ReadHeadStream(sr); if (!metaRes.Ok) return metaRes.Error; var meta = metaRes.Value; playlistInfo[listId] = meta; var plist = new Playlist { Title = meta.Title }; if (headOnly) return plist; // read content string? line; while ((line = sr.ReadLine()) != null) { var kvp = line.Split(new[] { ':' }, 2); if (kvp.Length < 2) continue; string key = kvp[0]; string value = kvp[1]; switch (key) { // Legacy entry case "rs": { var rskvp = value.Split(new[] { ':' }, 2); if (kvp.Length < 2) { Log.Warn("Erroneus playlist split count: {0}", line); continue; } string content = rskvp[1]; var rsSplit = content.Split(new[] { ',' }, 3); if (rsSplit.Length < 3) goto default; if (!string.IsNullOrWhiteSpace(rsSplit[0])) plist.Add(new PlaylistItem(new AudioResource(Uri.UnescapeDataString(rsSplit[1]), Uri.UnescapeDataString(rsSplit[2]), rsSplit[0]))); else goto default; break; } case "rsj": var res = JsonConvert.DeserializeObject(value); plist.Add(new PlaylistItem(res)); break; case "id": case "ln": Log.Warn("Deprecated playlist data block: {0}", line); break; default: Log.Warn("Erroneus playlist data block: {0}", line); break; } } meta.Count = plist.Items.Count; return plist; } private R ReadHeadStream(StreamReader sr) { string? line; int version = -1; // read header while ((line = sr.ReadLine()) != null) { if (string.IsNullOrEmpty(line)) break; var kvp = line.Split(new[] { ':' }, 2); if (kvp.Length < 2) continue; string key = kvp[0]; string value = kvp[1]; switch (key) { case "version": version = int.Parse(value); if (version > FileVersion) return new LocalStr("The file version is too new and can't be read."); // LOC: TODO break; case "meta": var meta = JsonConvert.DeserializeObject(value); meta.Version = version; return meta; } } return new PlaylistMeta { Title = "", Count = 0, Version = version }; } public E Write(string listId, IReadOnlyPlaylist list) { try { rwLock.EnterWriteLock(); var result = WriteToFile(listId, list); dirtyList.Remove(listId); return result; } finally { rwLock.ExitWriteLock(); } } private E WriteToFile(string listId, IReadOnlyPlaylist plist) { var fi = NameToFile(listId); if (fi is null) return new LocalStr(strings.error_playlist_no_store_directory); var dir = fi.Directory; if (!dir.Exists) dir.Create(); using (var sw = new StreamWriter(fi.Open(FileMode.Create, FileAccess.Write, FileShare.Read), Tools.Utf8Encoder)) { var serializer = new JsonSerializer { Formatting = Formatting.None, }; var meta = playlistInfo.GetOrNew(listId); meta.Title = plist.Title; meta.Count = plist.Items.Count; meta.Version = FileVersion; sw.WriteLine("version:" + FileVersion); sw.Write("meta:"); serializer.Serialize(sw, meta); sw.WriteLine(); sw.WriteLine(); foreach (var pli in plist.Items) { sw.Write("rsj:"); serializer.Serialize(sw, pli.AudioResource); sw.WriteLine(); } } return R.Ok; } public E Delete(string listId) { try { rwLock.EnterWriteLock(); return DeleteInternal(listId); } finally { rwLock.ExitWriteLock(); } } private E DeleteInternal(string listId) { var fi = NameToFile(listId); bool cached = playlistInfo.ContainsKey(listId); if (!cached && (fi is null || !fi.Exists)) return new LocalStr(strings.error_playlist_not_found); playlistCache.Remove(listId); playlistInfo.Remove(listId); dirtyList.Remove(listId); try { fi?.Delete(); return R.Ok; } catch (IOException) { return new LocalStr(strings.error_io_in_use); } catch (System.Security.SecurityException) { return new LocalStr(strings.error_io_missing_permission); } } public R ListPlaylists(string? pattern) { if (confBot.LocalConfigDir is null) return new LocalStr("Temporary bots cannot have playlists"); // TODO do this for all other methods too bool hasWriteLock = false; try { if (reloadFolderCache) { rwLock.EnterWriteLock(); hasWriteLock = true; var di = new DirectoryInfo(Path.Combine(confBot.LocalConfigDir, BotPaths.Playlists)); if (!di.Exists) return Array.Empty(); IEnumerable fileEnu; if (string.IsNullOrEmpty(pattern)) fileEnu = di.EnumerateFiles(); else fileEnu = di.EnumerateFiles(pattern, SearchOption.TopDirectoryOnly); // TODO exceptions playlistInfo.Clear(); foreach (var fi in fileEnu) { ReadFromFile(fi.Name, true); } reloadFolderCache = false; } else { rwLock.EnterReadLock(); hasWriteLock = false; } return playlistInfo.Select(kvp => new PlaylistInfo(kvp.Key, kvp.Value.Title) { SongCount = kvp.Value.Count }).ToArray(); } finally { if (hasWriteLock) rwLock.ExitWriteLock(); else rwLock.ExitReadLock(); } } public void ReloadFolderCache() => reloadFolderCache = true; public bool Exists(string listId) { try { rwLock.EnterWriteLock(); return ExistsInternal(listId); } finally { rwLock.ExitWriteLock(); } } public bool ExistsInternal(string listId) { if (playlistInfo.ContainsKey(listId)) return true; var fi = NameToFile(listId); return fi is null || fi.Exists; } public void Flush() { try { rwLock.EnterWriteLock(); foreach (var name in dirtyList) { if (playlistCache.TryGetValue(name, out var plist)) WriteToFile(name, plist); } dirtyList.Clear(); } finally { rwLock.ExitWriteLock(); } } public void Dispose() { Flush(); rwLock.Dispose(); } } public class PlaylistMeta { [JsonProperty(PropertyName = "count")] public int Count { get; set; } [JsonProperty(PropertyName = "title")] public string Title { get; set; } = string.Empty; [JsonIgnore] public int Version { get; set; } } } ================================================ FILE: TS3AudioBot/Playlists/PlaylistItem.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using TS3AudioBot.Audio; using TS3AudioBot.CommandSystem.CommandResults; using TS3AudioBot.ResourceFactories; namespace TS3AudioBot.Playlists { public class PlaylistItem : IAudioResourceResult, IMetaContainer { public PlayInfo? PlayInfo { get; set; } public AudioResource AudioResource { get; } public PlaylistItem(AudioResource resource, PlayInfo? meta = null) { AudioResource = resource ?? throw new ArgumentNullException(nameof(resource)); PlayInfo = meta; } public static PlaylistItem From(PlayResource playResource) { return new PlaylistItem(playResource.AudioResource, playResource.PlayInfo); } public override string ToString() => AudioResource.ResourceTitle ?? $"{AudioResource.AudioType}: {AudioResource.ResourceId}"; } } ================================================ FILE: TS3AudioBot/Playlists/PlaylistManager.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using TS3AudioBot.Config; using TS3AudioBot.Helper; using TS3AudioBot.Localization; using TS3AudioBot.Playlists.Shuffle; using TS3AudioBot.Web.Model; using TSLib.Helper; namespace TS3AudioBot.Playlists { public sealed class PlaylistManager { private readonly PlaylistIO playlistPool; private const string mixName = ".mix"; private readonly Playlist mixList = new Playlist() { Title = "Now Playing" }; private readonly object listLock = new object(); public IReadOnlyPlaylist CurrentList => mixList; private IShuffleAlgorithm shuffle; private readonly IShuffleAlgorithm NormalOrder = new NormalOrder(); private readonly IShuffleAlgorithm RandomOrder = new LinearFeedbackShiftRegister(); public int Index { get => shuffle.Index; set => shuffle.Index = value; } public PlaylistItem? Current => MoveIndex(null, true); private bool random; public bool Random { get => random; set { random = value; var index = shuffle.Index; if (random) shuffle = RandomOrder; else shuffle = NormalOrder; shuffle.Index = index; } } public int Seed { get => shuffle.Seed; set => shuffle.Seed = value; } /// Loop mode for the current playlist. public LoopMode Loop { get; set; } = LoopMode.Off; public PlaylistManager(ConfPlaylists _, PlaylistIO playlistPool) { this.playlistPool = playlistPool; shuffle = NormalOrder; } public PlaylistItem? Next(bool manually = true) => MoveIndex(forward: true, manually); public PlaylistItem? Previous(bool manually = true) => MoveIndex(forward: false, manually); internal PlaylistItem? MoveIndex(bool? forward, bool manually) { lock (listLock) { if (mixList.Items.Count == 0) return null; if (shuffle.Length != mixList.Items.Count) shuffle.Length = mixList.Items.Count; if (shuffle.Index < 0 || shuffle.Index >= mixList.Items.Count) shuffle.Index = 0; // When next/prev was requested manually (via command) we ignore the loop one // mode and instead move the index. if ((Loop == LoopMode.One && !manually) || forward is null) return mixList[shuffle.Index]; bool listEnded; if (forward == true) listEnded = shuffle.Next(); else listEnded = shuffle.Prev(); // Get a new seed when one play-through ended. if (listEnded && Random) SetRandomSeed(); // If a next/prev request goes over the bounds of the list while loop mode is off // but was requested manually we act as if the list was looped. // This will give a more intuitive behaviour when the list is shuffeled (and also if not) // as the end might not be clear or visible. if (Loop == LoopMode.Off && listEnded && !manually) return null; return mixList[shuffle.Index]; } } public void Queue(PlaylistItem item) => ModifyPlaylist(mixName, mix => mix.Add(item).UnwrapThrow()); public void Queue(IEnumerable items) => ModifyPlaylist(mixName, mix => mix.AddRange(items).UnwrapThrow()); public void Clear() => ModifyPlaylist(mixName, mix => mix.Clear()); private void SetRandomSeed() { shuffle.Seed = Tools.Random.Next(); } public R LoadPlaylist(string listId) { R res; if (listId.StartsWith(".", StringComparison.Ordinal)) { res = GetSpecialPlaylist(listId); } else { var checkName = Util.IsSafeFileName(listId); if (!checkName.Ok) return checkName.Error; res = playlistPool.Read(listId); } if (!res.Ok) return res.Error; return res.Value; } public E CreatePlaylist(string listId, string? title = null) { var checkName = Util.IsSafeFileName(listId); if (!checkName.Ok) return checkName; if (playlistPool.Exists(listId)) return new LocalStr("Already exists"); return playlistPool.Write(listId, new Playlist().SetTitle(title ?? listId)); } public bool ExistsPlaylist(string listId) { if (GetSpecialPlaylist(listId)) return true; var checkName = Util.IsSafeFileName(listId); if (!checkName.Ok) return false; return playlistPool.Exists(listId); } public E ModifyPlaylist(string listId, Action action) { var res = GetSpecialPlaylist(listId); if (res) { var plist = res.Value; lock (listLock) { action(plist); } return R.Ok; } else { var checkName = Util.IsSafeFileName(listId); if (!checkName.Ok) return checkName.Error; res = playlistPool.Read(listId); if (!res.Ok) return res.Error; var plist = res.Value; lock (listLock) { action(plist); } return playlistPool.Write(listId, plist); } } public E DeletePlaylist(string listId) { var checkName = Util.IsSafeFileName(listId); if (!checkName.Ok) return checkName.Error; return playlistPool.Delete(listId); } public R GetAvailablePlaylists(string? pattern = null) => playlistPool.ListPlaylists(pattern); private R GetSpecialPlaylist(string listId) { return listId switch { mixName => mixList, _ => new LocalStr(strings.error_playlist_special_not_found), }; } } } ================================================ FILE: TS3AudioBot/Playlists/Shuffle/IShuffleAlgorithm.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Playlists.Shuffle { public interface IShuffleAlgorithm { int Seed { get; set; } int Length { get; set; } int Index { get; set; } // Returns true if the step reached the end of the list and wrapped around bool Next(); // Returns true if the step reached the end of the list and wrapped around bool Prev(); } // Output conventions: // // if Index = x, x >= Length // => Index = Tools.MathMod(Index, Length) // if Index = x, x < 0 // => Index : undefined // if Index = x, Length < 0 // => Index = -1 } ================================================ FILE: TS3AudioBot/Playlists/Shuffle/LinearFeedbackShiftRegister.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using TSLib.Helper; namespace TS3AudioBot.Playlists.Shuffle { public class LinearFeedbackShiftRegister : IShuffleAlgorithm { private int register = 1; // aka index private int mask; private int maskLength; private int seed; private int length; private int startRegister; private bool needsRecalc = true; public int Seed { get => seed; set { needsRecalc |= seed != value; seed = value; } } public int Length { get => length; set { needsRecalc |= length != value; length = value; } } public int Index { get { if (Length <= 0) return -1; return Tools.MathMod(register + Seed, Length); } set { if (Length <= 0) return; Recalc(); register = Tools.MathMod(value - Seed, Length); startRegister = register; } } private void Recalc() { if (!needsRecalc) return; needsRecalc = false; if (Length <= 0) return; register = (register % Length) + 1; // get the highest set bit (+1) to hold at least all values with a power of 2 int maxPow = 31; while (((1 << maxPow) & Length) == 0 && maxPow >= 0) maxPow--; maxPow++; mask = GenerateGaloisMask(maxPow, seed); maskLength = 1 << maxPow; } public bool Next() { if (Length <= 0) return false; Recalc(); do { register = NextOf(register); } while ((uint)register > Length); return register == startRegister; } private int NextOf(int val) { var lsb = val & 1; val >>= 1; val ^= -lsb & mask; return val; } public bool Prev() { if (Length <= 0) return false; Recalc(); do { register = PrevOf(register); } while ((uint)register > Length); return register == startRegister; } private int PrevOf(int val) { var v0 = PrevOfTest(val, 0); var v1 = PrevOfTest(val, 1); if (v0 < maskLength && NextOf(v0) == val) return v0; if (v1 < maskLength && NextOf(v1) == val) return v1; throw new InvalidOperationException(); } private int PrevOfTest(int val, int lsb) { var pval = (-lsb & mask) ^ val; return (pval << 1) | lsb; } private static int GenerateGaloisMask(int bits, int seedOffset) { if (bits == 1) return 1; if (bits == 2) return 3; int start = 1 << (bits - 1); int end = 1 << (bits); int diff = end - start; for (int i = 0; i < diff; i++) { int checkMask = Tools.MathMod(i + seedOffset, diff) + start; if (NumberOfSetBits(checkMask) % 2 != 0) continue; if (TestLfsr(checkMask, end)) return checkMask; } throw new InvalidOperationException(); } private static bool TestLfsr(int mask, int max) { const int start = 1; int field = start; for (int i = 2; i < max; i++) { int lsb = field & 1; field >>= 1; field ^= -lsb & mask; if (field == start) return false; } return true; } private static int NumberOfSetBits(int i) { #if NETCOREAPP3_1 if (System.Runtime.Intrinsics.X86.Popcnt.IsSupported) return unchecked((int)System.Runtime.Intrinsics.X86.Popcnt.PopCount((uint)i)); #endif i -= ((i >> 1) & 0x55555555); i = (i & 0x33333333) + ((i >> 2) & 0x33333333); return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; } } } ================================================ FILE: TS3AudioBot/Playlists/Shuffle/ListedShuffle.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Linq; using TSLib.Helper; namespace TS3AudioBot.Playlists.Shuffle { public class ListedShuffle : IShuffleAlgorithm { private int[] permutation = Array.Empty(); private bool needsRecalc = true; private int index; private int seed; private int length; public int Seed { get => seed; set { needsRecalc |= seed != value; seed = value; } } public int Length { get => length; set { needsRecalc |= length != value; length = value; } } public int Index { get { if (Length <= 0) return -1; GenList(); return permutation[index]; } set { if (Length <= 0) return; GenList(); index = Array.IndexOf(permutation, Tools.MathMod(value, permutation.Length)); } } private void GenList() { if (!needsRecalc) return; needsRecalc = false; if (Length <= 0) return; var rngeesus = new Random(seed); permutation = Enumerable.Range(0, length).Select(i => i).OrderBy(_ => rngeesus.Next()).ToArray(); index %= Length; } public bool Next() { if (Length <= 0) return false; GenList(); index = (index + 1) % permutation.Length; return index == 0; } public bool Prev() { if (Length <= 0) return false; GenList(); index = ((index - 1) % permutation.Length + permutation.Length) % permutation.Length; return index == permutation.Length - 1; } } } ================================================ FILE: TS3AudioBot/Playlists/Shuffle/NormalOrder.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using TSLib.Helper; namespace TS3AudioBot.Playlists.Shuffle { public class NormalOrder : IShuffleAlgorithm { public int Seed { get; set; } public int Length { get; set; } public int Index { get; set; } public bool Next() { Index = Tools.MathMod(Index + 1, Length); return Index == 0; } public bool Prev() { Index = Tools.MathMod(Index - 1, Length); return Index == Length - 1; } } } ================================================ FILE: TS3AudioBot/Plugins/ITabPlugin.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TS3AudioBot.Plugins { public interface ITabPlugin : IDisposable { void Initialize(); } public interface ICorePlugin : ITabPlugin { } public interface IBotPlugin : ITabPlugin { } public interface IPluginMeta { string Name { get; } string Description { get; } string Author { get; } Uri ProjectUrl { get; } Version Version { get; } } [AttributeUsage(AttributeTargets.Class, Inherited = false)] [Obsolete("Static Plugins are deprecated, use an ICorePlugin instead")] public sealed class StaticPluginAttribute : Attribute { } } ================================================ FILE: TS3AudioBot/Plugins/Plugin.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Emit; using Microsoft.CodeAnalysis.Text; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Security.Cryptography; using System.Text; using TS3AudioBot.CommandSystem; using TS3AudioBot.Dependency; using TS3AudioBot.ResourceFactories; using TSLib.Helper; namespace TS3AudioBot.Plugins { internal class Plugin { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private readonly CoreInjector coreInjector; private readonly ResourceResolver resourceResolver; private readonly BotManager botManager; private byte[]? md5CacheSum; private PluginObjects? corePlugin; private readonly Dictionary botPluginList = new Dictionary(); private IResolver? factoryObject; private Type? pluginType; private PluginStatus status; internal PluginType Type { get; private set; } public int Id { get; } public FileInfo File { get; } // TODO remove after plugin rework internal PluginObjects CorePlugin => corePlugin!; public Plugin(CoreInjector coreInjector, ResourceResolver resourceResolver, BotManager botManager, FileInfo file, int id) { this.coreInjector = coreInjector; this.resourceResolver = resourceResolver; this.botManager = botManager; corePlugin = null; File = file; Id = id; status = PluginStatus.Off; Type = PluginType.None; } public string Name { get { if (CheckStatus(null) == PluginStatus.Error) return $"{File.Name} (Error)"; var name = pluginType?.Name ?? File.Name; switch (Type) { case PluginType.Factory: if (factoryObject?.ResolverFor != null) return $"{factoryObject.ResolverFor}-factory"; return $"{name} (Factory)"; case PluginType.BotPlugin: return $"{name} (BotPlugin)"; case PluginType.CorePlugin: return $"{name} (CorePlugin)"; case PluginType.Commands: return $"{name} (Commands)"; case PluginType.None: return $"{File.Name} (Unknown)"; default: throw Tools.UnhandledDefault(Type); } } } public PluginStatus CheckStatus(Bot? bot) { if (Type != PluginType.BotPlugin) return status; if (status == PluginStatus.Disabled || status == PluginStatus.Error || status == PluginStatus.Off) return status; if (bot is null) return PluginStatus.NotAvailable; if (status == PluginStatus.Ready) return botPluginList.ContainsKey(bot) ? PluginStatus.Active : PluginStatus.Ready; if (status == PluginStatus.Active) throw new InvalidOperationException("BotPlugin must not be active"); throw Tools.UnhandledDefault(status); } public PluginResponse Load() { try { if (PluginManager.IsIgnored(File)) return PluginResponse.Disabled; var locStatus = CheckStatus(null); var cacheOk = Md5EqualsCache(); if (locStatus != PluginStatus.Off && cacheOk) { return locStatus == PluginStatus.Ready || locStatus == PluginStatus.Active ? PluginResponse.Ok : PluginResponse.UnknownError; } Unload(); PluginResponse result; switch (File.Extension) { case ".cs": result = PrepareSource(); break; case ".dll": case ".exe": result = PrepareBinary(); break; default: throw new InvalidProgramException(); } status = result == PluginResponse.Ok ? PluginStatus.Ready : PluginStatus.Error; return result; } catch (BadImageFormatException bifex) { Log.Warn("Plugin \"{0}\" has an invalid format: {1} (Add a \"{0}.ignore\" file to ignore this file)", File.Name, bifex.InnerException?.Message ?? bifex.Message); status = PluginStatus.Error; return PluginResponse.InvalidBinary; } catch (Exception ex) { Log.Warn("Plugin \"{0}\" failed to prepare: {1}", File.Name, ex.Message); status = PluginStatus.Error; return PluginResponse.Crash; } } private bool Md5EqualsCache() { using var md5 = MD5.Create(); using var stream = System.IO.File.OpenRead(File.FullName); var newHashSum = md5.ComputeHash(stream); if (md5CacheSum is null) { md5CacheSum = newHashSum; return false; } var equals = md5CacheSum.SequenceEqual(newHashSum); md5CacheSum = newHashSum; return equals; } private PluginResponse PrepareBinary() { // Do not use 'Assembly.LoadFile' as otherwise we cannot replace the dll // on windows aymore after it's opened once. var asmBin = System.IO.File.ReadAllBytes(File.FullName); var pdbFile = File.FullName[0..^File.Extension.Length] + ".pdb"; byte[]? pdbBin = null; try { if (System.IO.File.Exists(pdbFile)) pdbBin = System.IO.File.ReadAllBytes(pdbFile); } catch (Exception ex) { Log.Debug(ex, "No pdb file found"); } var assembly = Assembly.Load(asmBin, pdbBin); return InitializeAssembly(assembly); } private PluginResponse PrepareSource() { var param = AppDomain.CurrentDomain.GetAssemblies() .Where(asm => !asm.IsDynamic && !string.IsNullOrEmpty(asm.Location)) .Select(asm => MetadataReference.CreateFromFile(asm.Location)) .Concat(new[] { MetadataReference.CreateFromFile(Assembly.GetExecutingAssembly().Location) }).ToArray(); using var pluginFileStream = System.IO.File.OpenRead(File.FullName); var sourceTree = CSharpSyntaxTree.ParseText(SourceText.From(pluginFileStream)); var compilation = CSharpCompilation.Create($"plugin_{File.Name}_{Tools.Random.Next()}") .WithOptions(new CSharpCompilationOptions( outputKind: OutputKind.DynamicallyLinkedLibrary, optimizationLevel: OptimizationLevel.Release)) .AddReferences(param) .AddSyntaxTrees(sourceTree); using var ms_assembly = new MemoryStream(); using var ms_pdb = new MemoryStream(); var result = compilation.Emit(ms_assembly, ms_pdb, options: new EmitOptions() .WithDebugInformationFormat(DebugInformationFormat.PortablePdb) ); if (result.Success) { ms_assembly.Seek(0, SeekOrigin.Begin); ms_pdb.Seek(0, SeekOrigin.Begin); var assembly = Assembly.Load(ms_assembly.ToArray(), ms_pdb.ToArray()); return InitializeAssembly(assembly); } else { bool containsErrors = false; var strb = new StringBuilder(); strb.AppendFormat("Plugin \"{0}\" [{1}] compiler notifications:\n", File.Name, Id); foreach (var error in result.Diagnostics) { var position = error.Location.GetLineSpan(); containsErrors |= error.WarningLevel == 0; strb.AppendFormat("{0} L{1}/C{2}: {3}\n", error.WarningLevel == 0 ? "Error" : ((DiagnosticSeverity)(error.WarningLevel - 1)).ToString(), position.StartLinePosition.Line + 1, position.StartLinePosition.Character, error.GetMessage()); } strb.Length--; // remove last linebreak Log.Warn(strb.ToString()); return PluginResponse.CompileError; } } private PluginResponse InitializeAssembly(Assembly assembly) { try { var allTypes = assembly.GetExportedTypes(); var pluginTypes = allTypes.Where(t => typeof(ITabPlugin).IsAssignableFrom(t)).ToArray(); var factoryTypes = allTypes.Where(t => typeof(IResolver).IsAssignableFrom(t)).ToArray(); #pragma warning disable CS0618 // Type or member is obsolete var commandsTypes = allTypes.Where(t => t.GetCustomAttribute() != null).ToArray(); #pragma warning restore CS0618 // Type or member is obsolete if (pluginTypes.Length + factoryTypes.Length + commandsTypes.Length > 1) { Log.Warn("Any source or binary plugin file may contain one plugin or factory at most. ({})", Name); return PluginResponse.TooManyPlugins; } if (pluginTypes.Length + factoryTypes.Length + commandsTypes.Length == 0) { Log.Warn("Any source or binary plugin file must contain at least one plugin or factory. ({})", Name); return PluginResponse.NoTypeMatch; } if (pluginTypes.Length == 1) { pluginType = pluginTypes[0]; if (typeof(IBotPlugin).IsAssignableFrom(pluginType)) Type = PluginType.BotPlugin; else if (typeof(ICorePlugin).IsAssignableFrom(pluginType)) Type = PluginType.CorePlugin; else throw new InvalidOperationException("Do not inherit from 'ITabPlugin', instead use 'IBotPlugin' or 'ICorePlugin'"); } else if (factoryTypes.Length == 1) { pluginType = factoryTypes[0]; Type = PluginType.Factory; } else if (commandsTypes.Length == 1) { pluginType = commandsTypes[0]; Type = PluginType.Commands; } else { Type = PluginType.None; throw new InvalidOperationException(); } return PluginResponse.Ok; } catch (TypeLoadException tlex) { Log.Warn(nameof(InitializeAssembly) + " failed, The file \"{0}\" seems to be missing some dependecies ({1})", File.Name, tlex.Message); return PluginResponse.MissingDependency; } catch (Exception ex) { Log.Error(ex, nameof(InitializeAssembly) + " failed: {0}", ex.Message); return PluginResponse.Crash; } } /// /// Starts the plugin to have all its functionality available in the bot. /// This call requires this plugin to be in the state. /// Changes the status to when successful or otherwise. /// /// The bot instance where this plugin should be started. Can be null when not required. public PluginResponse Start(Bot? bot) { switch (CheckStatus(bot)) { case PluginStatus.Disabled: return PluginResponse.Disabled; case PluginStatus.Off: var response = Load(); if (response != PluginResponse.Ok) return response; goto case PluginStatus.Ready; case PluginStatus.Ready: return StartInternal(bot) ? PluginResponse.Ok : PluginResponse.UnknownError; case PluginStatus.Active: return PluginResponse.Ok; case PluginStatus.Error: return PluginResponse.UnknownError; case PluginStatus.NotAvailable: return PluginResponse.MissingContext; default: throw new ArgumentOutOfRangeException(); } } private bool StartInternal(Bot? bot) { if (CheckStatus(bot) != PluginStatus.Ready) throw new InvalidOperationException("This plugin has not yet been prepared"); if (pluginType is null) throw new InvalidOperationException("Plugin not correctly initialized"); try { switch (Type) { case PluginType.None: throw new InvalidOperationException("A 'None' plugin cannot be loaded"); case PluginType.BotPlugin: if (bot is null) { Log.Error("This plugin needs to be activated on a bot instance."); status = PluginStatus.Error; return false; } if (botPluginList.ContainsKey(bot)) throw new InvalidOperationException("Plugin is already instantiated on this bot"); var botPluginObjs = CreatePluginObjects(bot.Injector, pluginType, false); botPluginList.Add(bot, botPluginObjs); botPluginObjs.Plugin.Initialize(); break; case PluginType.CorePlugin: corePlugin = CreatePluginObjects(coreInjector, pluginType, false); botManager.IterateAll(b => { try { if (b.Injector.TryGet(out var commandManager)) commandManager.RegisterCollection(corePlugin.Bag); } catch (Exception ex) { Log.Error(ex, "Failed to register commands from plugin '{0}' for bot '{1}'", Name, b.Id); } }); corePlugin.Plugin.Initialize(); break; case PluginType.Factory: factoryObject = (IResolver)Activator.CreateInstance(pluginType)!; resourceResolver.AddResolver(factoryObject); break; case PluginType.Commands: corePlugin = CreatePluginObjects(coreInjector, pluginType, true); break; default: throw Tools.UnhandledDefault(Type); } } catch (Exception ex) { if (ex is MissingMethodException) Log.Error(ex, "Factories needs a parameterless constructor."); else Log.Error(ex, "Plugin '{0}' failed to load: {1}.", Name, ex.Message); Stop(bot); if (Type != PluginType.BotPlugin) status = PluginStatus.Error; return false; } if (Type != PluginType.BotPlugin) status = PluginStatus.Active; return true; } // Note, the 'isStatic' flag is only temporary while StaticPlugins are being // deprecated, after that this distinction is not necessary anymore and // can be removed. public static PluginObjects CreatePluginObjects(IInjector injector, Type type, bool isStatic) { object? pluginInstance = null; if (!isStatic) { if (!injector.TryCreate(type, out pluginInstance)) throw new Exception("Plugin is missing dependencies"); injector.FillProperties(pluginInstance); } if (!injector.TryGet(out var commandManager)) throw new Exception("Bot has no CommandSystem"); var pluginObjs = new PluginObjects( (ITabPlugin)pluginInstance!, new PluginCommandBag(pluginInstance, type), commandManager); pluginObjs.CommandManager.RegisterCollection(pluginObjs.Bag); return pluginObjs; } /// /// Stops the plugin and removes all its functionality available in the bot. /// Changes the status from to when successful or otherwise. /// /// The bot instance where this plugin should be stopped. Can be null when not required. public PluginResponse Stop(Bot? bot) { switch (Type) { case PluginType.None: break; case PluginType.BotPlugin: if (bot is null) { foreach (var pluginObjs in botPluginList.Values) DestroyPluginObjects(pluginObjs); botPluginList.Clear(); } else { if (botPluginList.Remove(bot, out var pluginObjs)) DestroyPluginObjects(pluginObjs); } break; case PluginType.CorePlugin: if (corePlugin != null) { botManager.IterateAll(b => { if (b.Injector.TryGet(out var commandManager)) commandManager.UnregisterCollection(corePlugin.Bag); }); DestroyPluginObjects(corePlugin); corePlugin = null; } break; case PluginType.Factory: if (factoryObject != null) resourceResolver.RemoveResolver(factoryObject); break; case PluginType.Commands: if (corePlugin != null) DestroyPluginObjects(corePlugin); break; default: throw Tools.UnhandledDefault(Type); } status = PluginStatus.Ready; return PluginResponse.Ok; } private void DestroyPluginObjects(PluginObjects pluginObjs) { pluginObjs.CommandManager.UnregisterCollection(pluginObjs.Bag); try { pluginObjs.Plugin?.Dispose(); } catch (Exception ex) { Log.Warn(ex, "Plugin '{0}' threw an exception while disposing", Name); } } public void Unload() { Stop(null); pluginType = null; if (CheckStatus(null) == PluginStatus.Ready) status = PluginStatus.Off; } public override string ToString() => Name; } public enum PluginType { None, BotPlugin, CorePlugin, Factory, Commands, } } ================================================ FILE: TS3AudioBot/Plugins/PluginCommandBag.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using TS3AudioBot.CommandSystem; namespace TS3AudioBot.Plugins { internal class PluginCommandBag : ICommandBag { public IReadOnlyCollection BagCommands { get; } public IReadOnlyCollection AdditionalRights => Array.Empty(); public PluginCommandBag(object? obj, Type t) { BagCommands = CommandManager.GetBotCommands(obj, t).ToArray(); } } } ================================================ FILE: TS3AudioBot/Plugins/PluginExtensions.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using NLog; using System.Diagnostics; using System.Runtime.CompilerServices; namespace TS3AudioBot.Plugins { public static class PluginExtensions { [MethodImpl(MethodImplOptions.NoInlining)] public static Logger GetLogger() { var cls = new StackTrace()?.GetFrame(1)?.GetMethod()?.DeclaringType?.Name ?? "Unknown"; return LogManager.GetLogger($"TS3AudioBot.Plugins.{cls}"); } } } ================================================ FILE: TS3AudioBot/Plugins/PluginManager.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Text; using TS3AudioBot.Config; using TS3AudioBot.Dependency; using TS3AudioBot.ResourceFactories; using TSLib.Helper; namespace TS3AudioBot.Plugins { // Start Plugin: // ! Start plugins before rights system to ensure all rights are loaded // - Get all commands // - Validate // - 0/1 Plugin // - Command name conflict // - 0/1 Factory // - Facory name conflict // - [ Instantiate plugin (Depending on type) ] // - Add commands to command manager // - Start config to system? public class PluginManager : IDisposable { private readonly ConfPlugins config; private readonly CoreInjector coreInjector; private readonly ResourceResolver resourceResolver; private readonly BotManager botManager; private readonly Dictionary plugins = new Dictionary(); private readonly HashSet usedIds = new HashSet(); private readonly object pluginsLock = new object(); // TODO remove after plugin rework internal ICollection Plugins => plugins.Values; public PluginManager(ConfPlugins config, CoreInjector coreInjector, ResourceResolver resourceResolver, BotManager botManager) { this.config = config; this.coreInjector = coreInjector; this.resourceResolver = resourceResolver; this.botManager = botManager; } private void CheckAndClearPlugins(Bot? bot) { ClearMissingFiles(); CheckLocalPlugins(bot); } /// Updates the plugin dictionary with new and changed plugins. /// A bot instance when the plugin is a bot local plugin. private void CheckLocalPlugins(Bot? bot) { var dir = new DirectoryInfo(config.Path); if (!dir.Exists) return; foreach (var file in dir.EnumerateFiles()) { if (plugins.TryGetValue(file.Name, out var plugin)) { var status = plugin.CheckStatus(bot); switch (status) { case PluginStatus.Disabled: case PluginStatus.Active: case PluginStatus.NotAvailable: continue; case PluginStatus.Ready: case PluginStatus.Off: case PluginStatus.Error: plugin.Load(); break; default: throw Tools.UnhandledDefault(status); } } else { if (IsIgnored(file)) continue; plugin = new Plugin(coreInjector, resourceResolver, botManager, file, GetFreeId()); if (plugin.Load() == PluginResponse.Disabled) { RemovePlugin(plugin); continue; } plugins.Add(file.Name, plugin); } } } /// Unloads all Plugins which have no corresponding file anymore and removes from the index list. private void ClearMissingFiles() { // at first find all missing and ignored files var missingFiles = plugins.Where(kvp => { kvp.Value.File.Refresh(); return !kvp.Value.File.Exists || IsIgnored(kvp.Value.File); }).ToArray(); // unload if it is loaded and remove foreach (var misFile in missingFiles) RemovePlugin(misFile.Value); } public static bool IsIgnored(FileInfo file) => (file.Extension != ".cs" && file.Extension != ".dll" && file.Extension != ".exe") || File.Exists(file.FullName + ".ignore"); private Plugin TryGetPlugin(string identifier) { if (plugins.TryGetValue(identifier, out var plugin)) return plugin; if (int.TryParse(identifier, out int num)) return plugins.Values.FirstOrDefault(p => p.Id == num); return plugins.Values.FirstOrDefault(p => p.Name == identifier); } private int GetFreeId() { int id = 0; while (usedIds.Contains(id)) id++; usedIds.Add(id); return id; } public PluginResponse StartPlugin(string identifier, Bot? bot) { lock (pluginsLock) { CheckLocalPlugins(bot); return TryGetPlugin(identifier)?.Start(bot) ?? PluginResponse.PluginNotFound; } } public PluginResponse StopPlugin(string identifier, Bot? bot) { lock (pluginsLock) { return TryGetPlugin(identifier)?.Stop(bot) ?? PluginResponse.PluginNotFound; } } internal void StopPlugins(Bot bot) { foreach (var plugin in plugins.Values) { if (plugin.Type == PluginType.BotPlugin && plugin.CheckStatus(bot) == PluginStatus.Active) plugin.Stop(bot); } } private void RemovePlugin(Plugin plugin) { usedIds.Remove(plugin.Id); plugins.Remove(plugin.File.Name); plugin.Unload(); } public PluginStatusInfo[] GetPluginOverview(Bot? bot) { lock (pluginsLock) { CheckAndClearPlugins(bot); return plugins.Values.Select(plugin => new PluginStatusInfo( plugin.Id, plugin.Name, plugin.CheckStatus(bot), plugin.Type ) ).ToArray(); } } public static string FormatOverview(ICollection pluginList) { if (pluginList.Count == 0) return "No plugins found!"; var strb = new StringBuilder(); strb.AppendLine("All available plugins:"); var digits = (int)Math.Floor(Math.Log10(pluginList.Count) + 1); foreach (var plugin in pluginList) { strb.Append("#").Append(plugin.Id.ToString("D" + digits, CultureInfo.InvariantCulture)).Append('|'); switch (plugin.Status) { case PluginStatus.Off: strb.Append("OFF"); break; case PluginStatus.Ready: strb.Append("RDY"); break; case PluginStatus.Active: strb.Append("+ON"); break; case PluginStatus.Disabled: strb.Append("UNL"); break; case PluginStatus.Error: strb.Append("ERR"); break; case PluginStatus.NotAvailable: strb.Append("N/A"); break; default: throw Tools.UnhandledDefault(plugin.Status); } strb.Append('|').AppendLine(plugin.Name ?? ""); } return strb.ToString(); } public void Dispose() { foreach (var plugin in plugins.Values) plugin.Unload(); } } public class PluginStatusInfo { public int Id { get; } public string Name { get; } public PluginStatus Status { get; } public PluginType Type { get; } public PluginStatusInfo(int id, string name, PluginStatus status, PluginType type) { Id = id; Name = name; Status = status; Type = type; } } } ================================================ FILE: TS3AudioBot/Plugins/PluginObjects.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using TS3AudioBot.CommandSystem; namespace TS3AudioBot.Plugins { internal class PluginObjects { public PluginCommandBag Bag { get; set; } public ITabPlugin Plugin { get; set; } public CommandManager CommandManager { get; set; } public PluginObjects(ITabPlugin plugin, PluginCommandBag bag, CommandManager commandManager) { Bag = bag; Plugin = plugin; CommandManager = commandManager; } } } ================================================ FILE: TS3AudioBot/Plugins/PluginResponse.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Plugins { public enum PluginResponse { Ok, Crash, MissingDependency, MissingContext, InvalidBinary, NoTypeMatch, TooManyPlugins, UnknownError, PluginNotFound, CompileError, Disabled, NotSupported, } } ================================================ FILE: TS3AudioBot/Plugins/PluginStatus.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Plugins { public enum PluginStatus { /// The plugin has just been found and is ready to be prepared. Off, /// The plugin is valid and ready to be loaded. Ready, /// The plugin is currently active. Active, /// The plugin has been plugged off intentionally and will not be prepared with the next scan. Disabled, /// The plugin failed to load. Error, /// The plugin needs to be checked/loaded withing a Bot context. NotAvailable, } } ================================================ FILE: TS3AudioBot/Properties/PublishProfiles/FolderProfile.pubxml ================================================  Release Any CPU bin\Release\netcoreapp3.1\publish\linux-x64\ FileSystem <_TargetId>Folder netcoreapp3.1 linux-x64 true false ================================================ FILE: TS3AudioBot/Properties/PublishProfiles/FolderProfile.pubxml.user ================================================  True|2023-03-15T11:23:15.0443243Z;True|2023-03-15T19:22:42.0669401+08:00;True|2023-03-15T19:22:08.8924841+08:00;True|2023-03-13T19:37:32.7540375+08:00;True|2023-03-13T11:34:41.6395482+08:00;True|2023-03-13T11:33:57.4556721+08:00;True|2023-03-13T11:28:32.3649863+08:00;True|2023-03-12T01:02:59.3104461+08:00; ================================================ FILE: TS3AudioBot/Properties.cs ================================================ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("TS3ABotUnitTests")] ================================================ FILE: TS3AudioBot/ResourceFactories/AudioResource.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using System; using System.Collections.Generic; using TS3AudioBot.CommandSystem.CommandResults; namespace TS3AudioBot.ResourceFactories { public class AudioResource : IAudioResourceResult { /// The resource type. [JsonProperty(PropertyName = "type")] public string AudioType { get; set; } /// An identifier to create the song. This id is uniqe among all resources with the same resource type string of a factory. [JsonProperty(PropertyName = "resid")] public string ResourceId { get; set; } /// The display title. [JsonProperty(PropertyName = "title")] public string? ResourceTitle { get; set; } /// Additional data to resolve the link. [JsonProperty(PropertyName = "add", NullValueHandling = NullValueHandling.Ignore)] public Dictionary? AdditionalData { get; set; } /// An identifier wich is unique among all and resource type string of a factory. [JsonIgnore] public string UniqueId => ResourceId + AudioType; [JsonIgnore] AudioResource IAudioResourceResult.AudioResource => this; #pragma warning disable CS8618 // Required for serialization public AudioResource() { } #pragma warning restore CS8618 public AudioResource(string resourceId, string? resourceTitle, string audioType, Dictionary? additionalData = null) { ResourceId = resourceId; ResourceTitle = resourceTitle; AudioType = audioType; AdditionalData = additionalData; } public AudioResource Add(string key, string value) { AdditionalData ??= new Dictionary(); AdditionalData.Add(key, value); return this; } public string? Get(string key) { if (AdditionalData is null) return null; return AdditionalData.TryGetValue(key, out var value) ? value : null; } public override bool Equals(object? obj) { if (!(obj is AudioResource other)) return false; return AudioType == other.AudioType && ResourceId == other.ResourceId; } public override int GetHashCode() => HashCode.Combine(AudioType, ResourceId); public override string ToString() { return $"{AudioType} ID:{ResourceId}"; } } } ================================================ FILE: TS3AudioBot/ResourceFactories/AudioTags/AudioTagReader.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.IO; using System.Text; namespace TS3AudioBot.ResourceFactories.AudioTags { internal static class AudioTagReader { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private static readonly Dictionary TagDict = new Dictionary(); static AudioTagReader() { Register(new Id3_1()); Register(new Id3_2()); } private static void Register(Tag tagHeader) { TagDict.Add(tagHeader.TagId, tagHeader); } public static HeaderData? GetData(Stream fileStream) { var sr = new BinaryReader(fileStream); string tag = Encoding.ASCII.GetString(sr.ReadBytes(3)); if (TagDict.TryGetValue(tag, out var tagHeader)) { try { var data = tagHeader.GetData(sr); if (data is null) return null; data.Title = data.Title?.TrimEnd('\0'); return data; } catch (IOException) { } catch (FormatException fex) { Log.Debug(fex, "Audiotag has an invalid format"); } catch (Exception ex) { Log.Warn(ex, "Unknown error while parsing audiotag"); } } return null; } private abstract class Tag { public abstract string TagId { get; } public abstract HeaderData GetData(BinaryReader fileStream); } // ReSharper disable InconsistentNaming private class Id3_1 : Tag { private const int TitleLength = 30; public override string TagId => "TAG"; public override HeaderData GetData(BinaryReader fileStream) { // 3 bytes skipped for TagID return new HeaderData { Title = Encoding.ASCII.GetString(fileStream.ReadBytes(TitleLength)), Picture = null, }; // ignore other blocks } } private class Id3_2 : Tag { private readonly int v2_TT2 = FrameIdV2("TT2"); // Title private readonly int v2_PIC = FrameIdV2("PIC"); // Picture private readonly uint v3_TIT2 = FrameIdV3("TIT2"); // Title private readonly uint v3_APIC = FrameIdV3("APIC"); // Picture private readonly uint v3_PIC0 = FrameIdV3("PIC\0"); // Picture public override string TagId => "ID3"; // ReSharper disable UnusedVariable #pragma warning disable IDE0059 // Unnecessary assignment of a value public override HeaderData GetData(BinaryReader fileStream) { var retdata = new HeaderData(); // using the official id3 tag documentation // http://id3.org/id3v2.3.0#ID3_tag_version_2.3.0 // read + validate header [10 bytes] // skipped for TagID >03 bytes byte versionMajor = fileStream.ReadByte(); // >01 bytes byte version_minor = fileStream.ReadByte(); // >01 bytes byte data_flags = fileStream.ReadByte(); // >01 bytes int tagSize = fileStream.ReadId3Int(); // >04 bytes // start at 0, the header is excluded from `tagSize` int readCount = 0; #region ID3v2 if (versionMajor == 2) { while (readCount < tagSize) { // frame header [06 bytes] int frameId = fileStream.ReadInt24Be(); // >03 bytes int frameSize = fileStream.ReadInt24Be(); // >03 bytes readCount += 6; if (readCount + frameSize > tagSize) throw new FormatException("Frame position+size exceedes header size"); if (frameId == v2_TT2) { var textBuffer = fileStream.ReadBytes(frameSize); retdata.Title = DecodeString(textBuffer[0], textBuffer, 1, frameSize - 1); } else if (frameId == v2_PIC) { var textEncoding = fileStream.ReadByte(); var imageType = fileStream.ReadInt24Be(); // JPG or PNG (or other?) var pictureType = fileStream.ReadByte(); var description = new List(); byte textByte; while ((textByte = fileStream.ReadByte()) != 0) description.Add(textByte); retdata.Picture = fileStream.ReadBytes(frameSize - (description.Count + 5)); } else if (frameId == 0) { break; } else { fileStream.ReadBytes(frameSize); readCount += frameSize; } } } #endregion #region ID3v3/4 else if (versionMajor == 3 || versionMajor == 4) { while (readCount < tagSize) { // frame header [10 bytes] uint frameId = fileStream.ReadUInt32Be(); // >04 bytes int frameSize = versionMajor == 4 // >04 bytes ? fileStream.ReadId3Int() : fileStream.ReadInt32Be(); ushort frame_flags = fileStream.ReadUInt16Be(); // >02 bytes readCount += 10; if ((frameId & 0xFF) == 0) { // legacy tags start here which we don't support break; } if (frameSize <= 0 || readCount + frameSize > tagSize) throw new FormatException("Frame position+size exceedes header size"); // content if (frameId == v3_TIT2) { var textBuffer = fileStream.ReadBytes(frameSize); // is a string, so the first byte is a indicator byte retdata.Title = DecodeString(textBuffer[0], textBuffer, 1, frameSize - 1); } else if (frameId == v3_APIC || frameId == v3_PIC0) { var textEncoding = fileStream.ReadByte(); // >01 bytes var mimeLen = ReadNullTermString(fileStream, 0, null); // >?? bytes var pictureType = fileStream.ReadByte(); // >01 bytes var descriptionLen = ReadNullTermString(fileStream, textEncoding, null); // >?? bytes retdata.Picture = fileStream.ReadBytes(frameSize - (mimeLen + descriptionLen + 2)); } else if (frameId == 0) { break; } else { fileStream.ReadBytes(frameSize); } readCount += frameSize; } } #endregion else throw new FormatException("Major id3 tag version not supported"); return retdata; } #pragma warning restore IDE0059 // Unnecessary assignment of a value // ReSharper restore UnusedVariable private static int ReadNullTermString(BinaryReader fileStream, byte encoding, List? text) { bool unicode = encoding == 1 || encoding == 2; if (!unicode) { int read = 0; byte textByte; while ((textByte = fileStream.ReadByte()) > 0) { text?.Add(textByte); read++; } return read + 1; // +1 = null-byte } else { var buffer = new byte[2]; int read = 0; while (fileStream.Read(buffer, 0, 2) == 2 && (buffer[0] != 0 || buffer[1] != 0)) { text?.AddRange(buffer); read += 2; } return read + 2; } } private static readonly Encoding UnicodeBeEncoding = new UnicodeEncoding(true, false); private static Encoding GetEncoding(byte type) { return type switch { 0 => Encoding.GetEncoding(28591), 1 => Encoding.Unicode, 2 => UnicodeBeEncoding, 3 => Encoding.UTF8, _ => throw new FormatException("The id3 tag is damaged"), }; } private static string DecodeString(byte type, byte[] textBuffer, int offset, int length) => GetEncoding(type).GetString(textBuffer, offset, length); private static int FrameIdV2(string id) { return BitConverterBigEndian.ToInt24(Encoding.ASCII.GetBytes(id)); } private static uint FrameIdV3(string id) { return BitConverterBigEndian.ToUInt32(Encoding.ASCII.GetBytes(id)); } } // ReSharper enable InconsistentNaming } internal class HeaderData { public string? Title { get; set; } public byte[]? Picture { get; set; } } } ================================================ FILE: TS3AudioBot/ResourceFactories/AudioTags/BinaryReaderBigEndianExtensions.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.IO; using System.Runtime.InteropServices; namespace TS3AudioBot.ResourceFactories.AudioTags { internal static class BinaryReaderBigEndianExtensions { public static short ReadInt16Be(this BinaryReader br) { return BitConverterBigEndian.ToInt16(br.ReadBytes(2)); } public static int ReadInt24Be(this BinaryReader br) { return BitConverterBigEndian.ToInt24(br.ReadBytes(3)); } public static int ReadInt32Be(this BinaryReader br) { return BitConverterBigEndian.ToInt32(br.ReadBytes(4)); } public static long ReadInt64Be(this BinaryReader br) { return BitConverterBigEndian.ToInt64(br.ReadBytes(8)); } public static ushort ReadUInt16Be(this BinaryReader br) { return BitConverterBigEndian.ToUInt16(br.ReadBytes(2)); } public static uint ReadUInt32Be(this BinaryReader br) { return BitConverterBigEndian.ToUInt32(br.ReadBytes(4)); } public static ulong ReadUInt64Be(this BinaryReader br) { return BitConverterBigEndian.ToUInt64(br.ReadBytes(8)); } public static int ReadId3Int(this BinaryReader br) { int num = 0; num |= br.ReadByte() << (3 * 7); num |= br.ReadByte() << (2 * 7); num |= br.ReadByte() << (1 * 7); num |= br.ReadByte() << (0 * 7); return num; } } internal static class BitConverterBigEndian { private const int BitsInByte = 8; public static short ToInt16(byte[] bytes) { return (short)( (bytes[0] << 1 * BitsInByte) | (bytes[1] << 0 * BitsInByte)); } public static int ToInt24(byte[] bytes) { return (bytes[0] << 2 * BitsInByte) | (bytes[1] << 1 * BitsInByte) | (bytes[2] << 0 * BitsInByte); } public static int ToInt32(byte[] bytes) { return (bytes[0] << 3 * BitsInByte) | (bytes[1] << 2 * BitsInByte) | (bytes[2] << 1 * BitsInByte) | (bytes[3] << 0 * BitsInByte); } public static long ToInt64(byte[] bytes) { ReinterpretInt ri; ri.value = 0; ri.HDW = // High double word (bytes[0] << 3 * BitsInByte) | (bytes[1] << 2 * BitsInByte) | (bytes[2] << 1 * BitsInByte) | (bytes[3] << 0 * BitsInByte); ri.LDW = // Low double word (bytes[4] << 3 * BitsInByte) | (bytes[5] << 2 * BitsInByte) | (bytes[6] << 1 * BitsInByte) | (bytes[7] << 0 * BitsInByte); return ri.value; } public static ushort ToUInt16(byte[] bytes) { return (ushort)( (bytes[0] << 1 * BitsInByte) | (bytes[1] << 0 * BitsInByte)); } public static uint ToUInt32(byte[] bytes) { return ((uint)bytes[0] << 3 * BitsInByte) | ((uint)bytes[1] << 2 * BitsInByte) | ((uint)bytes[2] << 1 * BitsInByte) | ((uint)bytes[3] << 0 * BitsInByte); } public static ulong ToUInt64(byte[] bytes) { ReinterpretInt ri; ri.value = 0; ri.HDW = // High double word (bytes[0] << 3 * BitsInByte) | (bytes[1] << 2 * BitsInByte) | (bytes[2] << 1 * BitsInByte) | (bytes[3] << 0 * BitsInByte); ri.LDW = // Low double word (bytes[4] << 3 * BitsInByte) | (bytes[5] << 2 * BitsInByte) | (bytes[6] << 1 * BitsInByte) | (bytes[7] << 0 * BitsInByte); return unchecked((ulong)ri.value); } [StructLayout(LayoutKind.Explicit)] private struct ReinterpretInt { [FieldOffset(0)] public int LDW; [FieldOffset(4)] public int HDW; [FieldOffset(0)] public long value; } } } ================================================ FILE: TS3AudioBot/ResourceFactories/AudioTags/M3uReader.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using TSLib.Helper; namespace TS3AudioBot.ResourceFactories.AudioTags { public static class M3uReader { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private const int MaxLineLength = 4096; private const int MaxListLength = 1000; private static readonly byte[] ExtM3uLine = Tools.Utf8Encoder.GetBytes("#EXTM3U"); private static readonly byte[] ExtInfLine = Tools.Utf8Encoder.GetBytes("#EXTINF"); private static readonly byte[] ExtXStreamInfLine = Tools.Utf8Encoder.GetBytes("#EXT-X-STREAM-INF"); public static async Task> TryGetData(Stream stream) { int read = 1; int bufferLen = 0; var buffer = new byte[MaxLineLength]; var data = new List(); string? trackTitle = null; string? trackStreamMeta = null; //bool extm3u = false; try { for (int i = 0; i < MaxListLength; i++) { if (read > 0) { read = await stream.ReadAsync(buffer, bufferLen, MaxLineLength - bufferLen); bufferLen += read; } // find linebreak index int index = Array.IndexOf(buffer, (byte)'\n', 0, bufferLen); int lb = 1; if (index == -1) index = Array.IndexOf(buffer, (byte)'\r', 0, bufferLen); else if (index > 0 && buffer[index - 1] == (byte)'\r') { index--; lb = 2; } ReadOnlyMemory line; bool atEnd = index == -1; if (atEnd) { if (bufferLen == MaxLineLength) throw Error.Str("Max read buffer exceeded"); line = buffer.AsMemory(0, bufferLen); bufferLen = 0; } else { line = buffer.AsMemory(0, index); } if (!line.IsEmpty) { if (line.Span[0] == (byte)'#') { if (line.Span.StartsWith(ExtInfLine)) { var dataSlice = line.Slice(ExtInfLine.Length + 1); var trackInfo = dataSlice.Span.IndexOf((byte)','); if (trackInfo >= 0) trackTitle = dataSlice.Span.Slice(trackInfo + 1).NewUtf8String(); } else if (line.Span.StartsWith(ExtM3uLine)) { //extm3u = true; ??? } else if (line.Span.StartsWith(ExtXStreamInfLine)) { trackStreamMeta = line.Span.Slice(ExtXStreamInfLine.Length + 1).NewUtf8String(); } // else: unsupported m3u tag } else { var lineStr = line.Span.NewUtf8String(); if (Uri.TryCreate(lineStr, UriKind.RelativeOrAbsolute, out _)) { data.Add(new M3uEntry( trackUrl: lineStr, title: trackTitle, streamMeta: trackStreamMeta) ); } else { Log.Debug("Skipping invalid playlist entry ({0})", lineStr); } trackTitle = null; trackStreamMeta = null; } } if (!atEnd) { index += lb; Array.Copy(buffer, index, buffer, 0, MaxLineLength - index); bufferLen -= index; } if (atEnd || bufferLen <= 0) { if (bufferLen < 0) throw Error.Str("Unexpected buffer underfill"); return data; } } throw Error.Str("List too long"); } catch (Exception ex) { throw Error.Exception(ex).Str("List too long"); } } } public class M3uEntry { public string TrackUrl { get; set; } public string? Title { get; set; } public string? StreamMeta { get; set; } public M3uEntry(string trackUrl, string? title, string? streamMeta) { TrackUrl = trackUrl; Title = title; StreamMeta = streamMeta; } } } ================================================ FILE: TS3AudioBot/ResourceFactories/BandcampResolver.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.IO; using System.Text.RegularExpressions; using System.Threading.Tasks; using TS3AudioBot.Helper; using TS3AudioBot.Localization; namespace TS3AudioBot.ResourceFactories { public class BandcampResolver : IResourceResolver, IThumbnailResolver { private static readonly Regex BandcampUrlRegex = new Regex(@"([\w_-]+).bandcamp.com/track/([\w_-]+)", Util.DefaultRegexConfig); private static readonly Regex TrackLinkRegex = new Regex(@"""mp3-128""\s*:\s*""([^""]*)""", Util.DefaultRegexConfig); private static readonly Regex TrackNameRegex = new Regex(@"""title""\s*:\s*""([^""]*)""", Util.DefaultRegexConfig); private static readonly Regex TrackArtRegex = new Regex(@"""album_art_id""\s*:\s*(\d+)\s*,", Util.DefaultRegexConfig); private static readonly Regex TrackMainJsonRegex = new Regex(@"trackinfo\s*:(.*),(\r|\n)", Util.DefaultRegexConfig); private const string AddArtist = "artist"; private const string AddTrack = "track"; public string ResolverFor => "bandcamp"; public MatchCertainty MatchResource(ResolveContext _, string uri) => BandcampUrlRegex.IsMatch(uri).ToMatchCertainty(); public async Task GetResource(ResolveContext _, string url) { var match = BandcampUrlRegex.Match(url); if (!match.Success) throw Error.LocalStr(strings.error_media_invalid_uri); var artistName = match.Groups[1].Value; var trackName = match.Groups[2].Value; var webSite = await WebWrapper.Request($"https://{artistName}.bandcamp.com/track/{trackName}").AsString(); match = TrackMainJsonRegex.Match(webSite); if (!match.Success) throw Error.LocalStr(strings.error_media_internal_missing + " (TrackMainJsonRegex)"); JToken jobj; try { jobj = JToken.Parse(match.Groups[1].Value); } catch (JsonReaderException ex) { throw Error.Exception(ex).LocalStr(strings.error_media_internal_missing + " (TrackMainJsonRegex.JToken)"); } if (!(jobj is JArray jarr) || jarr.Count == 0) throw Error.LocalStr(strings.error_media_no_stream_extracted); var firstTrack = jarr[0]; JToken? firstTrackFile; if (!firstTrack.TryCast("track_id", out var id) || !firstTrack.TryCast("title", out var title) || (firstTrackFile = firstTrack["file"]) == null || !firstTrackFile.TryCast("mp3-128", out var trackObj)) throw Error.LocalStr(strings.error_media_no_stream_extracted); return new BandcampPlayResource(trackObj, new AudioResource(id, title, ResolverFor) .Add(AddArtist, artistName) .Add(AddTrack, trackName), GetTrackArtId(webSite)); } public async Task GetResourceById(ResolveContext _, AudioResource resource) { var webSite = await DownloadEmbeddedSite(resource.ResourceId); if (string.IsNullOrEmpty(resource.ResourceTitle)) { var nameMatch = TrackNameRegex.Match(webSite); resource.ResourceTitle = nameMatch.Success ? nameMatch.Groups[1].Value : $"Bandcamp (id: {resource.ResourceId})"; } var match = TrackLinkRegex.Match(webSite); if (!match.Success) throw Error.LocalStr(strings.error_media_internal_missing + " (TrackLinkRegex)"); return new BandcampPlayResource(match.Groups[1].Value, resource, GetTrackArtId(webSite)); } public string RestoreLink(ResolveContext _, AudioResource resource) { var artistName = resource.Get(AddArtist); var trackName = resource.Get(AddTrack); if (artistName != null && trackName != null) return $"https://{artistName}.bandcamp.com/track/{trackName}"; // backup when something's wrong with the website return $"https://bandcamp.com/EmbeddedPlayer/v=2/track={resource.ResourceId}"; } private static Task DownloadEmbeddedSite(string id) => WebWrapper.Request($"https://bandcamp.com/EmbeddedPlayer/v=2/track={id}").AsString(); public async Task GetThumbnail(ResolveContext _, PlayResource playResource, Func action) { string? artId = null; if (playResource is BandcampPlayResource bandcampPlayResource) { artId = bandcampPlayResource.ArtId; } if (artId is null) { var webSite = await DownloadEmbeddedSite(playResource.AudioResource.ResourceId); artId = GetTrackArtId(webSite); } if (string.IsNullOrEmpty(artId)) throw Error.LocalStr(strings.error_media_image_not_found); // 1 : 1600px/1600px // 2 : 350px/ 350px // 3 : 100px/ 100px / full digital discography // 4 : 300px/ 300px // 5 : 700px/ 700px // 6 : 100px/ 100px // 7 : 150px/ 150px / discography // 8 : 124px/ 127px // 9 : 210px/ 210px / suggestion // 10 : 1200px/1200px / main banner // 11 : 172px/ 172px // 12 : 138px/ 138px // 13 : 380px/ 380px // 14 : 368px/ 368px // 15 : 135px/ 135px // 16 : 700px/ 700px // 42 : 50px/ 50px / supporter await WebWrapper.Request($"https://f4.bcbits.com/img/a{artId}_4.jpg").ToStream(action); } private static string? GetTrackArtId(string site) { var match = TrackArtRegex.Match(site); if (!match.Success) return null; return match.Groups[1].Value; } public void Dispose() { } } public class BandcampPlayResource : PlayResource { public string? ArtId { get; set; } public BandcampPlayResource(string uri, AudioResource baseData, string? artId) : base(uri, baseData) { ArtId = artId; } } } ================================================ FILE: TS3AudioBot/ResourceFactories/IPlaylistResolver.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Threading.Tasks; using TS3AudioBot.Playlists; namespace TS3AudioBot.ResourceFactories { public interface IPlaylistResolver : IResolver { MatchCertainty MatchPlaylist(ResolveContext ctx, string uri); Task GetPlaylist(ResolveContext ctx, string url); } } ================================================ FILE: TS3AudioBot/ResourceFactories/IResolver.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TS3AudioBot.ResourceFactories { public interface IResolver : IDisposable { string ResolverFor { get; } } } ================================================ FILE: TS3AudioBot/ResourceFactories/IResourceResolver.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Threading.Tasks; namespace TS3AudioBot.ResourceFactories { public interface IResourceResolver : IResolver { /// Check method to ask if a factory can load the given link. /// Any link or something similar a user can obtain to pass it here. /// True if the factory thinks it can parse it, false otherwise. MatchCertainty MatchResource(ResolveContext ctx, string uri); /// The factory will try to parse the uri and create a playable resource from it. /// Any link or something similar a user can obtain to pass it here. /// The playable resource if successful, or an error message otherwise Task GetResource(ResolveContext ctx, string uri); /// The factory will try to parse the unique identifier of its scope of responsibility and create a playable resource from it. /// A resource containing the unique id for a song this factory is responsible for. /// The playable resource if successful, or an error message otherwise Task GetResourceById(ResolveContext ctx, AudioResource resource); /// Gets a link to the original site/location. This may differ from the link the resource was orininally created. /// The unique id for a song this factory is responsible for. /// The (close to) original link if successful, null otherwise. string RestoreLink(ResolveContext ctx, AudioResource resource); } } ================================================ FILE: TS3AudioBot/ResourceFactories/ISearchResolver.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using System.Threading.Tasks; namespace TS3AudioBot.ResourceFactories { public interface ISearchResolver : IResolver { Task> Search(ResolveContext ctx, string keyword); } } ================================================ FILE: TS3AudioBot/ResourceFactories/IThumbnailResolver.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.IO; using System.Threading.Tasks; namespace TS3AudioBot.ResourceFactories { public interface IThumbnailResolver : IResolver { Task GetThumbnail(ResolveContext ctx, PlayResource playResource, Func action); } } ================================================ FILE: TS3AudioBot/ResourceFactories/MatchCertainty.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.ResourceFactories { public enum MatchCertainty { /// "Never" denotes that this factory cannot use this link. Never = 0, /// "OnlyIfLast" Only gets selected if no higher match was found. OnlyIfLast, /// "Always" will reserve a link exclusively for all factories which also said "Always". Always, } public static class MatchCertaintyExtensions { public static MatchCertainty ToMatchCertainty(this bool val) => val ? MatchCertainty.Always : MatchCertainty.Never; } } ================================================ FILE: TS3AudioBot/ResourceFactories/MediaResolver.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using PlaylistsNET.Content; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using TS3AudioBot.Config; using TS3AudioBot.Helper; using TS3AudioBot.Localization; using TS3AudioBot.Playlists; using TS3AudioBot.ResourceFactories.AudioTags; namespace TS3AudioBot.ResourceFactories { public sealed class MediaResolver : IResourceResolver, IPlaylistResolver, IThumbnailResolver { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); public string ResolverFor => "media"; public MatchCertainty MatchResource(ResolveContext _, string uri) => File.Exists(uri) ? MatchCertainty.Always : MatchCertainty.OnlyIfLast; public MatchCertainty MatchPlaylist(ResolveContext _, string uri) => Directory.Exists(uri) ? MatchCertainty.Always : File.Exists(uri) ? MatchCertainty.Always : MatchCertainty.OnlyIfLast; public Task GetResource(ResolveContext ctx, string uri) { return GetResourceById(ctx, new AudioResource(uri, null, ResolverFor)); } public async Task GetResourceById(ResolveContext ctx, AudioResource resource) { var resData = await ValidateFromString(ctx.Config, resource.ResourceId); if (resData.IsIcyStream) { resource.ResourceTitle = resData.Title; return new MediaPlayResource(resData.FullUri, resource, null, true); } if (resource.ResourceTitle is null) { if (!string.IsNullOrWhiteSpace(resData.Title)) resource.ResourceTitle = resData.Title; else resource.ResourceTitle = resource.ResourceId; } return new MediaPlayResource(resData.FullUri, resource, resData.Image, false); } public string RestoreLink(ResolveContext _, AudioResource resource) => resource.ResourceId; private Task ValidateFromString(ConfBot config, string uriStr) { var uri = GetUri(config, uriStr); return ValidateUri(uri); } private Task ValidateUri(Uri uri) { if (uri.IsWeb()) return ValidateWeb(uri); if (uri.IsFile()) return Task.Run(() => ValidateFile(uri)); throw Error.LocalStr(strings.error_media_invalid_uri); } private static HeaderData GetStreamHeaderData(Stream stream) { var headerData = AudioTagReader.GetData(stream) ?? new HeaderData(); headerData.Title ??= string.Empty; return headerData; } private static async Task ValidateWeb(Uri link) { try { return await WebWrapper.Request(link).WithHeader("Icy-MetaData", "1").ToAction(async response => { if (response.Headers.GetSingle("icy-metaint") != null) { return new ResData(link.AbsoluteUri, null) { IsIcyStream = true }; } var contentType = response.Headers.GetSingle("ContentType"); if (contentType == "application/vnd.apple.mpegurl" || contentType == "application/vnd.apple.mpegurl.audio") { return new ResData(link.AbsoluteUri, null); // No title meta info } else { using var stream = await response.Content.ReadAsStreamAsync(); var headerData = GetStreamHeaderData(stream); return new ResData(link.AbsoluteUri, headerData.Title) { Image = headerData.Picture }; } }); } catch (Exception ex) { Log.Debug(ex, "Failed to validate song"); throw Error.Exception(ex).LocalStr(strings.error_net_unknown); } } private ResData ValidateFile(Uri foundPath) { try { using var stream = File.Open(foundPath.LocalPath, FileMode.Open, FileAccess.Read, FileShare.Read); var headerData = GetStreamHeaderData(stream); return new ResData(foundPath.LocalPath, headerData.Title) { Image = headerData.Picture }; } catch (UnauthorizedAccessException ex) { throw Error.Exception(ex).LocalStr(strings.error_io_missing_permission); } catch (Exception ex) { Log.Warn(ex, "Failed to load song \"{0}\", because {1}", foundPath.OriginalString, ex.Message); throw Error.Exception(ex).LocalStr(strings.error_io_unknown_error); } } private Uri GetUri(ConfBot conf, string uri) { if (Uri.TryCreate(uri, UriKind.Absolute, out Uri? uriResult)) { return uriResult; } else { Log.Trace("Finding media path: '{0}'", uri); Uri? file = null; if (conf.LocalConfigDir != null) file ??= TryInPath(Path.Combine(conf.LocalConfigDir, BotPaths.Music), uri); file ??= TryInPath(conf.GetParent().Factories.Media.Path.Value, uri); if (file is null) throw Error.LocalStr(strings.error_media_file_not_found); return file; } } private static Uri? TryInPath(string pathPrefix, string file) { try { var musicPathPrefix = Path.GetFullPath(pathPrefix); var fullPath = Path.Combine(musicPathPrefix, file); if (fullPath.StartsWith(musicPathPrefix) && File.Exists(fullPath)) return new Uri(fullPath, UriKind.Absolute); } catch (Exception ex) when (ex is ArgumentException || ex is NotSupportedException || ex is PathTooLongException || ex is System.Security.SecurityException) { Log.Trace(ex, "Couldn't load resource"); } return null; } public async Task GetPlaylist(ResolveContext ctx, string url) { if (Directory.Exists(url)) // TODO rework for security { try { var di = new DirectoryInfo(url); var plist = new Playlist().SetTitle(di.Name); foreach (var file in di.EnumerateFiles()) { try { var val = await ValidateFromString(ctx.Config, file.FullName); var res = new AudioResource(val.FullUri, string.IsNullOrWhiteSpace(val.Title) ? val.FullUri : val.Title, ResolverFor); var addResult = plist.Add(new PlaylistItem(res)); if (!addResult) break; } catch (AudioBotException) { } } return plist; } catch (Exception ex) { Log.Warn("Failed to load playlist \"{0}\", because {1}", url, ex.Message); throw Error.Exception(ex).LocalStr(strings.error_io_unknown_error); } } var uri = GetUri(ctx.Config, url); try { if (uri.IsFile()) { using var stream = File.OpenRead(uri.AbsolutePath); return await GetPlaylistContentAsync(stream, url); } else if (uri.IsWeb()) { return await WebWrapper.Request(uri).ToAction(async response => { var contentType = response.Headers.GetSingle("Content-Type"); int index = url.LastIndexOf('.'); string anyId = index >= 0 ? url.Substring(index) : url; using var stream = await response.Content.ReadAsStreamAsync(); return await GetPlaylistContentAsync(stream, url, contentType); }); } throw Error.LocalStr(strings.error_media_invalid_uri); } catch (Exception ex) { Log.Warn(ex, "Error opening/reading playlist file"); throw Error.Exception(ex).LocalStr(strings.error_io_unknown_error); } } private Task GetPlaylistContentAsync(Stream stream, string url, string? mime = null) => Task.Run(() => GetPlaylistContent(stream, url, mime)); private Playlist GetPlaylistContent(Stream stream, string url, string? mime = null) { string? name = null; List items; mime = mime?.ToLowerInvariant(); url = url.ToLowerInvariant(); string anyId = mime ?? url; switch (anyId) { case ".m3u": case ".m3u8": case "application/mpegurl": case "application/x-mpegurl": case "audio/mpegurl": case "audio/x-mpegurl": case "application/vnd.apple.mpegurl": case "application/vnd.apple.mpegurl.audio": { var parser = new M3uContent(); var list = parser.GetFromStream(stream); items = new List( from e in list.PlaylistEntries select new PlaylistItem(new AudioResource(e.Path, e.Title, ResolverFor))); break; } case ".pls": case "audio/x-scpls": case "application/x-scpls": case "application/pls+xml": { var parser = new PlsContent(); var list = parser.GetFromStream(stream); items = new List( from e in list.PlaylistEntries select new PlaylistItem(new AudioResource(e.Path, e.Title, ResolverFor))); break; } case ".wpl": { var parser = new WplContent(); var list = parser.GetFromStream(stream); items = new List( from e in list.PlaylistEntries select new PlaylistItem(new AudioResource(e.Path, e.TrackTitle, ResolverFor))); name = list.Title; break; } case ".zpl": { var parser = new ZplContent(); var list = parser.GetFromStream(stream); items = new List( from e in list.PlaylistEntries select new PlaylistItem(new AudioResource(e.Path, e.TrackTitle, ResolverFor))); name = list.Title; break; } // ?? case "application/jspf+json": // ?? case "application/xspf+xml": default: throw Error.LocalStr(strings.error_media_file_not_found); // TODO Loc "media not supported" } if (string.IsNullOrEmpty(name)) { var index = url.LastIndexOfAny(new[] { '\\', '/' }); name = index >= 0 ? url.Substring(index) : url; } return new Playlist(items).SetTitle(name); } public async Task GetThumbnail(ResolveContext _, PlayResource playResource, Func action) { byte[]? rawImgData; if (playResource is MediaPlayResource mediaPlayResource) { rawImgData = mediaPlayResource.Image; } else { var uri = new Uri(playResource.PlayUri); if (uri.IsWeb()) rawImgData = await WebWrapper.Request(uri) .ToAction(async response => AudioTagReader.GetData(await response.Content.ReadAsStreamAsync())?.Picture); else if (uri.IsFile()) rawImgData = AudioTagReader.GetData(File.OpenRead(uri.LocalPath))?.Picture; else throw Error.LocalStr(strings.error_media_invalid_uri); } if (rawImgData is null) throw Error.LocalStr(strings.error_media_image_not_found); await action(new MemoryStream(rawImgData)); } public void Dispose() { } } internal class ResData { public string FullUri { get; } public string? Title { get; } public byte[]? Image { get; set; } public bool IsIcyStream { get; set; } = false; public ResData(string fullUri, string? title) { FullUri = fullUri; Title = title; Image = null; } } internal static class MediaExt { public static bool IsWeb(this Uri uri) => uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps; public static bool IsFile(this Uri uri) => uri.Scheme == Uri.UriSchemeFile; } public class MediaPlayResource : PlayResource { public byte[]? Image { get; } public bool IsIcyStream { get; } public MediaPlayResource(string uri, AudioResource baseData, byte[]? image, bool isIcyStream) : base(uri, baseData) { Image = image; IsIcyStream = isIcyStream; } } } ================================================ FILE: TS3AudioBot/ResourceFactories/PlayResource.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using TS3AudioBot.Audio; using TS3AudioBot.CommandSystem.CommandResults; namespace TS3AudioBot.ResourceFactories { public class PlayResource : IAudioResourceResult, IMetaContainer { public AudioResource AudioResource { get; } public string PlayUri { get; } public PlayInfo? PlayInfo { get; set; } public SongInfo? SongInfo { get; set; } public PlayResource(string uri, AudioResource baseData, PlayInfo? playInfo = null, SongInfo? songInfo = null) { AudioResource = baseData; PlayUri = uri; PlayInfo = playInfo; SongInfo = songInfo; } public override string ToString() => AudioResource.ToString(); } } ================================================ FILE: TS3AudioBot/ResourceFactories/ResolveContext.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using TS3AudioBot.Config; using TS3AudioBot.Playlists; namespace TS3AudioBot.ResourceFactories { public class ResolveContext { public ResourceResolver Resolver { get; } public ConfBot Config { get; } public ResolveContext(ResourceResolver resolver, ConfBot config) { Resolver = resolver; Config = config; } public Task Load(AudioResource resource) => Resolver.Load(this, resource); public Task Load(string message, string? audioType = null) => Resolver.Load(this, message, audioType); public Task LoadPlaylistFrom(string message, string? audioType = null) => Resolver.LoadPlaylistFrom(this, message, audioType); public string? RestoreLink(AudioResource res) => Resolver.RestoreLink(this, res); public Task GetThumbnail(PlayResource playResource, Func action) => Resolver.GetThumbnail(this, playResource, action); public Task> Search(string resolverName, string query) => Resolver.Search(this, resolverName, query); } } ================================================ FILE: TS3AudioBot/ResourceFactories/ResourceResolver.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using TS3AudioBot.Config; using TS3AudioBot.Helper; using TS3AudioBot.Localization; using TS3AudioBot.Playlists; using TS3AudioBot.ResourceFactories.Youtube; namespace TS3AudioBot.ResourceFactories { public sealed class ResourceResolver : IDisposable { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private readonly Dictionary allResolvers = new Dictionary(); private readonly List listResolvers = new List(); private readonly List resResolvers = new List(); private readonly List searchResolvers = new List(); public ResourceResolver(ConfFactories conf) { AddResolver(new MediaResolver()); AddResolver(new YoutubeResolver(conf.Youtube)); AddResolver(new SoundcloudResolver()); AddResolver(new TwitchResolver()); AddResolver(new BandcampResolver()); } private T? GetResolverByType(string audioType) where T : class, IResolver => // ToLower for legacy reasons allResolvers.TryGetValue(audioType.ToLowerInvariant(), out var resolver) && resolver is T resolverT ? resolverT : null; private IEnumerable<(IResourceResolver, MatchCertainty)> GetResResolverByLink(ResolveContext ctx, string uri) => from rsv in resResolvers let rsvCertain = rsv.MatchResource(ctx, uri) where rsvCertain != MatchCertainty.Never orderby rsvCertain descending select (rsv, rsvCertain); private IEnumerable<(IPlaylistResolver, MatchCertainty)> GetListResolverByLink(ResolveContext ctx, string uri) => from rsv in listResolvers let rsvCertain = rsv.MatchPlaylist(ctx, uri) where rsvCertain != MatchCertainty.Never orderby rsvCertain descending select (rsv, rsvCertain); private static IEnumerable FilterUsable(IEnumerable<(T, MatchCertainty)> enu) { var highestCertainty = MatchCertainty.Never; foreach (var (rsv, cert) in enu) { if ((highestCertainty == MatchCertainty.Always && cert < MatchCertainty.Always) || (highestCertainty > MatchCertainty.Never && cert <= MatchCertainty.OnlyIfLast)) yield break; yield return rsv; if (cert > highestCertainty) highestCertainty = cert; } } /// Generates a new which can be played. /// An with at least /// and set. /// The playable resource if successful, or an error message otherwise. public async Task Load(ResolveContext ctx, AudioResource resource) { if (resource is null) throw new ArgumentNullException(nameof(resource)); var resolver = GetResolverByType(resource.AudioType); if (resolver is null) throw CouldNotLoad(string.Format(strings.error_resfac_no_registered_factory, resource.AudioType)); try { var sw = Stopwatch.StartNew(); var result = await resolver.GetResourceById(ctx, resource); Log.Debug("Took {0}ms to resolve resource.", sw.ElapsedMilliseconds); return result; } catch (AudioBotException ex) { throw CouldNotLoad(ex.Message); } catch (Exception ex) { Log.Error(ex, "Resource resolver '{0}' threw while trying to resolve '{@resource}'", resolver.ResolverFor, resource); throw CouldNotLoad(strings.error_playmgr_internal_error); } } /// Generates a new which can be played. /// The message used will be cleared of bb-tags. Also lets you pick an /// identifier to optionally select a resolver. /// /// The link/uri to resolve for the resource. /// The associated resource type string to a resolver. /// Leave null to let it detect automatically. /// The playable resource if successful, or an error message otherwise. public async Task Load(ResolveContext ctx, string message, string? audioType = null) { if (string.IsNullOrWhiteSpace(message)) throw new ArgumentNullException(nameof(message)); var netlinkurl = TextUtil.ExtractUrlFromBb(message); if (audioType != null) { var resolver = GetResolverByType(audioType); if (resolver is null) throw CouldNotLoad(string.Format(strings.error_resfac_no_registered_factory, audioType)); return await resolver.GetResource(ctx, netlinkurl); } var resolvers = FilterUsable(GetResResolverByLink(ctx, netlinkurl)); List<(string, AudioBotException)>? errors = null; foreach (var resolver in resolvers) { try { var sw = Stopwatch.StartNew(); var result = await resolver.GetResource(ctx, netlinkurl); Log.Debug("Took {0}ms to resolve resource.", sw.ElapsedMilliseconds); return result; } catch (AudioBotException ex) { (errors ??= new List<(string, AudioBotException)>()).Add((resolver.ResolverFor, ex)); Log.Trace("Resolver {0} failed, result: {1}", resolver.ResolverFor, ex.Message); } } throw ToErrorString(errors); } public async Task LoadPlaylistFrom(ResolveContext ctx, string message, string? audioType = null) { if (string.IsNullOrWhiteSpace(message)) throw new ArgumentNullException(nameof(message)); string netlinkurl = TextUtil.ExtractUrlFromBb(message); if (audioType != null) { var resolver = GetResolverByType(audioType); if (resolver is null) throw CouldNotLoad(string.Format(strings.error_resfac_no_registered_factory, audioType)); try { return await resolver.GetPlaylist(ctx, netlinkurl); } catch (AudioBotException ex) { throw CouldNotLoad(ex.Message); } } var resolvers = FilterUsable(GetListResolverByLink(ctx, netlinkurl)); List<(string, AudioBotException)>? errors = null; foreach (var resolver in resolvers) { try { return await resolver.GetPlaylist(ctx, netlinkurl); } catch (AudioBotException ex) { (errors ??= new List<(string, AudioBotException)>()).Add((resolver.ResolverFor, ex)); Log.Trace("Resolver {0} failed, result: {1}", resolver.ResolverFor, ex.Message); } } throw ToErrorString(errors); } public string? RestoreLink(ResolveContext ctx, AudioResource res) { var resolver = GetResolverByType(res.AudioType); if (resolver is null) { Log.Debug("ResourceFactory for '{0}' not found", res.AudioType); return null; } try { return resolver.RestoreLink(ctx, res); } catch (AudioBotException ex) { Log.Error(ex, "Error resolving link ({0})", res); return null; } } public async Task GetThumbnail(ResolveContext ctx, PlayResource playResource, Func action) { var resolver = GetResolverByType(playResource.AudioResource.AudioType); if (resolver is null) throw Error.LocalStr(string.Format(strings.error_resfac_no_registered_factory, playResource.AudioResource.AudioType)); var sw = Stopwatch.StartNew(); await resolver.GetThumbnail(ctx, playResource, action); Log.Debug("Took {0}ms to load thumbnail.", sw.ElapsedMilliseconds); } public async Task> Search(ResolveContext ctx, string resolverName, string query) { var resolver = GetResolverByType(resolverName); if (resolver is null) throw CouldNotLoad(string.Format(strings.error_resfac_no_registered_factory, resolverName)); return await resolver.Search(ctx, query); } public void AddResolver(IResolver resolver) { if (resolver.ResolverFor.ToLowerInvariant() != resolver.ResolverFor) throw new ArgumentException($"The resolver audio type \"{nameof(IResolver.ResolverFor)}\" must be in lower case.", nameof(resolver)); if (allResolvers.ContainsKey(resolver.ResolverFor)) throw new ArgumentException("A resolver for this type already has been registered.", nameof(resolver)); if (resolver is IResourceResolver resResolver) { resResolvers.Add(resResolver); } if (resolver is IPlaylistResolver listResolver) { listResolvers.Add(listResolver); } if (resolver is ISearchResolver searchResolver) { searchResolvers.Add(searchResolver); } allResolvers.Add(resolver.ResolverFor, resolver); } public void RemoveResolver(IResolver Resolver) { if (!allResolvers.Remove(Resolver.ResolverFor)) return; if (Resolver is IResourceResolver resResolver) resResolvers.Remove(resResolver); if (Resolver is IPlaylistResolver listResolver) listResolvers.Remove(listResolver); if (Resolver is ISearchResolver searchResolver) searchResolvers.Remove(searchResolver); } private static AudioBotException CouldNotLoad(string? reason = null) { if (reason is null) return Error.LocalStr(strings.error_resfac_could_not_load); var strb = new StringBuilder(strings.error_resfac_could_not_load); strb.Append(" (").Append(reason).Append(")"); return Error.LocalStr(strb.ToString()); } private static AudioBotException ToErrorString(List<(string rsv, AudioBotException err)>? errors) { if (errors is null || errors.Count == 0) throw new ArgumentException("No errors provided", nameof(errors)); if (errors.Count == 1) return CouldNotLoad($"{errors[0].rsv}: {errors[0].err.Message}"); return CouldNotLoad(strings.error_resfac_multiple_factories_failed); } public void Dispose() { foreach (var resolver in allResolvers.Values) resolver.Dispose(); allResolvers.Clear(); } } } ================================================ FILE: TS3AudioBot/ResourceFactories/SongInfo.cs ================================================ using System; namespace TS3AudioBot.ResourceFactories { public class SongInfo { public string? Title { get; set; } public string? Track { get; set; } public string? Artist { get; set; } public TimeSpan? Length { get; set; } } } ================================================ FILE: TS3AudioBot/ResourceFactories/SoundcloudResolver.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Globalization; using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; using TS3AudioBot.Helper; using TS3AudioBot.Localization; using TS3AudioBot.Playlists; namespace TS3AudioBot.ResourceFactories { public sealed class SoundcloudResolver : IResourceResolver, IPlaylistResolver, IThumbnailResolver { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private static readonly Regex SoundcloudLink = new Regex(@"^https?\:\/\/(www\.)?soundcloud\.", Util.DefaultRegexConfig); private const string SoundcloudClientId = "a9dd3403f858e105d7e266edc162a0c5"; private const string AddArtist = "artist"; private const string AddTrack = "track"; public string ResolverFor => "soundcloud"; public MatchCertainty MatchResource(ResolveContext? _, string uri) => SoundcloudLink.IsMatch(uri).ToMatchCertainty(); public MatchCertainty MatchPlaylist(ResolveContext? _, string uri) => MatchResource(null, uri); public async Task GetResource(ResolveContext? _, string uri) { JsonTrackInfo? track = null; try { track = await WebWrapper .Request($"https://api.soundcloud.com/resolve.json?url={Uri.EscapeUriString(uri)}&client_id={SoundcloudClientId}") .AsJson(); } catch (Exception ex) { Log.Debug(ex, "Failed to get via api"); } if (track is null) { if (!SoundcloudLink.IsMatch(uri)) throw Error.LocalStr(strings.error_media_invalid_uri); return await YoutubeDlWrappedAsync(uri); } var resource = CheckAndGet(track); if (resource is null) throw Error.LocalStr(strings.error_media_internal_missing + " (parsedDict)"); return await GetResourceById(resource, false); } public Task GetResourceById(ResolveContext _, AudioResource resource) => GetResourceById(resource, true); private async Task GetResourceById(AudioResource resource, bool allowNullName) { if (SoundcloudLink.IsMatch(resource.ResourceId)) return await GetResource(null, resource.ResourceId); if (resource.ResourceTitle is null) { if (!allowNullName) throw Error.LocalStr(strings.error_media_internal_missing + " (title)"); string link = RestoreLink(null, resource); if (link is null) throw Error.LocalStr(strings.error_media_internal_missing + " (link)"); return await GetResource(null, link); } string finalRequest = $"https://api.soundcloud.com/tracks/{resource.ResourceId}/stream?client_id={SoundcloudClientId}"; return new PlayResource(finalRequest, resource); } public string RestoreLink(ResolveContext? _, AudioResource resource) { var artistName = resource.Get(AddArtist); var trackName = resource.Get(AddTrack); if (artistName != null && trackName != null) return $"https://soundcloud.com/{artistName}/{trackName}"; return "https://soundcloud.com"; } private AudioResource? CheckAndGet(JsonTrackInfo track) { if (track == null || track.id == 0 || track.title == null || track.permalink == null || track.user?.permalink == null) { Log.Debug("Parts of track response are empty: {@json}", track); return null; } return new AudioResource( track.id.ToString(CultureInfo.InvariantCulture), track.title, ResolverFor) .Add(AddArtist, track.user.permalink) .Add(AddTrack, track.permalink); } private async Task YoutubeDlWrappedAsync(string link) { Log.Debug("Falling back to youtube-dl!"); var response = await YoutubeDlHelper.GetSingleVideo(link); var title = response.title ?? $"Soundcloud-{link}"; var format = YoutubeDlHelper.FilterBest(response.formats); var url = format?.url; if (string.IsNullOrEmpty(url)) throw Error.LocalStr(strings.error_ytdl_empty_response); Log.Debug("youtube-dl succeeded!"); return new PlayResource(url, new AudioResource(link, title, ResolverFor)); } public async Task GetPlaylist(ResolveContext _, string url) { var playlist = await WebWrapper .Request($"https://api.soundcloud.com/resolve.json?url={Uri.EscapeUriString(url)}&client_id={SoundcloudClientId}") .AsJson(); if (playlist is null || playlist.title is null || playlist.tracks is null) { Log.Debug("Parts of playlist response are empty: {@json}", playlist); throw Error.LocalStr(strings.error_media_internal_missing + " (playlist)"); } var plist = new Playlist().SetTitle(playlist.title); plist.AddRange( playlist.tracks.Select(track => { var resource = CheckAndGet(track); if (resource is null) return null!; return new PlaylistItem(resource); }) .Where(track => track != null) ); return plist; } public async Task GetThumbnail(ResolveContext _, PlayResource playResource, Func action) { var thumb = await WebWrapper .Request($"https://api.soundcloud.com/tracks/{playResource.AudioResource.ResourceId}?client_id={SoundcloudClientId}") .AsJson(); if (thumb is null) throw Error.LocalStr(strings.error_media_internal_missing + " (thumb)"); if (thumb.artwork_url is null) throw Error.LocalStr(strings.error_media_internal_missing + " (artwork_url)"); // t500x500: 500px×500px // crop : 400px×400px // t300x300: 300px×300px // large : 100px×100px await WebWrapper.Request(thumb.artwork_url.Replace("-large", "-t300x300")).ToStream(action); } public void Dispose() { } #pragma warning disable CS0649, CS0169, IDE1006 // ReSharper disable ClassNeverInstantiated.Local, InconsistentNaming private class JsonTrackInfo { public int id { get; set; } public string? title { get; set; } public string? permalink { get; set; } public JsonTrackUser? user { get; set; } } private class JsonTrackUser { public string? permalink { get; set; } } private class JsonPlaylist { public string? title { get; set; } public JsonTrackInfo[]? tracks { get; set; } } private class JsonTumbnailMinimal { public string? artwork_url { get; set; } } // ReSharper enable ClassNeverInstantiated.Local, InconsistentNaming #pragma warning restore CS0649, CS0169, IDE1006 } } ================================================ FILE: TS3AudioBot/ResourceFactories/TwitchResolver.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Globalization; using System.Text.RegularExpressions; using System.Threading.Tasks; using TS3AudioBot.Helper; using TS3AudioBot.Localization; namespace TS3AudioBot.ResourceFactories { public sealed class TwitchResolver : IResourceResolver { private static readonly Regex TwitchMatch = new Regex(@"^(https?://)?(www\.)?twitch\.tv/(\w+)", Util.DefaultRegexConfig); private static readonly Regex M3U8ExtMatch = new Regex(@"#([\w-]+)(:(([\w-]+)=(""[^""]*""|[^,]+),?)*)?", Util.DefaultRegexConfig); //private const string TwitchClientId = "t9nlhlxnfux3gk2d6z1p093rj2c71i3"; // See: https://github.com/streamlink/streamlink/issues/2680 private const string TwitchClientIdPrivate = "kimne78kx3ncx6brgo4mv6wki5h1ko"; public string ResolverFor => "twitch"; public MatchCertainty MatchResource(ResolveContext _, string uri) => TwitchMatch.IsMatch(uri).ToMatchCertainty(); public async Task GetResource(ResolveContext _, string uri) { var match = TwitchMatch.Match(uri); if (!match.Success) throw Error.LocalStr(strings.error_media_invalid_uri); return await GetResourceById(null, new AudioResource(match.Groups[3].Value, null, ResolverFor)); } public async Task GetResourceById(ResolveContext? _, AudioResource resource) { var channel = resource.ResourceId; // request api token var access = await WebWrapper .Request($"https://api.twitch.tv/api/channels/{channel}/access_token") .WithHeader("Client-ID", TwitchClientIdPrivate) .AsJson(); // request m3u8 file if (access is null || access.token is null || access.sig is null) throw Error.LocalStr(strings.error_media_internal_invalid + " (tokenResult|sigResult)"); var token = Uri.EscapeUriString(access.token); var sig = access.sig; // guaranteed to be random, chosen by fair dice roll. const int random = 4; var m3u8 = await WebWrapper .Request($"http://usher.twitch.tv/api/channel/hls/{channel}.m3u8?player=twitchweb&&token={token}&sig={sig}&allow_audio_only=true&allow_source=true&type=any&p={random}") .AsString(); // parse m3u8 file var dataList = new List(); using (var reader = new System.IO.StringReader(m3u8)) { var header = reader.ReadLine(); if (string.IsNullOrEmpty(header) || header != "#EXTM3U") throw Error.LocalStr(strings.error_media_internal_missing + " (m3uHeader)"); while (true) { var blockInfo = reader.ReadLine(); if (string.IsNullOrEmpty(blockInfo)) break; var match = M3U8ExtMatch.Match(blockInfo); if (!match.Success) continue; switch (match.Groups[1].Value) { case "EXT-X-TWITCH-INFO": break; // Ignore twitch info line case "EXT-X-MEDIA": string? streamInfo = reader.ReadLine(); Match infoMatch; if (string.IsNullOrEmpty(streamInfo) || !(infoMatch = M3U8ExtMatch.Match(streamInfo)).Success || infoMatch.Groups[1].Value != "EXT-X-STREAM-INF") { throw Error.LocalStr(strings.error_media_internal_missing + " (m3uStream)"); } var streamData = new StreamData(); // #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=128000,CODECS="mp4a.40.2",VIDEO="audio_only" for (int i = 0; i < infoMatch.Groups[3].Captures.Count; i++) { string key = infoMatch.Groups[4].Captures[i].Value.ToUpperInvariant(); string value = infoMatch.Groups[5].Captures[i].Value; switch (key) { case "BANDWIDTH": streamData.Bandwidth = int.Parse(value, CultureInfo.InvariantCulture); break; case "CODECS": streamData.Codec = TextUtil.StripQuotes(value); break; case "VIDEO": streamData.QualityType = Enum.TryParse(TextUtil.StripQuotes(value), out StreamQuality quality) ? quality : StreamQuality.unknown; break; } } streamData.Url = reader.ReadLine(); dataList.Add(streamData); break; } } } // Validation Process if (dataList.Count <= 0) throw Error.LocalStr(strings.error_media_no_stream_extracted); int codec = SelectStream(dataList); if (codec < 0) throw Error.LocalStr(strings.error_media_no_stream_extracted); var selectedStream = dataList[codec]; if (selectedStream.Url == null) throw Error.LocalStr(strings.error_media_no_stream_extracted); if (resource.ResourceTitle == null) resource.ResourceTitle = $"Twitch channel: {channel}"; return new PlayResource(selectedStream.Url, resource); } private static int SelectStream(List list) => list.FindIndex(s => s.QualityType == StreamQuality.audio_only); public string RestoreLink(ResolveContext _, AudioResource resource) => "https://www.twitch.tv/" + resource.ResourceId; public void Dispose() { } #pragma warning disable IDE1006 // Naming Styles private class JsonAccessToken { public string? token { get; set; } public string? sig { get; set; } public DateTime expires_at { get; set; } } #pragma warning restore IDE1006 // Naming Styles } public sealed class StreamData { public StreamQuality QualityType { get; set; } public int Bandwidth { get; set; } public string? Codec { get; set; } public string? Url { get; set; } } public enum StreamQuality { unknown, chunked, high, medium, low, mobile, audio_only, } } ================================================ FILE: TS3AudioBot/ResourceFactories/Youtube/Json.cs ================================================ namespace TS3AudioBot.ResourceFactories.Youtube { #pragma warning disable CS0649, CS0169, IDE1006 // ReSharper disable ClassNeverInstantiated.Local, InconsistentNaming public class JsonVideoListResponse // # youtube#videoListResponse { public string? nextPageToken { get; set; } public JsonVideo[]? items { get; set; } } public class JsonVideo // youtube#video { public JsonContentDetails? contentDetails { get; set; } public JsonSnippet? snippet { get; set; } } public class JsonSearchListResponse // youtube#searchListResponse { public JsonSearchResult[]? items { get; set; } } public class JsonSearchResult // youtube#searchResult { public JsonContentDetails? id { get; set; } public JsonSnippet? snippet { get; set; } } public class JsonContentDetails { public string? videoId { get; set; } } public class JsonSnippet { public string? title { get; set; } public JsonThumbnailList? thumbnails { get; set; } } public class JsonThumbnailList { public JsonThumbnail? @default { get; set; } public JsonThumbnail? medium { get; set; } public JsonThumbnail? high { get; set; } public JsonThumbnail? standard { get; set; } public JsonThumbnail? maxres { get; set; } } public class JsonThumbnail { public string? url { get; set; } public int heigth { get; set; } public int width { get; set; } } // Custom json public class JsonPlayerResponse { public JsonStreamingData? streamingData { get; set; } public JsonVideoDetails? videoDetails { get; set; } } public class JsonStreamingData { public string? dashManifestUrl { get; set; } public string? hlsManifestUrl { get; set; } } public class JsonVideoDetails { public string? title { get; set; } public bool? isLive { get; set; } public bool useCipher { get; set; } public bool isLiveContent { get; set; } } public class JsonPlayFormat { public string? mimeType { get; set; } public int bitrate { get; set; } public string? cipher { get; set; } public string? url { get; set; } } // ReSharper enable ClassNeverInstantiated.Local, InconsistentNaming #pragma warning restore CS0649, CS0169, IDE1006 } ================================================ FILE: TS3AudioBot/ResourceFactories/Youtube/LoaderPriority.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.ResourceFactories.Youtube { public enum LoaderPriority { Internal, YoutubeDl } } ================================================ FILE: TS3AudioBot/ResourceFactories/Youtube/VideoCodec.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.ResourceFactories.Youtube { public enum VideoCodec { Unknown, Mp4, M4A, Webm, Flv, ThreeGp, } } ================================================ FILE: TS3AudioBot/ResourceFactories/Youtube/VideoData.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.ResourceFactories.Youtube { public sealed class VideoData { public VideoData(string link, string qualitydesciption, VideoCodec codec, bool audioOnly = false, bool videoOnly = false) { Link = link; Qualitydesciption = qualitydesciption; Codec = codec; AudioOnly = audioOnly; VideoOnly = videoOnly; } public string Link { get; } public string Qualitydesciption { get; } public VideoCodec Codec { get; } public bool AudioOnly { get; } public bool VideoOnly { get; } public override string ToString() => $"{Qualitydesciption} @ {Codec} - {Link}"; } } ================================================ FILE: TS3AudioBot/ResourceFactories/Youtube/YoutubeResolver.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; using TS3AudioBot.Audio; using TS3AudioBot.Config; using TS3AudioBot.Helper; using TS3AudioBot.Localization; using TS3AudioBot.Playlists; using TS3AudioBot.ResourceFactories.AudioTags; using TSLib.Helper; namespace TS3AudioBot.ResourceFactories.Youtube { public sealed class YoutubeResolver : IResourceResolver, IPlaylistResolver, IThumbnailResolver, ISearchResolver { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private static readonly Regex IdMatch = new Regex(@"(?:(?:&|\?)v=|youtu\.be\/)([\w\-_]{11})", Util.DefaultRegexConfig); private static readonly Regex YtTimestampMatch = new Regex(@"(?:&|\?)t=(\d+)", Util.DefaultRegexConfig); private static readonly Regex LinkMatch = new Regex(@"^(https?\:\/\/)?(www\.|m\.)?(youtube\.|youtu\.be)", Util.DefaultRegexConfig); private static readonly Regex ListMatch = new Regex(@"(&|\?)list=([\w\-_]+)", Util.DefaultRegexConfig); private static readonly Regex StreamCodecMatch = new Regex(@"CODECS=""([^""]*)""", Util.DefaultRegexConfig); private static readonly Regex StreamBitrateMatch = new Regex(@"BANDWIDTH=(\d+)", Util.DefaultRegexConfig); private string YoutubeProjectId => conf.ApiKey.Value; private readonly ConfResolverYoutube conf; public YoutubeResolver(ConfResolverYoutube conf) { this.conf = conf; } public string ResolverFor => "youtube"; public MatchCertainty MatchResource(ResolveContext? _, string uri) => LinkMatch.IsMatch(uri) || IdMatch.IsMatch(uri) ? MatchCertainty.Always : MatchCertainty.Never; public MatchCertainty MatchPlaylist(ResolveContext? _, string uri) => ListMatch.IsMatch(uri) ? MatchCertainty.Always : MatchCertainty.Never; public async Task GetResource(ResolveContext? _, string uri) { Match matchYtId = IdMatch.Match(uri); if (!matchYtId.Success) throw Error.LocalStr(strings.error_media_failed_to_parse_id); var play = await GetResourceById(null, new AudioResource(matchYtId.Groups[1].Value, null, ResolverFor)); Match matchTimestamp = YtTimestampMatch.Match(uri); if (matchYtId.Success && int.TryParse(matchTimestamp.Groups[1].Value, out var secs)) { play.PlayInfo ??= new PlayInfo(); play.PlayInfo.StartOffset = TimeSpan.FromSeconds(secs); } return play; } public async Task GetResourceById(ResolveContext? _, AudioResource resource) { var priority = conf.ResolverPriority.Value; switch (priority) { case LoaderPriority.Internal: try { return await ResolveResourceInternal(resource); } catch (AudioBotException) { goto case LoaderPriority.YoutubeDl; } case LoaderPriority.YoutubeDl: return await YoutubeDlWrapped(resource); default: throw Tools.UnhandledDefault(priority); } } private async Task ResolveResourceInternal(AudioResource resource) { var resulthtml = await WebWrapper.Request($"https://www.youtube.com/get_video_info?video_id={resource.ResourceId}").AsString(); var videoTypes = new List(); var dataParse = ParseQueryString(resulthtml); if (dataParse.TryGetValue("player_response", out var playerData)) { var parsed = JsonConvert.DeserializeObject(playerData[0]); Log.Debug("Extracted data: {@playerData}", parsed); if (parsed?.videoDetails != null) { resource.ResourceTitle ??= parsed.videoDetails.title; bool isLive = parsed.videoDetails.isLive ?? false; if (isLive && parsed.streamingData?.hlsManifestUrl != null) { return await ParseLiveData(resource, parsed.streamingData.hlsManifestUrl); } else if (isLive) { Log.Warn("Live stream without hls stream data"); } ParsePlayerData(parsed, videoTypes); } } if (dataParse.TryGetValue("url_encoded_fmt_stream_map", out var videoDataUnsplit)) ParseEncodedFmt(videoDataUnsplit, videoTypes); if (dataParse.TryGetValue("adaptive_fmts", out videoDataUnsplit)) ParseAdaptiveFmt(videoDataUnsplit, videoTypes); // Validation Process if (videoTypes.Count <= 0) throw Error.LocalStr(strings.error_media_no_stream_extracted); int codec = SelectStream(videoTypes); if (codec < 0) throw Error.LocalStr(strings.error_media_no_stream_extracted); await ValidateMedia(videoTypes[codec]); resource.ResourceTitle ??= $""; return new PlayResource(videoTypes[codec].Link, resource); } private static async Task ParseLiveData(AudioResource resource, string requestUrl) { List? webList = null; try { webList = await WebWrapper.Request(requestUrl).ToAction(async response => await M3uReader.TryGetData(await response.Content.ReadAsStreamAsync()) ); } catch (Exception ex) { throw Error.Exception(ex).LocalStr(strings.error_media_internal_invalid); } const string AacHe = "mp4a.40.5"; const string AacLc = "mp4a.40.2"; var streamPref = from item in webList let codecs = item.StreamMeta != null ? StreamCodecMatch.Match(item.StreamMeta).Groups[1].Value : "" let codecPref = codecs.Contains(AacLc) ? 0 : codecs.Contains(AacHe) ? 1 : 2 let bitrate = item.StreamMeta != null ? int.Parse(StreamBitrateMatch.Match(item.StreamMeta).Groups[1].Value) : int.MaxValue orderby codecPref, bitrate ascending select item; var streamSelect = streamPref.FirstOrDefault(); if (streamSelect is null) throw Error.LocalStr(strings.error_media_no_stream_extracted); return new PlayResource(streamSelect.TrackUrl, resource); } private static void ParsePlayerData(JsonPlayerResponse data, List videoTypes) { // TODO } private static void ParseEncodedFmt(List videoDataUnsplit, List videoTypes) { if (videoDataUnsplit.Count == 0) return; string[] videoData = videoDataUnsplit[0].Split(','); foreach (string vdat in videoData) { var videoparse = ParseQueryString(vdat); if (!videoparse.TryGetValue("url", out var vLink)) continue; if (!videoparse.TryGetValue("type", out var vType)) continue; if (!videoparse.TryGetValue("quality", out var vQuality)) continue; var vt = new VideoData(vLink[0], vQuality[0], GetCodec(vType[0])); videoTypes.Add(vt); } } private static void ParseAdaptiveFmt(List videoDataUnsplit, List videoTypes) { if (videoDataUnsplit.Count == 0) return; string[] videoData = videoDataUnsplit[0].Split(','); foreach (string vdat in videoData) { var videoparse = ParseQueryString(vdat); if (!videoparse.TryGetValue("type", out var vTypeArr)) continue; var vType = vTypeArr[0]; bool audioOnly = false; if (vType.StartsWith("video/", StringComparison.Ordinal)) continue; else if (vType.StartsWith("audio/", StringComparison.Ordinal)) audioOnly = true; if (!videoparse.TryGetValue("url", out var vLink)) continue; var vt = new VideoData(vLink[0], vType, GetCodec(vType), audioOnly, !audioOnly); videoTypes.Add(vt); } } public string RestoreLink(ResolveContext _, AudioResource resource) => "https://youtu.be/" + resource.ResourceId; private static int SelectStream(List list) { if (Log.IsTraceEnabled) { var dbg = new System.Text.StringBuilder("YT avail codecs: "); foreach (var yd in list) dbg.Append(yd.Qualitydesciption).Append(" @ ").Append(yd.Codec).Append(", "); Log.Trace("{0}", dbg); } int autoselectIndex = list.FindIndex(t => t.Codec == VideoCodec.M4A); if (autoselectIndex == -1) autoselectIndex = list.FindIndex(t => t.AudioOnly); if (autoselectIndex == -1) autoselectIndex = list.FindIndex(t => !t.VideoOnly); return autoselectIndex; } private static Task ValidateMedia(VideoData media) => WebWrapper.Request(media.Link).Send(); private static VideoCodec GetCodec(string type) { string lowtype = type.ToLowerInvariant(); bool audioOnly = false; string codecSubStr; if (lowtype.StartsWith("video/", StringComparison.Ordinal)) { codecSubStr = lowtype.Substring("video/".Length); } else if (lowtype.StartsWith("audio/", StringComparison.Ordinal)) { codecSubStr = lowtype.Substring("audio/".Length); audioOnly = true; } else return VideoCodec.Unknown; int codecEnd = codecSubStr.IndexOf(';'); var extractedCodec = codecEnd >= 0 ? codecSubStr.Substring(0, codecEnd) : codecSubStr; switch (extractedCodec) { case "mp4": if (audioOnly) return VideoCodec.M4A; return VideoCodec.Mp4; case "x-flv": return VideoCodec.Flv; case "3gpp": return VideoCodec.ThreeGp; case "webm": return VideoCodec.Webm; default: return VideoCodec.Unknown; } } public async Task GetPlaylist(ResolveContext _, string url) { Match matchYtId = ListMatch.Match(url); if (!matchYtId.Success) throw Error.LocalStr(strings.error_media_failed_to_parse_id); string id = matchYtId.Groups[2].Value; if (string.IsNullOrEmpty(YoutubeProjectId)) return await GetPlaylistYoutubeDl(id, url); else return await GetPlaylistYoutubeApi(id); } private async Task GetPlaylistYoutubeApi(string id) { var plist = new Playlist().SetTitle(id); string? nextToken = null; do { var parsed = await WebWrapper.Request("https://www.googleapis.com/youtube/v3/playlistItems" + "?part=contentDetails,snippet" + "&fields=" + Uri.EscapeDataString("items(contentDetails/videoId,snippet/title),nextPageToken") + "&maxResults=50" + "&playlistId=" + id + (nextToken != null ? "&pageToken=" + nextToken : string.Empty) + "&key=" + YoutubeProjectId).AsJson(); var videoItems = parsed.items; if (!plist.AddRange( videoItems.Select(item => new PlaylistItem( new AudioResource( item.contentDetails?.videoId ?? throw new NullReferenceException("item.contentDetails.videoId was null"), item.snippet?.title, ResolverFor ) ) ) )) break; nextToken = parsed.nextPageToken; } while (nextToken != null); return plist; } private async Task GetPlaylistYoutubeDl(string id, string url) { var plistData = await YoutubeDlHelper.GetPlaylistAsync(url); var plist = new Playlist().SetTitle(plistData.title ?? $"youtube-{id}"); plist.AddRange(plistData.entries .Where(entry => entry.id != null) .Select(entry => new PlaylistItem( new AudioResource( entry.id!, entry.title, ResolverFor ) ))); return plist; } private static async Task YoutubeDlWrapped(AudioResource resource) { Log.Debug("Falling back to youtube-dl!"); var response = await YoutubeDlHelper.GetSingleVideo(resource.ResourceId); resource.ResourceTitle = response.AutoTitle ?? $"Youtube-{resource.ResourceId}"; var songInfo = YoutubeDlHelper.MapToSongInfo(response); var format = YoutubeDlHelper.FilterBest(response.formats); var url = format?.url; if (string.IsNullOrEmpty(url)) throw Error.LocalStr(strings.error_ytdl_empty_response); Log.Debug("youtube-dl succeeded!"); return new PlayResource(url, resource, songInfo: songInfo); } public static Dictionary> ParseQueryString(string requestQueryString) { var rc = new Dictionary>(); string[] ar1 = requestQueryString.Split('&', '?'); foreach (string row in ar1) { if (string.IsNullOrEmpty(row)) continue; int index = row.IndexOf('='); if (index < 0) continue; var param = Uri.UnescapeDataString(row.Substring(0, index).Replace('+', ' ')); var list = rc.GetOrNew(param); list.Add(Uri.UnescapeDataString(row.Substring(index + 1).Replace('+', ' '))); } return rc; } public Task GetThumbnail(ResolveContext _, PlayResource playResource, Func action) { // default : 120px/ 90px /default.jpg // medium : 320px/180px /mqdefault.jpg // high : 480px/360px /hqdefault.jpg // standard : 640px/480px /sddefault.jpg // maxres : 1280px/720px /maxresdefault.jpg return WebWrapper .Request($"https://i.ytimg.com/vi/{playResource.AudioResource.ResourceId}/mqdefault.jpg") .ToStream(action); } public async Task> Search(ResolveContext _, string keyword) { if (string.IsNullOrEmpty(YoutubeProjectId)) return await SearchYoutubeDlAsync(keyword); else return await SearchYoutubeApi(keyword); } public async Task> SearchYoutubeApi(string keyword) { const int maxResults = 10; var parsed = await WebWrapper.Request( "https://www.googleapis.com/youtube/v3/search" + "?part=snippet" + "&fields=" + Uri.EscapeDataString("items(id/videoId,snippet(channelTitle,title))") + "&type=video" + "&safeSearch=none" + "&q=" + Uri.EscapeDataString(keyword) + "&maxResults=" + maxResults + "&key=" + YoutubeProjectId).AsJson(); return parsed.items.Select(item => new AudioResource( item.id?.videoId ?? throw new NullReferenceException("item.id.videoId was null"), item.snippet?.title, ResolverFor)).ToArray(); } public async Task> SearchYoutubeDlAsync(string keyword) { var search = await YoutubeDlHelper.GetSearchAsync(keyword); return search.entries .Where(entry => entry.id != null) .Select(entry => new AudioResource( entry.id!, entry.title, ResolverFor )).ToArray(); } public void Dispose() { } } } ================================================ FILE: TS3AudioBot/ResourceFactories/YoutubeDlHelper.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; using TS3AudioBot.Config; using TS3AudioBot.Helper; using TS3AudioBot.Localization; namespace TS3AudioBot.ResourceFactories { public static class YoutubeDlHelper { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); public static ConfPath? DataObj { private get; set; } private static string? YoutubeDlPath => DataObj?.Path.Value; private const string ParamGetSingleVideo = " --no-warnings --dump-json --id --"; private const string ParamGetPlaylist = "--no-warnings --yes-playlist --flat-playlist --dump-single-json --id --"; private const string ParamGetSearch = "--no-warnings --flat-playlist --dump-single-json -- ytsearch10:"; public static async Task GetSingleVideo(string id) { var ytdlPath = FindYoutubeDl(); if (ytdlPath is null) throw Error.LocalStr(strings.error_ytdl_not_found); var param = $"{ytdlPath.Value.param}{ParamGetSingleVideo} {id}"; return await RunYoutubeDl(ytdlPath.Value.ytdlpath, param); } public static async Task GetPlaylistAsync(string url) { var ytdlPath = FindYoutubeDl(); if (ytdlPath is null) throw Error.LocalStr(strings.error_ytdl_not_found); var param = $"{ytdlPath.Value.param}{ParamGetPlaylist} {url}"; return await RunYoutubeDl(ytdlPath.Value.ytdlpath, param); } public static async Task GetSearchAsync(string text) { var ytdlPath = FindYoutubeDl(); if (ytdlPath is null) throw Error.LocalStr(strings.error_ytdl_not_found); var param = $"{ytdlPath.Value.param}{ParamGetSearch}\"{text}\""; return await RunYoutubeDl(ytdlPath.Value.ytdlpath, param); } public static (string ytdlpath, string param)? FindYoutubeDl() { var youtubeDlPath = YoutubeDlPath; if (string.IsNullOrEmpty(youtubeDlPath)) { // Default path youtube-dl is suggesting to install const string defaultYtDlPath = "/usr/local/bin/youtube-dl"; if (File.Exists(defaultYtDlPath)) return (defaultYtDlPath, ""); // Default path most package managers install to const string defaultPkgManPath = "/usr/bin/youtube-dl"; if (File.Exists(defaultPkgManPath)) return (defaultPkgManPath, ""); youtubeDlPath = Directory.GetCurrentDirectory(); } string fullCustomPath; try { fullCustomPath = Path.GetFullPath(youtubeDlPath); } catch (ArgumentException ex) { Log.Warn(ex, "Your youtube-dl path may contain invalid characters"); return null; } // Example: /home/teamspeak/youtube-dl where 'youtube-dl' is the binary if (File.Exists(fullCustomPath) || File.Exists(fullCustomPath + ".exe")) return (fullCustomPath, ""); // Example: /home/teamspeak where the binary 'youtube-dl' lies in ./teamspeak/ string fullCustomPathWithoutFile = Path.Combine(fullCustomPath, "youtube-dl"); if (File.Exists(fullCustomPathWithoutFile) || File.Exists(fullCustomPathWithoutFile + ".exe")) return (fullCustomPathWithoutFile, ""); // Example: /home/teamspeak/youtube-dl where 'youtube-dl' is the github project folder string fullCustomPathGhProject = Path.Combine(fullCustomPath, "youtube_dl", "__main__.py"); if (File.Exists(fullCustomPathGhProject)) return ("python", $"\"{fullCustomPathGhProject}\""); return null; } public static async Task RunYoutubeDl(string path, string args) where T : notnull { try { bool stdOutDone = false; var stdOut = new StringBuilder(); var stdErr = new StringBuilder(); using var tmproc = new Process(); tmproc.StartInfo.FileName = path; tmproc.StartInfo.Arguments = args; tmproc.StartInfo.UseShellExecute = false; tmproc.StartInfo.CreateNoWindow = true; tmproc.StartInfo.RedirectStandardOutput = true; tmproc.StartInfo.RedirectStandardError = true; tmproc.EnableRaisingEvents = true; tmproc.Start(); tmproc.OutputDataReceived += (s, e) => { if (e.Data is null) stdOutDone = true; else stdOut.Append(e.Data); }; tmproc.ErrorDataReceived += (s, e) => stdErr.Append(e.Data); tmproc.BeginOutputReadLine(); tmproc.BeginErrorReadLine(); await tmproc.WaitForExitAsync(TimeSpan.FromSeconds(20)); if (!tmproc.HasExitedSafe()) { try { tmproc.Kill(); } catch (Exception ex) { Log.Debug(ex, "Failed to kill"); } } var timeout = Stopwatch.StartNew(); while (!stdOutDone) { if (timeout.Elapsed >= TimeSpan.FromSeconds(5)) { stdErr.Append(strings.error_ytdl_empty_response).Append(" (timeout)"); break; } await Task.Delay(50); } if (stdErr.Length > 0) { Log.Debug("youtube-dl failed to load the resource:\n{0}", stdErr); throw Error.LocalStr(strings.error_ytdl_song_failed_to_load); } return ParseResponse(stdOut.ToString()); } catch (Win32Exception ex) { Log.Error(ex, "Failed to run youtube-dl: {0}", ex.Message); throw Error.Exception(ex).LocalStr(strings.error_ytdl_failed_to_run); } } public static T ParseResponse(string? json) where T : notnull { if (string.IsNullOrEmpty(json)) throw Error.LocalStr(strings.error_ytdl_empty_response); try { return JsonConvert.DeserializeObject(json); } catch (Exception ex) { Log.Debug(ex, "Failed to read youtube-dl json data"); throw Error.Exception(ex).LocalStr(strings.error_media_internal_invalid); } } public static JsonYtdlFormat? FilterBest(IEnumerable? formats) { Log.Debug("Picking from options: {@formats}", formats); if (formats is null) return null; JsonYtdlFormat? best = null; foreach (var format in formats) { if (format.acodec == "none") continue; if (best == null || format.abr > best.abr || (format.vcodec == "none" && format.abr >= best.abr)) { best = format; } } Log.Debug("Picked: {@format}", best); return best; } public static SongInfo MapToSongInfo(JsonYtdlDump dump) { return new SongInfo { Title = dump.title, Track = dump.track, Artist = dump.artist, Length = TimeSpan.FromSeconds(dump.duration) }; } // https://stackoverflow.com/a/50461641/2444047 /// /// Waits asynchronously for the process to exit. /// /// The process to wait for cancellation. /// The maximum time to wait for exit before returning anyway. /// A cancellation token. If invoked, the task will return /// immediately as canceled. /// A Task representing waiting for the process to end. public static async Task WaitForExitAsync(this Process process, TimeSpan timeout, CancellationToken cancellationToken = default) { var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); void Process_Exited(object? sender, EventArgs e) { tcs.TrySetResult(true); } process.EnableRaisingEvents = true; process.Exited += Process_Exited; try { if (process.HasExited) { return; } var timoutTask = Task.Delay(timeout, cancellationToken); using (cancellationToken.Register(() => tcs.TrySetCanceled())) { await Task.WhenAny(tcs.Task, timoutTask); } } finally { process.Exited -= Process_Exited; } } } #pragma warning disable CS0649, CS0169, IDE1006 public abstract class JsonYtdlBase { public string? extractor { get; set; } public string? extractor_key { get; set; } } public class JsonYtdlDump : JsonYtdlBase { public string? title { get; set; } public string? track { get; set; } public string? artist { get; set; } // TODO int -> timespan converter public float duration { get; set; } public string? id { get; set; } public JsonYtdlFormat[]? formats { get; set; } public JsonYtdlFormat[]? requested_formats { get; set; } public string? AutoTitle => track ?? title; } public class JsonYtdlFormat { public string? vcodec { get; set; } public string? acodec { get; set; } /// audioBitRate public float? abr { get; set; } /// audioSampleRate public float? asr { get; set; } /// totalBitRate public float? tbr { get; set; } //public object http_headers { get; set; } public string? format { get; set; } public string? format_id { get; set; } public string? url { get; set; } public string? ext { get; set; } } public class JsonYtdlPlaylistDump : JsonYtdlBase { public string? id { get; set; } public string? title { get; set; } public JsonYtdlPlaylistEntry[]? entries { get; set; } } public class JsonYtdlPlaylistEntry { public string? title { get; set; } public string? id { get; set; } } #pragma warning restore CS0649, CS0169, IDE1006 } ================================================ FILE: TS3AudioBot/Resources/DefaultRights.toml ================================================ # Rights declaration file # For more information about syntax and structure see here: # https://github.com/Splamy/TS3AudioBot/wiki/Rights "+" = [ # Basic stuff "cmd.help.*", "cmd.pm", "cmd.subscribe", "cmd.unsubscribe", "cmd.kickme.*", "cmd.version", # Getting song info "cmd.song", "cmd.repeat", "cmd.random", # Conditionals and basic scripting "cmd.if", "cmd.print", "cmd.rng", "cmd.eval", "cmd.take", "cmd.xecute", "cmd.getmy.*", "cmd.json.*", "cmd.bot.use", "cmd.rights.can", ] # Admin rule [[rule]] # Set your admin Group Ids here, ex: [ 13, 42 ] groupid = [] # And/Or your admin Client Uids here useruid = [ "_admin_uid_" ] # By default treat requests from localhost as admin ip = [ "127.0.0.1", "::1" ] "+" = "*" # Playing rights [[rule]] # Set Group Ids you want to allow here, ex: [ 13, 42 ] groupid = [] # And/Or Client Uids here, ex [ "uA0U7t4PBxdJ5TLnarsOHQh4/tY=", "8CnUQzwT/d9nHNeUaed0RPsDxxk=" ] useruid = [] # Or remove groupid and useruid to allow for everyone "+" = [ # Play controls "cmd.play", "cmd.pause", "cmd.stop", "cmd.seek", "cmd.volume", # Playlist management "cmd.list.*", "cmd.add", "cmd.clear", "cmd.previous", "cmd.next", "cmd.random.*", "cmd.repeat.*", # History features "cmd.history.add", "cmd.history.from", "cmd.history.id", "cmd.history.last", "cmd.history.play", "cmd.history.till", "cmd.history.title", ] ================================================ FILE: TS3AudioBot/Resources/NLog.config ================================================ ================================================ FILE: TS3AudioBot/Rights/CreateFileSettings.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Rights { public class CreateFileSettings { // can be null public string[]? AdminUids { get; set; } = null; public bool OverwriteIfExists { get; set; } = false; } } ================================================ FILE: TS3AudioBot/Rights/ExecuteContext.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Net; using TSLib; using TSLib.Messages; namespace TS3AudioBot.Rights { internal class ExecuteContext { public string? Host { get; set; } public ServerGroupId[]? ServerGroups { get; set; } = Array.Empty(); public ChannelGroupId? ChannelGroupId { get; set; } public Uid ClientUid { get; set; } public bool IsApi { get; set; } public IPAddress? ApiCallerIp { get; set; } public string? ApiToken { get; set; } public string? Bot { get; set; } public TextMessageTargetMode? Visibiliy { get; set; } public PermOverview[]? Permissions { get; set; } public List MatchingRules { get; } = new List(); public HashSet DeclAdd { get; } = new HashSet(); } } ================================================ FILE: TS3AudioBot/Rights/Matchers/MatchApiCallerIp.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using System.Net; namespace TS3AudioBot.Rights.Matchers { internal class MatchApiCallerIp : Matcher { private readonly HashSet requestIps; public MatchApiCallerIp(IEnumerable requestIps) => this.requestIps = new HashSet(requestIps); public override bool Matches(ExecuteContext ctx) => ctx.ApiCallerIp != null && requestIps.Contains(ctx.ApiCallerIp); } } ================================================ FILE: TS3AudioBot/Rights/Matchers/MatchBot.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; namespace TS3AudioBot.Rights.Matchers { internal class MatchBot : Matcher { private readonly HashSet bots; public MatchBot(IEnumerable bots) => this.bots = new HashSet(bots); public override bool Matches(ExecuteContext ctx) => ctx.Bot != null && bots.Contains(ctx.Bot); } } ================================================ FILE: TS3AudioBot/Rights/Matchers/MatchChannelGroupId.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using TSLib; namespace TS3AudioBot.Rights.Matchers { internal class MatchChannelGroupId : Matcher { private readonly HashSet channelGroupIds; public MatchChannelGroupId(IEnumerable channelGroupIds) => this.channelGroupIds = new HashSet(channelGroupIds); public override bool Matches(ExecuteContext ctx) => ctx.ChannelGroupId != null && channelGroupIds.Contains(ctx.ChannelGroupId.Value); } } ================================================ FILE: TS3AudioBot/Rights/Matchers/MatchClientGroupId.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using TSLib; namespace TS3AudioBot.Rights.Matchers { internal class MatchServerGroupId : Matcher { private readonly HashSet serverGroupIds; public MatchServerGroupId(IEnumerable serverGroupIds) => this.serverGroupIds = new HashSet(serverGroupIds); public override bool Matches(ExecuteContext ctx) => ctx.ServerGroups?.Length > 0 && serverGroupIds.Overlaps(ctx.ServerGroups); } } ================================================ FILE: TS3AudioBot/Rights/Matchers/MatchClientUid.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using TSLib; namespace TS3AudioBot.Rights.Matchers { internal class MatchClientUid : Matcher { private readonly HashSet clientUids; public MatchClientUid(IEnumerable clientUids) => this.clientUids = new HashSet(clientUids); public override bool Matches(ExecuteContext ctx) => ctx.ClientUid != null && clientUids.Contains(ctx.ClientUid); } } ================================================ FILE: TS3AudioBot/Rights/Matchers/MatchHost.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; namespace TS3AudioBot.Rights.Matchers { internal class MatchHost : Matcher { private readonly HashSet hosts; public MatchHost(IEnumerable hosts) => this.hosts = new HashSet(hosts); public override bool Matches(ExecuteContext ctx) => ctx.Host != null && hosts.Contains(ctx.Host); } } ================================================ FILE: TS3AudioBot/Rights/Matchers/MatchIsApi.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Rights.Matchers { internal class MatchIsApi : Matcher { private readonly bool isApi; public MatchIsApi(bool isApi) => this.isApi = isApi; public override bool Matches(ExecuteContext ctx) => ctx.IsApi == isApi; } } ================================================ FILE: TS3AudioBot/Rights/Matchers/MatchPermission.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Text.RegularExpressions; using TS3AudioBot.Helper; using TSLib; using TSLib.Helper; namespace TS3AudioBot.Rights.Matchers { internal class MatchPermission : Matcher { private static readonly Regex expressionMatch = new Regex(@"(\w+)\s*(<|>|=|>=|<=|!=)\s*(-?\d+|true|false)", Util.DefaultRegexConfig); private readonly Dictionary permissions; public MatchPermission(string[] permissions, ParseContext ctx) { this.permissions = new Dictionary(permissions.Length); foreach (var expression in permissions) { var match = expressionMatch.Match(expression); if (!match.Success) { ctx.Errors.Add($"The expression \"{expression}\" is not in the valid form of ''"); continue; } var permission = match.Groups[1].Value; var compare = match.Groups[2].Value; var value = match.Groups[3].Value; if (!Enum.TryParse(permission, out var permissionId)) { ctx.Errors.Add($"The teamspeak permission \"{permission}\" was not found"); continue; } PermCompare compareOp; switch (compare) { case "=": compareOp = PermCompare.Equal; break; case "!=": compareOp = PermCompare.NotEqual; break; case ">": compareOp = PermCompare.Greater; break; case ">=": compareOp = PermCompare.GreaterOrEqual; break; case "<": compareOp = PermCompare.Less; break; case "<=": compareOp = PermCompare.LessOrEqual; break; default: continue; } if ((value == "true" || value == "false") && !permission.StartsWith("b_")) ctx.Warnings.Add("Comparing an integer permission with boolean value."); int valueNum; if (value == "true") valueNum = 1; else if (value == "false") valueNum = 0; else if (!int.TryParse(value, out valueNum)) { ctx.Errors.Add($"The permission compare value is not valid."); continue; } this.permissions.Add(permissionId, (compareOp, valueNum)); } } public IReadOnlyCollection ComparingPermissions() => permissions.Keys; public override bool Matches(ExecuteContext ctx) { if (ctx.Permissions == null) return false; foreach (var perm in ctx.Permissions) { if (perm == null) continue; var permission = perm.PermissionId; var value = perm.PermissionValue; if (permissions.TryGetValue(permission, out (PermCompare op, int value) compare)) { switch (compare.op) { case PermCompare.Equal: if (value == compare.value) return true; break; case PermCompare.NotEqual: if (value != compare.value) return true; break; case PermCompare.Greater: if (value > compare.value) return true; break; case PermCompare.GreaterOrEqual: if (value >= compare.value) return true; break; case PermCompare.Less: if (value < compare.value) return true; break; case PermCompare.LessOrEqual: if (value <= compare.value) return true; break; default: throw Tools.UnhandledDefault(compare.op); } } } return false; } } } ================================================ FILE: TS3AudioBot/Rights/Matchers/MatchToken.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; namespace TS3AudioBot.Rights.Matchers { internal class MatchToken : Matcher { private readonly HashSet tokens; public MatchToken(IEnumerable tokens) => this.tokens = new HashSet(tokens); public override bool Matches(ExecuteContext ctx) => ctx.ApiToken != null && tokens.Contains(ctx.ApiToken); } } ================================================ FILE: TS3AudioBot/Rights/Matchers/MatchVisibility.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Linq; using TSLib; namespace TS3AudioBot.Rights.Matchers { internal class MatchVisibility : Matcher { private readonly TextMessageTargetMode[] visibility; public MatchVisibility(TextMessageTargetMode[] visibility) => this.visibility = visibility; public override bool Matches(ExecuteContext ctx) => ctx.Visibiliy != null && visibility.Contains(ctx.Visibiliy.Value); } } ================================================ FILE: TS3AudioBot/Rights/Matchers/Matcher.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Rights.Matchers { internal abstract class Matcher { public abstract bool Matches(ExecuteContext ctx); } } ================================================ FILE: TS3AudioBot/Rights/Matchers/PermCompare.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Rights { internal enum PermCompare { Equal, NotEqual, Greater, GreaterOrEqual, Less, LessOrEqual, } } ================================================ FILE: TS3AudioBot/Rights/ParseContext.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using System.Text; using TSLib; namespace TS3AudioBot.Rights { internal class ParseContext { public List Declarations { get; } public RightsGroup[] Groups { get; private set; } public RightsRule[] Rules { get; private set; } public List Errors { get; } public List Warnings { get; } public ISet RegisteredRights { get; } public RightsRule RootRule { get; } public bool NeedsAvailableGroups { get; set; } = false; public bool NeedsAvailableChanGroups { get; set; } = false; public TsPermission[] NeedsPermOverview { get; set; } = Array.Empty(); public ParseContext(ISet registeredRights) { Declarations = new List(); RootRule = new RightsRule(); Errors = new List(); Warnings = new List(); RegisteredRights = registeredRights; Groups = Array.Empty(); Rules = Array.Empty(); } public void SplitDeclarations() { Groups = Declarations.OfType().ToArray(); Rules = Declarations.OfType().ToArray(); } public (bool hasErrors, string info) AsResult() { var strb = new StringBuilder(); foreach (var warn in Warnings) strb.Append("WRN: ").AppendLine(warn); if (Errors.Count == 0) { strb.Append(string.Join("\n", Rules.Select(x => x.ToString()))); if (strb.Length > 900) strb.Length = 900; return (true, strb.ToString()); } else { foreach (var err in Errors) strb.Append("ERR: ").AppendLine(err); if (strb.Length > 900) strb.Length = 900; return (false, strb.ToString()); } } } } ================================================ FILE: TS3AudioBot/Rights/RightsDecl.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Nett; using System; using System.Collections.Generic; using System.Linq; using TS3AudioBot.Helper; namespace TS3AudioBot.Rights { internal abstract class RightsDecl { public int Id { get; private set; } public int Level { get; set; } public RightsRule? Parent { get; set; } private string[]? includeNames = null; public RightsGroup[] Includes { get; set; } = Array.Empty(); public string[] DeclAdd { get; set; } = Array.Empty(); public string[] DeclDeny { get; set; } = Array.Empty(); public virtual bool ParseKey(string key, TomlObject tomlObj, ParseContext ctx) { switch (key) { case "+": if (!tomlObj.TryGetValueArray(out var declAdd)) { ctx.Errors.Add("<+> Field has invalid data."); declAdd = Array.Empty(); } DeclAdd = declAdd; return true; case "-": if (!tomlObj.TryGetValueArray(out var declDeny)) { ctx.Errors.Add("<-> Field has invalid data."); declDeny = Array.Empty(); } DeclDeny = declDeny; return true; case "include": if (!tomlObj.TryGetValueArray(out var includeNames)) { ctx.Errors.Add(" Field has invalid data."); includeNames = null; } this.includeNames = includeNames; return true; default: return false; } } public bool ParseChilden(TomlTable tomlObj, ParseContext ctx) { Id = ctx.Declarations.Count; ctx.Declarations.Add(this); bool hasErrors = false; foreach (var item in tomlObj) { if (!ParseKey(item.Key, item.Value, ctx)) { ctx.Errors.Add($"Unrecognized key <{item.Key}>."); hasErrors = true; } } return !hasErrors; } public abstract RightsGroup? ResolveGroup(string groupName, ParseContext ctx); /// /// Resolves all include strings to their representative object each. /// /// The parsing context for the current file processing. public bool ResolveIncludes(ParseContext ctx) { bool hasErrors = false; if (includeNames != null) { Includes = includeNames.Select(x => ResolveGroup(x, ctx)).ToArray()!; for (int i = 0; i < includeNames.Length; i++) { if (Includes[i] is null) { ctx.Errors.Add($"Could not find group \"{includeNames[i]}\" to include."); hasErrors = true; } } includeNames = null; } return !hasErrors; } public void MergeGroups(IEnumerable merge) { // this.+ = (include+ - this-) + this+ // this.- = this- foreach (var include in merge) MergeGroups(include); } public void MergeGroups(RightsDecl include) { DeclAdd = include.DeclAdd.Except(DeclDeny).Concat(DeclAdd).Distinct().ToArray(); } } } ================================================ FILE: TS3AudioBot/Rights/RightsGroup.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Rights { internal class RightsGroup : RightsDecl { public string Name { get; } public RightsGroup(string name) { Name = name; } public override RightsGroup? ResolveGroup(string groupName, ParseContext ctx) { if (Name == groupName) return this; return Parent?.ResolveGroup(groupName, ctx); } } } ================================================ FILE: TS3AudioBot/Rights/RightsManager.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Nett; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using TS3AudioBot.CommandSystem; using TS3AudioBot.Config; using TS3AudioBot.Dependency; using TS3AudioBot.Helper; using TS3AudioBot.Rights.Matchers; using TS3AudioBot.Web.Api; using TSLib; using TSLib.Full; using TSLib.Helper; using TSLib.Messages; namespace TS3AudioBot.Rights { /// Permission system of the bot. public class RightsManager { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private const int RuleLevelSize = 2; private bool needsRecalculation; private readonly ConfRights config; private RightsRule? rootRule; private HashSet registeredRights = new HashSet(); private readonly object rootRuleLock = new object(); // Required Matcher Data: // This variables save whether the current rights setup has at least one rule that // need a certain additional information. // This will save us from making unnecessary query calls. private bool needsAvailableGroups = true; private bool needsAvailableChanGroups = true; private TsPermission[] needsPermOverview = Array.Empty(); public RightsManager(ConfRights config) { this.config = config; needsRecalculation = true; } public void SetRightsList(IEnumerable rights) { var newRights = new HashSet(rights); if (!registeredRights.SetEquals(newRights)) { // TODO validate right names registeredRights = newRights; needsRecalculation = true; } } public async ValueTask HasAllRights(ExecutionInformation info, params string[] requestedRights) { var ctx = await GetRightsContext(info); var normalizedRequest = ExpandRights(requestedRights, registeredRights); return ctx.DeclAdd.IsSupersetOf(normalizedRequest); } public async ValueTask GetRightsSubset(ExecutionInformation info, params string[] requestedRights) { var ctx = await GetRightsContext(info); var normalizedRequest = ExpandRights(requestedRights, registeredRights); return ctx.DeclAdd.Intersect(normalizedRequest).ToArray(); } private async ValueTask GetRightsContext(ExecutionInformation info) { var localRootRule = TryGetRootSafe(); if (info.TryGet(out var execCtx)) return execCtx; execCtx = new ExecuteContext(); if (info.TryGet(out var clientCall)) { execCtx.ServerGroups = clientCall.ServerGroups; execCtx.ClientUid = clientCall.ClientUid; execCtx.Visibiliy = clientCall.Visibiliy; execCtx.IsApi = false; // Get Required Matcher Data: // In this region we will iteratively go through different possibilities to obtain // as much data as we can about our invoker. // For this step we will prefer query calls which can give us more than one information // at once and lazily fall back to other calls as long as needed. if (info.TryGet(out var ts) && info.TryGet(out var tsClient)) { ServerGroupId[]? serverGroups = clientCall.ServerGroups; ChannelId? channelId = clientCall.ChannelId; ClientDbId? databaseId = clientCall.DatabaseId; ChannelGroupId? channelGroup = clientCall.ChannelGroup; if (clientCall.ClientId != null && ((needsAvailableGroups && serverGroups is null) || (needsAvailableChanGroups && channelGroup is null) || (needsPermOverview.Length > 0 && (databaseId == null || channelId == null)) ) ) { try { var clientInfo = await ts.GetClientInfoById(clientCall.ClientId.Value); serverGroups = clientInfo.ServerGroups; channelGroup = clientInfo.ChannelGroup; databaseId = clientInfo.DatabaseId; channelId = clientInfo.ChannelId; } catch (AudioBotException) { } } if (needsAvailableGroups && serverGroups is null) { if (databaseId == null) { try { databaseId = await ts.GetClientDbIdByUid(clientCall.ClientUid); } catch (AudioBotException) { } } if (databaseId != null) { try { serverGroups = await ts.GetClientServerGroups(databaseId.Value); } catch (AudioBotException) { } } } execCtx.ChannelGroupId = channelGroup; execCtx.ServerGroups = serverGroups ?? Array.Empty(); if (needsPermOverview.Length > 0 && databaseId != null && channelId != null) { // TODO check if there is any better way to only get the permissions needed. var result = await tsClient.PermOverview(databaseId.Value, channelId.Value, 0); if (result.Ok) { execCtx.Permissions = new PermOverview[Enum.GetValues(typeof(TsPermission)).Length]; foreach (var perm in result.Value) { if (perm.PermissionId < 0 || (int)perm.PermissionId >= execCtx.Permissions.Length) continue; var cur = execCtx.Permissions[(int)perm.PermissionId]; execCtx.Permissions[(int)perm.PermissionId] = cur == null ? perm : cur.Combine(perm); } } } } } else if (info.TryGet(out var apiCallData)) { execCtx.ClientUid = apiCallData.ClientUid; execCtx.ApiToken = apiCallData.Token; execCtx.ApiCallerIp = apiCallData.IpAddress; execCtx.IsApi = true; } if (info.TryGet(out var bot)) { var botInfo = bot.GetInfo(); execCtx.Bot = botInfo.Name; execCtx.Host = botInfo.Server; } if (localRootRule != null) ProcessNode(localRootRule, execCtx); if (execCtx.MatchingRules.Count == 0) return execCtx; foreach (var rule in execCtx.MatchingRules) execCtx.DeclAdd.UnionWith(rule.DeclAdd); info.AddModule(execCtx); return execCtx; } private RightsRule? TryGetRootSafe() { var localRootRule = rootRule; if (localRootRule != null && !needsRecalculation) return localRootRule; lock (rootRuleLock) { if (rootRule != null && !needsRecalculation) return rootRule; rootRule = ReadFile(); return rootRule; } } private static bool ProcessNode(RightsRule rule, ExecuteContext ctx) { // check if node matches if (rule.Matches(ctx)) { bool hasMatchingChild = false; foreach (var child in rule.ChildrenRules) hasMatchingChild |= ProcessNode(child, ctx); if (!hasMatchingChild) ctx.MatchingRules.Add(rule); return true; } return false; } public bool Reload() { needsRecalculation = true; return TryGetRootSafe() != null; } // Loading and Parsing private RightsRule? ReadFile() { try { CreateDefaultConfigIfNotExists(); var table = Toml.ReadFile(config.Path); var ctx = new ParseContext(registeredRights); RecalculateRights(table, ctx); foreach (var err in ctx.Errors) Log.Error(err); foreach (var warn in ctx.Warnings) Log.Warn(warn); if (ctx.Errors.Count == 0) { needsAvailableChanGroups = ctx.NeedsAvailableChanGroups; needsAvailableGroups = ctx.NeedsAvailableGroups; needsPermOverview = ctx.NeedsPermOverview; needsRecalculation = false; return ctx.RootRule; } } catch (Exception ex) { Log.Error(ex, "The rights file could not be parsed"); } return null; } public void CreateDefaultConfigIfNotExists() { CreateConfig(new CreateFileSettings { OverwriteIfExists = false }); } public void CreateConfig(CreateFileSettings settings) { if (!settings.OverwriteIfExists && File.Exists(config.Path)) return; Log.Info("Creating new permission file ({@settings})", settings); string? toml = null; using (var fs = Util.GetEmbeddedFile("TS3AudioBot.Resources.DefaultRights.toml")!) using (var reader = new StreamReader(fs, Tools.Utf8Encoder)) { toml = reader.ReadToEnd(); } using (var fs = File.Open(config.Path, FileMode.Create, FileAccess.Write, FileShare.None)) using (var writer = new StreamWriter(fs, Tools.Utf8Encoder)) { string replaceAdminUids = settings.AdminUids != null ? string.Join(" ,", settings.AdminUids.Select(x => $"\"{x}\"")) : string.Empty; toml = toml.Replace("\"_admin_uid_\"", replaceAdminUids); writer.Write(toml); } } public void CreateConfigIfNotExists(bool interactive = false) { if (File.Exists(config.Path)) return; Log.Warn("No permission file found."); var settings = new CreateFileSettings { OverwriteIfExists = false, }; if (interactive) { Console.WriteLine("Do you want to set up an admin in the default permission file template? [Y/n]"); if (Interactive.UserAgree(defaultTo: true)) { var adminUid = Interactive.LoopAction("Please enter an admin uid", uid => { if (!Uid.IsValid(uid)) { Console.WriteLine("The uid seems to be invalid, continue anyway? [y/N]"); return Interactive.UserAgree(defaultTo: false); } return true; }); if (adminUid is null) return; settings.AdminUids = new[] { adminUid }; } } CreateConfig(settings); } private static void RecalculateRights(TomlTable table, ParseContext parseCtx) { if (!parseCtx.RootRule.ParseChilden(table, parseCtx)) return; parseCtx.SplitDeclarations(); if (!ValidateUniqueGroupNames(parseCtx)) return; if (!ResolveIncludes(parseCtx)) return; if (!CheckCyclicGroupDependencies(parseCtx)) return; BuildLevel(parseCtx.RootRule); LintDeclarations(parseCtx); NormalizeRules(parseCtx); FlattenGroups(parseCtx); FlattenRules(parseCtx.RootRule); CheckRequiredCalls(parseCtx); } private static HashSet ExpandRights(IEnumerable rights, ICollection registeredRights) { var rightsExpanded = new HashSet(); foreach (var right in rights) { int index = right.IndexOf('*'); if (index < 0) { // Rule does not contain any wildcards rightsExpanded.Add(right); } else if (index != 0 && right[index - 1] != '.') { // Do not permit misused wildcards throw new ArgumentException($"The right \"{right}\" has a misused wildcard."); } else if (index == 0) { // We are done here when including every possible right rightsExpanded.UnionWith(registeredRights); break; } else { // Add all rights which expand from that wildcard string subMatch = right.Substring(0, index - 1); rightsExpanded.UnionWith(registeredRights.Where(x => x.StartsWith(subMatch))); } } return rightsExpanded; } /// /// Removes rights which are in the Add and Deny category. /// Expands wildcard declarations to all explicit declarations. /// /// The parsing context for the current file processing. private static void NormalizeRules(ParseContext ctx) { foreach (var rule in ctx.Rules) { var denyNormalized = ExpandRights(rule.DeclDeny, ctx.RegisteredRights); rule.DeclDeny = denyNormalized.ToArray(); var addNormalized = ExpandRights(rule.DeclAdd, ctx.RegisteredRights); addNormalized.ExceptWith(rule.DeclDeny); rule.DeclAdd = addNormalized.ToArray(); var undeclared = rule.DeclAdd.Except(ctx.RegisteredRights) .Concat(rule.DeclDeny.Except(ctx.RegisteredRights)); foreach (var right in undeclared) { ctx.Warnings.Add($"Right \"{right}\" is not registered."); } } } /// /// Checks that each group name can be uniquely identified when resolving. /// /// The parsing context for the current file processing. private static bool ValidateUniqueGroupNames(ParseContext ctx) { bool hasErrors = false; foreach (var checkGroup in ctx.Groups) { // check that the name is unique var parent = checkGroup.Parent; while (parent != null) { foreach (var cmpGroup in parent.ChildrenGroups) { if (cmpGroup != checkGroup && cmpGroup.Name == checkGroup.Name) { ctx.Errors.Add($"Ambiguous group name: {checkGroup.Name}"); hasErrors = true; } } parent = parent.Parent; } } return !hasErrors; } /// /// Resolves all include strings to their representative object each. /// /// The parsing context for the current file processing. private static bool ResolveIncludes(ParseContext ctx) { bool hasErrors = false; foreach (var decl in ctx.Declarations) hasErrors |= !decl.ResolveIncludes(ctx); return !hasErrors; } /// /// Checks if group includes form a cyclic dependency. /// /// The parsing context for the current file processing. private static bool CheckCyclicGroupDependencies(ParseContext ctx) { bool hasErrors = false; foreach (var checkGroup in ctx.Groups) { var included = new HashSet(); var remainingIncludes = new Queue(); remainingIncludes.Enqueue(checkGroup); while (remainingIncludes.Count > 0) { var include = remainingIncludes.Dequeue(); included.Add(include); foreach (var newInclude in include.Includes) { if (newInclude == checkGroup) { hasErrors = true; ctx.Errors.Add($"Group \"{checkGroup.Name}\" has a cyclic include hierarchy."); break; } if (!included.Contains(newInclude)) remainingIncludes.Enqueue(newInclude); } } } return !hasErrors; } /// /// Generates hierarchical values for the field /// for all rules. This value represents which rule is more specified when /// merging two rule in order to prioritize rights. /// /// The root element of the hierarchy tree. /// The base level for the root element. private static void BuildLevel(RightsDecl root, int level = 0) { root.Level = level; if (root is RightsRule rootRule) { foreach (var child in rootRule.Children) { BuildLevel(child, level + RuleLevelSize); } } } /// /// Checks groups and rules for common mistakes and unusual declarations. /// Found stuff will be added as warnings. /// /// The parsing context for the current file processing. private static void LintDeclarations(ParseContext ctx) { // check if <+> contains <-> decl foreach (var decl in ctx.Declarations) { var uselessAdd = decl.DeclAdd.Intersect(decl.DeclDeny).ToArray(); foreach (var uAdd in uselessAdd) ctx.Warnings.Add($"Rule has declaration \"{uAdd}\" in \"+\" and \"-\""); } // top level <-> declaration is useless foreach (var decl in ctx.Groups) { if (decl.Includes.Length == 0 && decl.DeclDeny.Length > 0) ctx.Warnings.Add("Rule with \"-\" declaration but no include to override"); } var root = ctx.Rules.First(x => x.Parent is null); if (root.Includes.Length == 0 && root.DeclDeny.Length > 0) ctx.Warnings.Add("Root rule \"-\" declaration has no effect"); // check if rule has no matcher foreach (var rule in ctx.Rules) { if (!rule.HasMatcher() && rule.Parent != null) ctx.Warnings.Add("Rule has no matcher and will always match"); } // check for impossible combinations uid + uid, server + server, perm + perm ? // TODO // check for unused group var unusedGroups = new HashSet(ctx.Groups); foreach (var decl in ctx.Declarations) { foreach (var include in decl.Includes) { unusedGroups.Remove(include); } } foreach (var uGroup in unusedGroups) ctx.Warnings.Add($"Group \"{uGroup.Name}\" is never included in a rule"); } /// /// Sums up all includes for each group and includes them directly into the /// and . /// /// The parsing context for the current file processing. private static void FlattenGroups(ParseContext ctx) { var notReachable = new Queue(ctx.Groups); var currentlyReached = new HashSet(ctx.Groups.Where(x => x.Includes.Length == 0)); while (notReachable.Count > 0) { var item = notReachable.Dequeue(); if (currentlyReached.IsSupersetOf(item.Includes)) { currentlyReached.Add(item); item.MergeGroups(item.Includes); item.Includes = Array.Empty(); } else { notReachable.Enqueue(item); } } } /// /// Sums up all includes and parent rule declarations for each rule and includes them /// directly into the and . /// /// The root element of the hierarchy tree. private static void FlattenRules(RightsRule root) { if (root.Parent != null) root.MergeGroups(root.Parent); root.MergeGroups(root.Includes); root.Includes = Array.Empty(); foreach (var child in root.ChildrenRules) FlattenRules(child); } /// /// Checks which ts3client calls need to made to get all information /// for the required matcher. /// /// The parsing context for the current file processing. private static void CheckRequiredCalls(ParseContext ctx) { var needsPermOverview = new HashSet(); foreach (var group in ctx.Rules) { foreach (var matcher in group.Matcher) { switch (matcher) { case MatchServerGroupId _: ctx.NeedsAvailableGroups = true; break; case MatchChannelGroupId _: ctx.NeedsAvailableChanGroups = true; break; case MatchPermission sgid: needsPermOverview.UnionWith(sgid.ComparingPermissions()); break; } } } ctx.NeedsPermOverview = needsPermOverview.Count > 0 ? needsPermOverview.ToArray() : Array.Empty(); } } } ================================================ FILE: TS3AudioBot/Rights/RightsRule.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Nett; using System.Collections.Generic; using System.Linq; using System.Net; using TS3AudioBot.Helper; using TS3AudioBot.Rights.Matchers; using TSLib; namespace TS3AudioBot.Rights { // Adding a new Matcher: // 1) Add public MatchHashSet // 2) Add To Has Matches condition when empty // 3) Add To FillNull when not declared // 4) Add new case to ParseKey switch // 5) Add Property in the ExecuteContext class // 6) Add match condition to RightManager.ProcessNode // 7) Set value in RightManager.GetRightsContext internal class RightsRule : RightsDecl { public List Children { get; set; } public IEnumerable ChildrenRules => Children.OfType(); public IEnumerable ChildrenGroups => Children.OfType(); public List Matcher { get; } public RightsRule() { Children = new List(); Matcher = new List(); } public bool HasMatcher() => Matcher.Count > 0; public bool Matches(ExecuteContext ctx) { if (!HasMatcher()) return true; foreach (var matcher in Matcher) { if (matcher.Matches(ctx)) return true; } return false; } public override bool ParseKey(string key, TomlObject tomlObj, ParseContext ctx) { if (base.ParseKey(key, tomlObj, ctx)) return true; switch (key) { case "host": if (tomlObj.TryGetValueArray(out var host)) Matcher.Add(new MatchHost(host)); else ctx.Errors.Add(" Field has invalid data."); return true; case "groupid": if (tomlObj.TryGetValueArray(out var servergroupid)) Matcher.Add(new MatchServerGroupId(servergroupid.Select(ServerGroupId.To))); else ctx.Errors.Add(" Field has invalid data."); return true; case "channelgroupid": if (tomlObj.TryGetValueArray(out var channelgroupid)) Matcher.Add(new MatchChannelGroupId(channelgroupid.Select(ChannelGroupId.To))); else ctx.Errors.Add(" Field has invalid data."); return true; case "useruid": if (tomlObj.TryGetValueArray(out var useruid)) Matcher.Add(new MatchClientUid(useruid.Select(Uid.To))); else ctx.Errors.Add(" Field has invalid data."); return true; case "perm": if (tomlObj.TryGetValueArray(out var perm)) Matcher.Add(new MatchPermission(perm, ctx)); else ctx.Errors.Add(" Field has invalid data."); return true; case "apitoken": if (tomlObj.TryGetValueArray(out var apitoken)) Matcher.Add(new MatchToken(apitoken)); else ctx.Errors.Add(" Field has invalid data."); return true; case "bot": if (tomlObj.TryGetValueArray(out var bot)) Matcher.Add(new MatchBot(bot)); else ctx.Errors.Add(" Field has invalid data."); return true; case "isapi": if (tomlObj.TryGetValue(out var isapi)) Matcher.Add(new MatchIsApi(isapi)); else ctx.Errors.Add(" Field has invalid data."); return true; case "ip": if (tomlObj.TryGetValueArray(out var ip)) { Matcher.Add(new MatchApiCallerIp(ip.Select(x => { if (IPAddress.TryParse(x, out var ipa)) return ipa; ctx.Errors.Add($" Field value '{x}' could not be parsed."); return null!; }).Where(x => x != null))); } else ctx.Errors.Add(" Field has invalid data."); return true; case "visibility": if (tomlObj.TryGetValueArray(out var visibility)) Matcher.Add(new MatchVisibility(visibility)); else ctx.Errors.Add(" Field has invalid data."); return true; case "rule": if (tomlObj.TomlType == TomlObjectType.ArrayOfTables) { var childTables = (TomlTableArray)tomlObj; foreach (var childTable in childTables.Items) { var rule = new RightsRule(); Children.Add(rule); rule.Parent = this; rule.ParseChilden(childTable, ctx); } return true; } else { ctx.Errors.Add("Misused key with reserved name \"rule\"."); return false; } default: // group if (key.StartsWith("$")) { if (tomlObj.TomlType == TomlObjectType.Table) { var childTable = (TomlTable)tomlObj; var group = new RightsGroup(key); Children.Add(group); group.Parent = this; group.ParseChilden(childTable, ctx); return true; } else { ctx.Errors.Add($"Misused key for group declaration: {key}."); } } return false; } } public override RightsGroup? ResolveGroup(string groupName, ParseContext ctx) { foreach (var child in ChildrenGroups) { if (child.Name == groupName) return child; } return Parent?.ResolveGroup(groupName, ctx); } public override string ToString() { return $"[+:{string.Join(",", DeclAdd)} | -:{string.Join(",", DeclDeny)}]"; } } } ================================================ FILE: TS3AudioBot/Sessions/AnonymousSession.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Sessions { internal class AnonymousSession : UserSession { public AnonymousSession() { } } } ================================================ FILE: TS3AudioBot/Sessions/ApiToken.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using TSLib.Helper; namespace TS3AudioBot.Sessions { internal class ApiToken { public const int TokenLen = 32; public static readonly TimeSpan DefaultTokenTimeout = TimeSpan.MaxValue; public string Value { get; } public DateTime Timeout { get; } public bool ApiTokenActive => Tools.Now <= Timeout; public ApiToken(string value, DateTime timeout) { Value = value; Timeout = timeout; } } } ================================================ FILE: TS3AudioBot/Sessions/SessionManager.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using TSLib; namespace TS3AudioBot.Sessions { /// Management for clients talking with the bot. public class SessionManager { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); // Map: Id => UserSession private readonly Dictionary openSessions = new Dictionary(); public UserSession GetOrCreateSession(ClientId clientId) { lock (openSessions) { if (openSessions.TryGetValue(clientId, out var session)) return session; Log.Debug("ClientId {0} created session with the bot", clientId); session = new UserSession(); openSessions.Add(clientId, session); return session; } } public UserSession? GetSession(ClientId id) { lock (openSessions) { if (openSessions.TryGetValue(id, out var session)) return session; else return null; } } public void RemoveSession(ClientId id) { lock (openSessions) { openSessions.Remove(id); } } } } ================================================ FILE: TS3AudioBot/Sessions/TokenManager.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using LiteDB; using System; using System.Collections.Generic; using TS3AudioBot.Helper; using TSLib.Helper; namespace TS3AudioBot.Sessions { public class TokenManager { private const string TokenFormat = "{0}:{1}"; private const string ApiTokenTable = "apiToken"; private readonly LiteCollection dbTokenList; private readonly Dictionary dbTokenCache = new Dictionary(); public TokenManager(DbStore database) { dbTokenList = database.GetCollection(ApiTokenTable); dbTokenList.EnsureIndex(x => x.UserUid, true); dbTokenList.EnsureIndex(x => x.Token, true); } public string GenerateToken(string authId, TimeSpan? timeout = null) { if (string.IsNullOrEmpty(authId)) throw new ArgumentNullException(nameof(authId)); var token = new ApiToken( TextUtil.GenToken(ApiToken.TokenLen), AddTimeSpanSafe(Tools.Now, timeout ?? ApiToken.DefaultTokenTimeout)); dbTokenCache[authId] = token; dbTokenList.Upsert(new DbApiToken { UserUid = authId, Token = token.Value, ValidUntil = token.Timeout }); return string.Format(TokenFormat, authId, token.Value); } private static DateTime AddTimeSpanSafe(DateTime dateTime, TimeSpan addSpan) { if (addSpan == TimeSpan.MaxValue) return DateTime.MaxValue; if (addSpan == TimeSpan.MinValue) return DateTime.MinValue; if (dateTime == DateTime.MaxValue) return DateTime.MaxValue; try { return dateTime + addSpan; } catch (ArgumentOutOfRangeException) { return addSpan >= TimeSpan.Zero ? DateTime.MaxValue : DateTime.MinValue; } } internal ApiToken? GetToken(string authId) { if (dbTokenCache.TryGetValue(authId, out var token) && token.ApiTokenActive) return token; var dbToken = dbTokenList.FindById(authId); if (dbToken is null || dbToken.Token is null) return null; if (dbToken.ValidUntil < Tools.Now) { dbTokenList.Delete(authId); dbTokenCache.Remove(authId); return null; } token = new ApiToken(dbToken.Token, dbToken.ValidUntil); dbTokenCache[authId] = token; return token; } private class DbApiToken { [BsonId] public string? UserUid { get; set; } public string? Token { get; set; } public DateTime ValidUntil { get; set; } } } } ================================================ FILE: TS3AudioBot/Sessions/UserSession.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using TS3AudioBot.CommandSystem; using Response = System.Func>; namespace TS3AudioBot.Sessions { public class UserSession { private const string ResponseKey = "response"; private Dictionary? assocMap; protected bool lockToken; public Response? ResponseProcessor => Get(ResponseKey, out var val) ? val : null; public UserSession() { } public void SetResponseInstance(Response responseProcessor) => Set(ResponseKey, responseProcessor); public void ClearResponse() => Set(ResponseKey, null); public bool Get(string key, [MaybeNullWhen(false)] out TData value) where TData : notnull { value = default!; if (assocMap is null) return false; if (!assocMap.TryGetValue(key, out var valueObj)) return false; if (!(valueObj is TData valueT)) return false; value = valueT; return true; } public void Set(string key, TData data) { if (assocMap is null) assocMap = new Dictionary(); if (data is null) assocMap.Remove(key); else assocMap[key] = data; } } public static class UserSessionExtensions { public static void SetResponse(this UserSession? session, Response responseProcessor) { if (session is null) throw new CommandException("No session context", CommandExceptionReason.CommandError); session.SetResponseInstance(responseProcessor); } } } ================================================ FILE: TS3AudioBot/Setup.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using CommandLine; using CommandLine.Text; using NLog; using System; using System.Globalization; using System.IO; using System.Runtime; using System.Threading; using System.Threading.Tasks; using TS3AudioBot.Environment; using TS3AudioBot.Helper; using TSLib.Helper; using TSLib.Scheduler; namespace TS3AudioBot { internal static class Setup { private static readonly Logger Log = LogManager.GetCurrentClassLogger(); public const int ExitCodeOk = 0; public const int ExitCodeMalformedArguments = 1; public const int ExitCodeLibopusLoadError = 2; public static int Main(string[] args) { Thread.CurrentThread.Name = "TAB Main"; Tools.SetLogId("Core"); var parsedArgs = new Parser(with => { with.AutoHelp = true; with.AutoVersion = false; }).ParseArguments(args); ParameterData? setup = parsedArgs.MapResult(ok => ok, _ => null); if (setup is null) { Console.WriteLine(HelpText.AutoBuild(parsedArgs, h => { h.Heading = $"TS3AudioBot {SystemData.AssemblyData}"; h.Copyright = ""; return HelpText.DefaultParsingErrorsHandler(parsedArgs, h); })); return ExitCodeMalformedArguments; } if (setup.ShowVersion) { Console.WriteLine(SystemData.AssemblyData.ToLongString()); return ExitCodeOk; } if (setup.ShowStatsExample) { Console.WriteLine("The bot will contribute to the stats counter about once per day."); Console.WriteLine("We do NOT store any IP or identifiable information."); Console.WriteLine("Please keep this feature enabled to help us improve and grow."); Console.WriteLine("An example stats packet looks like this:"); Console.WriteLine(Stats.CreateExample()); return ExitCodeOk; } SetupLog(); if (!SetupLibopus()) return ExitCodeLibopusLoadError; if (setup.Llgc) EnableLlgc(); if (!setup.HideBanner) LogHeader(); DedicatedTaskScheduler.FromCurrentThread(() => StartBot(setup)); return ExitCodeOk; } private static async void StartBot(ParameterData setup) { // Initialize the actual core var core = new Core((DedicatedTaskScheduler)TaskScheduler.Current, setup.ConfigFile); await core.Run(setup); } public static void SetupLog() { if (LogManager.Configuration is null) { var configFileInfo = new FileInfo("NLog.config"); if (!configFileInfo.Exists) { using var configStream = Util.GetEmbeddedFile("TS3AudioBot.Resources.NLog.config")!; using var configFileStream = configFileInfo.OpenWrite(); configStream.CopyTo(configFileStream); } LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration(configFileInfo.FullName); } else if (LogManager.Configuration.AllTargets.Count == 0) { Console.WriteLine("Your NLog target config is empty. Nothing will be logged!"); Console.WriteLine("Please refer to https://github.com/NLog/NLog/wiki/Configuration-file to learn more how to set up your own logging configuration."); } } public static bool SetupLibopus() { bool loaded = TSLib.Audio.Opus.NativeMethods.PreloadLibrary(); if (!loaded) Log.Error("Couldn't find libopus. Make sure it is installed or placed in the correct folder."); return loaded; } public static void EnableLlgc() { GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency; } public static void LogHeader() { Log.Info("[============ TS3AudioBot started =============]"); Log.Info("[ Date: {0}", DateTime.Now.ToString("dddd, dd MMMM yyyy HH:mm:ss", CultureInfo.InvariantCulture)); Log.Info("[ Version: {0}", SystemData.AssemblyData); Log.Info("[ Build: {0}", SystemData.AssemblyData.BuildConfiguration); Log.Info("[ Platform: {0}", SystemData.PlatformData); Log.Info("[ Runtime: {0} ServerGC:{1} GC:{2}", SystemData.RuntimeData.FullName, GCSettings.IsServerGC, GCSettings.LatencyMode); Log.Info("[ Opus: {0}", TSLib.Audio.Opus.NativeMethods.Info); // ffmpeg // youtube-dl Log.Info("[==============================================]"); } } public class ParameterData { [Option('c', "config", Default = null, HelpText = "Specify the path to the ts3audiobot.toml config file.")] public string? ConfigFile { get; set; } [Option("skip-checks", HelpText = "Skips checking the system for all required tools.")] public bool SkipVerifications { get; set; } [Option("hide-banner", HelpText = "Do not print the version information header.")] public bool HideBanner { get; set; } [Option("non-interactive", HelpText = "Disables console prompts from setup tools.")] public bool NonInteractive { get; set; } public bool Interactive => !NonInteractive; [Option("no-llgc", Hidden = true)] public bool NoLlgc { get; set; } public bool Llgc => !NoLlgc; [Option("stats-disabled", HelpText = "Disables sending to the global stats tracker.")] public bool StatsDisabled { get; set; } public bool SendStats => !StatsDisabled; [Option("stats-example", HelpText = "Shows you what the bot sends to the global stats tracker.")] public bool ShowStatsExample { get; set; } [Option('V', "version", HelpText = "Gets the bot version.")] public bool ShowVersion { get; set; } // -i --interactive, minimal ui/console tool to execute basic stuff like // create bot, excute commands // --setup setup the entire environment (-y to skip for user input?) // > libopus (self-compile/apt-get) // > ffmpeg (apt-get) // > youtube-dl (repo/apt-get) // > check NLog.config exists // > Crete new bot (see --new-bot) // --new-bot name={} address={} server_password={} ? } } ================================================ FILE: TS3AudioBot/TS3AudioBot.csproj ================================================ TS3AudioBot TS3AudioBot Exe 8.0 netcoreapp3.1 true Major enable AnyCPU false portable Media\favicon.ico en TS3AudioBot.Setup true true https://github.com/Splamy/TS3AudioBot.git git true true false false false true analyzers Designer Always . true Always . true True True strings.resx ResXFileCodeGenerator strings.Designer.cs True ================================================ FILE: TS3AudioBot/TS3AudioBot.csproj.user ================================================  <_LastSelectedProfileId>C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\Properties\PublishProfiles\FolderProfile.pubxml ================================================ FILE: TS3AudioBot/Ts3Client.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using TS3AudioBot.Algorithm; using TS3AudioBot.CommandSystem; using TS3AudioBot.Config; using TS3AudioBot.Helper; using TS3AudioBot.Localization; using TSLib; using TSLib.Commands; using TSLib.Full; using TSLib.Helper; using TSLib.Messages; using CmdE = System.Threading.Tasks.Task>; namespace TS3AudioBot { public sealed class Ts3Client { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private readonly Id id; public event AsyncEventHandler? OnBotConnected; public event AsyncEventHandler? OnBotDisconnected; public event AsyncEventHandler? OnBotStoppedReconnecting; public event AsyncEventHandler? OnMessageReceived; public event AsyncEventHandler? OnAloneChanged; public event EventHandler? OnWhisperNoTarget; private static readonly string[] QuitMessages = { "I'm outta here", "You're boring", "Have a nice day", "Bye", "Good night", "Nothing to do here", "Taking a break", "Lorem ipsum dolor sit amet…", "Nothing can hold me back", "It's getting quiet", "Drop the bazzzzzz", "Never gonna give you up", "Never gonna let you down", "Keep rockin' it", "?", "c(ꙩ_Ꙩ)ꜿ", "I'll be back", "Your advertisement could be here", "connection lost", "disconnected", "Requested by API.", "Robert'); DROP TABLE students;--", "It works!! No, wait...", "Notice me, senpai", ":wq", "Soon™", "It's not a bug, it's a feature" }; private bool closed = false; private int reconnectCounter; private ReconnectType? lastReconnect; private readonly ConfBot config; private readonly TsFullClient ts3FullClient; private IdentityData? identity; private List clientbuffer = new List(); private bool clientbufferOutdated = true; private readonly TimedCache clientDbNames = new TimedCache(); private readonly LruCache dbIdCache = new LruCache(128); private bool alone = true; private ChannelId? reconnectChannel = null; private ClientId[] ownChannelClients = Array.Empty(); public bool Connected => ts3FullClient.Connected; public TsConst ServerConstants => ts3FullClient.ServerConstants; public Ts3Client(ConfBot config, TsFullClient ts3FullClient, Id id) { this.id = id; this.ts3FullClient = ts3FullClient; ts3FullClient.OnEachTextMessage += ExtendedTextMessage; ts3FullClient.OnErrorEvent += TsFullClient_OnErrorEvent; ts3FullClient.OnDisconnected += TsFullClient_OnDisconnected; ts3FullClient.OnEachClientMoved += async (_, e) => { UpdateReconnectChannel(e.ClientId, e.TargetChannelId); if (AloneRecheckRequired(e.ClientId, e.TargetChannelId)) await IsAloneRecheck(); }; ts3FullClient.OnEachClientEnterView += async (_, e) => { UpdateReconnectChannel(e.ClientId, e.TargetChannelId); if (AloneRecheckRequired(e.ClientId, e.TargetChannelId)) await IsAloneRecheck(); else if (AloneRecheckRequired(e.ClientId, e.SourceChannelId)) await IsAloneRecheck(); }; ts3FullClient.OnEachClientLeftView += async (_, e) => { UpdateReconnectChannel(e.ClientId, e.TargetChannelId); if (AloneRecheckRequired(e.ClientId, e.TargetChannelId)) await IsAloneRecheck(); else if (AloneRecheckRequired(e.ClientId, e.SourceChannelId)) await IsAloneRecheck(); }; this.config = config; identity = null; } public E Connect() { // get or compute identity var identityConf = config.Connect.Identity; if (string.IsNullOrEmpty(identityConf.PrivateKey)) { identity = TsCrypt.GenerateNewIdentity(); identityConf.PrivateKey.Value = identity.PrivateKeyString; identityConf.Offset.Value = identity.ValidKeyOffset; } else { var identityResult = TsCrypt.LoadIdentityDynamic(identityConf.PrivateKey.Value, identityConf.Offset.Value); if (!identityResult.Ok) { Log.Error("The identity from the config file is corrupted. Remove it to generate a new one next start; or try to repair it."); return "Corrupted identity"; } identity = identityResult.Value; identityConf.PrivateKey.Value = identity.PrivateKeyString; identityConf.Offset.Value = identity.ValidKeyOffset; } // check required security level if (identityConf.Level.Value >= 0 && identityConf.Level.Value <= 160) UpdateIndentityToSecurityLevel(identityConf.Level.Value); else if (identityConf.Level.Value != -1) Log.Warn("Invalid config value for 'Level', enter a number between '0' and '160' or '-1' to adapt automatically."); config.SaveWhenExists(); reconnectCounter = 0; lastReconnect = null; reconnectChannel = null; ts3FullClient.QuitMessage = Tools.PickRandom(QuitMessages); ClearAllCaches(); _ = ConnectClient(); return R.Ok; } private async Task ConnectClient() { if (identity is null) throw new InvalidOperationException(); if (closed) return; TsVersionSigned? versionSign; if (!string.IsNullOrEmpty(config.Connect.ClientVersion.Build.Value)) { var versionConf = config.Connect.ClientVersion; versionSign = TsVersionSigned.TryParse(versionConf.Build, versionConf.Platform.Value, versionConf.Sign); if (versionSign is null) { Log.Warn("Invalid version sign, falling back to unknown :P"); versionSign = TsVersionSigned.VER_WIN_3_X_X; } } else if (Tools.IsLinux) { versionSign = TsVersionSigned.VER_LIN_3_X_X; } else { versionSign = TsVersionSigned.VER_WIN_3_X_X; } var connectionConfig = new ConnectionDataFull(config.Connect.Address, identity, versionSign: versionSign, username: config.Connect.Name, serverPassword: config.Connect.ServerPassword.Get(), defaultChannel: reconnectChannel?.ToPath() ?? config.Connect.Channel, defaultChannelPassword: config.Connect.ChannelPassword.Get(), logId: id); config.SaveWhenExists().UnwrapToLog(Log); if (!(await ts3FullClient.Connect(connectionConfig)).GetOk(out var error)) { Log.Error("Could not connect: {0}", error.ErrorFormat()); return; } Log.Info("Client connected."); reconnectCounter = 0; lastReconnect = null; await OnBotConnected.InvokeAsync(this); } public async Task Disconnect() { closed = true; await ts3FullClient.Disconnect(); ts3FullClient.Dispose(); } private void UpdateIndentityToSecurityLevel(int targetLevel) { if (identity is null) throw new InvalidOperationException(); if (TsCrypt.GetSecurityLevel(identity) < targetLevel) { Log.Info("Calculating up to required security level: {0}", targetLevel); TsCrypt.ImproveSecurity(identity, targetLevel); config.Connect.Identity.Offset.Value = identity.ValidKeyOffset; } } #region TSLib functions wrapper public Task SendMessage(string message, ClientId clientId) => ts3FullClient.SendPrivateMessage(message, clientId).UnwrapThrow(); public Task SendChannelMessage(string message) => ts3FullClient.SendChannelMessage(message).UnwrapThrow(); public Task SendServerMessage(string message) => ts3FullClient.SendServerMessage(message, 1).UnwrapThrow(); public Task KickClientFromServer(params ClientId[] clientId) => ts3FullClient.KickClientFromServer(clientId).UnwrapThrow(); public Task KickClientFromChannel(params ClientId[] clientId) => ts3FullClient.KickClientFromChannel(clientId).UnwrapThrow(); public Task ChangeDescription(string description) => ts3FullClient.ChangeDescription(description).UnwrapThrow(); public Task ChangeBadges(string badgesString) { if (!badgesString.StartsWith("overwolf=") && !badgesString.StartsWith("badges=")) badgesString = "overwolf=0:badges=" + badgesString; return ts3FullClient.ChangeBadges(badgesString).UnwrapThrow(); } public Task ChangeName(string name) => ts3FullClient.ChangeName(name).UnwrapThrow(e => (e == TsErrorCode.parameter_invalid_size ? strings.error_ts_invalid_name : null, false) ); public Task GetCachedClientById(ClientId id) => ClientBufferRequest(client => client.ClientId == id); public async Task GetFallbackedClientById(ClientId id) { try { return await ClientBufferRequest(client => client.ClientId == id); } catch (AudioBotException) { } Log.Warn("Slow double request due to missing or wrong permission configuration!"); ClientList clientInfo = await ts3FullClient.Send("clientinfo", new CommandParameter("clid", id)) .MapToSingle() .UnwrapThrow(_ => (strings.error_ts_no_client_found, true)); clientInfo.ClientId = id; clientbuffer.Add(clientInfo); return clientInfo; } public async Task GetClientByName(string name) { await RefreshClientBuffer(false); var client = Filter.DefaultFilter.Filter( clientbuffer.Select(cb => new KeyValuePair(cb.Name, cb)), name).FirstOrDefault().Value; if (client is null) throw new CommandException(strings.error_ts_no_client_found); return client; } private async Task ClientBufferRequest(Predicate pred) { await RefreshClientBuffer(false); var clientData = clientbuffer.Find(pred); if (clientData is null) throw new CommandException(strings.error_ts_no_client_found); return clientData; } public async ValueTask RefreshClientBuffer(bool force) { if (clientbufferOutdated || force) { var result = await ts3FullClient.ClientList(ClientListOptions.uid); if (!result) { Log.Debug("Clientlist failed ({0})", result.Error.ErrorFormat()); throw new TeamSpeakErrorCommandException(result.Error.FormatLocal().Str, result.Error); } clientbuffer = result.Value.ToList(); clientbufferOutdated = false; } } public async Task GetClientServerGroups(ClientDbId dbId) { var result = await ts3FullClient.ServerGroupsByClientDbId(dbId).UnwrapThrow(_ => (strings.error_ts_no_client_found, true)); return result.Select(csg => csg.ServerGroupId).ToArray(); } public async Task GetDbClientByDbId(ClientDbId clientDbId) { if (clientDbNames.TryGetValue(clientDbId, out var clientData)) return clientData; clientData = await ts3FullClient.ClientDbInfo(clientDbId).UnwrapThrow(_ => (strings.error_ts_no_client_found, true)); clientDbNames.Set(clientDbId, clientData); return clientData; } public Task GetClientInfoById(ClientId id) => ts3FullClient.ClientInfo(id).UnwrapThrow(_ => (strings.error_ts_no_client_found, true)); public async Task GetClientDbIdByUid(Uid uid) { if (dbIdCache.TryGetValue(uid, out var dbid)) return dbid; var client = await ts3FullClient.GetClientDbIdFromUid(uid).UnwrapThrow(_ => (strings.error_ts_no_client_found, true)); dbIdCache.Set(client.ClientUid, client.ClientDbId); return client.ClientDbId; } public async Task SetupRights(string? key) { var self = ts3FullClient.Book.Self(); if (self is null) { Log.Error("Getting self failed"); throw new CommandException(strings.cmd_bot_setup_error); } var myDbId = self.DatabaseId; // Check all own server groups ServerGroupId[] groups; bool groupsOk; try { groups = await GetClientServerGroups(myDbId); groupsOk = true; } catch { groups = Array.Empty(); groupsOk = false; } // Add self to master group (via token) if (!string.IsNullOrEmpty(key)) { var privKeyUseResult = await ts3FullClient.PrivilegeKeyUse(key); if (!privKeyUseResult.Ok) { Log.Error("Using privilege key failed ({0})", privKeyUseResult.Error.ErrorFormat()); throw new CommandException(strings.cmd_bot_setup_error); } } // Remember new group (or check if in new group at all) var groupDiff = Array.Empty(); if (groupsOk) { ServerGroupId[] groupsNew; try { groupsNew = await GetClientServerGroups(myDbId); groupDiff = groupsNew.Except(groups).ToArray(); } catch { } } if (config.BotGroupId == 0) { // Create new Bot group var botGroup = await ts3FullClient.ServerGroupAdd("ServerBot"); if (botGroup.Ok) { config.BotGroupId.Value = botGroup.Value.ServerGroupId.Value; // Add self to new group var grpresult = await ts3FullClient.ServerGroupAddClient(botGroup.Value.ServerGroupId, myDbId); if (!grpresult.Ok) Log.Error("Adding group failed ({0})", grpresult.Error.ErrorFormat()); } } const int max = 75; const int ava = 500000; // max size in bytes for the avatar // Add various rights to the bot group var permresult = await ts3FullClient.ServerGroupAddPerm((ServerGroupId)config.BotGroupId.Value, new[] { TsPermission.i_client_whisper_power, // + Required for whisper channel playing TsPermission.i_client_private_textmessage_power, // + Communication TsPermission.b_client_server_textmessage_send, // + Communication TsPermission.b_client_channel_textmessage_send, // + Communication TsPermission.b_client_modify_dbproperties, // ? Dont know but seems also required for the next one TsPermission.b_client_modify_description, // + Used to change the description of our bot TsPermission.b_client_info_view, // (+) only used as fallback usually TsPermission.b_virtualserver_client_list, // ? Dont know but seems also required for the next one TsPermission.i_channel_subscribe_power, // + Required to find user to communicate TsPermission.b_virtualserver_client_dbinfo, // + Required to get basic user information for history, api, etc... TsPermission.i_client_talk_power, // + Required for normal channel playing TsPermission.b_client_modify_own_description, // ? not sure if this makes b_client_modify_description superfluous TsPermission.b_group_is_permanent, // + Group should stay even if bot disconnects TsPermission.i_client_kick_from_channel_power, // + Optional for kicking TsPermission.i_client_kick_from_server_power, // + Optional for kicking TsPermission.i_client_max_clones_uid, // + In case that bot times out and tries to join again TsPermission.b_client_ignore_antiflood, // + The bot should be resistent to forced spam attacks TsPermission.b_channel_join_ignore_password, // + The noble bot will not abuse this power TsPermission.b_channel_join_permanent, // + Allow joining to all channel even on strict servers TsPermission.b_channel_join_semi_permanent, // + Allow joining to all channel even on strict servers TsPermission.b_channel_join_temporary, // + Allow joining to all channel even on strict servers TsPermission.b_channel_join_ignore_maxclients, // + Allow joining full channels TsPermission.i_channel_join_power, // + Allow joining to all channel even on strict servers TsPermission.b_client_permissionoverview_view, // + Scanning through given perms for rights system TsPermission.i_client_max_avatar_filesize, // + Uploading thumbnails as avatar TsPermission.b_client_use_channel_commander, // + Enable channel commander TsPermission.b_client_ignore_bans, // + The bot should be resistent to bans TsPermission.b_client_ignore_sticky, // + Should skip weird movement restrictions TsPermission.i_client_max_channel_subscriptions, // + Required to find user to communicate }, new[] { max, max, 1, 1, 1, 1, 1, 1, max, 1, max, 1, 1, max, max, 4, 1, 1, 1, 1, 1, 1, max, 1, ava, 1, 1, 1, -1, }, new[] { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, }, new[] { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, }); if (!permresult) Log.Error("Adding permissions failed ({0})", permresult.Error.ErrorFormat()); // Leave master group again if (groupDiff.Length > 0) { foreach (var grp in groupDiff) { var grpresult = await ts3FullClient.ServerGroupDelClient(grp, myDbId); if (!grpresult.Ok) Log.Error("Removing group failed ({0})", grpresult.Error.ErrorFormat()); } } } public Task UploadAvatar(System.IO.Stream stream) => ts3FullClient.UploadAvatar(stream).UnwrapThrow(e => (e == TsErrorCode.permission_invalid_size ? strings.error_ts_file_too_big : null, false) ); public Task DeleteAvatar() => ts3FullClient.DeleteAvatar().UnwrapThrow(); public Task MoveTo(ChannelId channelId, string? password = null) => ts3FullClient.ClientMove(ts3FullClient.ClientId, channelId, password).UnwrapThrow(_ => (strings.error_ts_cannot_move, true)); public Task SetChannelCommander(bool isCommander) => ts3FullClient.ChangeIsChannelCommander(isCommander).UnwrapThrow(_ => (strings.error_ts_cannot_set_commander, true)); public async Task IsChannelCommander() => (await GetClientInfoById(ts3FullClient.ClientId)).IsChannelCommander; public void InvalidateClientBuffer() => clientbufferOutdated = true; private void ClearAllCaches() { InvalidateClientBuffer(); dbIdCache.Clear(); clientDbNames.Clear(); alone = true; ownChannelClients = Array.Empty(); } #endregion #region Events private void TsFullClient_OnErrorEvent(object? sender, CommandError error) { switch (error.Id) { case TsErrorCode.whisper_no_targets: OnWhisperNoTarget?.Invoke(this, EventArgs.Empty); break; default: Log.Debug("Got ts3 error event: {0}", error.ErrorFormat()); break; } } private async void TsFullClient_OnDisconnected(object? sender, DisconnectEventArgs e) { await OnBotDisconnected.InvokeAsync(this, e); if (e.Error != null) { var error = e.Error; switch (error.Id) { case TsErrorCode.client_could_not_validate_identity: if (config.Connect.Identity.Level.Value == -1 && !string.IsNullOrEmpty(error.ExtraMessage)) { int targetSecLevel = int.Parse(error.ExtraMessage); UpdateIndentityToSecurityLevel(targetSecLevel); // TODO Async await ConnectClient(); return; // skip triggering event, we want to reconnect } else { Log.Warn("The server reported that the security level you set is not high enough." + "Increase the value to '{0}' or set it to '-1' to generate it on demand when connecting.", error.ExtraMessage); } break; case TsErrorCode.client_too_many_clones_connected: Log.Warn("Another client with the same identity is already connected."); if (await TryReconnect(ReconnectType.Error)) return; break; case TsErrorCode.connect_failed_banned: Log.Warn("This bot is banned."); if (await TryReconnect(ReconnectType.Ban)) return; break; default: Log.Warn("Could not connect: {0}", error.ErrorFormat()); if (await TryReconnect(ReconnectType.Error)) return; break; } } else { Log.Debug("Bot disconnected. Reason: {0}", e.ExitReason); if (await TryReconnect(e.ExitReason switch { Reason.Timeout => ReconnectType.Timeout, Reason.SocketError => ReconnectType.Timeout, Reason.KickedFromServer => ReconnectType.Kick, Reason.ServerShutdown => ReconnectType.ServerShutdown, Reason.ServerStopped => ReconnectType.ServerShutdown, Reason.Banned => ReconnectType.Ban, _ => ReconnectType.None })) return; } await OnBotStoppedReconnecting.InvokeAsync(this); } private async Task TryReconnect(ReconnectType type) { if (closed) return false; // Check if we want to keep the last disconnect type if (type == ReconnectType.Timeout && lastReconnect == ReconnectType.ServerShutdown) { type = lastReconnect.Value; } else { if (lastReconnect != type) reconnectCounter = 0; lastReconnect = type; } TimeSpan? delay; switch (type) { case ReconnectType.Timeout: delay = config.Reconnect.OnTimeout.GetValueAsTime(reconnectCounter); break; case ReconnectType.Kick: delay = config.Reconnect.OnKick.GetValueAsTime(reconnectCounter); break; case ReconnectType.Ban: delay = config.Reconnect.OnBan.GetValueAsTime(reconnectCounter); break; case ReconnectType.ServerShutdown: delay = config.Reconnect.OnShutdown.GetValueAsTime(reconnectCounter); break; case ReconnectType.Error: delay = config.Reconnect.OnError.GetValueAsTime(reconnectCounter); break; case ReconnectType.None: return false; default: throw Tools.UnhandledDefault(type); } reconnectCounter++; if (delay == null) { Log.Info("Reconnect strategy for '{0}' has reached the end. Closing instance.", type); return false; } Log.Info("Trying to reconnect because of {0}. Delaying reconnect for {1:0} seconds", type, delay.Value.TotalSeconds); await Task.Delay(delay.Value); // TODO: Async add cancellation token ? await ConnectClient(); return true; } private async void ExtendedTextMessage(object? sender, TextMessage textMessage) { // Prevent loopback of own textmessages if (textMessage.InvokerId == ts3FullClient.ClientId) return; await OnMessageReceived.InvokeAsync(sender, textMessage); } private void UpdateReconnectChannel(ClientId clientId, ChannelId channelId) { if (clientId == ts3FullClient.ClientId && channelId != ChannelId.Null) reconnectChannel = channelId; } private bool AloneRecheckRequired(ClientId clientId, ChannelId channelId) => ownChannelClients.Contains(clientId) || channelId == ts3FullClient.Book.Self()?.Channel; private async ValueTask IsAloneRecheck() { var self = ts3FullClient.Book.Self(); if (self is null) return; var ownChannel = self.Channel; ownChannelClients = ts3FullClient.Book.Clients.Values.Where(c => c.Channel == ownChannel && c != self).Select(c => c.Id).ToArray(); var newAlone = ownChannelClients.Length == 0; if (newAlone != alone) { alone = newAlone; await OnAloneChanged.InvokeAsync(this, new AloneChanged(newAlone)); } } #endregion private enum ReconnectType { None, Timeout, Kick, Ban, ServerShutdown, Error } } public class AloneChanged : EventArgs { public bool Alone { get; } public AloneChanged(bool alone) { Alone = alone; } } internal static class CommandErrorExtentions { public static async Task UnwrapThrow(this Task> task, Func? prefix = null) where T : notnull { var result = await task; if (result.Ok) return result.Value; else throw new TeamSpeakErrorCommandException(result.Error.FormatLocal(prefix).Str, result.Error); } public static async Task UnwrapThrow(this Task> task, Func? prefix = null) { var result = await task; if (!result.Ok) throw new TeamSpeakErrorCommandException(result.Error.FormatLocal(prefix).Str, result.Error); } public static async Task> FormatLocal(this Task> task, Func? prefix = null) where T : notnull => (await task).FormatLocal(prefix); public static R FormatLocal(this R cmdErr, Func? prefix = null) where T : notnull { if (cmdErr.Ok) return cmdErr.Value; return cmdErr.Error.FormatLocal(prefix); } public static async CmdE FormatLocal(this Task> task, Func? prefix = null) => (await task).FormatLocal(prefix); public static E FormatLocal(this E cmdErr, Func? prefix = null) { if (cmdErr.Ok) return R.Ok; return cmdErr.Error.FormatLocal(prefix); } public static LocalStr FormatLocal(this CommandError err, Func? prefix = null) { var strb = new StringBuilder(); bool msg = true; if (prefix != null) { string? prefixStr; (prefixStr, msg) = prefix(err.Id); if (prefixStr != null) { strb.Append(prefixStr); } } if (strb.Length == 0) { strb.Append(strings.error_ts_unknown_error); } if (msg) { if (strb.Length > 0) strb.Append(" ("); var localStr = LocalizationManager.GetString("error_ts_code_" + (uint)err.Id); if (localStr != null) strb.Append(localStr); else strb.Append(err.Message); strb.Append(')'); } if (err.MissingPermissionId != TsPermission.undefined) strb.Append(" (").Append(err.MissingPermissionId).Append(')'); return new LocalStr(strb.ToString()); } } } ================================================ FILE: TS3AudioBot/Upgrader.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using TS3AudioBot.Dependency; namespace TS3AudioBot { internal static class Upgrader { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private const string CoreTable = "core"; private const int CurrentVersion = 1; public static void PerformUpgrades(CoreInjector injector) { var database = injector.GetModuleOrThrow(); var meta = database.GetMetaData(CoreTable); void Advance(int version, string? explanation) { meta.Version = version; database.UpdateMetaData(meta); if (explanation != null) Log.Info("Upgrading data to ver {0}. {1}", version, explanation); } switch (meta.Version) { case 0: // Case 0 should always jump to the lastest version, since it gets created on first start. Advance(CurrentVersion, null); goto case CurrentVersion; case CurrentVersion: break; default: Log.Warn("It seems that you downgraded your TS3AB version. " + "Due to automatic upgrades some stuff might not work anymore, be advised. " + "It is recommended to backup data before upgrading to unstable/beta builds if you intend to downgrade again."); break; } } } } ================================================ FILE: TS3AudioBot/Web/Api/ApiCall.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Net; using TSLib; namespace TS3AudioBot.Web.Api { public class ApiCall : InvokerData { public string? Token { get; set; } public IPAddress? IpAddress { get; set; } public Uri? RequestUrl { get; set; } public string? Body { get; set; } public static ApiCall CreateAnonymous() => new ApiCall(Uid.Anonymous); public ApiCall(Uid clientUid, IPAddress? ipAddress = null, Uri? requestUrl = null, string? token = null, string? body = null) : base(clientUid) { Token = token; IpAddress = ipAddress; RequestUrl = requestUrl; Body = body; } } } ================================================ FILE: TS3AudioBot/Web/Api/DataStream.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Microsoft.AspNetCore.Http; using System; using System.Threading.Tasks; namespace TS3AudioBot.Web.Api { public class DataStream { private readonly Func writeFunc; public DataStream(Func writeFunc) { this.writeFunc = writeFunc; } public Task WriteOut(HttpResponse response) => writeFunc(response); public override string? ToString() => null; } } ================================================ FILE: TS3AudioBot/Web/Api/JsonArray.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; namespace TS3AudioBot.Web.Api { public class JsonArray : JsonValue> { public JsonArray(IList value, string msg) : base(value, msg) { } public JsonArray(IList value, Func, string>? asString = null) : base(value, asString) { } } } ================================================ FILE: TS3AudioBot/Web/Api/JsonEmpty.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Web.Api { public class JsonEmpty : JsonObject { private readonly string message; public JsonEmpty(string msg) { message = msg; } public override object GetSerializeObject() => string.Empty; public override string Serialize() => string.Empty; public override string ToString() => message; } } ================================================ FILE: TS3AudioBot/Web/Api/JsonError.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using TS3AudioBot.CommandSystem; namespace TS3AudioBot.Web.Api { public class JsonError : JsonObject { private static readonly JsonSerializerSettings ErrorSerializeSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, }; private readonly CommandExceptionReason reason; public int ErrorCode => (int)reason; public string ErrorName => reason.ToString(); public string ErrorMessage { get; } public string? HelpMessage { get; set; } public string? HelpLink { get; set; } public JsonError(string msg, CommandExceptionReason reason) { ErrorMessage = msg; this.reason = reason; } public override string Serialize() => JsonConvert.SerializeObject(GetSerializeObject(), ErrorSerializeSettings); public override string ToString() => ErrorMessage; } } ================================================ FILE: TS3AudioBot/Web/Api/JsonObject.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using TS3AudioBot.CommandSystem.CommandResults; using TS3AudioBot.Helper; namespace TS3AudioBot.Web.Api { public abstract class JsonObject : IWrappedResult { private static readonly JsonSerializerSettings DefaultSettigs = new JsonSerializerSettings(); static JsonObject() { DefaultSettigs.Converters.Add(new IJsonSerializableConverter()); DefaultSettigs.Converters.Add(new TimeSpanConverter()); } protected JsonObject() { } object? IWrappedResult.Content => GetSerializeObject(); public virtual object GetSerializeObject() => this; public virtual string Serialize() => JsonConvert.SerializeObject(GetSerializeObject(), DefaultSettigs); public override abstract string ToString(); } } ================================================ FILE: TS3AudioBot/Web/Api/JsonValue.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using System; using TS3AudioBot.CommandSystem; namespace TS3AudioBot.Web.Api { public class JsonValue : JsonValue where T : notnull { protected Func? AsString { get; } new public T Value => (T)base.Value; public JsonValue(T value) : base(value) { } public JsonValue(T value, string msg) : base(value, msg) { } public JsonValue(T value, Func? asString) : base(value) { AsString = asString; } public override string ToString() { if (AsStringResult is null) { if (AsString != null) AsStringResult = AsString.Invoke(Value); else AsStringResult = Value?.ToString() ?? string.Empty; } return AsStringResult; } } public abstract class JsonValue : JsonObject { protected string? AsStringResult { get; set; } public object Value { get; } protected JsonValue(object value) { Value = value; AsStringResult = null; } protected JsonValue(object value, string msg) { Value = value; AsStringResult = msg ?? string.Empty; } public override object GetSerializeObject() => Value; public override string Serialize() { var seriObj = GetSerializeObject(); if (seriObj != null && CommandSystemTypes.BasicTypes.Contains(seriObj.GetType())) return JsonConvert.SerializeObject(this); return base.Serialize(); } public override string ToString() { if (AsStringResult is null) AsStringResult = Value?.ToString() ?? string.Empty; return AsStringResult; } // static creator methods for anonymous stuff public static JsonValue Create(T anon) where T : notnull => new JsonValue(anon); public static JsonValue Create(T anon, string msg) where T : notnull => new JsonValue(anon, msg); public static JsonValue Create(T anon, Func? asString) where T : notnull => new JsonValue(anon, asString); } } ================================================ FILE: TS3AudioBot/Web/Api/OpenApiGenerator.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Text; using TS3AudioBot.CommandSystem; using TS3AudioBot.CommandSystem.Commands; using TSLib.Helper; namespace TS3AudioBot.Web.Api { public static class OpenApiGenerator { private static readonly JsonSerializer seri = JsonSerializer.CreateDefault(); static OpenApiGenerator() { seri.NullValueHandling = NullValueHandling.Ignore; } public static JObject Generate(CommandManager commandManager, BotInfo[] bots) { var paths = new JObject(); var addedCommandPaths = new HashSet(); foreach (var command in commandManager.AllCommands) { var token = GenerateCommand(commandManager, command, addedCommandPaths); if (token != null) paths.Add(token); } const string defaultAuthSchemeName = "default_basic"; return new JObject( new JProperty("openapi", "3.0.0"), JPropObj("info", new JProperty("version", "1.0.0"), new JProperty("title", "Ts3AudioBot API"), new JProperty("description", "The Ts3AudioBot api interface.") ), new JProperty("paths", paths ), new JProperty("servers", new JArray( new JObject( new JProperty("url", "/api"), new JProperty("description", "Your Ts3AudioBot server.") ) ).Chain(x => { foreach (var bot in bots) { x.Add(new JObject( new JProperty("url", $"/api/bot/use/{bot.Id}/(/"), new JProperty("description", $"Bot {bot.Name}") )); } }) ), JPropObj("components", JPropObj("securitySchemes", JPropObj(defaultAuthSchemeName, new JProperty("type", "http"), new JProperty("scheme", "basic") ) ) ), new JProperty("security", new JArray( new JObject( new JProperty(defaultAuthSchemeName, new JArray()) ) ) ) ); } private static JToken? GenerateCommand(CommandManager commandManager, BotCommand command, HashSet addedCommandPaths) { var parameters = new JArray(); var pathBuilder = new StringBuilder(); pathBuilder.Append("/"); pathBuilder.Append(command.InvokeName.Replace(' ', '/')); foreach (var param in command.CommandParameter) { switch (param.Kind) { case ParamKind.Unknown: break; case ParamKind.SpecialArguments: break; case ParamKind.Dependency: break; case ParamKind.NormalCommand: case ParamKind.NormalParam: case ParamKind.NormalArray: case ParamKind.NormalTailString: if (param.Kind == ParamKind.NormalArray) pathBuilder.Append("/{").Append(param.Name).Append("}..."); else pathBuilder.Append("/{").Append(param.Name).Append("}"); var addparam = new JObject( new JProperty("name", param.Name), new JProperty("in", "path"), new JProperty("description", "useful help"), new JProperty("required", true) // param.optional ); var paramschema = NormalToSchema(param.Type); if (paramschema != null) addparam.Add("schema", JObject.FromObject(paramschema, seri)); parameters.Add(addparam); break; default: throw Tools.UnhandledDefault(param.Kind); } } var path = pathBuilder.ToString(); if (addedCommandPaths.Contains(path)) return null; addedCommandPaths.Add(path); // check tag var tags = new JArray(); int spaceIndex = command.InvokeName.IndexOf(' '); string baseName = spaceIndex >= 0 ? command.InvokeName.Substring(0, spaceIndex) : command.InvokeName; var commandroot = commandManager.RootGroup.GetCommand(baseName); switch (commandroot) { case null: break; case CommandGroup group: tags.Add(baseName); break; } // build final command var reponseschema = NormalToSchema(command.CommandReturn); return JPropObj(path, JPropObj("get", new JProperty("tags", tags), new JProperty("description", command.Description), new JProperty("parameters", parameters), new JProperty("responses", new JObject().Chain(r => { if (reponseschema != null) { r.Add( JPropObj("200", new JProperty("description", "Successful"), new JProperty("content", new JObject( JPropObj("application/json", new JProperty("schema", JObject.FromObject(reponseschema, seri)) ) ) ) ) ); } else { r.Add( JPropObj("204", new JProperty("description", "Successful") ) ); } }) ) ) ); } private static T Chain(this T token, Action func) where T : JToken { func.Invoke(token); return token; } private static JProperty JPropObj(string name, params object[] token) { return new JProperty(name, new JObject(token)); } private static OApiSchema? NormalToSchema(Type type) { type = FunctionCommand.UnwrapReturnType(type); if (type.IsArray) { return new OApiSchema("array") { Items = NormalToSchema(type.GetElementType()!) }; } if (type == typeof(bool)) return OApiSchema.FromBasic("boolean"); else if (type == typeof(sbyte)) return OApiSchema.FromBasic("integer", "int8"); else if (type == typeof(byte)) return OApiSchema.FromBasic("integer", "uint8"); else if (type == typeof(short)) return OApiSchema.FromBasic("integer", "int16"); else if (type == typeof(ushort)) return OApiSchema.FromBasic("integer", "uint16"); else if (type == typeof(int)) return OApiSchema.FromBasic("integer", "int32"); else if (type == typeof(uint)) return OApiSchema.FromBasic("integer", "uint32"); else if (type == typeof(long)) return OApiSchema.FromBasic("integer", "int64"); else if (type == typeof(ulong)) return OApiSchema.FromBasic("integer", "uint64"); else if (type == typeof(float)) return OApiSchema.FromBasic("number", "float"); else if (type == typeof(double)) return OApiSchema.FromBasic("number", "double"); else if (type == typeof(TimeSpan)) return OApiSchema.FromBasic("string", "duration"); else if (type == typeof(DateTime)) return OApiSchema.FromBasic("string", "date-time"); else if (type == typeof(string)) return OApiSchema.FromBasic("string", null); else if (type == typeof(JsonEmpty) || type == typeof(void)) return null; else if (type == typeof(JsonObject) || type == typeof(object)) return OApiSchema.FromBasic("object"); else if (type == typeof(ICommand)) return OApiSchema.FromBasic("λ"); else { return OApiSchema.FromBasic(type.Name); } } private class OApiSchema { [JsonProperty(PropertyName = "type")] public string Type { get; set; } [JsonProperty(PropertyName = "format")] public string? Format { get; set; } [JsonProperty(PropertyName = "additionalProperties")] public OApiSchema? AdditionalProperties { get; set; } [JsonProperty(PropertyName = "items")] public OApiSchema? Items { get; set; } public OApiSchema(string type) { Type = type; } public static OApiSchema FromBasic(string type, string? format = null) => new OApiSchema(type) { Format = format }; public OApiSchema ObjWrap() => new OApiSchema("object") { AdditionalProperties = this }; } } } ================================================ FILE: TS3AudioBot/Web/Api/TimeSpanConverter.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using System; namespace TS3AudioBot.Web.Api { internal class TimeSpanConverter : JsonConverter { public override void WriteJson(JsonWriter writer, TimeSpan value, JsonSerializer serializer) { writer.WriteValue(value.TotalSeconds); } public override TimeSpan ReadJson(JsonReader reader, Type objectType, TimeSpan existingValue, bool hasExistingValue, JsonSerializer serializer) { float secs = (float?)reader.Value ?? 0; return TimeSpan.FromSeconds(secs); } } } ================================================ FILE: TS3AudioBot/Web/Api/WebApi.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; using System; using System.Globalization; using System.IO; using System.Net; using System.Threading; using System.Threading.Tasks; using TS3AudioBot.Algorithm; using TS3AudioBot.Audio; using TS3AudioBot.CommandSystem; using TS3AudioBot.CommandSystem.Ast; using TS3AudioBot.CommandSystem.Commands; using TS3AudioBot.Config; using TS3AudioBot.Dependency; using TS3AudioBot.Environment; using TS3AudioBot.Helper; using TS3AudioBot.Localization; using TS3AudioBot.Sessions; using TSLib; using TSLib.Helper; namespace TS3AudioBot.Web.Api { public sealed class WebApi { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private static readonly Uri Dummy = new Uri("http://dummy/"); private const string ErrorNoUserOrToken = "Unknown user or no active token found"; private const string ErrorAuthFailure = "Authentication failed"; private const string ErrorAnonymousDisabled = "This bot does not allow anonymous api requests"; private const string ErrorUnsupportedScheme = "Unsupported authentication scheme"; public bool AllowAnonymousRequest { get; set; } = true; private readonly ConfWebApi config; private readonly CoreInjector coreInjector; private readonly TokenManager tokenManager; private readonly Stats stats; public WebApi(ConfWebApi config, CoreInjector coreInjector, TokenManager tokenManager, Stats stats) { this.config = config; this.coreInjector = coreInjector; this.tokenManager = tokenManager; this.stats = stats; } public async Task ProcessApiV1Call(HttpContext context) { var request = context.Request; var response = context.Response; response.ContentType = "application/json"; response.Headers["Access-Control-Allow-Origin"] = "*"; response.Headers["CacheControl"] = "no-cache, no-store, must-revalidate"; var authResult = Authenticate(context.Request); if (!authResult.Ok) { Log.Debug("Authorization failed!"); await ReturnError(new CommandException(authResult.Error, CommandExceptionReason.Unauthorized), response); return; } if (!AllowAnonymousRequest && authResult.Value.ClientUid == Uid.Null) { Log.Debug("Unauthorized request!"); await ReturnError(new CommandException(ErrorAnonymousDisabled, CommandExceptionReason.Unauthorized), response); return; } var apiCallData = authResult.Value; var remoteAddress = context.Connection?.RemoteIpAddress; if (remoteAddress is null) { Log.Warn("Remote has no IP, ignoring request"); return; } if (IPAddress.IsLoopback(remoteAddress) && request.Headers.TryGetValue("X-Real-IP", out var realIpStr) && IPAddress.TryParse(realIpStr, out var realIp)) { remoteAddress = realIp; } apiCallData.IpAddress = remoteAddress; apiCallData.RequestUrl = new Uri(Dummy, context.Features.Get().RawTarget); Log.Info("{0} Requested: {1}", remoteAddress, apiCallData.RequestUrl.PathAndQuery); var command = BuildCommand(apiCallData.RequestUrl); if (!(await ProcessBodyData(request, apiCallData)).GetOk(out var err)) { await ReturnError(err, response); return; } var execInfo = BuildContext(apiCallData); try { stats.TrackCommandApiCall(); Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; var res = await command.Execute(execInfo, Array.Empty()); if (res is null) { response.StatusCode = (int)HttpStatusCode.NoContent; } else if (res is DataStream data) { response.StatusCode = (int)HttpStatusCode.OK; using (response.Body) { await data.WriteOut(response); } } else { if (!(res is JsonObject json)) json = JsonValue.Create(res); var returnString = json.Serialize(); response.StatusCode = returnString.Length == 0 ? (int)HttpStatusCode.NoContent : (int)HttpStatusCode.OK; using var responseStream = new StreamWriter(response.Body); await responseStream.WriteAsync(returnString); } } catch (Exception ex) { await ReturnError(ex, response); } } private ICommand BuildCommand(Uri requestUrl) { string apirequest = requestUrl.OriginalString.Substring(requestUrl.GetLeftPart(UriPartial.Authority).Length + "/api".Length); var ast = CommandParser.ParseCommandRequest(apirequest, '/', '/'); UnescapeAstTree(ast); Log.Trace(ast.ToString); return CommandManager.AstToCommandResult(ast); } private ExecutionInformation BuildContext(ApiCall apiCallData) { var execInfo = new ExecutionInformation(coreInjector); execInfo.AddModule(new CallerInfo(true) { SkipRightsChecks = false, CommandComplexityMax = config.CommandComplexity, IsColor = false, }); execInfo.AddModule(apiCallData); execInfo.AddModule(apiCallData); execInfo.AddModule(Filter.GetFilterByNameOrDefault(config.Matcher)); return execInfo; } private async Task> ProcessBodyData(HttpRequest request, ApiCall apiCallData) { if (request.ContentType != "application/json") return R.Ok; try { using (var sr = new StreamReader(request.Body, Tools.Utf8Encoder)) apiCallData.Body = await sr.ReadToEndAsync(); return R.Ok; } catch (Exception ex) { Log.Warn(ex, "Failed to parse request Body"); return ex; } } private static async Task ReturnError(Exception ex, HttpResponse response) { Log.Debug(ex, "Api Exception"); try { JsonError? jsonError = null; switch (ex) { case CommandException cex: jsonError = ReturnCommandError(cex, response); break; case AudioBotException abex: jsonError = new JsonError(abex.Message, CommandExceptionReason.CommandError); break; case NotImplementedException _: response.StatusCode = (int)HttpStatusCode.NotImplemented; break; case EntityTooLargeException _: response.StatusCode = (int)HttpStatusCode.RequestEntityTooLarge; break; default: Log.Error(ex, "Unknown command error"); response.StatusCode = (int)HttpStatusCode.InternalServerError; break; } jsonError ??= new JsonError(ex.Message, CommandExceptionReason.Unknown); using var responseStream = new StreamWriter(response.Body); await responseStream.WriteAsync(jsonError.Serialize()); } catch (Exception htex) { Log.Warn(htex, "Failed to respond to HTTP request."); } } private static JsonError ReturnCommandError(CommandException ex, HttpResponse response) { var jsonError = new JsonError(ex.Message, ex.Reason); switch (ex.Reason) { case CommandExceptionReason.Unknown: case CommandExceptionReason.InternalError: response.StatusCode = (int)HttpStatusCode.InternalServerError; break; case CommandExceptionReason.Unauthorized: jsonError.HelpMessage += "You have to authenticate yourself to call this method."; jsonError.HelpLink = "https://github.com/Splamy/TS3AudioBot/wiki/WebAPI#authentication"; response.StatusCode = (int)HttpStatusCode.Unauthorized; break; case CommandExceptionReason.MissingRights: jsonError.HelpLink = "https://github.com/Splamy/TS3AudioBot/wiki/FAQ#missing-rights"; response.StatusCode = (int)HttpStatusCode.Forbidden; break; case CommandExceptionReason.AmbiguousCall: case CommandExceptionReason.MissingParameter: case CommandExceptionReason.NotSupported: response.StatusCode = (int)HttpStatusCode.BadRequest; break; case CommandExceptionReason.MissingContext: if (ex is MissingContextCommandException mcex) { if (mcex.MissingType == typeof(ClientCall)) { jsonError.HelpMessage += strings.error_not_available_from_api; } else if (mcex.MissingType == typeof(UserSession)) { jsonError.HelpMessage += "Creating UserSessions via api is currently not implemented yet."; } else if (mcex.MissingType == typeof(Bot) || mcex.MissingType == typeof(Player) || mcex.MissingType == typeof(PlayManager) || mcex.MissingType == typeof(Ts3Client) || mcex.MissingType == typeof(IVoiceTarget) || mcex.MissingType == typeof(IVoiceTarget) || mcex.MissingType == typeof(ConfBot)) { jsonError.HelpMessage += "You are trying to call a command which is specific to a bot. " + "Use '!bot use' to switch to a bot instance"; jsonError.HelpLink = "https://github.com/Splamy/TS3AudioBot/wiki/FAQ#api-missing-context"; } } goto case CommandExceptionReason.CommandError; case CommandExceptionReason.CommandError: case CommandExceptionReason.NoReturnMatch: response.StatusCode = 422; // Unprocessable Entity break; case CommandExceptionReason.FunctionNotFound: response.StatusCode = (int)HttpStatusCode.NotFound; break; default: throw Tools.UnhandledDefault(ex.Reason); } return jsonError; } private static void UnescapeAstTree(AstNode node) { switch (node.Type) { case AstType.Command: var astCom = (AstCommand)node; foreach (var child in astCom.Parameter) UnescapeAstTree(child); break; case AstType.Value: var astVal = (AstValue)node; astVal.Value = Uri.UnescapeDataString(astVal.Value); break; case AstType.Error: break; default: throw Tools.UnhandledDefault(node.Type); } } private R Authenticate(HttpRequest request) { if (!request.Headers.TryGetValue("Authorization", out var headerVal)) return ApiCall.CreateAnonymous(); var authParts = headerVal.ToString().Split(new[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries); if (authParts.Length < 2) return ErrorAuthFailure; if (!string.Equals(authParts[0], "BASIC", StringComparison.OrdinalIgnoreCase)) return ErrorUnsupportedScheme; string userUid; string token; try { var data = Convert.FromBase64String(authParts[1]); var index = Array.IndexOf(data, (byte)':'); if (index < 0) return ErrorAuthFailure; userUid = Tools.Utf8Encoder.GetString(data, 0, index); token = Tools.Utf8Encoder.GetString(data, index + 1, data.Length - (index + 1)); } catch (Exception) { return "Malformed base64 string"; } var dbToken = tokenManager.GetToken(userUid); if (dbToken is null) return ErrorNoUserOrToken; if (dbToken.Value != token) return ErrorAuthFailure; return new ApiCall((Uid)userUid, token: dbToken.Value); } } } ================================================ FILE: TS3AudioBot/Web/Model/CurrentSongInfo.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; using System; namespace TS3AudioBot.Web.Model { public class CurrentSongInfo : PlaylistItemGetData { [JsonProperty(PropertyName = "Position")] public TimeSpan Position { get; set; } [JsonProperty(PropertyName = "Length")] public TimeSpan Length { get; set; } [JsonProperty(PropertyName = "Paused")] public bool Paused { get; set; } } } ================================================ FILE: TS3AudioBot/Web/Model/PlaylistInfo.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; namespace TS3AudioBot.Web.Model { public class PlaylistInfo { // TODO better names [JsonProperty(PropertyName = "Id")] public string Id { get; set; } [JsonProperty(PropertyName = "Title")] public string Title { get; set; } /// How many songs are in the entire playlist [JsonProperty(PropertyName = "SongCount")] public int SongCount { get; set; } /// From which index the itemization begins. [JsonProperty(PropertyName = "DisplayOffset")] public int DisplayOffset { get; set; } /// The playlist items for the request. /// This might only be a part of the entire playlist. /// Check for the entire count. [JsonProperty(PropertyName = "Items", NullValueHandling = NullValueHandling.Ignore)] public PlaylistItemGetData[]? Items { get; set; } public PlaylistInfo(string id, string title) { Id = id; Title = title; } } } ================================================ FILE: TS3AudioBot/Web/Model/PlaylistItemGetData.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TS3AudioBot.Web.Model { public class PlaylistItemGetData { // Optional, useful when adding a single element to a list // public int? Index { get; set; } public string? Link { get; set; } public string? Title { get; set; } public string? AudioType { get; set; } // Link // AlbumCover } } ================================================ FILE: TS3AudioBot/Web/Model/QueueInfo.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Newtonsoft.Json; namespace TS3AudioBot.Web.Model { public class QueueInfo : PlaylistInfo { [JsonProperty(PropertyName = "PlaybackIndex")] public int PlaybackIndex { get; set; } public QueueInfo(string id, string title) : base(id, title) { } } } ================================================ FILE: TS3AudioBot/Web/WebServer.cs ================================================ // TS3AudioBot - An advanced Musicbot for Teamspeak 3 // Copyright (C) 2017 TS3AudioBot contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; using TS3AudioBot.Config; using TS3AudioBot.Dependency; namespace TS3AudioBot.Web { public sealed class WebServer : IDisposable { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private CancellationTokenSource? cancelToken; private readonly ConfWeb config; private readonly CoreInjector coreInjector; private Api.WebApi? api; public WebServer(ConfWeb config, CoreInjector coreInjector) { this.config = config; this.coreInjector = coreInjector; } // TODO write server to be reload-able public void StartWebServer() { var startWebServer = false; if (config.Api.Enabled || config.Interface.Enabled) { if (!config.Api.Enabled) Log.Warn("The api is required for the webinterface to work properly; The api is now implicitly enabled. Enable the api in the config to remove this warning."); if (!coreInjector.TryCreate(out var api)) throw new Exception("Could not create Api object."); this.api = api; startWebServer = true; } if (startWebServer) { StartWebServerInternal(); } } public string? FindWebFolder() { var webData = config.Interface; if (string.IsNullOrEmpty(webData.Path)) { for (int i = 0; i < 5; i++) { var up = Path.Combine(Enumerable.Repeat("..", i).ToArray()); var checkDir = Path.Combine(up, "WebInterface"); if (Directory.Exists(checkDir)) return Path.GetFullPath(checkDir); } var asmPath = Path.GetDirectoryName(typeof(Core).Assembly.Location)!; var asmWebPath = Path.GetFullPath(Path.Combine(asmPath, "WebInterface")); if (Directory.Exists(asmWebPath)) return asmWebPath; } else if (Directory.Exists(webData.Path)) { return Path.GetFullPath(webData.Path); } return null; } private void StartWebServerInternal() { cancelToken?.Cancel(); cancelToken?.Dispose(); cancelToken = new CancellationTokenSource(); var host = new WebHostBuilder() .SuppressStatusMessages(true) .ConfigureLogging((context, logging) => { logging.ClearProviders(); }) .UseKestrel(kestrel => { kestrel.Limits.MaxRequestBodySize = 3_000_000; // 3 MiB should be enough }) .ConfigureServices(services => { services.AddCors(options => { options.AddPolicy("TS3AB", builder => { builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); }); }); }) .Configure(app => { app.UseCors("TS3AB"); if (api != null) // api enabled { app.Map(new PathString("/api"), map => { map.Run(async ctx => { using var _ = NLog.MappedDiagnosticsLogicalContext.SetScoped("BotId", "Api"); await Log.SwallowAsync(() => api.ProcessApiV1Call(ctx)); }); }); } if (config.Interface.Enabled) { app.UseFileServer(); } var applicationLifetime = app.ApplicationServices.GetRequiredService(); applicationLifetime.ApplicationStopping.Register(OnShutdown); }); if (config.Interface.Enabled) { var baseDir = FindWebFolder(); if (baseDir is null) { Log.Error("Can't find a WebInterface path to host. Try specifying the path to host in the config"); } else { host.UseWebRoot(baseDir); } } var addrs = config.Hosts.Value; if (addrs.Contains("*")) { host.ConfigureKestrel(kestrel => { kestrel.ListenAnyIP(config.Port.Value); }); } else if (addrs.Count == 1 && addrs[0] == "localhost") { host.ConfigureKestrel(kestrel => { kestrel.ListenLocalhost(config.Port.Value); }); } else { host.UseUrls(addrs.Select(uri => new UriBuilder(uri) { Port = config.Port }.Uri.AbsoluteUri).ToArray()); } Log.Info("Starting Webserver on port {0}", config.Port.Value); new Func(async () => { try { await host.Build().RunAsync(cancelToken.Token); } catch (Exception ex) { Log.Error(ex, "The webserver could not be started"); return; } })(); } public void OnShutdown() { Log.Info("WebServer has closed"); } public void Dispose() { Log.Info("WebServer is closing"); cancelToken?.Cancel(); cancelToken?.Dispose(); cancelToken = null; } } } ================================================ FILE: TS3AudioBot/build.csx ================================================ #r "nuget: SimpleExec, 6.2.0" #r "nuget: Newtonsoft.Json, 12.0.3" using Newtonsoft.Json; using static SimpleExec.Command; if (Args.Count == 0) { WriteLine("This script is itended to be used in the build pipeline"); return 1; } string outFile = Args[0]; string buildConfig = Args[1]; string json = Read("dotnet", "gitversion"); var version = JsonConvert.DeserializeAnonymousType(json, new { FullSemVer = "", BranchName = "", Sha = "", AssemblySemVer = "", AssemblySemFileVer = "", InformationalVersion = "", }); var genFile = $@" [assembly: System.Reflection.AssemblyVersion(""{version.AssemblySemVer}"")] [assembly: System.Reflection.AssemblyFileVersion(""{version.AssemblySemFileVer}"")] [assembly: System.Reflection.AssemblyInformationalVersion(""{version.InformationalVersion}"")] namespace TS3AudioBot.Environment {{ partial class BuildData {{ partial void GetDataInternal() {{ this.Version = ""{version.FullSemVer}""; this.Branch = ""{version.BranchName}""; this.CommitSha = ""{version.Sha}""; this.BuildConfiguration = ""{buildConfig}""; }} }} }} "; Console.WriteLine("Generated Version {0}", version.FullSemVer); var writeFull = Path.GetFullPath(outFile); //WriteLine("Writing to {0}", writeFull); File.WriteAllText(writeFull, genFile); ================================================ FILE: TS3AudioBot/obj/Debug/TS3AudioBot.1.0.0.nuspec ================================================  TS3AudioBot 1.0.0 TS3AudioBot Package Description ================================================ FILE: TS3AudioBot/obj/Debug/net7.0-windows/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs ================================================ // using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")] ================================================ FILE: TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.AssemblyInfo.cs ================================================ //------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyProductAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyTitleAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/Splamy/TS3AudioBot.git")] [assembly: System.Resources.NeutralResourcesLanguageAttribute("en")] [assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] [assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] // 由 MSBuild WriteCodeFragment 类生成。 ================================================ FILE: TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.AssemblyInfoInputs.cache ================================================ 4efb224719327bf3510b3a91aa702db77e89b788 ================================================ FILE: TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig ================================================ is_global = true build_property.TargetFramework = net7.0-windows build_property.TargetPlatformMinVersion = 7.0 build_property.UsingMicrosoftNETSdkWeb = build_property.ProjectTypeGuids = build_property.InvariantGlobalization = build_property.PlatformNeutralAssembly = build_property.EnforceExtendedAnalyzerRules = build_property._SupportedPlatformList = Linux,macOS,Windows build_property.RootNamespace = TS3AudioBot build_property.ProjectDir = C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\ ================================================ FILE: TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.csproj.CopyComplete ================================================ ================================================ FILE: TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.csproj.CoreCompileInputs.cache ================================================ ef947e7377dc5c9f212fca8011c4a3fe43611636 ================================================ FILE: TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.csproj.FileListAbsolute.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\TS3AudioBot.exe C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\lib\x64\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\lib\x86\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\TS3AudioBot.dll.config C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\TS3AudioBot.deps.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\TS3AudioBot.runtimeconfig.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\TS3AudioBot.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\TS3AudioBot.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\CliWrap.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\CommandLine.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Heijden.Dns.Portable.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\LiteDB.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Connections.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Cors.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Hosting.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Http.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Http.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Http.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Http.Features.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Server.Kestrel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Server.Kestrel.Core.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Server.Kestrel.Https.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.StaticFiles.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.AspNetCore.WebUtilities.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.CodeAnalysis.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.CodeAnalysis.CSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.Configuration.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.Configuration.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.Configuration.Binder.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.Configuration.EnvironmentVariables.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.Configuration.FileExtensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.DependencyInjection.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.DependencyInjection.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.FileProviders.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.FileProviders.Physical.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.FileSystemGlobbing.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.Logging.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.Logging.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.ObjectPool.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.Options.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Extensions.WebEncoders.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Microsoft.Net.Http.Headers.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Nett.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Newtonsoft.Json.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\NLog.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\PlaylistsNET.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\BouncyCastle.Crypto.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\SixLabors.ImageSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\Chaos.NaCl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\System.IO.Pipelines.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\cs\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\de\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\es\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\fr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\it\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\ja\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\ko\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\pl\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\pt-BR\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\ru\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\tr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\zh-Hans\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\zh-Hant\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\cs\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\de\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\es\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\fr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\it\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\ja\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\ko\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\pl\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\ru\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\tr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\net7.0-windows\TSLib.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\TS3AudioBot.csproj.AssemblyReference.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\TS3AudioBot.csproj.SuggestedBindingRedirects.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\TS3AudioBot.dll.config C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\TS3AudioBot.Localization.strings.resources C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\TS3AudioBot.csproj.GenerateResource.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\TS3AudioBot.AssemblyInfoInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\TS3AudioBot.AssemblyInfo.cs C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\TS3AudioBot.csproj.CoreCompileInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\TS3AudioBot.csproj.CopyComplete C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\TS3AudioBot.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\refint\TS3AudioBot.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\TS3AudioBot.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\TS3AudioBot.genruntimeconfig.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\net7.0-windows\ref\TS3AudioBot.dll ================================================ FILE: TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.csproj.SuggestedBindingRedirects.cache ================================================ cc5ef2302008f569ee5df7947a4243981cb35797 ================================================ FILE: TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.dll.config ================================================ ================================================ FILE: TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.genruntimeconfig.cache ================================================ 7e35779a7f8ad652cae26250ac9575323be437a4 ================================================ FILE: TS3AudioBot/obj/Debug/netcoreapp3.1/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs ================================================ // using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v3.1", FrameworkDisplayName = "")] ================================================ FILE: TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.AssemblyInfo.cs ================================================ //------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyProductAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyTitleAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/Splamy/TS3AudioBot.git")] [assembly: System.Resources.NeutralResourcesLanguageAttribute("en")] // 由 MSBuild WriteCodeFragment 类生成。 ================================================ FILE: TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.AssemblyInfoInputs.cache ================================================ c475f89158c62771af519d032a12f1bd5df5cb32 ================================================ FILE: TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig ================================================ is_global = true build_property.RootNamespace = TS3AudioBot build_property.ProjectDir = G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\ ================================================ FILE: TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.csproj.CopyComplete ================================================ ================================================ FILE: TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.csproj.CoreCompileInputs.cache ================================================ 5db711007006312b76b0f7995644fd3c8cfa0999 ================================================ FILE: TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.csproj.FileListAbsolute.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.exe C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\lib\x64\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\lib\x86\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.dll.config C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.deps.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.runtimeconfig.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.runtimeconfig.dev.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\CliWrap.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\CommandLine.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Heijden.Dns.Portable.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\LiteDB.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Connections.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Cors.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Hosting.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Http.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Http.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Http.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Http.Features.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.Core.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.Https.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.StaticFiles.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.WebUtilities.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.CodeAnalysis.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.CodeAnalysis.CSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Configuration.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Configuration.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Configuration.Binder.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Configuration.EnvironmentVariables.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Configuration.FileExtensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.DependencyInjection.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.DependencyInjection.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.FileProviders.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.FileProviders.Physical.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.FileSystemGlobbing.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Logging.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Logging.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.ObjectPool.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Options.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.WebEncoders.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Net.Http.Headers.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Nett.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Newtonsoft.Json.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\NLog.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\PlaylistsNET.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\BouncyCastle.Crypto.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\SixLabors.ImageSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Chaos.NaCl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\System.IO.Pipelines.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\cs\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\de\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\es\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\fr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\it\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\ja\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\ko\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\pl\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\pt-BR\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\ru\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\tr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\zh-Hans\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\zh-Hant\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\cs\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\de\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\es\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\fr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\it\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\ja\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\ko\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\pl\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\ru\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\tr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TSLib.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.csproj.AssemblyReference.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.csproj.SuggestedBindingRedirects.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.dll.config C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.Localization.strings.resources C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.csproj.GenerateResource.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.AssemblyInfoInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.AssemblyInfo.cs C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.csproj.CoreCompileInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.csproj.CopyComplete C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.genruntimeconfig.cache G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.exe G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\lib\x64\libopus.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\lib\x86\libopus.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.dll.config G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.deps.json G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.runtimeconfig.json G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.runtimeconfig.dev.json G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TS3AudioBot.pdb G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\CliWrap.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\CommandLine.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Heijden.Dns.Portable.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\LiteDB.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Connections.Abstractions.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Cors.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Hosting.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Hosting.Abstractions.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Http.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Http.Abstractions.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Http.Extensions.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Http.Features.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.Core.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.Https.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.StaticFiles.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.AspNetCore.WebUtilities.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.CodeAnalysis.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.CodeAnalysis.CSharp.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Configuration.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Configuration.Abstractions.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Configuration.Binder.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Configuration.EnvironmentVariables.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Configuration.FileExtensions.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.DependencyInjection.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.DependencyInjection.Abstractions.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.FileProviders.Abstractions.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.FileProviders.Physical.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.FileSystemGlobbing.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Hosting.Abstractions.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Logging.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Logging.Abstractions.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.ObjectPool.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Options.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.Primitives.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Extensions.WebEncoders.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Microsoft.Net.Http.Headers.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Nett.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Newtonsoft.Json.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\NLog.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\PlaylistsNET.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\BouncyCastle.Crypto.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\SixLabors.ImageSharp.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\Chaos.NaCl.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\System.IO.Pipelines.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\cs\Microsoft.CodeAnalysis.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\de\Microsoft.CodeAnalysis.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\es\Microsoft.CodeAnalysis.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\fr\Microsoft.CodeAnalysis.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\it\Microsoft.CodeAnalysis.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\ja\Microsoft.CodeAnalysis.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\ko\Microsoft.CodeAnalysis.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\pl\Microsoft.CodeAnalysis.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\pt-BR\Microsoft.CodeAnalysis.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\ru\Microsoft.CodeAnalysis.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\tr\Microsoft.CodeAnalysis.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\zh-Hans\Microsoft.CodeAnalysis.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\zh-Hant\Microsoft.CodeAnalysis.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\cs\Microsoft.CodeAnalysis.CSharp.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\de\Microsoft.CodeAnalysis.CSharp.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\es\Microsoft.CodeAnalysis.CSharp.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\fr\Microsoft.CodeAnalysis.CSharp.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\it\Microsoft.CodeAnalysis.CSharp.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\ja\Microsoft.CodeAnalysis.CSharp.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\ko\Microsoft.CodeAnalysis.CSharp.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\pl\Microsoft.CodeAnalysis.CSharp.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\ru\Microsoft.CodeAnalysis.CSharp.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\tr\Microsoft.CodeAnalysis.CSharp.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TSLib.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Debug\netcoreapp3.1\TSLib.pdb G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.csproj.AssemblyReference.cache G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.dll.config G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.Localization.strings.resources G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.csproj.GenerateResource.cache G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.AssemblyInfoInputs.cache G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.AssemblyInfo.cs G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.csproj.CoreCompileInputs.cache G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.csproj.CopyComplete G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.dll G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.pdb G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Debug\netcoreapp3.1\TS3AudioBot.genruntimeconfig.cache ================================================ FILE: TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.csproj.SuggestedBindingRedirects.cache ================================================ ef24e4af7229c939c818abac044d4f1b112c94d6 ================================================ FILE: TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.dll.config ================================================ ================================================ FILE: TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.genruntimeconfig.cache ================================================ 49f0521b9c3237f06c1aac9d1aaf96b21b297ab3 ================================================ FILE: TS3AudioBot/obj/Release/net7.0-windows/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs ================================================ // using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")] ================================================ FILE: TS3AudioBot/obj/Release/net7.0-windows/TS3AudioBot.AssemblyInfo.cs ================================================ //------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyProductAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyTitleAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/Splamy/TS3AudioBot.git")] [assembly: System.Resources.NeutralResourcesLanguageAttribute("en")] [assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] [assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] // 由 MSBuild WriteCodeFragment 类生成。 ================================================ FILE: TS3AudioBot/obj/Release/net7.0-windows/TS3AudioBot.AssemblyInfoInputs.cache ================================================ e28135d739ac8256182642272e8c3b73f5d97434 ================================================ FILE: TS3AudioBot/obj/Release/net7.0-windows/TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig ================================================ is_global = true build_property.TargetFramework = net7.0-windows build_property.TargetPlatformMinVersion = 7.0 build_property.UsingMicrosoftNETSdkWeb = build_property.ProjectTypeGuids = build_property.InvariantGlobalization = build_property.PlatformNeutralAssembly = build_property.EnforceExtendedAnalyzerRules = build_property._SupportedPlatformList = Linux,macOS,Windows build_property.RootNamespace = TS3AudioBot build_property.ProjectDir = C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\ ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs ================================================ // using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v3.1", FrameworkDisplayName = ".NET Core 3.1")] ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/PublishOutputs.25bc18e9a6.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\lib\x64\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\lib\x86\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\TS3AudioBot.exe C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\TS3AudioBot.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\TS3AudioBot.deps.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\TS3AudioBot.runtimeconfig.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\TS3AudioBot.dll.config C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\TS3AudioBot.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\CliWrap.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\CommandLine.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Heijden.Dns.Portable.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\LiteDB.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Connections.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Cors.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Hosting.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Http.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Http.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Http.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Http.Features.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Server.Kestrel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Server.Kestrel.Core.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Server.Kestrel.Https.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.StaticFiles.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.AspNetCore.WebUtilities.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.CodeAnalysis.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.CodeAnalysis.CSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.Configuration.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.Configuration.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.Configuration.Binder.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.Configuration.EnvironmentVariables.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.Configuration.FileExtensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.DependencyInjection.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.DependencyInjection.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.FileProviders.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.FileProviders.Physical.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.FileSystemGlobbing.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.Logging.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.Logging.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.ObjectPool.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.Options.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Extensions.WebEncoders.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Microsoft.Net.Http.Headers.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Nett.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Newtonsoft.Json.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\NLog.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\PlaylistsNET.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\BouncyCastle.Crypto.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\SixLabors.ImageSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\Chaos.NaCl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\System.IO.Pipelines.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\cs\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\de\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\es\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\fr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\it\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\ja\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\ko\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\pl\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\pt-BR\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\ru\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\tr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\zh-Hans\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\zh-Hant\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\cs\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\de\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\es\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\fr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\it\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\ja\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\ko\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\pl\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\ru\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\tr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\TSLib.pdb ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.AssemblyInfo.cs ================================================ //------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyProductAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyTitleAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/Splamy/TS3AudioBot.git")] [assembly: System.Resources.NeutralResourcesLanguageAttribute("en")] // 由 MSBuild WriteCodeFragment 类生成。 ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.AssemblyInfoInputs.cache ================================================ 50117c7602ecaf17a93e18fb5ca5b06974bd2274 ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig ================================================ is_global = true build_property.RootNamespace = TS3AudioBot build_property.ProjectDir = G:\TS3DEV\TS3AudioBot-master\TS3AudioBot\ ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.csproj.CopyComplete ================================================ ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.csproj.CoreCompileInputs.cache ================================================ d276b449706cfe9bac91ee685a58212440e6d58d ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.csproj.FileListAbsolute.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\TS3AudioBot.exe C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\lib\x64\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\lib\x86\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\TS3AudioBot.dll.config C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\TS3AudioBot.deps.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\TS3AudioBot.runtimeconfig.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\TS3AudioBot.runtimeconfig.dev.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\TS3AudioBot.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\TS3AudioBot.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\CliWrap.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\CommandLine.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Heijden.Dns.Portable.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\LiteDB.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Connections.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Cors.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Hosting.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Http.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Http.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Http.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Http.Features.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.Core.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.Https.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.StaticFiles.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.AspNetCore.WebUtilities.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.CodeAnalysis.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.CodeAnalysis.CSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.Configuration.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.Configuration.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.Configuration.Binder.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.Configuration.EnvironmentVariables.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.Configuration.FileExtensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.DependencyInjection.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.DependencyInjection.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.FileProviders.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.FileProviders.Physical.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.FileSystemGlobbing.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.Logging.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.Logging.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.ObjectPool.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.Options.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Extensions.WebEncoders.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Microsoft.Net.Http.Headers.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Nett.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Newtonsoft.Json.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\NLog.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\PlaylistsNET.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\BouncyCastle.Crypto.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\SixLabors.ImageSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\Chaos.NaCl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\System.IO.Pipelines.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\cs\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\de\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\es\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\fr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\it\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\ja\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\ko\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\pl\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\pt-BR\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\ru\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\tr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\zh-Hans\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\zh-Hant\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\cs\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\de\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\es\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\fr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\it\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\ja\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\ko\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\pl\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\ru\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\tr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\TSLib.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\TS3AudioBot.csproj.AssemblyReference.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\TS3AudioBot.csproj.SuggestedBindingRedirects.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\TS3AudioBot.dll.config C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\TS3AudioBot.Localization.strings.resources C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\TS3AudioBot.csproj.GenerateResource.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\TS3AudioBot.AssemblyInfoInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\TS3AudioBot.AssemblyInfo.cs C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\TS3AudioBot.csproj.CoreCompileInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\TS3AudioBot.csproj.CopyComplete C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\TS3AudioBot.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\TS3AudioBot.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\TS3AudioBot.genruntimeconfig.cache ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.csproj.SuggestedBindingRedirects.cache ================================================ ef24e4af7229c939c818abac044d4f1b112c94d6 ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.dll.config ================================================ ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.genruntimeconfig.cache ================================================ e1f5521c98efcbfc4d650d650b6eeca110972c10 ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs ================================================ // using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v3.1", FrameworkDisplayName = ".NET Core 3.1")] ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/PublishOutputs.c54adf16a2.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\lib\x64\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\lib\x86\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\TS3AudioBot C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\TS3AudioBot.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\TS3AudioBot.deps.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\TS3AudioBot.runtimeconfig.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\TS3AudioBot.dll.config C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\TS3AudioBot.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.CSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.VisualBasic.Core.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.VisualBasic.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Win32.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Win32.Registry.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.AppContext.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Buffers.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Collections.Concurrent.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Collections.Immutable.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Collections.NonGeneric.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Collections.Specialized.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Collections.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.ComponentModel.Annotations.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.ComponentModel.DataAnnotations.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.ComponentModel.EventBasedAsync.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.ComponentModel.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.ComponentModel.TypeConverter.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.ComponentModel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Configuration.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Console.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Core.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Data.Common.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Data.DataSetExtensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Data.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Diagnostics.Contracts.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Diagnostics.Debug.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Diagnostics.DiagnosticSource.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Diagnostics.FileVersionInfo.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Diagnostics.Process.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Diagnostics.StackTrace.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Diagnostics.TextWriterTraceListener.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Diagnostics.Tools.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Diagnostics.TraceSource.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Diagnostics.Tracing.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Drawing.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Drawing.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Dynamic.Runtime.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Globalization.Calendars.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Globalization.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Globalization.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.Compression.Brotli.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.Compression.FileSystem.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.Compression.ZipFile.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.Compression.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.FileSystem.AccessControl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.FileSystem.DriveInfo.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.FileSystem.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.FileSystem.Watcher.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.FileSystem.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.IsolatedStorage.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.MemoryMappedFiles.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.Pipes.AccessControl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.Pipes.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.UnmanagedMemoryStream.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Linq.Expressions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Linq.Parallel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Linq.Queryable.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Linq.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Memory.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.Http.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.HttpListener.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.Mail.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.NameResolution.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.NetworkInformation.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.Ping.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.Requests.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.Security.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.ServicePoint.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.Sockets.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.WebClient.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.WebHeaderCollection.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.WebProxy.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.WebSockets.Client.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.WebSockets.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Numerics.Vectors.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Numerics.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.ObjectModel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Private.DataContractSerialization.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Private.Uri.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Private.Xml.Linq.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Private.Xml.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Reflection.DispatchProxy.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Reflection.Emit.ILGeneration.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Reflection.Emit.Lightweight.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Reflection.Emit.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Reflection.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Reflection.Metadata.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Reflection.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Reflection.TypeExtensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Reflection.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Resources.Reader.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Resources.ResourceManager.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Resources.Writer.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.CompilerServices.VisualC.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.Handles.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.InteropServices.RuntimeInformation.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.InteropServices.WindowsRuntime.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.InteropServices.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.Intrinsics.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.Loader.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.Numerics.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.Serialization.Formatters.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.Serialization.Json.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.Serialization.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.Serialization.Xml.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.Serialization.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.WindowsRuntime.UI.Xaml.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.WindowsRuntime.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.AccessControl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.Claims.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.Cryptography.Algorithms.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.Cryptography.Cng.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.Cryptography.Csp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.Cryptography.Encoding.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.Cryptography.OpenSsl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.Cryptography.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.Cryptography.X509Certificates.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.Principal.Windows.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.Principal.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.SecureString.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.ServiceModel.Web.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.ServiceProcess.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Text.Encoding.CodePages.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Text.Encoding.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Text.Encoding.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Text.Encodings.Web.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Text.Json.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Text.RegularExpressions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Threading.Channels.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Threading.Overlapped.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Threading.Tasks.Dataflow.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Threading.Tasks.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Threading.Tasks.Parallel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Threading.Tasks.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Threading.Thread.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Threading.ThreadPool.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Threading.Timer.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Threading.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Transactions.Local.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Transactions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.ValueTuple.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Web.HttpUtility.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Web.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Windows.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Xml.Linq.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Xml.ReaderWriter.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Xml.Serialization.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Xml.XDocument.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Xml.XPath.XDocument.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Xml.XPath.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Xml.XmlDocument.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Xml.XmlSerializer.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Xml.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\WindowsBase.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\mscorlib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\netstandard.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\SOS_README.md C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Globalization.Native.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.Compression.Native.a C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.Compression.Native.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Native.a C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Native.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.Http.Native.a C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.Http.Native.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.Security.Native.a C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Net.Security.Native.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Private.CoreLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.Cryptography.Native.OpenSsl.a C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Security.Cryptography.Native.OpenSsl.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\createdump C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\libclrjit.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\libcoreclr.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\libcoreclrtraceptprovider.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\libdbgshim.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\libhostfxr.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\libhostpolicy.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\libmscordaccore.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\libmscordbi.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\CliWrap.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\CommandLine.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Heijden.Dns.Portable.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\LiteDB.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Connections.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Cors.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Hosting.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Http.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Http.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Http.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Http.Features.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Server.Kestrel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Server.Kestrel.Core.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Server.Kestrel.Https.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.StaticFiles.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.AspNetCore.WebUtilities.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.CodeAnalysis.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.CodeAnalysis.CSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.Configuration.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.Configuration.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.Configuration.Binder.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.Configuration.EnvironmentVariables.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.Configuration.FileExtensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.DependencyInjection.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.DependencyInjection.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.FileProviders.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.FileProviders.Physical.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.FileSystemGlobbing.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.Logging.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.Logging.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.ObjectPool.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.Options.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Extensions.WebEncoders.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Microsoft.Net.Http.Headers.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Nett.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Newtonsoft.Json.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\NLog.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\PlaylistsNET.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\BouncyCastle.Crypto.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\SixLabors.ImageSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\Chaos.NaCl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.IO.Pipelines.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\System.Runtime.CompilerServices.Unsafe.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\cs\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\de\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\es\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\fr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\it\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\ja\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\ko\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\pl\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\pt-BR\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\ru\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\tr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\zh-Hans\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\zh-Hant\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\cs\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\de\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\es\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\fr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\it\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\ja\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\ko\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\pl\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\ru\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\tr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\linux-x64\TSLib.pdb ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.AssemblyInfo.cs ================================================ //------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyProductAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyTitleAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/Splamy/TS3AudioBot.git")] [assembly: System.Resources.NeutralResourcesLanguageAttribute("en")] // 由 MSBuild WriteCodeFragment 类生成。 ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.AssemblyInfoInputs.cache ================================================ 50117c7602ecaf17a93e18fb5ca5b06974bd2274 ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig ================================================ is_global = true build_property.RootNamespace = TS3AudioBot build_property.ProjectDir = C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\ ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.csproj.CopyComplete ================================================ ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.csproj.CoreCompileInputs.cache ================================================ d0079f35f2cb1ea4672c113d8c75c7ec8d691736 ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.csproj.FileListAbsolute.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\TS3AudioBot C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\lib\x64\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\lib\x86\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\TS3AudioBot.dll.config C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\TS3AudioBot.deps.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\TS3AudioBot.runtimeconfig.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\TS3AudioBot.runtimeconfig.dev.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\TS3AudioBot.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\TS3AudioBot.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\CliWrap.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\CommandLine.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Heijden.Dns.Portable.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\LiteDB.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Connections.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Cors.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Hosting.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Http.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Http.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Http.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Http.Features.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Server.Kestrel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Server.Kestrel.Core.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Server.Kestrel.Https.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.StaticFiles.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.AspNetCore.WebUtilities.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.CodeAnalysis.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.CodeAnalysis.CSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.Configuration.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.Configuration.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.Configuration.Binder.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.Configuration.EnvironmentVariables.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.Configuration.FileExtensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.DependencyInjection.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.DependencyInjection.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.FileProviders.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.FileProviders.Physical.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.FileSystemGlobbing.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.Logging.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.Logging.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.ObjectPool.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.Options.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Extensions.WebEncoders.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Net.Http.Headers.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Nett.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Newtonsoft.Json.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\NLog.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\PlaylistsNET.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\BouncyCastle.Crypto.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\SixLabors.ImageSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Chaos.NaCl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.Pipelines.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.CompilerServices.Unsafe.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\cs\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\de\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\es\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\fr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\it\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\ja\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\ko\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\pl\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\pt-BR\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\ru\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\tr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\zh-Hans\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\zh-Hant\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\cs\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\de\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\es\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\fr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\it\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\ja\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\ko\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\pl\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\ru\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\tr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.CSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.VisualBasic.Core.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.VisualBasic.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Win32.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\Microsoft.Win32.Registry.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.AppContext.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Buffers.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Collections.Concurrent.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Collections.Immutable.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Collections.NonGeneric.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Collections.Specialized.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Collections.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.ComponentModel.Annotations.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.ComponentModel.DataAnnotations.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.ComponentModel.EventBasedAsync.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.ComponentModel.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.ComponentModel.TypeConverter.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.ComponentModel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Configuration.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Console.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Core.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Data.Common.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Data.DataSetExtensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Data.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Diagnostics.Contracts.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Diagnostics.Debug.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Diagnostics.DiagnosticSource.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Diagnostics.FileVersionInfo.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Diagnostics.Process.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Diagnostics.StackTrace.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Diagnostics.TextWriterTraceListener.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Diagnostics.Tools.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Diagnostics.TraceSource.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Diagnostics.Tracing.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Drawing.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Drawing.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Dynamic.Runtime.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Globalization.Calendars.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Globalization.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Globalization.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.Compression.Brotli.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.Compression.FileSystem.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.Compression.ZipFile.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.Compression.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.FileSystem.AccessControl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.FileSystem.DriveInfo.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.FileSystem.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.FileSystem.Watcher.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.FileSystem.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.IsolatedStorage.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.MemoryMappedFiles.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.Pipes.AccessControl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.Pipes.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.UnmanagedMemoryStream.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Linq.Expressions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Linq.Parallel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Linq.Queryable.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Linq.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Memory.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.Http.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.HttpListener.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.Mail.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.NameResolution.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.NetworkInformation.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.Ping.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.Requests.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.Security.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.ServicePoint.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.Sockets.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.WebClient.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.WebHeaderCollection.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.WebProxy.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.WebSockets.Client.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.WebSockets.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Numerics.Vectors.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Numerics.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.ObjectModel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Private.DataContractSerialization.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Private.Uri.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Private.Xml.Linq.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Private.Xml.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Reflection.DispatchProxy.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Reflection.Emit.ILGeneration.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Reflection.Emit.Lightweight.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Reflection.Emit.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Reflection.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Reflection.Metadata.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Reflection.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Reflection.TypeExtensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Reflection.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Resources.Reader.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Resources.ResourceManager.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Resources.Writer.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.CompilerServices.VisualC.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.Handles.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.InteropServices.RuntimeInformation.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.InteropServices.WindowsRuntime.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.InteropServices.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.Intrinsics.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.Loader.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.Numerics.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.Serialization.Formatters.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.Serialization.Json.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.Serialization.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.Serialization.Xml.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.Serialization.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.WindowsRuntime.UI.Xaml.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.WindowsRuntime.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Runtime.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.AccessControl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.Claims.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.Cryptography.Algorithms.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.Cryptography.Cng.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.Cryptography.Csp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.Cryptography.Encoding.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.Cryptography.OpenSsl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.Cryptography.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.Cryptography.X509Certificates.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.Principal.Windows.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.Principal.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.SecureString.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.ServiceModel.Web.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.ServiceProcess.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Text.Encoding.CodePages.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Text.Encoding.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Text.Encoding.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Text.Encodings.Web.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Text.Json.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Text.RegularExpressions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Threading.Channels.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Threading.Overlapped.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Threading.Tasks.Dataflow.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Threading.Tasks.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Threading.Tasks.Parallel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Threading.Tasks.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Threading.Thread.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Threading.ThreadPool.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Threading.Timer.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Threading.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Transactions.Local.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Transactions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.ValueTuple.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Web.HttpUtility.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Web.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Windows.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Xml.Linq.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Xml.ReaderWriter.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Xml.Serialization.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Xml.XDocument.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Xml.XPath.XDocument.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Xml.XPath.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Xml.XmlDocument.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Xml.XmlSerializer.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Xml.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\WindowsBase.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\mscorlib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\netstandard.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\SOS_README.md C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Globalization.Native.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.Compression.Native.a C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.IO.Compression.Native.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Native.a C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Native.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.Http.Native.a C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.Http.Native.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.Security.Native.a C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Net.Security.Native.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Private.CoreLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.Cryptography.Native.OpenSsl.a C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\System.Security.Cryptography.Native.OpenSsl.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\createdump C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\libclrjit.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\libcoreclr.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\libcoreclrtraceptprovider.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\libdbgshim.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\libhostfxr.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\libhostpolicy.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\libmscordaccore.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\libmscordbi.so C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\linux-x64\TSLib.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\linux-x64\TS3AudioBot.csproj.AssemblyReference.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\linux-x64\TS3AudioBot.csproj.SuggestedBindingRedirects.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\linux-x64\TS3AudioBot.dll.config C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\linux-x64\TS3AudioBot.Localization.strings.resources C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\linux-x64\TS3AudioBot.csproj.GenerateResource.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\linux-x64\TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\linux-x64\TS3AudioBot.AssemblyInfoInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\linux-x64\TS3AudioBot.AssemblyInfo.cs C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\linux-x64\TS3AudioBot.csproj.CoreCompileInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\linux-x64\TS3AudioBot.csproj.CopyComplete C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\linux-x64\TS3AudioBot.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\linux-x64\TS3AudioBot.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\linux-x64\TS3AudioBot.genruntimeconfig.cache ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.csproj.SuggestedBindingRedirects.cache ================================================ ef24e4af7229c939c818abac044d4f1b112c94d6 ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.deps.json ================================================ { "runtimeTarget": { "name": ".NETCoreApp,Version=v3.1/linux-x64", "signature": "" }, "compilationOptions": {}, "targets": { ".NETCoreApp,Version=v3.1": {}, ".NETCoreApp,Version=v3.1/linux-x64": { "TS3AudioBot/1.0.0": { "dependencies": { "CliWrap": "3.1.0", "CommandLineParser": "2.8.0", "LiteDB": "4.1.4", "Microsoft.AspNetCore.Cors": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel": "2.2.0", "Microsoft.AspNetCore.StaticFiles": "2.2.0", "Microsoft.CodeAnalysis.CSharp": "3.7.0", "NLog": "4.7.3", "Nett": "0.15.0", "Newtonsoft.Json": "12.0.3", "PlaylistsNET": "1.1.2", "SixLabors.ImageSharp": "1.0.0", "Splamy.TSLib": "1.1.0", "TSLib": "1.1.0.0", "runtimepack.Microsoft.NETCore.App.Runtime.linux-x64": "3.1.32" }, "runtime": { "TS3AudioBot.dll": {} } }, "runtimepack.Microsoft.NETCore.App.Runtime.linux-x64/3.1.32": { "runtime": { "Microsoft.CSharp.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "Microsoft.VisualBasic.Core.dll": { "assemblyVersion": "10.0.5.0", "fileVersion": "4.700.22.56512" }, "Microsoft.VisualBasic.dll": { "assemblyVersion": "10.0.0.0", "fileVersion": "4.700.22.56512" }, "Microsoft.Win32.Primitives.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "Microsoft.Win32.Registry.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.700.22.56512" }, "System.AppContext.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Buffers.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.Collections.Concurrent.dll": { "assemblyVersion": "4.0.15.0", "fileVersion": "4.700.22.56512" }, "System.Collections.Immutable.dll": { "assemblyVersion": "1.2.5.0", "fileVersion": "4.700.22.56512" }, "System.Collections.NonGeneric.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Collections.Specialized.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Collections.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.ComponentModel.Annotations.dll": { "assemblyVersion": "4.3.1.0", "fileVersion": "4.700.22.56512" }, "System.ComponentModel.DataAnnotations.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.ComponentModel.EventBasedAsync.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.ComponentModel.Primitives.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.ComponentModel.TypeConverter.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.ComponentModel.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Configuration.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Console.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Core.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Data.Common.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Data.DataSetExtensions.dll": { "assemblyVersion": "4.0.1.0", "fileVersion": "4.700.22.56512" }, "System.Data.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.Contracts.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.Debug.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.DiagnosticSource.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.FileVersionInfo.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.Process.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.StackTrace.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.TextWriterTraceListener.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.Tools.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.TraceSource.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.Tracing.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Drawing.Primitives.dll": { "assemblyVersion": "4.2.1.0", "fileVersion": "4.700.22.56512" }, "System.Drawing.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Dynamic.Runtime.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Globalization.Calendars.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Globalization.Extensions.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Globalization.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.Compression.Brotli.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.Compression.FileSystem.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.IO.Compression.ZipFile.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.IO.Compression.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.FileSystem.AccessControl.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.IO.FileSystem.DriveInfo.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.FileSystem.Primitives.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.FileSystem.Watcher.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.FileSystem.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.IsolatedStorage.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.MemoryMappedFiles.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.Pipes.AccessControl.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.IO.Pipes.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.UnmanagedMemoryStream.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Linq.Expressions.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Linq.Parallel.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Linq.Queryable.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Linq.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Memory.dll": { "assemblyVersion": "4.2.1.0", "fileVersion": "4.700.22.56512" }, "System.Net.Http.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.HttpListener.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.Mail.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.NameResolution.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.NetworkInformation.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.Ping.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.Primitives.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.Requests.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.Security.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.ServicePoint.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.Sockets.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.WebClient.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.WebHeaderCollection.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.WebProxy.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.WebSockets.Client.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.WebSockets.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Numerics.Vectors.dll": { "assemblyVersion": "4.1.6.0", "fileVersion": "4.700.22.56512" }, "System.Numerics.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.ObjectModel.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Private.DataContractSerialization.dll": { "assemblyVersion": "4.1.5.0", "fileVersion": "4.700.22.56512" }, "System.Private.Uri.dll": { "assemblyVersion": "4.0.6.0", "fileVersion": "4.700.22.56512" }, "System.Private.Xml.Linq.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Private.Xml.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.DispatchProxy.dll": { "assemblyVersion": "4.0.6.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.Emit.ILGeneration.dll": { "assemblyVersion": "4.1.1.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.Emit.Lightweight.dll": { "assemblyVersion": "4.1.1.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.Emit.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.Extensions.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.Metadata.dll": { "assemblyVersion": "1.4.5.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.Primitives.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.TypeExtensions.dll": { "assemblyVersion": "4.1.5.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Resources.Reader.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Resources.ResourceManager.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Resources.Writer.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.CompilerServices.VisualC.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Extensions.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Handles.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.InteropServices.RuntimeInformation.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.InteropServices.WindowsRuntime.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.InteropServices.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Intrinsics.dll": { "assemblyVersion": "4.0.1.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Loader.dll": { "assemblyVersion": "4.1.1.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Numerics.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Serialization.Formatters.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Serialization.Json.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Serialization.Primitives.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Serialization.Xml.dll": { "assemblyVersion": "4.1.5.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Serialization.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.WindowsRuntime.UI.Xaml.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.WindowsRuntime.dll": { "assemblyVersion": "4.0.15.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.AccessControl.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.700.22.56512" }, "System.Security.Claims.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.Algorithms.dll": { "assemblyVersion": "4.3.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.Cng.dll": { "assemblyVersion": "4.3.3.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.Csp.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.Encoding.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.OpenSsl.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.Primitives.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.X509Certificates.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.Principal.Windows.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.700.22.56512" }, "System.Security.Principal.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.SecureString.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.ServiceModel.Web.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.ServiceProcess.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Text.Encoding.CodePages.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.700.22.56512" }, "System.Text.Encoding.Extensions.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Text.Encoding.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Text.Encodings.Web.dll": { "assemblyVersion": "4.0.5.1", "fileVersion": "4.700.22.56512" }, "System.Text.Json.dll": { "assemblyVersion": "4.0.1.2", "fileVersion": "4.700.22.56512" }, "System.Text.RegularExpressions.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Channels.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Overlapped.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Tasks.Dataflow.dll": { "assemblyVersion": "4.6.5.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Tasks.Extensions.dll": { "assemblyVersion": "4.3.1.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Tasks.Parallel.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Tasks.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Thread.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.ThreadPool.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Timer.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Transactions.Local.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Transactions.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.ValueTuple.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.Web.HttpUtility.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Web.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Windows.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Xml.Linq.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Xml.ReaderWriter.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Xml.Serialization.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Xml.XDocument.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Xml.XPath.XDocument.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Xml.XPath.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Xml.XmlDocument.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Xml.XmlSerializer.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Xml.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "WindowsBase.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "mscorlib.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "netstandard.dll": { "assemblyVersion": "2.1.0.0", "fileVersion": "4.700.22.56512" } }, "native": { "SOS_README.md": { "fileVersion": "0.0.0.0" }, "System.Globalization.Native.so": { "fileVersion": "0.0.0.0" }, "System.IO.Compression.Native.a": { "fileVersion": "0.0.0.0" }, "System.IO.Compression.Native.so": { "fileVersion": "0.0.0.0" }, "System.Native.a": { "fileVersion": "0.0.0.0" }, "System.Native.so": { "fileVersion": "0.0.0.0" }, "System.Net.Http.Native.a": { "fileVersion": "0.0.0.0" }, "System.Net.Http.Native.so": { "fileVersion": "0.0.0.0" }, "System.Net.Security.Native.a": { "fileVersion": "0.0.0.0" }, "System.Net.Security.Native.so": { "fileVersion": "0.0.0.0" }, "System.Private.CoreLib.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.55902" }, "System.Security.Cryptography.Native.OpenSsl.a": { "fileVersion": "0.0.0.0" }, "System.Security.Cryptography.Native.OpenSsl.so": { "fileVersion": "0.0.0.0" }, "createdump": { "fileVersion": "0.0.0.0" }, "libclrjit.so": { "fileVersion": "0.0.0.0" }, "libcoreclr.so": { "fileVersion": "0.0.0.0" }, "libcoreclrtraceptprovider.so": { "fileVersion": "0.0.0.0" }, "libdbgshim.so": { "fileVersion": "0.0.0.0" }, "libhostfxr.so": { "fileVersion": "0.0.0.0" }, "libhostpolicy.so": { "fileVersion": "0.0.0.0" }, "libmscordaccore.so": { "fileVersion": "0.0.0.0" }, "libmscordbi.so": { "fileVersion": "0.0.0.0" } } }, "CliWrap/3.1.0": { "runtime": { "lib/netcoreapp3.0/CliWrap.dll": { "assemblyVersion": "3.1.0.0", "fileVersion": "3.1.0.0" } } }, "CommandLineParser/2.8.0": { "runtime": { "lib/netstandard2.0/CommandLine.dll": { "assemblyVersion": "2.8.0.0", "fileVersion": "2.8.0.0" } } }, "Heijden.Dns.Portable/2.0.19": { "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": { "assemblyVersion": "2.0.19.0", "fileVersion": "2.0.19.0" } } }, "LiteDB/4.1.4": { "dependencies": { "System.Reflection": "4.3.0", "System.Reflection.TypeExtensions": "4.3.0" }, "runtime": { "lib/netstandard2.0/LiteDB.dll": { "assemblyVersion": "4.1.4.0", "fileVersion": "4.1.4.0" } } }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.IO.Pipelines": "4.7.2" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Cors/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Hosting/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.Configuration.EnvironmentVariables": "2.2.0", "Microsoft.Extensions.Configuration.FileExtensions": "2.2.0", "Microsoft.Extensions.DependencyInjection": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0", "Microsoft.Extensions.Logging": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Diagnostics.DiagnosticSource": "4.5.0", "System.Reflection.Metadata": "1.6.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Hosting.Server.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Http/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.ObjectPool": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Buffers": "4.5.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Hosting": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Https": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Memory": "4.5.4", "System.Numerics.Vectors": "4.5.0", "System.Runtime.CompilerServices.Unsafe": "4.7.0", "System.Security.Cryptography.Cng": "4.5.0", "System.Threading.Tasks.Extensions": "4.5.3" }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0" }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Connections.Abstractions": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.WebEncoders": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "dependencies": { "Microsoft.Net.Http.Headers": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": {}, "Microsoft.CodeAnalysis.Common/3.7.0": { "dependencies": { "Microsoft.CodeAnalysis.Analyzers": "3.0.0", "System.Collections.Immutable": "1.5.0", "System.Memory": "4.5.4", "System.Reflection.Metadata": "1.6.0", "System.Runtime.CompilerServices.Unsafe": "4.7.0", "System.Text.Encoding.CodePages": "4.5.1", "System.Threading.Tasks.Extensions": "4.5.3" }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": { "assemblyVersion": "3.7.0.0", "fileVersion": "3.700.20.37502" } }, "resources": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "dependencies": { "Microsoft.CodeAnalysis.Common": "3.7.0" }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": { "assemblyVersion": "3.7.0.0", "fileVersion": "3.700.20.37502" } }, "resources": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.Extensions.Configuration/2.2.0": { "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0" }, "runtime": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "runtime": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "dependencies": { "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.FileSystemGlobbing": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.Extensions.Logging/2.2.0": { "dependencies": { "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.ObjectPool/2.2.0": { "runtime": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Options/2.2.0": { "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Primitives": "2.2.0", "System.ComponentModel.Annotations": "4.5.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Primitives/2.2.0": { "dependencies": { "System.Memory": "4.5.4", "System.Runtime.CompilerServices.Unsafe": "4.7.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.WebEncoders/2.2.0": { "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.Net.Http.Headers/2.2.0": { "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0", "System.Buffers": "4.5.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.NETCore.Platforms/2.1.2": {}, "Microsoft.NETCore.Targets/1.1.0": {}, "Microsoft.Win32.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.unix.Microsoft.Win32.Primitives": "4.3.0" } }, "Nett/0.15.0": { "runtime": { "lib/netstandard2.0/Nett.dll": { "assemblyVersion": "0.15.0.0", "fileVersion": "0.15.0.0" } } }, "Newtonsoft.Json/12.0.3": { "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "assemblyVersion": "12.0.0.0", "fileVersion": "12.0.3.23909" } } }, "NLog/4.7.3": { "runtime": { "lib/netstandard2.0/NLog.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.7.3.11982" } } }, "PlaylistsNET/1.1.2": { "runtime": { "lib/netstandard2.0/PlaylistsNET.dll": { "assemblyVersion": "1.0.6.0", "fileVersion": "1.0.6.0" } } }, "Portable.BouncyCastle/1.8.6.7": { "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "assemblyVersion": "1.8.6.0", "fileVersion": "1.8.6.7" } } }, "runtime.any.System.Collections/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "runtime.any.System.Diagnostics.Tracing/4.3.0": {}, "runtime.any.System.Globalization/4.3.0": {}, "runtime.any.System.IO/4.3.0": {}, "runtime.any.System.Reflection/4.3.0": {}, "runtime.any.System.Reflection.Primitives/4.3.0": {}, "runtime.any.System.Resources.ResourceManager/4.3.0": {}, "runtime.any.System.Runtime/4.3.0": { "dependencies": { "System.Private.Uri": "4.3.0" } }, "runtime.any.System.Runtime.Handles/4.3.0": {}, "runtime.any.System.Runtime.InteropServices/4.3.0": {}, "runtime.any.System.Text.Encoding/4.3.0": {}, "runtime.any.System.Text.Encoding.Extensions/4.3.0": {}, "runtime.any.System.Threading.Tasks/4.3.0": {}, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, "runtime.native.System/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0" } }, "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "dependencies": { "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" } }, "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, "runtime.unix.Microsoft.Win32.Primitives/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "runtime.native.System": "4.3.0" } }, "runtime.unix.System.Diagnostics.Debug/4.3.0": { "dependencies": { "runtime.native.System": "4.3.0" } }, "runtime.unix.System.IO.FileSystem/4.3.0": { "dependencies": { "System.Buffers": "4.5.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Text.Encoding.Extensions": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.native.System": "4.3.0" } }, "runtime.unix.System.Net.Primitives/4.3.0": { "dependencies": { "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Threading": "4.3.0", "runtime.native.System": "4.3.0" } }, "runtime.unix.System.Net.Sockets/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.Net.NameResolution": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" } }, "runtime.unix.System.Private.Uri/4.3.0": { "dependencies": { "runtime.native.System": "4.3.0" } }, "runtime.unix.System.Runtime.Extensions/4.3.0": { "dependencies": { "System.Private.Uri": "4.3.0", "runtime.native.System": "4.3.0", "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" } }, "SixLabors.ImageSharp/1.0.0": { "runtime": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": { "assemblyVersion": "1.0.0.0", "fileVersion": "1.0.0.0" } } }, "Splamy.Ed25519.Toolkit/1.0.3": { "runtime": { "lib/netcoreapp2.1/Chaos.NaCl.dll": { "assemblyVersion": "1.0.3.0", "fileVersion": "1.0.3.0" } } }, "System.Buffers/4.5.0": {}, "System.Collections/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Collections": "4.3.0" } }, "System.Collections.Immutable/1.5.0": {}, "System.ComponentModel.Annotations/4.5.0": {}, "System.Diagnostics.Debug/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.unix.System.Diagnostics.Debug": "4.3.0" } }, "System.Diagnostics.DiagnosticSource/4.5.0": {}, "System.Diagnostics.Tracing/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Diagnostics.Tracing": "4.3.0" } }, "System.Globalization/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Globalization": "4.3.0" } }, "System.IO/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.any.System.IO": "4.3.0" } }, "System.IO.FileSystem/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.unix.System.IO.FileSystem": "4.3.0" } }, "System.IO.FileSystem.Primitives/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "System.IO.Pipelines/4.7.2": { "runtime": { "lib/netcoreapp3.0/System.IO.Pipelines.dll": { "assemblyVersion": "4.0.2.1", "fileVersion": "4.700.20.21406" } } }, "System.Linq/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" } }, "System.Memory/4.5.4": {}, "System.Net.NameResolution/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.native.System": "4.3.0" } }, "System.Net.NetworkInformation/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" } }, "System.Net.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "runtime.unix.System.Net.Primitives": "4.3.0" } }, "System.Net.Sockets/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.unix.System.Net.Sockets": "4.3.0" } }, "System.Numerics.Vectors/4.5.0": {}, "System.Private.Uri/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "runtime.unix.System.Private.Uri": "4.3.0" } }, "System.Reflection/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "runtime.any.System.Reflection": "4.3.0" } }, "System.Reflection.Metadata/1.6.0": {}, "System.Reflection.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Reflection.Primitives": "4.3.0" } }, "System.Reflection.TypeExtensions/4.3.0": { "dependencies": { "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Resources.ResourceManager/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0", "runtime.any.System.Resources.ResourceManager": "4.3.0" } }, "System.Runtime/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "runtime.any.System.Runtime": "4.3.0" } }, "System.Runtime.CompilerServices.Unsafe/4.7.0": { "runtime": { "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll": { "assemblyVersion": "4.0.6.0", "fileVersion": "4.700.19.56404" } } }, "System.Runtime.Extensions/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.unix.System.Runtime.Extensions": "4.3.0" } }, "System.Runtime.Handles/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Runtime.Handles": "4.3.0" } }, "System.Runtime.InteropServices/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "runtime.any.System.Runtime.InteropServices": "4.3.0" } }, "System.Security.Claims/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" } }, "System.Security.Cryptography.Cng/4.5.0": {}, "System.Security.Principal/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "System.Security.Principal.Windows/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" } }, "System.Text.Encoding/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Text.Encoding": "4.3.0" } }, "System.Text.Encoding.CodePages/4.5.1": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "System.Runtime.CompilerServices.Unsafe": "4.7.0" } }, "System.Text.Encoding.Extensions/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "runtime.any.System.Text.Encoding.Extensions": "4.3.0" } }, "System.Text.Encodings.Web/4.5.0": {}, "System.Threading/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.Threading.Overlapped/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Threading.Tasks/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Threading.Tasks": "4.3.0" } }, "System.Threading.Tasks.Extensions/4.5.3": {}, "System.Threading.Thread/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "System.Threading.ThreadPool/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "Splamy.TSLib/1.1.0": { "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2" }, "runtime": { "TSLib.dll": {} } }, "TSLib/1.1.0.0": { "runtime": { "TSLib.dll": { "assemblyVersion": "1.1.0.0", "fileVersion": "1.1.0.0" } } } } }, "libraries": { "TS3AudioBot/1.0.0": { "type": "project", "serviceable": false, "sha512": "" }, "runtimepack.Microsoft.NETCore.App.Runtime.linux-x64/3.1.32": { "type": "runtimepack", "serviceable": false, "sha512": "" }, "CliWrap/3.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-vbQ+rpxRgdkWBHmZXl8De4PYzKTOxa37Tfz6Zb01OP8f7eFBOjCj5IY2+Ghb81pPMA6rCDPrYEbod1EzbcFG2w==", "path": "cliwrap/3.1.0", "hashPath": "cliwrap.3.1.0.nupkg.sha512" }, "CommandLineParser/2.8.0": { "type": "package", "serviceable": true, "sha512": "sha512-eco2HlKQBY4Joz9odHigzGpVzv6pjsXnY5lziioMveQxr+i2Z7xYcIOMeZTgYiqnMtMAbXMXsVhrNfWO5vJS8Q==", "path": "commandlineparser/2.8.0", "hashPath": "commandlineparser.2.8.0.nupkg.sha512" }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "serviceable": true, "sha512": "sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==", "path": "heijden.dns.portable/2.0.19", "hashPath": "heijden.dns.portable.2.0.19.nupkg.sha512" }, "LiteDB/4.1.4": { "type": "package", "serviceable": true, "sha512": "sha512-g4g9JlHzRBZl+Gd2UbiRdszZ7t8wozU2wX7+5xY5uE79tmcgcDhha+ubAP84G1VLbwQmhBGCzRfIx+epLmJciQ==", "path": "litedb/4.1.4", "hashPath": "litedb.4.1.4.nupkg.sha512" }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-Aqr/16Cu5XmGv7mLKJvXRxhhd05UJ7cTTSaUV4MZ3ynAzfgWjsAdpIU8FWuxwAjmVdmI8oOWuVDrbs+sRkhKnA==", "path": "microsoft.aspnetcore.connections.abstractions/2.2.0", "hashPath": "microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Cors/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-LFlTM3ThS3ZCILuKnjy8HyK9/IlDh3opogdbCVx6tMGyDzTQBgMPXLjGDLtMk5QmLDCcP3l1TO3z/+1viA8GUg==", "path": "microsoft.aspnetcore.cors/2.2.0", "hashPath": "microsoft.aspnetcore.cors.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Hosting/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-7t4RbUGugpHtQmzAkc9fpDdYJg6t/jcB2VVnjensVYbZFnLDU8pNrG0hrekk1DQG7P2UzpSqKLzDsFF0/lkkbw==", "path": "microsoft.aspnetcore.hosting/2.2.0", "hashPath": "microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==", "path": "microsoft.aspnetcore.hosting.abstractions/2.2.0", "hashPath": "microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==", "path": "microsoft.aspnetcore.hosting.server.abstractions/2.2.0", "hashPath": "microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Http/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==", "path": "microsoft.aspnetcore.http/2.2.0", "hashPath": "microsoft.aspnetcore.http.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==", "path": "microsoft.aspnetcore.http.abstractions/2.2.0", "hashPath": "microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==", "path": "microsoft.aspnetcore.http.extensions/2.2.0", "hashPath": "microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==", "path": "microsoft.aspnetcore.http.features/2.2.0", "hashPath": "microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-D0vGB8Tp0UNMiAhT+pwAVeqDDx2OFrfpu/plwm0WhA+1DZvTLc99eDwGISL6LAY8x7a12lhl9w7/m+VdoyDu8Q==", "path": "microsoft.aspnetcore.server.kestrel/2.2.0", "hashPath": "microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-F6/Vesd3ODq/ISbHfcvfRf7IzRtTvrNX8VA36Knm5e7bteJhoRA2GKQUVQ+neoO1njLvaQKnjcA3rdCZ6AF6cg==", "path": "microsoft.aspnetcore.server.kestrel.core/2.2.0", "hashPath": "microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-nEH5mU6idUYS3/+9BKw2stMOM25ZdGwIH4P4kyj6PVkMPgQUTkBQ7l/ScPkepdhejcOlPa+g3+M4dYsSYPUJ8g==", "path": "microsoft.aspnetcore.server.kestrel.https/2.2.0", "hashPath": "microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-j1ai2CG8BGp4mYf2TWSFjjy1pRgW9XbqhdR4EOVvrlFVbcpEPfXNIPEdjkcgK+txWCupGzkFnFF8oZsASMtmyw==", "path": "microsoft.aspnetcore.server.kestrel.transport.abstractions/2.2.0", "hashPath": "microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-qTACI0wePgAKCH+YKrMgChyfqJpjwgGZEtSuwBw6TjWLQ66THGasleia/7EZz2t2eAjwWxw8RA/D8ODrBqpj9A==", "path": "microsoft.aspnetcore.server.kestrel.transport.sockets/2.2.0", "hashPath": "microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-byZDrjir6Co5EoWbraQyG0qbPCUG6XgGYQstipMF9lucOAjq/mqnIyt8B8iMWnin/ghZoOln9Y01af4rUAwOhA==", "path": "microsoft.aspnetcore.staticfiles/2.2.0", "hashPath": "microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==", "path": "microsoft.aspnetcore.webutilities/2.2.0", "hashPath": "microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512" }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": { "type": "package", "serviceable": true, "sha512": "sha512-ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g==", "path": "microsoft.codeanalysis.analyzers/3.0.0", "hashPath": "microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512" }, "Microsoft.CodeAnalysis.Common/3.7.0": { "type": "package", "serviceable": true, "sha512": "sha512-SFEdnbw8204hTlde3JePYSIpNX58h/MMXa7LctUsUDigWMR8Ar9gE8LnsLqAIFM0O33JEuQbJ0G4Sat+cPGldw==", "path": "microsoft.codeanalysis.common/3.7.0", "hashPath": "microsoft.codeanalysis.common.3.7.0.nupkg.sha512" }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "type": "package", "serviceable": true, "sha512": "sha512-sKi5PIVy9nVDerkbplY6OQhJBNzEO4XJsMGrnmb6KFEa6K1ulGCHIv6NtDjdUQ/dGrouU3OExc3yzww0COD76w==", "path": "microsoft.codeanalysis.csharp/3.7.0", "hashPath": "microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512" }, "Microsoft.Extensions.Configuration/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==", "path": "microsoft.extensions.configuration/2.2.0", "hashPath": "microsoft.extensions.configuration.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", "path": "microsoft.extensions.configuration.abstractions/2.2.0", "hashPath": "microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==", "path": "microsoft.extensions.configuration.binder/2.2.0", "hashPath": "microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-gIqt9PkKO01hZ0zmHnWrZ1E45MDreZTVoyDbL1kMWKtDgxxWTJpYtESTEcgpvR1uB1iex1zKGYzJpOMgmuP5TQ==", "path": "microsoft.extensions.configuration.environmentvariables/2.2.0", "hashPath": "microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-H1qCpWBC8Ed4tguTR/qYkbb3F6DI5Su3t8xyFo3/5MzAd8PwPpHzgX8X04KbBxKmk173Pb64x7xMHarczVFQUA==", "path": "microsoft.extensions.configuration.fileextensions/2.2.0", "hashPath": "microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==", "path": "microsoft.extensions.dependencyinjection/2.2.0", "hashPath": "microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==", "path": "microsoft.extensions.dependencyinjection.abstractions/2.2.0", "hashPath": "microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==", "path": "microsoft.extensions.fileproviders.abstractions/2.2.0", "hashPath": "microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-tbDHZnBJkjYd9NjlRZ9ondDiv1Te3KYCTW2RWpR1B0e1Z8+EnFRo7qNnHkkSCixLdlPZzhjlX24d/PixQ7w2dA==", "path": "microsoft.extensions.fileproviders.physical/2.2.0", "hashPath": "microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-ZSsHZp3PyW6vk37tDEdypjgGlNtpJ0EixBMOfUod2Thx7GtwfFSAQXUQx8a8BN8vfWKGGMbp7jPWdoHx/At4wQ==", "path": "microsoft.extensions.filesystemglobbing/2.2.0", "hashPath": "microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==", "path": "microsoft.extensions.hosting.abstractions/2.2.0", "hashPath": "microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Logging/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==", "path": "microsoft.extensions.logging/2.2.0", "hashPath": "microsoft.extensions.logging.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==", "path": "microsoft.extensions.logging.abstractions/2.2.0", "hashPath": "microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.ObjectPool/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==", "path": "microsoft.extensions.objectpool/2.2.0", "hashPath": "microsoft.extensions.objectpool.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Options/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==", "path": "microsoft.extensions.options/2.2.0", "hashPath": "microsoft.extensions.options.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Primitives/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==", "path": "microsoft.extensions.primitives/2.2.0", "hashPath": "microsoft.extensions.primitives.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.WebEncoders/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-V8XcqYcpcdBAxUhLeyYcuKmxu4CtNQA9IphTnARpQGhkop4A93v2XgM3AtaVVJo3H2cDWxWM6aeO8HxkifREqw==", "path": "microsoft.extensions.webencoders/2.2.0", "hashPath": "microsoft.extensions.webencoders.2.2.0.nupkg.sha512" }, "Microsoft.Net.Http.Headers/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==", "path": "microsoft.net.http.headers/2.2.0", "hashPath": "microsoft.net.http.headers.2.2.0.nupkg.sha512" }, "Microsoft.NETCore.Platforms/2.1.2": { "type": "package", "serviceable": true, "sha512": "sha512-mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==", "path": "microsoft.netcore.platforms/2.1.2", "hashPath": "microsoft.netcore.platforms.2.1.2.nupkg.sha512" }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "path": "microsoft.netcore.targets/1.1.0", "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "path": "microsoft.win32.primitives/4.3.0", "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" }, "Nett/0.15.0": { "type": "package", "serviceable": true, "sha512": "sha512-/0SoN9ugPKfmLndtKy3gaRxOlzji94/yrNgQLe45/1ZgExj0BaVozbXD+oWD8E6MCLvTs+YWzmn315mQOXGCcw==", "path": "nett/0.15.0", "hashPath": "nett.0.15.0.nupkg.sha512" }, "Newtonsoft.Json/12.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==", "path": "newtonsoft.json/12.0.3", "hashPath": "newtonsoft.json.12.0.3.nupkg.sha512" }, "NLog/4.7.3": { "type": "package", "serviceable": true, "sha512": "sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==", "path": "nlog/4.7.3", "hashPath": "nlog.4.7.3.nupkg.sha512" }, "PlaylistsNET/1.1.2": { "type": "package", "serviceable": true, "sha512": "sha512-IGzVterTV49b9FjzY7gMUcxnzOvVDj6L07pjB821m+k2iHWazy/OhIvDCvGSMx1cvkY9ZBajXpQO5uUCZY51vw==", "path": "playlistsnet/1.1.2", "hashPath": "playlistsnet.1.1.2.nupkg.sha512" }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "serviceable": true, "sha512": "sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==", "path": "portable.bouncycastle/1.8.6.7", "hashPath": "portable.bouncycastle.1.8.6.7.nupkg.sha512" }, "runtime.any.System.Collections/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", "path": "runtime.any.system.collections/4.3.0", "hashPath": "runtime.any.system.collections.4.3.0.nupkg.sha512" }, "runtime.any.System.Diagnostics.Tracing/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==", "path": "runtime.any.system.diagnostics.tracing/4.3.0", "hashPath": "runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512" }, "runtime.any.System.Globalization/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==", "path": "runtime.any.system.globalization/4.3.0", "hashPath": "runtime.any.system.globalization.4.3.0.nupkg.sha512" }, "runtime.any.System.IO/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==", "path": "runtime.any.system.io/4.3.0", "hashPath": "runtime.any.system.io.4.3.0.nupkg.sha512" }, "runtime.any.System.Reflection/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==", "path": "runtime.any.system.reflection/4.3.0", "hashPath": "runtime.any.system.reflection.4.3.0.nupkg.sha512" }, "runtime.any.System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==", "path": "runtime.any.system.reflection.primitives/4.3.0", "hashPath": "runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512" }, "runtime.any.System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==", "path": "runtime.any.system.resources.resourcemanager/4.3.0", "hashPath": "runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "runtime.any.System.Runtime/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", "path": "runtime.any.system.runtime/4.3.0", "hashPath": "runtime.any.system.runtime.4.3.0.nupkg.sha512" }, "runtime.any.System.Runtime.Handles/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==", "path": "runtime.any.system.runtime.handles/4.3.0", "hashPath": "runtime.any.system.runtime.handles.4.3.0.nupkg.sha512" }, "runtime.any.System.Runtime.InteropServices/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==", "path": "runtime.any.system.runtime.interopservices/4.3.0", "hashPath": "runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512" }, "runtime.any.System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==", "path": "runtime.any.system.text.encoding/4.3.0", "hashPath": "runtime.any.system.text.encoding.4.3.0.nupkg.sha512" }, "runtime.any.System.Text.Encoding.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==", "path": "runtime.any.system.text.encoding.extensions/4.3.0", "hashPath": "runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512" }, "runtime.any.System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==", "path": "runtime.any.system.threading.tasks/4.3.0", "hashPath": "runtime.any.system.threading.tasks.4.3.0.nupkg.sha512" }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==", "path": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==", "path": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==", "path": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.native.System/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", "path": "runtime.native.system/4.3.0", "hashPath": "runtime.native.system.4.3.0.nupkg.sha512" }, "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", "path": "runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==", "path": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==", "path": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==", "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==", "path": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==", "path": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==", "path": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==", "path": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.unix.Microsoft.Win32.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-2mI2Mfq+CVatgr4RWGvAWBjoCfUafy6VNFU7G9OA52DjO8x/okfIbsEq2UPgeGfdpO7X5gmPXKT8slx0tn0Mhw==", "path": "runtime.unix.microsoft.win32.primitives/4.3.0", "hashPath": "runtime.unix.microsoft.win32.primitives.4.3.0.nupkg.sha512" }, "runtime.unix.System.Diagnostics.Debug/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-WV8KLRHWVUVUDduFnvGMHt0FsEt2wK6xPl1EgDKlaMx2KnZ43A/O0GzP8wIuvAC7mq4T9V1mm90r+PXkL9FPdQ==", "path": "runtime.unix.system.diagnostics.debug/4.3.0", "hashPath": "runtime.unix.system.diagnostics.debug.4.3.0.nupkg.sha512" }, "runtime.unix.System.IO.FileSystem/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-ajmTcjrqc3vgV1TH54DRioshbEniaFbOAJ0kReGuNsp9uIcqYle0RmUo6+Qlwqe3JIs4TDxgnqs3UzX3gRJ1rA==", "path": "runtime.unix.system.io.filesystem/4.3.0", "hashPath": "runtime.unix.system.io.filesystem.4.3.0.nupkg.sha512" }, "runtime.unix.System.Net.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-AZcRXhH7Gamr+bckUfX3iHefPIrujJTt9XWQWo0elNiP1SNasX0KBWINZkDKY0GsOrsyJ7cB4MgIRTZzLlsTKg==", "path": "runtime.unix.system.net.primitives/4.3.0", "hashPath": "runtime.unix.system.net.primitives.4.3.0.nupkg.sha512" }, "runtime.unix.System.Net.Sockets/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-4NcLbqajFaD3PvhOdmbieeBlKY4d8/kBfgJ5g28n6k1jWEICabvLM62gvmUS/CvyfvcZxVanKPl+E9LhPzfXZw==", "path": "runtime.unix.system.net.sockets/4.3.0", "hashPath": "runtime.unix.system.net.sockets.4.3.0.nupkg.sha512" }, "runtime.unix.System.Private.Uri/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-ooWzobr5RAq34r9uan1r/WPXJYG1XWy9KanrxNvEnBzbFdQbMG7Y3bVi4QxR7xZMNLOxLLTAyXvnSkfj5boZSg==", "path": "runtime.unix.system.private.uri/4.3.0", "hashPath": "runtime.unix.system.private.uri.4.3.0.nupkg.sha512" }, "runtime.unix.System.Runtime.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-zQiTBVpiLftTQZW8GFsV0gjYikB1WMkEPIxF5O6RkUrSV/OgvRRTYgeFQha/0keBpuS0HYweraGRwhfhJ7dj7w==", "path": "runtime.unix.system.runtime.extensions/4.3.0", "hashPath": "runtime.unix.system.runtime.extensions.4.3.0.nupkg.sha512" }, "SixLabors.ImageSharp/1.0.0": { "type": "package", "serviceable": true, "sha512": "sha512-8amvsk8NXnCxZV0lvJppAZJknViWgBOO/2V59IGR6DVoD13mSmG+/Z9eg5IwrHQuRHp5RD9lfXBXDZyk8rTKDg==", "path": "sixlabors.imagesharp/1.0.0", "hashPath": "sixlabors.imagesharp.1.0.0.nupkg.sha512" }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==", "path": "splamy.ed25519.toolkit/1.0.3", "hashPath": "splamy.ed25519.toolkit.1.0.3.nupkg.sha512" }, "System.Buffers/4.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==", "path": "system.buffers/4.5.0", "hashPath": "system.buffers.4.5.0.nupkg.sha512" }, "System.Collections/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "path": "system.collections/4.3.0", "hashPath": "system.collections.4.3.0.nupkg.sha512" }, "System.Collections.Immutable/1.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==", "path": "system.collections.immutable/1.5.0", "hashPath": "system.collections.immutable.1.5.0.nupkg.sha512" }, "System.ComponentModel.Annotations/4.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==", "path": "system.componentmodel.annotations/4.5.0", "hashPath": "system.componentmodel.annotations.4.5.0.nupkg.sha512" }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "path": "system.diagnostics.debug/4.3.0", "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" }, "System.Diagnostics.DiagnosticSource/4.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-eIHRELiYDQvsMToML81QFkXEEYXUSUT2F28t1SGrevWqP+epFdw80SyAXIKTXOHrIEXReFOEnEr7XlGiC2GgOg==", "path": "system.diagnostics.diagnosticsource/4.5.0", "hashPath": "system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512" }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "path": "system.diagnostics.tracing/4.3.0", "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" }, "System.Globalization/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "path": "system.globalization/4.3.0", "hashPath": "system.globalization.4.3.0.nupkg.sha512" }, "System.IO/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "path": "system.io/4.3.0", "hashPath": "system.io.4.3.0.nupkg.sha512" }, "System.IO.FileSystem/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "path": "system.io.filesystem/4.3.0", "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "path": "system.io.filesystem.primitives/4.3.0", "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" }, "System.IO.Pipelines/4.7.2": { "type": "package", "serviceable": true, "sha512": "sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==", "path": "system.io.pipelines/4.7.2", "hashPath": "system.io.pipelines.4.7.2.nupkg.sha512" }, "System.Linq/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "path": "system.linq/4.3.0", "hashPath": "system.linq.4.3.0.nupkg.sha512" }, "System.Memory/4.5.4": { "type": "package", "serviceable": true, "sha512": "sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", "path": "system.memory/4.5.4", "hashPath": "system.memory.4.5.4.nupkg.sha512" }, "System.Net.NameResolution/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", "path": "system.net.nameresolution/4.3.0", "hashPath": "system.net.nameresolution.4.3.0.nupkg.sha512" }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==", "path": "system.net.networkinformation/4.3.0", "hashPath": "system.net.networkinformation.4.3.0.nupkg.sha512" }, "System.Net.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "path": "system.net.primitives/4.3.0", "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" }, "System.Net.Sockets/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "path": "system.net.sockets/4.3.0", "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" }, "System.Numerics.Vectors/4.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==", "path": "system.numerics.vectors/4.5.0", "hashPath": "system.numerics.vectors.4.5.0.nupkg.sha512" }, "System.Private.Uri/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", "path": "system.private.uri/4.3.0", "hashPath": "system.private.uri.4.3.0.nupkg.sha512" }, "System.Reflection/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "path": "system.reflection/4.3.0", "hashPath": "system.reflection.4.3.0.nupkg.sha512" }, "System.Reflection.Metadata/1.6.0": { "type": "package", "serviceable": true, "sha512": "sha512-COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", "path": "system.reflection.metadata/1.6.0", "hashPath": "system.reflection.metadata.1.6.0.nupkg.sha512" }, "System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "path": "system.reflection.primitives/4.3.0", "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" }, "System.Reflection.TypeExtensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", "path": "system.reflection.typeextensions/4.3.0", "hashPath": "system.reflection.typeextensions.4.3.0.nupkg.sha512" }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "path": "system.resources.resourcemanager/4.3.0", "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "System.Runtime/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "path": "system.runtime/4.3.0", "hashPath": "system.runtime.4.3.0.nupkg.sha512" }, "System.Runtime.CompilerServices.Unsafe/4.7.0": { "type": "package", "serviceable": true, "sha512": "sha512-IpU1lcHz8/09yDr9N+Juc7SCgNUz+RohkCQI+KsWKR67XxpFr8Z6c8t1iENCXZuRuNCc4HBwme/MDHNVCwyAKg==", "path": "system.runtime.compilerservices.unsafe/4.7.0", "hashPath": "system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512" }, "System.Runtime.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "path": "system.runtime.extensions/4.3.0", "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" }, "System.Runtime.Handles/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "path": "system.runtime.handles/4.3.0", "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "path": "system.runtime.interopservices/4.3.0", "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" }, "System.Security.Claims/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "path": "system.security.claims/4.3.0", "hashPath": "system.security.claims.4.3.0.nupkg.sha512" }, "System.Security.Cryptography.Cng/4.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==", "path": "system.security.cryptography.cng/4.5.0", "hashPath": "system.security.cryptography.cng.4.5.0.nupkg.sha512" }, "System.Security.Principal/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "path": "system.security.principal/4.3.0", "hashPath": "system.security.principal.4.3.0.nupkg.sha512" }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", "path": "system.security.principal.windows/4.3.0", "hashPath": "system.security.principal.windows.4.3.0.nupkg.sha512" }, "System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "path": "system.text.encoding/4.3.0", "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" }, "System.Text.Encoding.CodePages/4.5.1": { "type": "package", "serviceable": true, "sha512": "sha512-4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", "path": "system.text.encoding.codepages/4.5.1", "hashPath": "system.text.encoding.codepages.4.5.1.nupkg.sha512" }, "System.Text.Encoding.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", "path": "system.text.encoding.extensions/4.3.0", "hashPath": "system.text.encoding.extensions.4.3.0.nupkg.sha512" }, "System.Text.Encodings.Web/4.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-Xg4G4Indi4dqP1iuAiMSwpiWS54ZghzR644OtsRCm/m/lBMG8dUBhLVN7hLm8NNrNTR+iGbshCPTwrvxZPlm4g==", "path": "system.text.encodings.web/4.5.0", "hashPath": "system.text.encodings.web.4.5.0.nupkg.sha512" }, "System.Threading/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "path": "system.threading/4.3.0", "hashPath": "system.threading.4.3.0.nupkg.sha512" }, "System.Threading.Overlapped/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", "path": "system.threading.overlapped/4.3.0", "hashPath": "system.threading.overlapped.4.3.0.nupkg.sha512" }, "System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "path": "system.threading.tasks/4.3.0", "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" }, "System.Threading.Tasks.Extensions/4.5.3": { "type": "package", "serviceable": true, "sha512": "sha512-+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==", "path": "system.threading.tasks.extensions/4.5.3", "hashPath": "system.threading.tasks.extensions.4.5.3.nupkg.sha512" }, "System.Threading.Thread/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", "path": "system.threading.thread/4.3.0", "hashPath": "system.threading.thread.4.3.0.nupkg.sha512" }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", "path": "system.threading.threadpool/4.3.0", "hashPath": "system.threading.threadpool.4.3.0.nupkg.sha512" }, "Splamy.TSLib/1.1.0": { "type": "project", "serviceable": false, "sha512": "" }, "TSLib/1.1.0.0": { "type": "reference", "serviceable": false, "sha512": "" } }, "runtimes": { "alpine-x64": [ "alpine", "linux-musl-x64", "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "alpine.3.10-x64": [ "alpine.3.10", "alpine.3.9-x64", "alpine.3.9", "alpine.3.8-x64", "alpine.3.8", "alpine.3.7-x64", "alpine.3.7", "alpine.3.6-x64", "alpine.3.6", "alpine-x64", "alpine", "linux-musl-x64", "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "alpine.3.11-x64": [ "alpine.3.11", "alpine.3.10-x64", "alpine.3.10", "alpine.3.9-x64", "alpine.3.9", "alpine.3.8-x64", "alpine.3.8", "alpine.3.7-x64", "alpine.3.7", "alpine.3.6-x64", "alpine.3.6", "alpine-x64", "alpine", "linux-musl-x64", "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "alpine.3.12-x64": [ "alpine.3.12", "alpine.3.11-x64", "alpine.3.11", "alpine.3.10-x64", "alpine.3.10", "alpine.3.9-x64", "alpine.3.9", "alpine.3.8-x64", "alpine.3.8", "alpine.3.7-x64", "alpine.3.7", "alpine.3.6-x64", "alpine.3.6", "alpine-x64", "alpine", "linux-musl-x64", "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "alpine.3.13-x64": [ "alpine.3.13", "alpine.3.12-x64", "alpine.3.12", "alpine.3.11-x64", "alpine.3.11", "alpine.3.10-x64", "alpine.3.10", "alpine.3.9-x64", "alpine.3.9", "alpine.3.8-x64", "alpine.3.8", "alpine.3.7-x64", "alpine.3.7", "alpine.3.6-x64", "alpine.3.6", "alpine-x64", "alpine", "linux-musl-x64", "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "alpine.3.14-x64": [ "alpine.3.14", "alpine.3.13-x64", "alpine.3.13", "alpine.3.12-x64", "alpine.3.12", "alpine.3.11-x64", "alpine.3.11", "alpine.3.10-x64", "alpine.3.10", "alpine.3.9-x64", "alpine.3.9", "alpine.3.8-x64", "alpine.3.8", "alpine.3.7-x64", "alpine.3.7", "alpine.3.6-x64", "alpine.3.6", "alpine-x64", "alpine", "linux-musl-x64", "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "alpine.3.15-x64": [ "alpine.3.15", "alpine.3.14-x64", "alpine.3.14", "alpine.3.13-x64", "alpine.3.13", "alpine.3.12-x64", "alpine.3.12", "alpine.3.11-x64", "alpine.3.11", "alpine.3.10-x64", "alpine.3.10", "alpine.3.9-x64", "alpine.3.9", "alpine.3.8-x64", "alpine.3.8", "alpine.3.7-x64", "alpine.3.7", "alpine.3.6-x64", "alpine.3.6", "alpine-x64", "alpine", "linux-musl-x64", "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "alpine.3.16-x64": [ "alpine.3.16", "alpine.3.15-x64", "alpine.3.15", "alpine.3.14-x64", "alpine.3.14", "alpine.3.13-x64", "alpine.3.13", "alpine.3.12-x64", "alpine.3.12", "alpine.3.11-x64", "alpine.3.11", "alpine.3.10-x64", "alpine.3.10", "alpine.3.9-x64", "alpine.3.9", "alpine.3.8-x64", "alpine.3.8", "alpine.3.7-x64", "alpine.3.7", "alpine.3.6-x64", "alpine.3.6", "alpine-x64", "alpine", "linux-musl-x64", "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "alpine.3.17-x64": [ "alpine.3.17", "alpine.3.16-x64", "alpine.3.16", "alpine.3.15-x64", "alpine.3.15", "alpine.3.14-x64", "alpine.3.14", "alpine.3.13-x64", "alpine.3.13", "alpine.3.12-x64", "alpine.3.12", "alpine.3.11-x64", "alpine.3.11", "alpine.3.10-x64", "alpine.3.10", "alpine.3.9-x64", "alpine.3.9", "alpine.3.8-x64", "alpine.3.8", "alpine.3.7-x64", "alpine.3.7", "alpine.3.6-x64", "alpine.3.6", "alpine-x64", "alpine", "linux-musl-x64", "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "alpine.3.6-x64": [ "alpine.3.6", "alpine-x64", "alpine", "linux-musl-x64", "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "alpine.3.7-x64": [ "alpine.3.7", "alpine.3.6-x64", "alpine.3.6", "alpine-x64", "alpine", "linux-musl-x64", "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "alpine.3.8-x64": [ "alpine.3.8", "alpine.3.7-x64", "alpine.3.7", "alpine.3.6-x64", "alpine.3.6", "alpine-x64", "alpine", "linux-musl-x64", "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "alpine.3.9-x64": [ "alpine.3.9", "alpine.3.8-x64", "alpine.3.8", "alpine.3.7-x64", "alpine.3.7", "alpine.3.6-x64", "alpine.3.6", "alpine-x64", "alpine", "linux-musl-x64", "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "android-x64": [ "android", "linux-bionic-x64", "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "android.21-x64": [ "android.21", "android-x64", "android", "linux-bionic-x64", "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "android.22-x64": [ "android.22", "android.21-x64", "android.21", "android-x64", "android", "linux-bionic-x64", "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "android.23-x64": [ "android.23", "android.22-x64", "android.22", "android.21-x64", "android.21", "android-x64", "android", "linux-bionic-x64", "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "android.24-x64": [ "android.24", "android.23-x64", "android.23", "android.22-x64", "android.22", "android.21-x64", "android.21", "android-x64", "android", "linux-bionic-x64", "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "android.25-x64": [ "android.25", "android.24-x64", "android.24", "android.23-x64", "android.23", "android.22-x64", "android.22", "android.21-x64", "android.21", "android-x64", "android", "linux-bionic-x64", "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "android.26-x64": [ "android.26", "android.25-x64", "android.25", "android.24-x64", "android.24", "android.23-x64", "android.23", "android.22-x64", "android.22", "android.21-x64", "android.21", "android-x64", "android", "linux-bionic-x64", "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "android.27-x64": [ "android.27", "android.26-x64", "android.26", "android.25-x64", "android.25", "android.24-x64", "android.24", "android.23-x64", "android.23", "android.22-x64", "android.22", "android.21-x64", "android.21", "android-x64", "android", "linux-bionic-x64", "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "android.28-x64": [ "android.28", "android.27-x64", "android.27", "android.26-x64", "android.26", "android.25-x64", "android.25", "android.24-x64", "android.24", "android.23-x64", "android.23", "android.22-x64", "android.22", "android.21-x64", "android.21", "android-x64", "android", "linux-bionic-x64", "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "android.29-x64": [ "android.29", "android.28-x64", "android.28", "android.27-x64", "android.27", "android.26-x64", "android.26", "android.25-x64", "android.25", "android.24-x64", "android.24", "android.23-x64", "android.23", "android.22-x64", "android.22", "android.21-x64", "android.21", "android-x64", "android", "linux-bionic-x64", "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "android.30-x64": [ "android.30", "android.29-x64", "android.29", "android.28-x64", "android.28", "android.27-x64", "android.27", "android.26-x64", "android.26", "android.25-x64", "android.25", "android.24-x64", "android.24", "android.23-x64", "android.23", "android.22-x64", "android.22", "android.21-x64", "android.21", "android-x64", "android", "linux-bionic-x64", "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "android.31-x64": [ "android.31", "android.30-x64", "android.30", "android.29-x64", "android.29", "android.28-x64", "android.28", "android.27-x64", "android.27", "android.26-x64", "android.26", "android.25-x64", "android.25", "android.24-x64", "android.24", "android.23-x64", "android.23", "android.22-x64", "android.22", "android.21-x64", "android.21", "android-x64", "android", "linux-bionic-x64", "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "android.32-x64": [ "android.32", "android.31-x64", "android.31", "android.30-x64", "android.30", "android.29-x64", "android.29", "android.28-x64", "android.28", "android.27-x64", "android.27", "android.26-x64", "android.26", "android.25-x64", "android.25", "android.24-x64", "android.24", "android.23-x64", "android.23", "android.22-x64", "android.22", "android.21-x64", "android.21", "android-x64", "android", "linux-bionic-x64", "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "arch-x64": [ "arch", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "centos-x64": [ "centos", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "centos.7-x64": [ "centos.7", "centos-x64", "rhel.7-x64", "centos", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "centos.8-x64": [ "centos.8", "centos-x64", "rhel.8-x64", "centos", "rhel.8", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "centos.9-x64": [ "centos.9", "centos-x64", "rhel.9-x64", "centos", "rhel.9", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "debian-x64": [ "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "debian.10-x64": [ "debian.10", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "debian.11-x64": [ "debian.11", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "debian.8-x64": [ "debian.8", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "debian.9-x64": [ "debian.9", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "exherbo-x64": [ "exherbo", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora-x64": [ "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.23-x64": [ "fedora.23", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.24-x64": [ "fedora.24", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.25-x64": [ "fedora.25", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.26-x64": [ "fedora.26", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.27-x64": [ "fedora.27", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.28-x64": [ "fedora.28", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.29-x64": [ "fedora.29", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.30-x64": [ "fedora.30", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.31-x64": [ "fedora.31", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.32-x64": [ "fedora.32", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.33-x64": [ "fedora.33", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.34-x64": [ "fedora.34", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.35-x64": [ "fedora.35", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.36-x64": [ "fedora.36", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.37-x64": [ "fedora.37", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "fedora.38-x64": [ "fedora.38", "fedora-x64", "fedora", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "gentoo-x64": [ "gentoo", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "linux-bionic-x64": [ "linux-bionic", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "linux-musl-x64": [ "linux-musl", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "linux-x64": [ "linux", "unix-x64", "unix", "any", "base" ], "linuxmint.17-x64": [ "linuxmint.17", "ubuntu.14.04-x64", "ubuntu.14.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "linuxmint.17.1-x64": [ "linuxmint.17.1", "linuxmint.17-x64", "linuxmint.17", "ubuntu.14.04-x64", "ubuntu.14.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "linuxmint.17.2-x64": [ "linuxmint.17.2", "linuxmint.17.1-x64", "linuxmint.17.1", "linuxmint.17-x64", "linuxmint.17", "ubuntu.14.04-x64", "ubuntu.14.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "linuxmint.17.3-x64": [ "linuxmint.17.3", "linuxmint.17.2-x64", "linuxmint.17.2", "linuxmint.17.1-x64", "linuxmint.17.1", "linuxmint.17-x64", "linuxmint.17", "ubuntu.14.04-x64", "ubuntu.14.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "linuxmint.18-x64": [ "linuxmint.18", "ubuntu.16.04-x64", "ubuntu.16.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "linuxmint.18.1-x64": [ "linuxmint.18.1", "linuxmint.18-x64", "linuxmint.18", "ubuntu.16.04-x64", "ubuntu.16.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "linuxmint.18.2-x64": [ "linuxmint.18.2", "linuxmint.18.1-x64", "linuxmint.18.1", "linuxmint.18-x64", "linuxmint.18", "ubuntu.16.04-x64", "ubuntu.16.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "linuxmint.18.3-x64": [ "linuxmint.18.3", "linuxmint.18.2-x64", "linuxmint.18.2", "linuxmint.18.1-x64", "linuxmint.18.1", "linuxmint.18-x64", "linuxmint.18", "ubuntu.16.04-x64", "ubuntu.16.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "linuxmint.19-x64": [ "linuxmint.19", "ubuntu.18.04-x64", "ubuntu.18.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "linuxmint.19.1-x64": [ "linuxmint.19.1", "linuxmint.19-x64", "linuxmint.19", "ubuntu.18.04-x64", "ubuntu.18.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "linuxmint.19.2-x64": [ "linuxmint.19.2", "linuxmint.19.1-x64", "linuxmint.19.1", "linuxmint.19-x64", "linuxmint.19", "ubuntu.18.04-x64", "ubuntu.18.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "manjaro-x64": [ "manjaro", "arch-x64", "arch", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "miraclelinux-x64": [ "miraclelinux", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "miraclelinux.8-x64": [ "miraclelinux.8", "miraclelinux-x64", "rhel.8-x64", "miraclelinux", "rhel.8", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "miraclelinux.9-x64": [ "miraclelinux.9", "miraclelinux-x64", "rhel.9-x64", "miraclelinux", "rhel.9", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ol-x64": [ "ol", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ol.7-x64": [ "ol.7", "ol-x64", "rhel.7-x64", "ol", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ol.7.0-x64": [ "ol.7.0", "ol.7-x64", "rhel.7.0-x64", "ol.7", "rhel.7.0", "ol-x64", "rhel.7-x64", "ol", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ol.7.1-x64": [ "ol.7.1", "ol.7.0-x64", "rhel.7.1-x64", "ol.7.0", "rhel.7.1", "ol.7-x64", "rhel.7.0-x64", "ol.7", "rhel.7.0", "ol-x64", "rhel.7-x64", "ol", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ol.7.2-x64": [ "ol.7.2", "ol.7.1-x64", "rhel.7.2-x64", "ol.7.1", "rhel.7.2", "ol.7.0-x64", "rhel.7.1-x64", "ol.7.0", "rhel.7.1", "ol.7-x64", "rhel.7.0-x64", "ol.7", "rhel.7.0", "ol-x64", "rhel.7-x64", "ol", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ol.7.3-x64": [ "ol.7.3", "ol.7.2-x64", "rhel.7.3-x64", "ol.7.2", "rhel.7.3", "ol.7.1-x64", "rhel.7.2-x64", "ol.7.1", "rhel.7.2", "ol.7.0-x64", "rhel.7.1-x64", "ol.7.0", "rhel.7.1", "ol.7-x64", "rhel.7.0-x64", "ol.7", "rhel.7.0", "ol-x64", "rhel.7-x64", "ol", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ol.7.4-x64": [ "ol.7.4", "ol.7.3-x64", "rhel.7.4-x64", "ol.7.3", "rhel.7.4", "ol.7.2-x64", "rhel.7.3-x64", "ol.7.2", "rhel.7.3", "ol.7.1-x64", "rhel.7.2-x64", "ol.7.1", "rhel.7.2", "ol.7.0-x64", "rhel.7.1-x64", "ol.7.0", "rhel.7.1", "ol.7-x64", "rhel.7.0-x64", "ol.7", "rhel.7.0", "ol-x64", "rhel.7-x64", "ol", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ol.7.5-x64": [ "ol.7.5", "ol.7.4-x64", "rhel.7.5-x64", "ol.7.4", "rhel.7.5", "ol.7.3-x64", "rhel.7.4-x64", "ol.7.3", "rhel.7.4", "ol.7.2-x64", "rhel.7.3-x64", "ol.7.2", "rhel.7.3", "ol.7.1-x64", "rhel.7.2-x64", "ol.7.1", "rhel.7.2", "ol.7.0-x64", "rhel.7.1-x64", "ol.7.0", "rhel.7.1", "ol.7-x64", "rhel.7.0-x64", "ol.7", "rhel.7.0", "ol-x64", "rhel.7-x64", "ol", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ol.7.6-x64": [ "ol.7.6", "ol.7.5-x64", "rhel.7.6-x64", "ol.7.5", "rhel.7.6", "ol.7.4-x64", "rhel.7.5-x64", "ol.7.4", "rhel.7.5", "ol.7.3-x64", "rhel.7.4-x64", "ol.7.3", "rhel.7.4", "ol.7.2-x64", "rhel.7.3-x64", "ol.7.2", "rhel.7.3", "ol.7.1-x64", "rhel.7.2-x64", "ol.7.1", "rhel.7.2", "ol.7.0-x64", "rhel.7.1-x64", "ol.7.0", "rhel.7.1", "ol.7-x64", "rhel.7.0-x64", "ol.7", "rhel.7.0", "ol-x64", "rhel.7-x64", "ol", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ol.8-x64": [ "ol.8", "ol-x64", "rhel.8-x64", "ol", "rhel.8", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ol.8.0-x64": [ "ol.8.0", "ol.8-x64", "rhel.8.0-x64", "ol.8", "rhel.8.0", "ol-x64", "rhel.8-x64", "ol", "rhel.8", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "opensuse-x64": [ "opensuse", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "opensuse.13.2-x64": [ "opensuse.13.2", "opensuse-x64", "opensuse", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "opensuse.15.0-x64": [ "opensuse.15.0", "opensuse-x64", "opensuse", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "opensuse.15.1-x64": [ "opensuse.15.1", "opensuse-x64", "opensuse", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "opensuse.42.1-x64": [ "opensuse.42.1", "opensuse-x64", "opensuse", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "opensuse.42.2-x64": [ "opensuse.42.2", "opensuse-x64", "opensuse", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "opensuse.42.3-x64": [ "opensuse.42.3", "opensuse-x64", "opensuse", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel-x64": [ "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel.6-x64": [ "rhel.6", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel.7-x64": [ "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel.7.0-x64": [ "rhel.7.0", "rhel.7-x64", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel.7.1-x64": [ "rhel.7.1", "rhel.7.0-x64", "rhel.7.0", "rhel.7-x64", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel.7.2-x64": [ "rhel.7.2", "rhel.7.1-x64", "rhel.7.1", "rhel.7.0-x64", "rhel.7.0", "rhel.7-x64", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel.7.3-x64": [ "rhel.7.3", "rhel.7.2-x64", "rhel.7.2", "rhel.7.1-x64", "rhel.7.1", "rhel.7.0-x64", "rhel.7.0", "rhel.7-x64", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel.7.4-x64": [ "rhel.7.4", "rhel.7.3-x64", "rhel.7.3", "rhel.7.2-x64", "rhel.7.2", "rhel.7.1-x64", "rhel.7.1", "rhel.7.0-x64", "rhel.7.0", "rhel.7-x64", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel.7.5-x64": [ "rhel.7.5", "rhel.7.4-x64", "rhel.7.4", "rhel.7.3-x64", "rhel.7.3", "rhel.7.2-x64", "rhel.7.2", "rhel.7.1-x64", "rhel.7.1", "rhel.7.0-x64", "rhel.7.0", "rhel.7-x64", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel.7.6-x64": [ "rhel.7.6", "rhel.7.5-x64", "rhel.7.5", "rhel.7.4-x64", "rhel.7.4", "rhel.7.3-x64", "rhel.7.3", "rhel.7.2-x64", "rhel.7.2", "rhel.7.1-x64", "rhel.7.1", "rhel.7.0-x64", "rhel.7.0", "rhel.7-x64", "rhel.7", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel.8-x64": [ "rhel.8", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel.8.0-x64": [ "rhel.8.0", "rhel.8-x64", "rhel.8", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel.8.1-x64": [ "rhel.8.1", "rhel.8.0-x64", "rhel.8.0", "rhel.8-x64", "rhel.8", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rhel.9-x64": [ "rhel.9", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rocky-x64": [ "rocky", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rocky.8-x64": [ "rocky.8", "rocky-x64", "rhel.8-x64", "rocky", "rhel.8", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "rocky.9-x64": [ "rocky.9", "rocky-x64", "rhel.9-x64", "rocky", "rhel.9", "rhel-x64", "rhel", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "sles-x64": [ "sles", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "sles.12-x64": [ "sles.12", "sles-x64", "sles", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "sles.12.1-x64": [ "sles.12.1", "sles.12-x64", "sles.12", "sles-x64", "sles", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "sles.12.2-x64": [ "sles.12.2", "sles.12.1-x64", "sles.12.1", "sles.12-x64", "sles.12", "sles-x64", "sles", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "sles.12.3-x64": [ "sles.12.3", "sles.12.2-x64", "sles.12.2", "sles.12.1-x64", "sles.12.1", "sles.12-x64", "sles.12", "sles-x64", "sles", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "sles.12.4-x64": [ "sles.12.4", "sles.12.3-x64", "sles.12.3", "sles.12.2-x64", "sles.12.2", "sles.12.1-x64", "sles.12.1", "sles.12-x64", "sles.12", "sles-x64", "sles", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "sles.15-x64": [ "sles.15", "sles.12.4-x64", "sles.12.4", "sles.12.3-x64", "sles.12.3", "sles.12.2-x64", "sles.12.2", "sles.12.1-x64", "sles.12.1", "sles.12-x64", "sles.12", "sles-x64", "sles", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "sles.15.1-x64": [ "sles.15.1", "sles.15-x64", "sles.15", "sles.12.4-x64", "sles.12.4", "sles.12.3-x64", "sles.12.3", "sles.12.2-x64", "sles.12.2", "sles.12.1-x64", "sles.12.1", "sles.12-x64", "sles.12", "sles-x64", "sles", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu-x64": [ "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.14.04-x64": [ "ubuntu.14.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.14.10-x64": [ "ubuntu.14.10", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.15.04-x64": [ "ubuntu.15.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.15.10-x64": [ "ubuntu.15.10", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.16.04-x64": [ "ubuntu.16.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.16.10-x64": [ "ubuntu.16.10", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.17.04-x64": [ "ubuntu.17.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.17.10-x64": [ "ubuntu.17.10", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.18.04-x64": [ "ubuntu.18.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.18.10-x64": [ "ubuntu.18.10", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.19.04-x64": [ "ubuntu.19.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.19.10-x64": [ "ubuntu.19.10", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.20.04-x64": [ "ubuntu.20.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.20.10-x64": [ "ubuntu.20.10", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.21.04-x64": [ "ubuntu.21.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.21.10-x64": [ "ubuntu.21.10", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ], "ubuntu.22.04-x64": [ "ubuntu.22.04", "ubuntu-x64", "ubuntu", "debian-x64", "debian", "linux-x64", "linux", "unix-x64", "unix", "any", "base" ] } } ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.dll.config ================================================ ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.genruntimeconfig.cache ================================================ 0b982f5efa26349aa5c8a55d48178e55c2e0b507 ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs ================================================ // using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v3.1", FrameworkDisplayName = ".NET Core 3.1")] ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/PublishOutputs.cf05aea114.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\win-x64\TS3AudioBot.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\win-x64\TSLib.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\publish\win-x64\TS3AudioBot.exe ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.AssemblyInfo.cs ================================================ //------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyProductAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyTitleAttribute("TS3AudioBot")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/Splamy/TS3AudioBot.git")] [assembly: System.Resources.NeutralResourcesLanguageAttribute("en")] // 由 MSBuild WriteCodeFragment 类生成。 ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.AssemblyInfoInputs.cache ================================================ 50117c7602ecaf17a93e18fb5ca5b06974bd2274 ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig ================================================ is_global = true build_property.RootNamespace = TS3AudioBot build_property.ProjectDir = C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\ ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.csproj.CopyComplete ================================================ ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.csproj.CoreCompileInputs.cache ================================================ 2b42ad7e4c680046f6843d674cdaa482ee7159e0 ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.csproj.FileListAbsolute.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\TS3AudioBot.exe C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\lib\x64\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\lib\x86\libopus.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\TS3AudioBot.dll.config C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\TS3AudioBot.deps.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\TS3AudioBot.runtimeconfig.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\TS3AudioBot.runtimeconfig.dev.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\TS3AudioBot.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\TS3AudioBot.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\CliWrap.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\CommandLine.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Heijden.Dns.Portable.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\LiteDB.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Connections.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Cors.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Hosting.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Http.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Http.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Http.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Http.Features.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Server.Kestrel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Server.Kestrel.Core.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Server.Kestrel.Https.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.StaticFiles.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.AspNetCore.WebUtilities.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.CodeAnalysis.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.CodeAnalysis.CSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.Configuration.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.Configuration.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.Configuration.Binder.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.Configuration.EnvironmentVariables.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.Configuration.FileExtensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.DependencyInjection.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.DependencyInjection.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.FileProviders.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.FileProviders.Physical.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.FileSystemGlobbing.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.Hosting.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.Logging.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.Logging.Abstractions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.ObjectPool.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.Options.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Extensions.WebEncoders.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Net.Http.Headers.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Nett.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Newtonsoft.Json.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\NLog.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\PlaylistsNET.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\BouncyCastle.Crypto.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\SixLabors.ImageSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Chaos.NaCl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.Pipelines.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\cs\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\de\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\es\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\fr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\it\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\ja\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\ko\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\pl\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\pt-BR\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\ru\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\tr\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\zh-Hans\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\zh-Hant\Microsoft.CodeAnalysis.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\cs\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\de\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\es\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\fr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\it\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\ja\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\ko\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\pl\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\ru\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\tr\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\TSLib.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\win-x64\TS3AudioBot.csproj.AssemblyReference.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\win-x64\TS3AudioBot.csproj.SuggestedBindingRedirects.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\win-x64\TS3AudioBot.dll.config C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\win-x64\TS3AudioBot.Localization.strings.resources C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\win-x64\TS3AudioBot.csproj.GenerateResource.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\win-x64\TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\win-x64\TS3AudioBot.AssemblyInfoInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\win-x64\TS3AudioBot.AssemblyInfo.cs C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\win-x64\TS3AudioBot.csproj.CoreCompileInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\win-x64\TS3AudioBot.csproj.CopyComplete C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\win-x64\TS3AudioBot.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\win-x64\TS3AudioBot.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\obj\Release\netcoreapp3.1\win-x64\TS3AudioBot.genruntimeconfig.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.CSharp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.VisualBasic.Core.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.VisualBasic.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Win32.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.Win32.Registry.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.AppContext.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Buffers.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Collections.Concurrent.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Collections.Immutable.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Collections.NonGeneric.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Collections.Specialized.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Collections.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.ComponentModel.Annotations.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.ComponentModel.DataAnnotations.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.ComponentModel.EventBasedAsync.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.ComponentModel.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.ComponentModel.TypeConverter.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.ComponentModel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Configuration.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Console.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Core.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Data.Common.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Data.DataSetExtensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Data.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Diagnostics.Contracts.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Diagnostics.Debug.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Diagnostics.DiagnosticSource.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Diagnostics.FileVersionInfo.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Diagnostics.Process.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Diagnostics.StackTrace.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Diagnostics.TextWriterTraceListener.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Diagnostics.Tools.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Diagnostics.TraceSource.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Diagnostics.Tracing.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Drawing.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Drawing.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Dynamic.Runtime.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Globalization.Calendars.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Globalization.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Globalization.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.Compression.Brotli.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.Compression.FileSystem.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.Compression.ZipFile.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.Compression.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.FileSystem.AccessControl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.FileSystem.DriveInfo.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.FileSystem.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.FileSystem.Watcher.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.FileSystem.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.IsolatedStorage.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.MemoryMappedFiles.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.Pipes.AccessControl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.Pipes.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.UnmanagedMemoryStream.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.IO.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Linq.Expressions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Linq.Parallel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Linq.Queryable.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Linq.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Memory.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.Http.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.HttpListener.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.Mail.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.NameResolution.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.NetworkInformation.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.Ping.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.Requests.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.Security.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.ServicePoint.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.Sockets.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.WebClient.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.WebHeaderCollection.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.WebProxy.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.WebSockets.Client.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.WebSockets.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Net.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Numerics.Vectors.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Numerics.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.ObjectModel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Private.DataContractSerialization.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Private.Uri.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Private.Xml.Linq.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Private.Xml.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Reflection.DispatchProxy.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Reflection.Emit.ILGeneration.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Reflection.Emit.Lightweight.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Reflection.Emit.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Reflection.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Reflection.Metadata.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Reflection.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Reflection.TypeExtensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Reflection.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Resources.Reader.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Resources.ResourceManager.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Resources.Writer.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.CompilerServices.Unsafe.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.CompilerServices.VisualC.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.Handles.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.InteropServices.RuntimeInformation.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.InteropServices.WindowsRuntime.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.InteropServices.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.Intrinsics.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.Loader.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.Numerics.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.Serialization.Formatters.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.Serialization.Json.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.Serialization.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.Serialization.Xml.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.Serialization.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.WindowsRuntime.UI.Xaml.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.WindowsRuntime.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Runtime.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Security.AccessControl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Security.Claims.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Security.Cryptography.Algorithms.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Security.Cryptography.Cng.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Security.Cryptography.Csp.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Security.Cryptography.Encoding.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Security.Cryptography.OpenSsl.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Security.Cryptography.Primitives.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Security.Cryptography.X509Certificates.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Security.Principal.Windows.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Security.Principal.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Security.SecureString.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Security.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.ServiceModel.Web.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.ServiceProcess.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Text.Encoding.CodePages.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Text.Encoding.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Text.Encoding.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Text.Encodings.Web.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Text.Json.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Text.RegularExpressions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Threading.Channels.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Threading.Overlapped.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Threading.Tasks.Dataflow.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Threading.Tasks.Extensions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Threading.Tasks.Parallel.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Threading.Tasks.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Threading.Thread.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Threading.ThreadPool.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Threading.Timer.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Threading.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Transactions.Local.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Transactions.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.ValueTuple.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Web.HttpUtility.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Web.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Windows.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Xml.Linq.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Xml.ReaderWriter.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Xml.Serialization.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Xml.XDocument.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Xml.XPath.XDocument.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Xml.XPath.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Xml.XmlDocument.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Xml.XmlSerializer.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Xml.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\WindowsBase.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\mscorlib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\netstandard.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\Microsoft.DiaSymReader.Native.amd64.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\SOS_README.md C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\System.Private.CoreLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-console-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-datetime-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-debug-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-errorhandling-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-file-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-file-l1-2-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-file-l2-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-handle-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-heap-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-interlocked-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-libraryloader-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-localization-l1-2-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-memory-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-namedpipe-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-processenvironment-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-processthreads-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-processthreads-l1-1-1.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-profile-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-rtlsupport-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-string-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-synch-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-synch-l1-2-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-sysinfo-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-timezone-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-core-util-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-conio-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-convert-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-environment-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-filesystem-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-heap-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-locale-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-math-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-multibyte-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-private-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-process-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-runtime-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-stdio-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-string-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-time-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\api-ms-win-crt-utility-l1-1-0.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\clrcompression.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\clretwrc.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\clrjit.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\coreclr.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\dbgshim.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\hostfxr.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\hostpolicy.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\mscordaccore.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\mscordaccore_amd64_amd64_4.700.22.55902.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\mscordbi.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\mscorrc.debug.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\mscorrc.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TS3AudioBot\bin\Release\netcoreapp3.1\win-x64\ucrtbase.dll ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.csproj.SuggestedBindingRedirects.cache ================================================ ef24e4af7229c939c818abac044d4f1b112c94d6 ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.deps.json ================================================ { "runtimeTarget": { "name": ".NETCoreApp,Version=v3.1/win-x64", "signature": "" }, "compilationOptions": {}, "targets": { ".NETCoreApp,Version=v3.1": {}, ".NETCoreApp,Version=v3.1/win-x64": { "TS3AudioBot/1.0.0": { "dependencies": { "CliWrap": "3.1.0", "CommandLineParser": "2.8.0", "LiteDB": "4.1.4", "Microsoft.AspNetCore.Cors": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel": "2.2.0", "Microsoft.AspNetCore.StaticFiles": "2.2.0", "Microsoft.CodeAnalysis.CSharp": "3.7.0", "NLog": "4.7.3", "Nett": "0.15.0", "Newtonsoft.Json": "12.0.3", "PlaylistsNET": "1.1.2", "SixLabors.ImageSharp": "1.0.0", "Splamy.TSLib": "1.1.0", "TSLib": "1.1.0.0", "runtimepack.Microsoft.NETCore.App.Runtime.win-x64": "3.1.32" }, "runtime": { "TS3AudioBot.dll": {} } }, "runtimepack.Microsoft.NETCore.App.Runtime.win-x64/3.1.32": { "runtime": { "Microsoft.CSharp.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "Microsoft.VisualBasic.Core.dll": { "assemblyVersion": "10.0.5.0", "fileVersion": "4.700.22.56512" }, "Microsoft.VisualBasic.dll": { "assemblyVersion": "10.0.0.0", "fileVersion": "4.700.22.56512" }, "Microsoft.Win32.Primitives.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "Microsoft.Win32.Registry.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.700.22.56512" }, "System.AppContext.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Buffers.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.Collections.Concurrent.dll": { "assemblyVersion": "4.0.15.0", "fileVersion": "4.700.22.56512" }, "System.Collections.Immutable.dll": { "assemblyVersion": "1.2.5.0", "fileVersion": "4.700.22.56512" }, "System.Collections.NonGeneric.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Collections.Specialized.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Collections.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.ComponentModel.Annotations.dll": { "assemblyVersion": "4.3.1.0", "fileVersion": "4.700.22.56512" }, "System.ComponentModel.DataAnnotations.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.ComponentModel.EventBasedAsync.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.ComponentModel.Primitives.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.ComponentModel.TypeConverter.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.ComponentModel.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Configuration.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Console.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Core.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Data.Common.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Data.DataSetExtensions.dll": { "assemblyVersion": "4.0.1.0", "fileVersion": "4.700.22.56512" }, "System.Data.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.Contracts.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.Debug.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.DiagnosticSource.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.FileVersionInfo.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.Process.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.StackTrace.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.TextWriterTraceListener.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.Tools.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.TraceSource.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Diagnostics.Tracing.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Drawing.Primitives.dll": { "assemblyVersion": "4.2.1.0", "fileVersion": "4.700.22.56512" }, "System.Drawing.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Dynamic.Runtime.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Globalization.Calendars.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Globalization.Extensions.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Globalization.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.Compression.Brotli.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.Compression.FileSystem.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.IO.Compression.ZipFile.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.IO.Compression.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.FileSystem.AccessControl.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.IO.FileSystem.DriveInfo.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.FileSystem.Primitives.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.FileSystem.Watcher.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.FileSystem.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.IsolatedStorage.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.MemoryMappedFiles.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.Pipes.AccessControl.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.IO.Pipes.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.UnmanagedMemoryStream.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.IO.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Linq.Expressions.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Linq.Parallel.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Linq.Queryable.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Linq.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Memory.dll": { "assemblyVersion": "4.2.1.0", "fileVersion": "4.700.22.56512" }, "System.Net.Http.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.HttpListener.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.Mail.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.NameResolution.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.NetworkInformation.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.Ping.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.Primitives.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.Requests.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.Security.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.ServicePoint.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.Sockets.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.WebClient.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.WebHeaderCollection.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.WebProxy.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.WebSockets.Client.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.WebSockets.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Net.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Numerics.Vectors.dll": { "assemblyVersion": "4.1.6.0", "fileVersion": "4.700.22.56512" }, "System.Numerics.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.ObjectModel.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Private.DataContractSerialization.dll": { "assemblyVersion": "4.1.5.0", "fileVersion": "4.700.22.56512" }, "System.Private.Uri.dll": { "assemblyVersion": "4.0.6.0", "fileVersion": "4.700.22.56512" }, "System.Private.Xml.Linq.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Private.Xml.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.DispatchProxy.dll": { "assemblyVersion": "4.0.6.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.Emit.ILGeneration.dll": { "assemblyVersion": "4.1.1.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.Emit.Lightweight.dll": { "assemblyVersion": "4.1.1.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.Emit.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.Extensions.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.Metadata.dll": { "assemblyVersion": "1.4.5.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.Primitives.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.TypeExtensions.dll": { "assemblyVersion": "4.1.5.0", "fileVersion": "4.700.22.56512" }, "System.Reflection.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Resources.Reader.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Resources.ResourceManager.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Resources.Writer.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.CompilerServices.Unsafe.dll": { "assemblyVersion": "4.0.6.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.CompilerServices.VisualC.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Extensions.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Handles.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.InteropServices.RuntimeInformation.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.InteropServices.WindowsRuntime.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.InteropServices.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Intrinsics.dll": { "assemblyVersion": "4.0.1.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Loader.dll": { "assemblyVersion": "4.1.1.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Numerics.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Serialization.Formatters.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Serialization.Json.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Serialization.Primitives.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Serialization.Xml.dll": { "assemblyVersion": "4.1.5.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.Serialization.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.WindowsRuntime.UI.Xaml.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.WindowsRuntime.dll": { "assemblyVersion": "4.0.15.0", "fileVersion": "4.700.22.56512" }, "System.Runtime.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.AccessControl.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.700.22.56512" }, "System.Security.Claims.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.Algorithms.dll": { "assemblyVersion": "4.3.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.Cng.dll": { "assemblyVersion": "4.3.3.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.Csp.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.Encoding.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.OpenSsl.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.Primitives.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.Cryptography.X509Certificates.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.Principal.Windows.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.700.22.56512" }, "System.Security.Principal.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.SecureString.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Security.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.ServiceModel.Web.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.ServiceProcess.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Text.Encoding.CodePages.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.700.22.56512" }, "System.Text.Encoding.Extensions.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Text.Encoding.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Text.Encodings.Web.dll": { "assemblyVersion": "4.0.5.1", "fileVersion": "4.700.22.56512" }, "System.Text.Json.dll": { "assemblyVersion": "4.0.1.2", "fileVersion": "4.700.22.56512" }, "System.Text.RegularExpressions.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Channels.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Overlapped.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Tasks.Dataflow.dll": { "assemblyVersion": "4.6.5.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Tasks.Extensions.dll": { "assemblyVersion": "4.3.1.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Tasks.Parallel.dll": { "assemblyVersion": "4.0.4.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Tasks.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Thread.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.ThreadPool.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.Timer.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Threading.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Transactions.Local.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Transactions.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.ValueTuple.dll": { "assemblyVersion": "4.0.5.0", "fileVersion": "4.700.22.56512" }, "System.Web.HttpUtility.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.700.22.56512" }, "System.Web.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Windows.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Xml.Linq.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Xml.ReaderWriter.dll": { "assemblyVersion": "4.2.2.0", "fileVersion": "4.700.22.56512" }, "System.Xml.Serialization.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.Xml.XDocument.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Xml.XPath.XDocument.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Xml.XPath.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Xml.XmlDocument.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Xml.XmlSerializer.dll": { "assemblyVersion": "4.1.2.0", "fileVersion": "4.700.22.56512" }, "System.Xml.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "System.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "WindowsBase.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "mscorlib.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.56512" }, "netstandard.dll": { "assemblyVersion": "2.1.0.0", "fileVersion": "4.700.22.56512" } }, "native": { "Microsoft.DiaSymReader.Native.amd64.dll": { "fileVersion": "14.12.25830.2" }, "SOS_README.md": { "fileVersion": "0.0.0.0" }, "System.Private.CoreLib.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.700.22.55902" }, "api-ms-win-core-console-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-datetime-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-debug-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-errorhandling-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-file-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-file-l1-2-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-file-l2-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-handle-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-heap-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-interlocked-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-libraryloader-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-localization-l1-2-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-memory-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-namedpipe-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-processenvironment-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-processthreads-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-processthreads-l1-1-1.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-profile-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-rtlsupport-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-string-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-synch-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-synch-l1-2-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-sysinfo-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-timezone-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-core-util-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-conio-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-convert-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-environment-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-filesystem-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-heap-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-locale-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-math-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-multibyte-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-private-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-process-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-runtime-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-stdio-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-string-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-time-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "api-ms-win-crt-utility-l1-1-0.dll": { "fileVersion": "10.0.17134.12" }, "clrcompression.dll": { "fileVersion": "4.700.22.56512" }, "clretwrc.dll": { "fileVersion": "4.700.22.55902" }, "clrjit.dll": { "fileVersion": "4.700.22.55902" }, "coreclr.dll": { "fileVersion": "4.700.22.55902" }, "dbgshim.dll": { "fileVersion": "4.700.22.55902" }, "hostfxr.dll": { "fileVersion": "3.100.3222.56520" }, "hostpolicy.dll": { "fileVersion": "3.100.3222.56520" }, "mscordaccore.dll": { "fileVersion": "4.700.22.55902" }, "mscordaccore_amd64_amd64_4.700.22.55902.dll": { "fileVersion": "4.700.22.55902" }, "mscordbi.dll": { "fileVersion": "4.700.22.55902" }, "mscorrc.debug.dll": { "fileVersion": "4.700.22.55902" }, "mscorrc.dll": { "fileVersion": "4.700.22.55902" }, "ucrtbase.dll": { "fileVersion": "10.0.17134.12" } } }, "CliWrap/3.1.0": { "runtime": { "lib/netcoreapp3.0/CliWrap.dll": { "assemblyVersion": "3.1.0.0", "fileVersion": "3.1.0.0" } } }, "CommandLineParser/2.8.0": { "runtime": { "lib/netstandard2.0/CommandLine.dll": { "assemblyVersion": "2.8.0.0", "fileVersion": "2.8.0.0" } } }, "Heijden.Dns.Portable/2.0.19": { "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": { "assemblyVersion": "2.0.19.0", "fileVersion": "2.0.19.0" } } }, "LiteDB/4.1.4": { "dependencies": { "System.Reflection": "4.3.0", "System.Reflection.TypeExtensions": "4.3.0" }, "runtime": { "lib/netstandard2.0/LiteDB.dll": { "assemblyVersion": "4.1.4.0", "fileVersion": "4.1.4.0" } } }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.IO.Pipelines": "4.7.2" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Cors/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Hosting/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.Configuration.EnvironmentVariables": "2.2.0", "Microsoft.Extensions.Configuration.FileExtensions": "2.2.0", "Microsoft.Extensions.DependencyInjection": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0", "Microsoft.Extensions.Logging": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Diagnostics.DiagnosticSource": "4.5.0", "System.Reflection.Metadata": "1.6.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Hosting.Server.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Http/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.ObjectPool": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Buffers": "4.5.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Hosting": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Https": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Memory": "4.5.4", "System.Numerics.Vectors": "4.5.0", "System.Runtime.CompilerServices.Unsafe": "4.7.0", "System.Security.Cryptography.Cng": "4.5.0", "System.Threading.Tasks.Extensions": "4.5.3" }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0" }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Connections.Abstractions": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.WebEncoders": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "dependencies": { "Microsoft.Net.Http.Headers": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": {}, "Microsoft.CodeAnalysis.Common/3.7.0": { "dependencies": { "Microsoft.CodeAnalysis.Analyzers": "3.0.0", "System.Collections.Immutable": "1.5.0", "System.Memory": "4.5.4", "System.Reflection.Metadata": "1.6.0", "System.Runtime.CompilerServices.Unsafe": "4.7.0", "System.Text.Encoding.CodePages": "4.5.1", "System.Threading.Tasks.Extensions": "4.5.3" }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": { "assemblyVersion": "3.7.0.0", "fileVersion": "3.700.20.37502" } }, "resources": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "dependencies": { "Microsoft.CodeAnalysis.Common": "3.7.0" }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": { "assemblyVersion": "3.7.0.0", "fileVersion": "3.700.20.37502" } }, "resources": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.Extensions.Configuration/2.2.0": { "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0" }, "runtime": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "runtime": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "dependencies": { "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.FileSystemGlobbing": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.Extensions.Logging/2.2.0": { "dependencies": { "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.ObjectPool/2.2.0": { "runtime": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Options/2.2.0": { "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Primitives": "2.2.0", "System.ComponentModel.Annotations": "4.5.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.Primitives/2.2.0": { "dependencies": { "System.Memory": "4.5.4", "System.Runtime.CompilerServices.Unsafe": "4.7.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18315" } } }, "Microsoft.Extensions.WebEncoders/2.2.0": { "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.Net.Http.Headers/2.2.0": { "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0", "System.Buffers": "4.5.0" }, "runtime": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": { "assemblyVersion": "2.2.0.0", "fileVersion": "2.2.0.18316" } } }, "Microsoft.NETCore.Platforms/2.1.2": {}, "Microsoft.NETCore.Targets/1.1.0": {}, "Microsoft.Win32.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.win.Microsoft.Win32.Primitives": "4.3.0" } }, "Nett/0.15.0": { "runtime": { "lib/netstandard2.0/Nett.dll": { "assemblyVersion": "0.15.0.0", "fileVersion": "0.15.0.0" } } }, "Newtonsoft.Json/12.0.3": { "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "assemblyVersion": "12.0.0.0", "fileVersion": "12.0.3.23909" } } }, "NLog/4.7.3": { "runtime": { "lib/netstandard2.0/NLog.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.7.3.11982" } } }, "PlaylistsNET/1.1.2": { "runtime": { "lib/netstandard2.0/PlaylistsNET.dll": { "assemblyVersion": "1.0.6.0", "fileVersion": "1.0.6.0" } } }, "Portable.BouncyCastle/1.8.6.7": { "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "assemblyVersion": "1.8.6.0", "fileVersion": "1.8.6.7" } } }, "runtime.any.System.Collections/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "runtime.any.System.Diagnostics.Tracing/4.3.0": {}, "runtime.any.System.Globalization/4.3.0": {}, "runtime.any.System.IO/4.3.0": {}, "runtime.any.System.Reflection/4.3.0": {}, "runtime.any.System.Reflection.Primitives/4.3.0": {}, "runtime.any.System.Resources.ResourceManager/4.3.0": {}, "runtime.any.System.Runtime/4.3.0": { "dependencies": { "System.Private.Uri": "4.3.0" } }, "runtime.any.System.Runtime.Handles/4.3.0": {}, "runtime.any.System.Runtime.InteropServices/4.3.0": {}, "runtime.any.System.Text.Encoding/4.3.0": {}, "runtime.any.System.Text.Encoding.Extensions/4.3.0": {}, "runtime.any.System.Threading.Tasks/4.3.0": {}, "runtime.native.System/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0" } }, "runtime.win.Microsoft.Win32.Primitives/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.InteropServices": "4.3.0" } }, "runtime.win.System.Diagnostics.Debug/4.3.0": {}, "runtime.win.System.IO.FileSystem/4.3.0": { "dependencies": { "System.Buffers": "4.5.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Text.Encoding.Extensions": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "runtime.win.System.Net.Primitives/4.3.0": { "dependencies": { "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Threading": "4.3.0" } }, "runtime.win.System.Net.Sockets/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Net.NameResolution": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "runtime.win.System.Runtime.Extensions/4.3.0": { "dependencies": { "System.Private.Uri": "4.3.0" } }, "SixLabors.ImageSharp/1.0.0": { "runtime": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": { "assemblyVersion": "1.0.0.0", "fileVersion": "1.0.0.0" } } }, "Splamy.Ed25519.Toolkit/1.0.3": { "runtime": { "lib/netcoreapp2.1/Chaos.NaCl.dll": { "assemblyVersion": "1.0.3.0", "fileVersion": "1.0.3.0" } } }, "System.Buffers/4.5.0": {}, "System.Collections/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Collections": "4.3.0" } }, "System.Collections.Immutable/1.5.0": {}, "System.ComponentModel.Annotations/4.5.0": {}, "System.Diagnostics.Debug/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.win.System.Diagnostics.Debug": "4.3.0" } }, "System.Diagnostics.DiagnosticSource/4.5.0": {}, "System.Diagnostics.Tracing/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Diagnostics.Tracing": "4.3.0" } }, "System.Globalization/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Globalization": "4.3.0" } }, "System.IO/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.any.System.IO": "4.3.0" } }, "System.IO.FileSystem/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.win.System.IO.FileSystem": "4.3.0" } }, "System.IO.FileSystem.Primitives/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "System.IO.Pipelines/4.7.2": { "runtime": { "lib/netcoreapp3.0/System.IO.Pipelines.dll": { "assemblyVersion": "4.0.2.1", "fileVersion": "4.700.20.21406" } } }, "System.Linq/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" } }, "System.Memory/4.5.4": {}, "System.Net.NameResolution/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.native.System": "4.3.0" } }, "System.Net.NetworkInformation/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" } }, "System.Net.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "runtime.win.System.Net.Primitives": "4.3.0" } }, "System.Net.Sockets/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.win.System.Net.Sockets": "4.3.0" } }, "System.Numerics.Vectors/4.5.0": {}, "System.Private.Uri/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0" } }, "System.Reflection/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "runtime.any.System.Reflection": "4.3.0" } }, "System.Reflection.Metadata/1.6.0": {}, "System.Reflection.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Reflection.Primitives": "4.3.0" } }, "System.Reflection.TypeExtensions/4.3.0": { "dependencies": { "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Resources.ResourceManager/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0", "runtime.any.System.Resources.ResourceManager": "4.3.0" } }, "System.Runtime/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "runtime.any.System.Runtime": "4.3.0" } }, "System.Runtime.CompilerServices.Unsafe/4.7.0": {}, "System.Runtime.Extensions/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.win.System.Runtime.Extensions": "4.3.0" } }, "System.Runtime.Handles/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Runtime.Handles": "4.3.0" } }, "System.Runtime.InteropServices/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "runtime.any.System.Runtime.InteropServices": "4.3.0" } }, "System.Security.Claims/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" } }, "System.Security.Cryptography.Cng/4.5.0": {}, "System.Security.Principal/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "System.Security.Principal.Windows/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" } }, "System.Text.Encoding/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Text.Encoding": "4.3.0" } }, "System.Text.Encoding.CodePages/4.5.1": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "System.Runtime.CompilerServices.Unsafe": "4.7.0" } }, "System.Text.Encoding.Extensions/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "runtime.any.System.Text.Encoding.Extensions": "4.3.0" } }, "System.Text.Encodings.Web/4.5.0": {}, "System.Threading/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.Threading.Overlapped/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Threading.Tasks/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Threading.Tasks": "4.3.0" } }, "System.Threading.Tasks.Extensions/4.5.3": {}, "System.Threading.Thread/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "System.Threading.ThreadPool/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "Splamy.TSLib/1.1.0": { "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2" }, "runtime": { "TSLib.dll": {} } }, "TSLib/1.1.0.0": { "runtime": { "TSLib.dll": { "assemblyVersion": "1.1.0.0", "fileVersion": "1.1.0.0" } } } } }, "libraries": { "TS3AudioBot/1.0.0": { "type": "project", "serviceable": false, "sha512": "" }, "runtimepack.Microsoft.NETCore.App.Runtime.win-x64/3.1.32": { "type": "runtimepack", "serviceable": false, "sha512": "" }, "CliWrap/3.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-vbQ+rpxRgdkWBHmZXl8De4PYzKTOxa37Tfz6Zb01OP8f7eFBOjCj5IY2+Ghb81pPMA6rCDPrYEbod1EzbcFG2w==", "path": "cliwrap/3.1.0", "hashPath": "cliwrap.3.1.0.nupkg.sha512" }, "CommandLineParser/2.8.0": { "type": "package", "serviceable": true, "sha512": "sha512-eco2HlKQBY4Joz9odHigzGpVzv6pjsXnY5lziioMveQxr+i2Z7xYcIOMeZTgYiqnMtMAbXMXsVhrNfWO5vJS8Q==", "path": "commandlineparser/2.8.0", "hashPath": "commandlineparser.2.8.0.nupkg.sha512" }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "serviceable": true, "sha512": "sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==", "path": "heijden.dns.portable/2.0.19", "hashPath": "heijden.dns.portable.2.0.19.nupkg.sha512" }, "LiteDB/4.1.4": { "type": "package", "serviceable": true, "sha512": "sha512-g4g9JlHzRBZl+Gd2UbiRdszZ7t8wozU2wX7+5xY5uE79tmcgcDhha+ubAP84G1VLbwQmhBGCzRfIx+epLmJciQ==", "path": "litedb/4.1.4", "hashPath": "litedb.4.1.4.nupkg.sha512" }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-Aqr/16Cu5XmGv7mLKJvXRxhhd05UJ7cTTSaUV4MZ3ynAzfgWjsAdpIU8FWuxwAjmVdmI8oOWuVDrbs+sRkhKnA==", "path": "microsoft.aspnetcore.connections.abstractions/2.2.0", "hashPath": "microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Cors/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-LFlTM3ThS3ZCILuKnjy8HyK9/IlDh3opogdbCVx6tMGyDzTQBgMPXLjGDLtMk5QmLDCcP3l1TO3z/+1viA8GUg==", "path": "microsoft.aspnetcore.cors/2.2.0", "hashPath": "microsoft.aspnetcore.cors.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Hosting/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-7t4RbUGugpHtQmzAkc9fpDdYJg6t/jcB2VVnjensVYbZFnLDU8pNrG0hrekk1DQG7P2UzpSqKLzDsFF0/lkkbw==", "path": "microsoft.aspnetcore.hosting/2.2.0", "hashPath": "microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==", "path": "microsoft.aspnetcore.hosting.abstractions/2.2.0", "hashPath": "microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==", "path": "microsoft.aspnetcore.hosting.server.abstractions/2.2.0", "hashPath": "microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Http/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==", "path": "microsoft.aspnetcore.http/2.2.0", "hashPath": "microsoft.aspnetcore.http.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==", "path": "microsoft.aspnetcore.http.abstractions/2.2.0", "hashPath": "microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==", "path": "microsoft.aspnetcore.http.extensions/2.2.0", "hashPath": "microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==", "path": "microsoft.aspnetcore.http.features/2.2.0", "hashPath": "microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-D0vGB8Tp0UNMiAhT+pwAVeqDDx2OFrfpu/plwm0WhA+1DZvTLc99eDwGISL6LAY8x7a12lhl9w7/m+VdoyDu8Q==", "path": "microsoft.aspnetcore.server.kestrel/2.2.0", "hashPath": "microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-F6/Vesd3ODq/ISbHfcvfRf7IzRtTvrNX8VA36Knm5e7bteJhoRA2GKQUVQ+neoO1njLvaQKnjcA3rdCZ6AF6cg==", "path": "microsoft.aspnetcore.server.kestrel.core/2.2.0", "hashPath": "microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-nEH5mU6idUYS3/+9BKw2stMOM25ZdGwIH4P4kyj6PVkMPgQUTkBQ7l/ScPkepdhejcOlPa+g3+M4dYsSYPUJ8g==", "path": "microsoft.aspnetcore.server.kestrel.https/2.2.0", "hashPath": "microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-j1ai2CG8BGp4mYf2TWSFjjy1pRgW9XbqhdR4EOVvrlFVbcpEPfXNIPEdjkcgK+txWCupGzkFnFF8oZsASMtmyw==", "path": "microsoft.aspnetcore.server.kestrel.transport.abstractions/2.2.0", "hashPath": "microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-qTACI0wePgAKCH+YKrMgChyfqJpjwgGZEtSuwBw6TjWLQ66THGasleia/7EZz2t2eAjwWxw8RA/D8ODrBqpj9A==", "path": "microsoft.aspnetcore.server.kestrel.transport.sockets/2.2.0", "hashPath": "microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-byZDrjir6Co5EoWbraQyG0qbPCUG6XgGYQstipMF9lucOAjq/mqnIyt8B8iMWnin/ghZoOln9Y01af4rUAwOhA==", "path": "microsoft.aspnetcore.staticfiles/2.2.0", "hashPath": "microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512" }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==", "path": "microsoft.aspnetcore.webutilities/2.2.0", "hashPath": "microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512" }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": { "type": "package", "serviceable": true, "sha512": "sha512-ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g==", "path": "microsoft.codeanalysis.analyzers/3.0.0", "hashPath": "microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512" }, "Microsoft.CodeAnalysis.Common/3.7.0": { "type": "package", "serviceable": true, "sha512": "sha512-SFEdnbw8204hTlde3JePYSIpNX58h/MMXa7LctUsUDigWMR8Ar9gE8LnsLqAIFM0O33JEuQbJ0G4Sat+cPGldw==", "path": "microsoft.codeanalysis.common/3.7.0", "hashPath": "microsoft.codeanalysis.common.3.7.0.nupkg.sha512" }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "type": "package", "serviceable": true, "sha512": "sha512-sKi5PIVy9nVDerkbplY6OQhJBNzEO4XJsMGrnmb6KFEa6K1ulGCHIv6NtDjdUQ/dGrouU3OExc3yzww0COD76w==", "path": "microsoft.codeanalysis.csharp/3.7.0", "hashPath": "microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512" }, "Microsoft.Extensions.Configuration/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==", "path": "microsoft.extensions.configuration/2.2.0", "hashPath": "microsoft.extensions.configuration.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", "path": "microsoft.extensions.configuration.abstractions/2.2.0", "hashPath": "microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==", "path": "microsoft.extensions.configuration.binder/2.2.0", "hashPath": "microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-gIqt9PkKO01hZ0zmHnWrZ1E45MDreZTVoyDbL1kMWKtDgxxWTJpYtESTEcgpvR1uB1iex1zKGYzJpOMgmuP5TQ==", "path": "microsoft.extensions.configuration.environmentvariables/2.2.0", "hashPath": "microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-H1qCpWBC8Ed4tguTR/qYkbb3F6DI5Su3t8xyFo3/5MzAd8PwPpHzgX8X04KbBxKmk173Pb64x7xMHarczVFQUA==", "path": "microsoft.extensions.configuration.fileextensions/2.2.0", "hashPath": "microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==", "path": "microsoft.extensions.dependencyinjection/2.2.0", "hashPath": "microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==", "path": "microsoft.extensions.dependencyinjection.abstractions/2.2.0", "hashPath": "microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==", "path": "microsoft.extensions.fileproviders.abstractions/2.2.0", "hashPath": "microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-tbDHZnBJkjYd9NjlRZ9ondDiv1Te3KYCTW2RWpR1B0e1Z8+EnFRo7qNnHkkSCixLdlPZzhjlX24d/PixQ7w2dA==", "path": "microsoft.extensions.fileproviders.physical/2.2.0", "hashPath": "microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-ZSsHZp3PyW6vk37tDEdypjgGlNtpJ0EixBMOfUod2Thx7GtwfFSAQXUQx8a8BN8vfWKGGMbp7jPWdoHx/At4wQ==", "path": "microsoft.extensions.filesystemglobbing/2.2.0", "hashPath": "microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==", "path": "microsoft.extensions.hosting.abstractions/2.2.0", "hashPath": "microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Logging/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==", "path": "microsoft.extensions.logging/2.2.0", "hashPath": "microsoft.extensions.logging.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==", "path": "microsoft.extensions.logging.abstractions/2.2.0", "hashPath": "microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.ObjectPool/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==", "path": "microsoft.extensions.objectpool/2.2.0", "hashPath": "microsoft.extensions.objectpool.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Options/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==", "path": "microsoft.extensions.options/2.2.0", "hashPath": "microsoft.extensions.options.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.Primitives/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==", "path": "microsoft.extensions.primitives/2.2.0", "hashPath": "microsoft.extensions.primitives.2.2.0.nupkg.sha512" }, "Microsoft.Extensions.WebEncoders/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-V8XcqYcpcdBAxUhLeyYcuKmxu4CtNQA9IphTnARpQGhkop4A93v2XgM3AtaVVJo3H2cDWxWM6aeO8HxkifREqw==", "path": "microsoft.extensions.webencoders/2.2.0", "hashPath": "microsoft.extensions.webencoders.2.2.0.nupkg.sha512" }, "Microsoft.Net.Http.Headers/2.2.0": { "type": "package", "serviceable": true, "sha512": "sha512-iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==", "path": "microsoft.net.http.headers/2.2.0", "hashPath": "microsoft.net.http.headers.2.2.0.nupkg.sha512" }, "Microsoft.NETCore.Platforms/2.1.2": { "type": "package", "serviceable": true, "sha512": "sha512-mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==", "path": "microsoft.netcore.platforms/2.1.2", "hashPath": "microsoft.netcore.platforms.2.1.2.nupkg.sha512" }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "path": "microsoft.netcore.targets/1.1.0", "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "path": "microsoft.win32.primitives/4.3.0", "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" }, "Nett/0.15.0": { "type": "package", "serviceable": true, "sha512": "sha512-/0SoN9ugPKfmLndtKy3gaRxOlzji94/yrNgQLe45/1ZgExj0BaVozbXD+oWD8E6MCLvTs+YWzmn315mQOXGCcw==", "path": "nett/0.15.0", "hashPath": "nett.0.15.0.nupkg.sha512" }, "Newtonsoft.Json/12.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==", "path": "newtonsoft.json/12.0.3", "hashPath": "newtonsoft.json.12.0.3.nupkg.sha512" }, "NLog/4.7.3": { "type": "package", "serviceable": true, "sha512": "sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==", "path": "nlog/4.7.3", "hashPath": "nlog.4.7.3.nupkg.sha512" }, "PlaylistsNET/1.1.2": { "type": "package", "serviceable": true, "sha512": "sha512-IGzVterTV49b9FjzY7gMUcxnzOvVDj6L07pjB821m+k2iHWazy/OhIvDCvGSMx1cvkY9ZBajXpQO5uUCZY51vw==", "path": "playlistsnet/1.1.2", "hashPath": "playlistsnet.1.1.2.nupkg.sha512" }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "serviceable": true, "sha512": "sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==", "path": "portable.bouncycastle/1.8.6.7", "hashPath": "portable.bouncycastle.1.8.6.7.nupkg.sha512" }, "runtime.any.System.Collections/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", "path": "runtime.any.system.collections/4.3.0", "hashPath": "runtime.any.system.collections.4.3.0.nupkg.sha512" }, "runtime.any.System.Diagnostics.Tracing/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==", "path": "runtime.any.system.diagnostics.tracing/4.3.0", "hashPath": "runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512" }, "runtime.any.System.Globalization/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==", "path": "runtime.any.system.globalization/4.3.0", "hashPath": "runtime.any.system.globalization.4.3.0.nupkg.sha512" }, "runtime.any.System.IO/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==", "path": "runtime.any.system.io/4.3.0", "hashPath": "runtime.any.system.io.4.3.0.nupkg.sha512" }, "runtime.any.System.Reflection/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==", "path": "runtime.any.system.reflection/4.3.0", "hashPath": "runtime.any.system.reflection.4.3.0.nupkg.sha512" }, "runtime.any.System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==", "path": "runtime.any.system.reflection.primitives/4.3.0", "hashPath": "runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512" }, "runtime.any.System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==", "path": "runtime.any.system.resources.resourcemanager/4.3.0", "hashPath": "runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "runtime.any.System.Runtime/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", "path": "runtime.any.system.runtime/4.3.0", "hashPath": "runtime.any.system.runtime.4.3.0.nupkg.sha512" }, "runtime.any.System.Runtime.Handles/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==", "path": "runtime.any.system.runtime.handles/4.3.0", "hashPath": "runtime.any.system.runtime.handles.4.3.0.nupkg.sha512" }, "runtime.any.System.Runtime.InteropServices/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==", "path": "runtime.any.system.runtime.interopservices/4.3.0", "hashPath": "runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512" }, "runtime.any.System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==", "path": "runtime.any.system.text.encoding/4.3.0", "hashPath": "runtime.any.system.text.encoding.4.3.0.nupkg.sha512" }, "runtime.any.System.Text.Encoding.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==", "path": "runtime.any.system.text.encoding.extensions/4.3.0", "hashPath": "runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512" }, "runtime.any.System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==", "path": "runtime.any.system.threading.tasks/4.3.0", "hashPath": "runtime.any.system.threading.tasks.4.3.0.nupkg.sha512" }, "runtime.native.System/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", "path": "runtime.native.system/4.3.0", "hashPath": "runtime.native.system.4.3.0.nupkg.sha512" }, "runtime.win.Microsoft.Win32.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", "path": "runtime.win.microsoft.win32.primitives/4.3.0", "hashPath": "runtime.win.microsoft.win32.primitives.4.3.0.nupkg.sha512" }, "runtime.win.System.Diagnostics.Debug/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==", "path": "runtime.win.system.diagnostics.debug/4.3.0", "hashPath": "runtime.win.system.diagnostics.debug.4.3.0.nupkg.sha512" }, "runtime.win.System.IO.FileSystem/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", "path": "runtime.win.system.io.filesystem/4.3.0", "hashPath": "runtime.win.system.io.filesystem.4.3.0.nupkg.sha512" }, "runtime.win.System.Net.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", "path": "runtime.win.system.net.primitives/4.3.0", "hashPath": "runtime.win.system.net.primitives.4.3.0.nupkg.sha512" }, "runtime.win.System.Net.Sockets/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", "path": "runtime.win.system.net.sockets/4.3.0", "hashPath": "runtime.win.system.net.sockets.4.3.0.nupkg.sha512" }, "runtime.win.System.Runtime.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", "path": "runtime.win.system.runtime.extensions/4.3.0", "hashPath": "runtime.win.system.runtime.extensions.4.3.0.nupkg.sha512" }, "SixLabors.ImageSharp/1.0.0": { "type": "package", "serviceable": true, "sha512": "sha512-8amvsk8NXnCxZV0lvJppAZJknViWgBOO/2V59IGR6DVoD13mSmG+/Z9eg5IwrHQuRHp5RD9lfXBXDZyk8rTKDg==", "path": "sixlabors.imagesharp/1.0.0", "hashPath": "sixlabors.imagesharp.1.0.0.nupkg.sha512" }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==", "path": "splamy.ed25519.toolkit/1.0.3", "hashPath": "splamy.ed25519.toolkit.1.0.3.nupkg.sha512" }, "System.Buffers/4.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==", "path": "system.buffers/4.5.0", "hashPath": "system.buffers.4.5.0.nupkg.sha512" }, "System.Collections/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "path": "system.collections/4.3.0", "hashPath": "system.collections.4.3.0.nupkg.sha512" }, "System.Collections.Immutable/1.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==", "path": "system.collections.immutable/1.5.0", "hashPath": "system.collections.immutable.1.5.0.nupkg.sha512" }, "System.ComponentModel.Annotations/4.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==", "path": "system.componentmodel.annotations/4.5.0", "hashPath": "system.componentmodel.annotations.4.5.0.nupkg.sha512" }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "path": "system.diagnostics.debug/4.3.0", "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" }, "System.Diagnostics.DiagnosticSource/4.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-eIHRELiYDQvsMToML81QFkXEEYXUSUT2F28t1SGrevWqP+epFdw80SyAXIKTXOHrIEXReFOEnEr7XlGiC2GgOg==", "path": "system.diagnostics.diagnosticsource/4.5.0", "hashPath": "system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512" }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "path": "system.diagnostics.tracing/4.3.0", "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" }, "System.Globalization/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "path": "system.globalization/4.3.0", "hashPath": "system.globalization.4.3.0.nupkg.sha512" }, "System.IO/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "path": "system.io/4.3.0", "hashPath": "system.io.4.3.0.nupkg.sha512" }, "System.IO.FileSystem/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "path": "system.io.filesystem/4.3.0", "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "path": "system.io.filesystem.primitives/4.3.0", "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" }, "System.IO.Pipelines/4.7.2": { "type": "package", "serviceable": true, "sha512": "sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==", "path": "system.io.pipelines/4.7.2", "hashPath": "system.io.pipelines.4.7.2.nupkg.sha512" }, "System.Linq/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "path": "system.linq/4.3.0", "hashPath": "system.linq.4.3.0.nupkg.sha512" }, "System.Memory/4.5.4": { "type": "package", "serviceable": true, "sha512": "sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", "path": "system.memory/4.5.4", "hashPath": "system.memory.4.5.4.nupkg.sha512" }, "System.Net.NameResolution/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", "path": "system.net.nameresolution/4.3.0", "hashPath": "system.net.nameresolution.4.3.0.nupkg.sha512" }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==", "path": "system.net.networkinformation/4.3.0", "hashPath": "system.net.networkinformation.4.3.0.nupkg.sha512" }, "System.Net.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "path": "system.net.primitives/4.3.0", "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" }, "System.Net.Sockets/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "path": "system.net.sockets/4.3.0", "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" }, "System.Numerics.Vectors/4.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==", "path": "system.numerics.vectors/4.5.0", "hashPath": "system.numerics.vectors.4.5.0.nupkg.sha512" }, "System.Private.Uri/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", "path": "system.private.uri/4.3.0", "hashPath": "system.private.uri.4.3.0.nupkg.sha512" }, "System.Reflection/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "path": "system.reflection/4.3.0", "hashPath": "system.reflection.4.3.0.nupkg.sha512" }, "System.Reflection.Metadata/1.6.0": { "type": "package", "serviceable": true, "sha512": "sha512-COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", "path": "system.reflection.metadata/1.6.0", "hashPath": "system.reflection.metadata.1.6.0.nupkg.sha512" }, "System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "path": "system.reflection.primitives/4.3.0", "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" }, "System.Reflection.TypeExtensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", "path": "system.reflection.typeextensions/4.3.0", "hashPath": "system.reflection.typeextensions.4.3.0.nupkg.sha512" }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "path": "system.resources.resourcemanager/4.3.0", "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "System.Runtime/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "path": "system.runtime/4.3.0", "hashPath": "system.runtime.4.3.0.nupkg.sha512" }, "System.Runtime.CompilerServices.Unsafe/4.7.0": { "type": "package", "serviceable": true, "sha512": "sha512-IpU1lcHz8/09yDr9N+Juc7SCgNUz+RohkCQI+KsWKR67XxpFr8Z6c8t1iENCXZuRuNCc4HBwme/MDHNVCwyAKg==", "path": "system.runtime.compilerservices.unsafe/4.7.0", "hashPath": "system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512" }, "System.Runtime.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "path": "system.runtime.extensions/4.3.0", "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" }, "System.Runtime.Handles/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "path": "system.runtime.handles/4.3.0", "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "path": "system.runtime.interopservices/4.3.0", "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" }, "System.Security.Claims/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "path": "system.security.claims/4.3.0", "hashPath": "system.security.claims.4.3.0.nupkg.sha512" }, "System.Security.Cryptography.Cng/4.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==", "path": "system.security.cryptography.cng/4.5.0", "hashPath": "system.security.cryptography.cng.4.5.0.nupkg.sha512" }, "System.Security.Principal/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "path": "system.security.principal/4.3.0", "hashPath": "system.security.principal.4.3.0.nupkg.sha512" }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", "path": "system.security.principal.windows/4.3.0", "hashPath": "system.security.principal.windows.4.3.0.nupkg.sha512" }, "System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "path": "system.text.encoding/4.3.0", "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" }, "System.Text.Encoding.CodePages/4.5.1": { "type": "package", "serviceable": true, "sha512": "sha512-4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", "path": "system.text.encoding.codepages/4.5.1", "hashPath": "system.text.encoding.codepages.4.5.1.nupkg.sha512" }, "System.Text.Encoding.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", "path": "system.text.encoding.extensions/4.3.0", "hashPath": "system.text.encoding.extensions.4.3.0.nupkg.sha512" }, "System.Text.Encodings.Web/4.5.0": { "type": "package", "serviceable": true, "sha512": "sha512-Xg4G4Indi4dqP1iuAiMSwpiWS54ZghzR644OtsRCm/m/lBMG8dUBhLVN7hLm8NNrNTR+iGbshCPTwrvxZPlm4g==", "path": "system.text.encodings.web/4.5.0", "hashPath": "system.text.encodings.web.4.5.0.nupkg.sha512" }, "System.Threading/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "path": "system.threading/4.3.0", "hashPath": "system.threading.4.3.0.nupkg.sha512" }, "System.Threading.Overlapped/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", "path": "system.threading.overlapped/4.3.0", "hashPath": "system.threading.overlapped.4.3.0.nupkg.sha512" }, "System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "path": "system.threading.tasks/4.3.0", "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" }, "System.Threading.Tasks.Extensions/4.5.3": { "type": "package", "serviceable": true, "sha512": "sha512-+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==", "path": "system.threading.tasks.extensions/4.5.3", "hashPath": "system.threading.tasks.extensions.4.5.3.nupkg.sha512" }, "System.Threading.Thread/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", "path": "system.threading.thread/4.3.0", "hashPath": "system.threading.thread.4.3.0.nupkg.sha512" }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", "path": "system.threading.threadpool/4.3.0", "hashPath": "system.threading.threadpool.4.3.0.nupkg.sha512" }, "Splamy.TSLib/1.1.0": { "type": "project", "serviceable": false, "sha512": "" }, "TSLib/1.1.0.0": { "type": "reference", "serviceable": false, "sha512": "" } }, "runtimes": { "win-x64": [ "win", "any", "base" ], "win-x64-aot": [ "win-aot", "win-x64", "win", "aot", "any", "base" ], "win10-x64": [ "win10", "win81-x64", "win81", "win8-x64", "win8", "win7-x64", "win7", "win-x64", "win", "any", "base" ], "win10-x64-aot": [ "win10-aot", "win10-x64", "win10", "win81-x64-aot", "win81-aot", "win81-x64", "win81", "win8-x64-aot", "win8-aot", "win8-x64", "win8", "win7-x64-aot", "win7-aot", "win7-x64", "win7", "win-x64-aot", "win-aot", "win-x64", "win", "aot", "any", "base" ], "win7-x64": [ "win7", "win-x64", "win", "any", "base" ], "win7-x64-aot": [ "win7-aot", "win7-x64", "win7", "win-x64-aot", "win-aot", "win-x64", "win", "aot", "any", "base" ], "win8-x64": [ "win8", "win7-x64", "win7", "win-x64", "win", "any", "base" ], "win8-x64-aot": [ "win8-aot", "win8-x64", "win8", "win7-x64-aot", "win7-aot", "win7-x64", "win7", "win-x64-aot", "win-aot", "win-x64", "win", "aot", "any", "base" ], "win81-x64": [ "win81", "win8-x64", "win8", "win7-x64", "win7", "win-x64", "win", "any", "base" ], "win81-x64-aot": [ "win81-aot", "win81-x64", "win81", "win8-x64-aot", "win8-aot", "win8-x64", "win8", "win7-x64-aot", "win7-aot", "win7-x64", "win7", "win-x64-aot", "win-aot", "win-x64", "win", "aot", "any", "base" ] } } ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.dll.config ================================================ ================================================ FILE: TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.genruntimeconfig.cache ================================================ 749191dc128713cd4907aa06d5f79988d8caaf6a ================================================ FILE: TS3AudioBot/obj/TS3AudioBot.csproj.nuget.dgspec.json ================================================ { "format": 1, "restore": { "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj": {} }, "projects": { "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj": { "version": "1.0.0", "restore": { "projectUniqueName": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "projectName": "TS3AudioBot", "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "packagesPath": "C:\\Users\\Saopig\\.nuget\\packages\\", "outputPath": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\", "projectStyle": "PackageReference", "configFilePaths": [ "C:\\Users\\Saopig\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": { "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj" } } } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "dependencies": { "CliWrap": { "target": "Package", "version": "[3.1.0, )" }, "CommandLineParser": { "target": "Package", "version": "[2.8.0, )" }, "LiteDB": { "target": "Package", "version": "[4.1.4, )" }, "Microsoft.AspNetCore.Cors": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.Server.Kestrel": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.StaticFiles": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.CodeAnalysis.CSharp": { "include": "Runtime, Compile, Build, Native, ContentFiles, BuildTransitive", "target": "Package", "version": "[3.7.0, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Nett": { "target": "Package", "version": "[0.15.0, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "PlaylistsNET": { "target": "Package", "version": "[1.1.2, )" }, "SixLabors.ImageSharp": { "target": "Package", "version": "[1.0.0, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" } } }, "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "version": "1.1.0", "restore": { "projectUniqueName": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "projectName": "Splamy.TSLib", "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "packagesPath": "C:\\Users\\Saopig\\.nuget\\packages\\", "outputPath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\", "projectStyle": "PackageReference", "crossTargeting": true, "configFilePaths": [ "C:\\Users\\Saopig\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1", "netstandard2.0", "netstandard2.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": {} }, "netstandard2.0": { "targetAlias": "netstandard2.0", "projectReferences": {} }, "netstandard2.1": { "targetAlias": "netstandard2.1", "projectReferences": {} } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" }, "netstandard2.0": { "targetAlias": "netstandard2.0", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NETStandard.Library": { "suppressParent": "All", "target": "Package", "version": "[2.0.3, )", "autoReferenced": true }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" }, "System.Memory": { "target": "Package", "version": "[4.5.4, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" }, "netstandard2.1": { "targetAlias": "netstandard2.1", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "NETStandard.Library": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" } } } } } ================================================ FILE: TS3AudioBot/obj/TS3AudioBot.csproj.nuget.g.props ================================================  True NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ C:\Users\Saopig\.nuget\packages\ PackageReference 5.11.4 $(MSBuildAllProjects);$(MSBuildThisFileFullPath) C:\Users\Saopig\.nuget\packages\microsoft.codeanalysis.analyzers\3.0.0 ================================================ FILE: TS3AudioBot/obj/TS3AudioBot.csproj.nuget.g.targets ================================================  $(MSBuildAllProjects);$(MSBuildThisFileFullPath) ================================================ FILE: TS3AudioBot/obj/project.assets.json ================================================ { "version": 3, "targets": { ".NETCoreApp,Version=v3.1": { "CliWrap/3.1.0": { "type": "package", "compile": { "lib/netcoreapp3.0/CliWrap.dll": {} }, "runtime": { "lib/netcoreapp3.0/CliWrap.dll": {} } }, "CommandLineParser/2.8.0": { "type": "package", "compile": { "lib/netstandard2.0/CommandLine.dll": {} }, "runtime": { "lib/netstandard2.0/CommandLine.dll": {} } }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "compile": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} } }, "LiteDB/4.1.4": { "type": "package", "dependencies": { "System.Reflection": "4.3.0", "System.Reflection.TypeExtensions": "4.3.0" }, "compile": { "lib/netstandard2.0/LiteDB.dll": {} }, "runtime": { "lib/netstandard2.0/LiteDB.dll": {} } }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.IO.Pipelines": "4.5.2" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": {} } }, "Microsoft.AspNetCore.Cors/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": {} } }, "Microsoft.AspNetCore.Hosting/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.Configuration.EnvironmentVariables": "2.2.0", "Microsoft.Extensions.Configuration.FileExtensions": "2.2.0", "Microsoft.Extensions.DependencyInjection": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0", "Microsoft.Extensions.Logging": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Diagnostics.DiagnosticSource": "4.5.0", "System.Reflection.Metadata": "1.6.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": {} } }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Server.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": {} } }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": {} } }, "Microsoft.AspNetCore.Http/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.ObjectPool": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": {} } }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": {} } }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Buffers": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": {} } }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": {} } }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Https": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": {} } }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Memory": "4.5.1", "System.Numerics.Vectors": "4.5.0", "System.Runtime.CompilerServices.Unsafe": "4.5.1", "System.Security.Cryptography.Cng": "4.5.0", "System.Threading.Tasks.Extensions": "4.5.1" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": {} }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": {} } }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": {} }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": {} } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Connections.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": {} } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": {} }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": {} } }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.WebEncoders": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": {} } }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "type": "package", "dependencies": { "Microsoft.Net.Http.Headers": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": {} } }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": { "type": "package", "build": { "build/_._": {} } }, "Microsoft.CodeAnalysis.Common/3.7.0": { "type": "package", "dependencies": { "Microsoft.CodeAnalysis.Analyzers": "3.0.0", "System.Collections.Immutable": "1.5.0", "System.Memory": "4.5.4", "System.Reflection.Metadata": "1.6.0", "System.Runtime.CompilerServices.Unsafe": "4.7.0", "System.Text.Encoding.CodePages": "4.5.1", "System.Threading.Tasks.Extensions": "4.5.3" }, "compile": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": {} }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": {} }, "resource": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "type": "package", "dependencies": { "Microsoft.CodeAnalysis.Common": "[3.7.0]" }, "compile": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": {} }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": {} }, "resource": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.Extensions.Configuration/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": {} } }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": {} } }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": {} } }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": {} } }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": {} } }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0" }, "compile": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": {} }, "runtime": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": {} } }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {} } }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": {} } }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.FileSystemGlobbing": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": {} } }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": {} } }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": {} } }, "Microsoft.Extensions.Logging/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": {} } }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": {} } }, "Microsoft.Extensions.ObjectPool/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": {} } }, "Microsoft.Extensions.Options/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Primitives": "2.2.0", "System.ComponentModel.Annotations": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": {} } }, "Microsoft.Extensions.Primitives/2.2.0": { "type": "package", "dependencies": { "System.Memory": "4.5.1", "System.Runtime.CompilerServices.Unsafe": "4.5.1" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": {} } }, "Microsoft.Extensions.WebEncoders/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": {} } }, "Microsoft.Net.Http.Headers/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0", "System.Buffers": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": {} } }, "Microsoft.NETCore.Platforms/2.1.2": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "Nett/0.15.0": { "type": "package", "compile": { "lib/netstandard2.0/Nett.dll": {} }, "runtime": { "lib/netstandard2.0/Nett.dll": {} } }, "Newtonsoft.Json/12.0.3": { "type": "package", "compile": { "lib/netstandard2.0/Newtonsoft.Json.dll": {} }, "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": {} } }, "NLog/4.7.3": { "type": "package", "compile": { "lib/netstandard2.0/NLog.dll": {} }, "runtime": { "lib/netstandard2.0/NLog.dll": {} } }, "PlaylistsNET/1.1.2": { "type": "package", "compile": { "lib/netstandard2.0/PlaylistsNET.dll": {} }, "runtime": { "lib/netstandard2.0/PlaylistsNET.dll": {} } }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "compile": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": {} }, "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": {} } }, "runtime.native.System/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "SixLabors.ImageSharp/1.0.0": { "type": "package", "compile": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": {} }, "runtime": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": {} } }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "compile": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} }, "runtime": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} } }, "System.Buffers/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Collections/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.Collections.Immutable/1.5.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Collections.Immutable.dll": {} }, "runtime": { "lib/netstandard2.0/System.Collections.Immutable.dll": {} } }, "System.ComponentModel.Annotations/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.Diagnostics.DiagnosticSource/4.5.0": { "type": "package", "compile": { "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": {} }, "runtime": { "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": {} } }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Globalization/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.IO/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.5/System.IO.dll": {} } }, "System.IO.FileSystem/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} } }, "System.IO.Pipelines/4.7.2": { "type": "package", "compile": { "ref/netcoreapp2.0/System.IO.Pipelines.dll": {} }, "runtime": { "lib/netcoreapp3.0/System.IO.Pipelines.dll": {} } }, "System.Linq/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" }, "compile": { "ref/netstandard1.6/_._": {} }, "runtime": { "lib/netstandard1.6/System.Linq.dll": {} } }, "System.Memory/4.5.4": { "type": "package", "compile": { "ref/netcoreapp2.1/_._": {} }, "runtime": { "lib/netcoreapp2.1/_._": {} } }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.NetworkInformation.dll": {} }, "runtimeTargets": { "runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "linux" }, "runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "osx" }, "runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Net.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Primitives.dll": {} } }, "System.Net.Sockets/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Sockets.dll": {} } }, "System.Numerics.Vectors/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Reflection/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Reflection.dll": {} } }, "System.Reflection.Metadata/1.6.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Reflection.Metadata.dll": {} }, "runtime": { "lib/netstandard2.0/System.Reflection.Metadata.dll": {} } }, "System.Reflection.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/System.Reflection.Primitives.dll": {} } }, "System.Reflection.TypeExtensions/4.3.0": { "type": "package", "dependencies": { "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Reflection.TypeExtensions.dll": {} }, "runtime": { "lib/netstandard1.5/System.Reflection.TypeExtensions.dll": {} } }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": {} } }, "System.Runtime/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "ref/netstandard1.5/System.Runtime.dll": {} } }, "System.Runtime.CompilerServices.Unsafe/4.7.0": { "type": "package", "compile": { "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": {} }, "runtime": { "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll": {} } }, "System.Runtime.Extensions/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Runtime.Handles/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Runtime.Handles.dll": {} } }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netcoreapp1.1/_._": {} } }, "System.Security.Claims/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Security.Claims.dll": {} } }, "System.Security.Cryptography.Cng/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll": {} }, "runtime": { "lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll": {} }, "runtimeTargets": { "runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Security.Principal/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/System.Security.Principal.dll": {} } }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Text.Encoding/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Text.Encoding.dll": {} } }, "System.Text.Encoding.CodePages/4.5.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "System.Runtime.CompilerServices.Unsafe": "4.5.2" }, "compile": { "lib/netstandard2.0/System.Text.Encoding.CodePages.dll": {} }, "runtime": { "lib/netstandard2.0/System.Text.Encoding.CodePages.dll": {} }, "runtimeTargets": { "runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Text.Encodings.Web/4.5.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Text.Encodings.Web.dll": {} }, "runtime": { "lib/netstandard2.0/System.Text.Encodings.Web.dll": {} } }, "System.Threading/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.dll": {} } }, "System.Threading.Overlapped/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Threading.Tasks/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Threading.Tasks.dll": {} } }, "System.Threading.Tasks.Extensions/4.5.3": { "type": "package", "compile": { "ref/netcoreapp2.1/_._": {} }, "runtime": { "lib/netcoreapp2.1/_._": {} } }, "System.Threading.Thread/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.Thread.dll": {} } }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.ThreadPool.dll": {} } }, "Splamy.TSLib/1.1.0": { "type": "project", "framework": ".NETCoreApp,Version=v3.1", "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2" }, "compile": { "bin/placeholder/Splamy.TSLib.dll": {} }, "runtime": { "bin/placeholder/Splamy.TSLib.dll": {} } } } }, "libraries": { "CliWrap/3.1.0": { "sha512": "vbQ+rpxRgdkWBHmZXl8De4PYzKTOxa37Tfz6Zb01OP8f7eFBOjCj5IY2+Ghb81pPMA6rCDPrYEbod1EzbcFG2w==", "type": "package", "path": "cliwrap/3.1.0", "files": [ ".nupkg.metadata", ".signature.p7s", "cliwrap.3.1.0.nupkg.sha512", "cliwrap.nuspec", "favicon.png", "lib/net461/CliWrap.dll", "lib/net461/CliWrap.xml", "lib/netcoreapp3.0/CliWrap.dll", "lib/netcoreapp3.0/CliWrap.xml", "lib/netstandard2.0/CliWrap.dll", "lib/netstandard2.0/CliWrap.xml", "lib/netstandard2.1/CliWrap.dll", "lib/netstandard2.1/CliWrap.xml" ] }, "CommandLineParser/2.8.0": { "sha512": "eco2HlKQBY4Joz9odHigzGpVzv6pjsXnY5lziioMveQxr+i2Z7xYcIOMeZTgYiqnMtMAbXMXsVhrNfWO5vJS8Q==", "type": "package", "path": "commandlineparser/2.8.0", "files": [ ".nupkg.metadata", ".signature.p7s", "CommandLine20.png", "License.md", "README.md", "commandlineparser.2.8.0.nupkg.sha512", "commandlineparser.nuspec", "lib/net40/CommandLine.dll", "lib/net40/CommandLine.xml", "lib/net45/CommandLine.dll", "lib/net45/CommandLine.xml", "lib/net461/CommandLine.dll", "lib/net461/CommandLine.xml", "lib/netstandard2.0/CommandLine.dll", "lib/netstandard2.0/CommandLine.xml" ] }, "Heijden.Dns.Portable/2.0.19": { "sha512": "i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==", "type": "package", "path": "heijden.dns.portable/2.0.19", "files": [ ".nupkg.metadata", ".signature.p7s", "heijden.dns.portable.2.0.19.nupkg.sha512", "heijden.dns.portable.nuspec", "lib/netstandard1.3/Heijden.Dns.Portable.dll" ] }, "LiteDB/4.1.4": { "sha512": "g4g9JlHzRBZl+Gd2UbiRdszZ7t8wozU2wX7+5xY5uE79tmcgcDhha+ubAP84G1VLbwQmhBGCzRfIx+epLmJciQ==", "type": "package", "path": "litedb/4.1.4", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net35/LiteDB.dll", "lib/net35/LiteDB.xml", "lib/net40/LiteDB.dll", "lib/net40/LiteDB.xml", "lib/netstandard1.3/LiteDB.dll", "lib/netstandard1.3/LiteDB.xml", "lib/netstandard2.0/LiteDB.dll", "lib/netstandard2.0/LiteDB.xml", "litedb.4.1.4.nupkg.sha512", "litedb.nuspec" ] }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "sha512": "Aqr/16Cu5XmGv7mLKJvXRxhhd05UJ7cTTSaUV4MZ3ynAzfgWjsAdpIU8FWuxwAjmVdmI8oOWuVDrbs+sRkhKnA==", "type": "package", "path": "microsoft.aspnetcore.connections.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.xml", "microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.connections.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Cors/2.2.0": { "sha512": "LFlTM3ThS3ZCILuKnjy8HyK9/IlDh3opogdbCVx6tMGyDzTQBgMPXLjGDLtMk5QmLDCcP3l1TO3z/+1viA8GUg==", "type": "package", "path": "microsoft.aspnetcore.cors/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Cors.xml", "microsoft.aspnetcore.cors.2.2.0.nupkg.sha512", "microsoft.aspnetcore.cors.nuspec" ] }, "Microsoft.AspNetCore.Hosting/2.2.0": { "sha512": "7t4RbUGugpHtQmzAkc9fpDdYJg6t/jcB2VVnjensVYbZFnLDU8pNrG0hrekk1DQG7P2UzpSqKLzDsFF0/lkkbw==", "type": "package", "path": "microsoft.aspnetcore.hosting/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.xml", "microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512", "microsoft.aspnetcore.hosting.nuspec" ] }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "sha512": "ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==", "type": "package", "path": "microsoft.aspnetcore.hosting.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.xml", "microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.hosting.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "sha512": "1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==", "type": "package", "path": "microsoft.aspnetcore.hosting.server.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.xml", "microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.hosting.server.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Http/2.2.0": { "sha512": "YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==", "type": "package", "path": "microsoft.aspnetcore.http/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.xml", "microsoft.aspnetcore.http.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.nuspec" ] }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "sha512": "Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==", "type": "package", "path": "microsoft.aspnetcore.http.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.xml", "microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "sha512": "2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==", "type": "package", "path": "microsoft.aspnetcore.http.extensions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.xml", "microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.extensions.nuspec" ] }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "sha512": "ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==", "type": "package", "path": "microsoft.aspnetcore.http.features/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.xml", "microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.features.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "sha512": "D0vGB8Tp0UNMiAhT+pwAVeqDDx2OFrfpu/plwm0WhA+1DZvTLc99eDwGISL6LAY8x7a12lhl9w7/m+VdoyDu8Q==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.xml", "microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "sha512": "F6/Vesd3ODq/ISbHfcvfRf7IzRtTvrNX8VA36Knm5e7bteJhoRA2GKQUVQ+neoO1njLvaQKnjcA3rdCZ6AF6cg==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.core/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.xml", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.xml", "microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.core.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "sha512": "nEH5mU6idUYS3/+9BKw2stMOM25ZdGwIH4P4kyj6PVkMPgQUTkBQ7l/ScPkepdhejcOlPa+g3+M4dYsSYPUJ8g==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.https/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.xml", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.xml", "microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.https.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "sha512": "j1ai2CG8BGp4mYf2TWSFjjy1pRgW9XbqhdR4EOVvrlFVbcpEPfXNIPEdjkcgK+txWCupGzkFnFF8oZsASMtmyw==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.transport.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.xml", "microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.transport.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "sha512": "qTACI0wePgAKCH+YKrMgChyfqJpjwgGZEtSuwBw6TjWLQ66THGasleia/7EZz2t2eAjwWxw8RA/D8ODrBqpj9A==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.transport.sockets/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml", "microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.transport.sockets.nuspec" ] }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "sha512": "byZDrjir6Co5EoWbraQyG0qbPCUG6XgGYQstipMF9lucOAjq/mqnIyt8B8iMWnin/ghZoOln9Y01af4rUAwOhA==", "type": "package", "path": "microsoft.aspnetcore.staticfiles/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll", "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.xml", "microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512", "microsoft.aspnetcore.staticfiles.nuspec" ] }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "sha512": "9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==", "type": "package", "path": "microsoft.aspnetcore.webutilities/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll", "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.xml", "microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512", "microsoft.aspnetcore.webutilities.nuspec" ] }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": { "sha512": "ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g==", "type": "package", "path": "microsoft.codeanalysis.analyzers/3.0.0", "hasTools": true, "files": [ ".nupkg.metadata", ".signature.p7s", "EULA.rtf", "ThirdPartyNotices.rtf", "analyzers/dotnet/cs/Microsoft.CodeAnalysis.Analyzers.dll", "analyzers/dotnet/cs/Microsoft.CodeAnalysis.CSharp.Analyzers.dll", "analyzers/dotnet/cs/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/de/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/es/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/it/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/Microsoft.CodeAnalysis.Analyzers.dll", "analyzers/dotnet/vb/Microsoft.CodeAnalysis.VisualBasic.Analyzers.dll", "analyzers/dotnet/vb/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/de/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/es/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/it/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll", "build/Microsoft.CodeAnalysis.Analyzers.props", "build/Microsoft.CodeAnalysis.Analyzers.targets", "documentation/Analyzer Configuration.md", "documentation/Microsoft.CodeAnalysis.Analyzers.md", "documentation/Microsoft.CodeAnalysis.Analyzers.sarif", "editorconfig/AllRulesDefault/.editorconfig", "editorconfig/AllRulesDisabled/.editorconfig", "editorconfig/AllRulesEnabled/.editorconfig", "editorconfig/CorrectnessRulesDefault/.editorconfig", "editorconfig/CorrectnessRulesEnabled/.editorconfig", "editorconfig/DataflowRulesDefault/.editorconfig", "editorconfig/DataflowRulesEnabled/.editorconfig", "editorconfig/LibraryRulesDefault/.editorconfig", "editorconfig/LibraryRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCompatibilityRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCompatibilityRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCorrectnessRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCorrectnessRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDesignRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDesignRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDocumentationRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDocumentationRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisLocalizationRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisLocalizationRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisPerformanceRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisPerformanceRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled/.editorconfig", "editorconfig/PortedFromFxCopRulesDefault/.editorconfig", "editorconfig/PortedFromFxCopRulesEnabled/.editorconfig", "microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512", "microsoft.codeanalysis.analyzers.nuspec", "rulesets/AllRulesDefault.ruleset", "rulesets/AllRulesDisabled.ruleset", "rulesets/AllRulesEnabled.ruleset", "rulesets/CorrectnessRulesDefault.ruleset", "rulesets/CorrectnessRulesEnabled.ruleset", "rulesets/DataflowRulesDefault.ruleset", "rulesets/DataflowRulesEnabled.ruleset", "rulesets/LibraryRulesDefault.ruleset", "rulesets/LibraryRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisCompatibilityRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisCompatibilityRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisCorrectnessRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisCorrectnessRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisDesignRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisDesignRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisDocumentationRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisDocumentationRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisLocalizationRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisLocalizationRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisPerformanceRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisPerformanceRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled.ruleset", "rulesets/PortedFromFxCopRulesDefault.ruleset", "rulesets/PortedFromFxCopRulesEnabled.ruleset", "tools/install.ps1", "tools/uninstall.ps1" ] }, "Microsoft.CodeAnalysis.Common/3.7.0": { "sha512": "SFEdnbw8204hTlde3JePYSIpNX58h/MMXa7LctUsUDigWMR8Ar9gE8LnsLqAIFM0O33JEuQbJ0G4Sat+cPGldw==", "type": "package", "path": "microsoft.codeanalysis.common/3.7.0", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "ThirdPartyNotices.rtf", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.pdb", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.xml", "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.pdb", "lib/netstandard2.0/Microsoft.CodeAnalysis.xml", "lib/netstandard2.0/cs/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/de/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/es/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/fr/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/it/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/ja/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/ko/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/pl/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/ru/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/tr/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll", "microsoft.codeanalysis.common.3.7.0.nupkg.sha512", "microsoft.codeanalysis.common.nuspec" ] }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "sha512": "sKi5PIVy9nVDerkbplY6OQhJBNzEO4XJsMGrnmb6KFEa6K1ulGCHIv6NtDjdUQ/dGrouU3OExc3yzww0COD76w==", "type": "package", "path": "microsoft.codeanalysis.csharp/3.7.0", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "ThirdPartyNotices.rtf", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.pdb", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.xml", "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.pdb", "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.xml", "lib/netstandard2.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll", "microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512", "microsoft.codeanalysis.csharp.nuspec" ] }, "Microsoft.Extensions.Configuration/2.2.0": { "sha512": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==", "type": "package", "path": "microsoft.extensions.configuration/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.xml", "microsoft.extensions.configuration.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.nuspec" ] }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "sha512": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", "type": "package", "path": "microsoft.extensions.configuration.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.xml", "microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.abstractions.nuspec" ] }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "sha512": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==", "type": "package", "path": "microsoft.extensions.configuration.binder/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.xml", "microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.binder.nuspec" ] }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "sha512": "gIqt9PkKO01hZ0zmHnWrZ1E45MDreZTVoyDbL1kMWKtDgxxWTJpYtESTEcgpvR1uB1iex1zKGYzJpOMgmuP5TQ==", "type": "package", "path": "microsoft.extensions.configuration.environmentvariables/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.xml", "microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.environmentvariables.nuspec" ] }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "sha512": "H1qCpWBC8Ed4tguTR/qYkbb3F6DI5Su3t8xyFo3/5MzAd8PwPpHzgX8X04KbBxKmk173Pb64x7xMHarczVFQUA==", "type": "package", "path": "microsoft.extensions.configuration.fileextensions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.xml", "microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.fileextensions.nuspec" ] }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "sha512": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==", "type": "package", "path": "microsoft.extensions.dependencyinjection/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net461/Microsoft.Extensions.DependencyInjection.dll", "lib/net461/Microsoft.Extensions.DependencyInjection.xml", "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll", "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.xml", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml", "microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512", "microsoft.extensions.dependencyinjection.nuspec" ] }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "sha512": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==", "type": "package", "path": "microsoft.extensions.dependencyinjection.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", "microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.dependencyinjection.abstractions.nuspec" ] }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "sha512": "EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==", "type": "package", "path": "microsoft.extensions.fileproviders.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.xml", "microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.fileproviders.abstractions.nuspec" ] }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "sha512": "tbDHZnBJkjYd9NjlRZ9ondDiv1Te3KYCTW2RWpR1B0e1Z8+EnFRo7qNnHkkSCixLdlPZzhjlX24d/PixQ7w2dA==", "type": "package", "path": "microsoft.extensions.fileproviders.physical/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.xml", "microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512", "microsoft.extensions.fileproviders.physical.nuspec" ] }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "sha512": "ZSsHZp3PyW6vk37tDEdypjgGlNtpJ0EixBMOfUod2Thx7GtwfFSAQXUQx8a8BN8vfWKGGMbp7jPWdoHx/At4wQ==", "type": "package", "path": "microsoft.extensions.filesystemglobbing/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll", "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.xml", "microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512", "microsoft.extensions.filesystemglobbing.nuspec" ] }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "sha512": "+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==", "type": "package", "path": "microsoft.extensions.hosting.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.xml", "microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.hosting.abstractions.nuspec" ] }, "Microsoft.Extensions.Logging/2.2.0": { "sha512": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==", "type": "package", "path": "microsoft.extensions.logging/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Logging.dll", "lib/netstandard2.0/Microsoft.Extensions.Logging.xml", "microsoft.extensions.logging.2.2.0.nupkg.sha512", "microsoft.extensions.logging.nuspec" ] }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "sha512": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==", "type": "package", "path": "microsoft.extensions.logging.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", "microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.logging.abstractions.nuspec" ] }, "Microsoft.Extensions.ObjectPool/2.2.0": { "sha512": "gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==", "type": "package", "path": "microsoft.extensions.objectpool/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll", "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.xml", "microsoft.extensions.objectpool.2.2.0.nupkg.sha512", "microsoft.extensions.objectpool.nuspec" ] }, "Microsoft.Extensions.Options/2.2.0": { "sha512": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==", "type": "package", "path": "microsoft.extensions.options/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Options.dll", "lib/netstandard2.0/Microsoft.Extensions.Options.xml", "microsoft.extensions.options.2.2.0.nupkg.sha512", "microsoft.extensions.options.nuspec" ] }, "Microsoft.Extensions.Primitives/2.2.0": { "sha512": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==", "type": "package", "path": "microsoft.extensions.primitives/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll", "lib/netstandard2.0/Microsoft.Extensions.Primitives.xml", "microsoft.extensions.primitives.2.2.0.nupkg.sha512", "microsoft.extensions.primitives.nuspec" ] }, "Microsoft.Extensions.WebEncoders/2.2.0": { "sha512": "V8XcqYcpcdBAxUhLeyYcuKmxu4CtNQA9IphTnARpQGhkop4A93v2XgM3AtaVVJo3H2cDWxWM6aeO8HxkifREqw==", "type": "package", "path": "microsoft.extensions.webencoders/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll", "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.xml", "microsoft.extensions.webencoders.2.2.0.nupkg.sha512", "microsoft.extensions.webencoders.nuspec" ] }, "Microsoft.Net.Http.Headers/2.2.0": { "sha512": "iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==", "type": "package", "path": "microsoft.net.http.headers/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll", "lib/netstandard2.0/Microsoft.Net.Http.Headers.xml", "microsoft.net.http.headers.2.2.0.nupkg.sha512", "microsoft.net.http.headers.nuspec" ] }, "Microsoft.NETCore.Platforms/2.1.2": { "sha512": "mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==", "type": "package", "path": "microsoft.netcore.platforms/2.1.2", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.0/_._", "microsoft.netcore.platforms.2.1.2.nupkg.sha512", "microsoft.netcore.platforms.nuspec", "runtime.json", "useSharedDesignerContext.txt", "version.txt" ] }, "Microsoft.NETCore.Targets/1.1.0": { "sha512": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "type": "package", "path": "microsoft.netcore.targets/1.1.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "microsoft.netcore.targets.1.1.0.nupkg.sha512", "microsoft.netcore.targets.nuspec", "runtime.json" ] }, "Microsoft.Win32.Primitives/4.3.0": { "sha512": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "type": "package", "path": "microsoft.win32.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/Microsoft.Win32.Primitives.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "microsoft.win32.primitives.4.3.0.nupkg.sha512", "microsoft.win32.primitives.nuspec", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/Microsoft.Win32.Primitives.dll", "ref/netstandard1.3/Microsoft.Win32.Primitives.dll", "ref/netstandard1.3/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "Nett/0.15.0": { "sha512": "/0SoN9ugPKfmLndtKy3gaRxOlzji94/yrNgQLe45/1ZgExj0BaVozbXD+oWD8E6MCLvTs+YWzmn315mQOXGCcw==", "type": "package", "path": "nett/0.15.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net40/Nett.dll", "lib/net40/Nett.xml", "lib/netstandard2.0/Nett.dll", "lib/netstandard2.0/Nett.xml", "nett.0.15.0.nupkg.sha512", "nett.nuspec" ] }, "Newtonsoft.Json/12.0.3": { "sha512": "6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==", "type": "package", "path": "newtonsoft.json/12.0.3", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.md", "lib/net20/Newtonsoft.Json.dll", "lib/net20/Newtonsoft.Json.xml", "lib/net35/Newtonsoft.Json.dll", "lib/net35/Newtonsoft.Json.xml", "lib/net40/Newtonsoft.Json.dll", "lib/net40/Newtonsoft.Json.xml", "lib/net45/Newtonsoft.Json.dll", "lib/net45/Newtonsoft.Json.xml", "lib/netstandard1.0/Newtonsoft.Json.dll", "lib/netstandard1.0/Newtonsoft.Json.xml", "lib/netstandard1.3/Newtonsoft.Json.dll", "lib/netstandard1.3/Newtonsoft.Json.xml", "lib/netstandard2.0/Newtonsoft.Json.dll", "lib/netstandard2.0/Newtonsoft.Json.xml", "lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.dll", "lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.xml", "lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.dll", "lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.xml", "newtonsoft.json.12.0.3.nupkg.sha512", "newtonsoft.json.nuspec", "packageIcon.png" ] }, "NLog/4.7.3": { "sha512": "3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==", "type": "package", "path": "nlog/4.7.3", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/monoandroid44/NLog.dll", "lib/monoandroid44/NLog.xml", "lib/net35/NLog.dll", "lib/net35/NLog.xml", "lib/net40-client/NLog.dll", "lib/net40-client/NLog.xml", "lib/net45/NLog.dll", "lib/net45/NLog.xml", "lib/netstandard1.3/NLog.dll", "lib/netstandard1.3/NLog.xml", "lib/netstandard1.5/NLog.dll", "lib/netstandard1.5/NLog.xml", "lib/netstandard2.0/NLog.dll", "lib/netstandard2.0/NLog.xml", "lib/sl4/NLog.dll", "lib/sl4/NLog.xml", "lib/sl5/NLog.dll", "lib/sl5/NLog.xml", "lib/wp8/NLog.dll", "lib/wp8/NLog.xml", "lib/xamarinios10/NLog.dll", "lib/xamarinios10/NLog.xml", "nlog.4.7.3.nupkg.sha512", "nlog.nuspec" ] }, "PlaylistsNET/1.1.2": { "sha512": "IGzVterTV49b9FjzY7gMUcxnzOvVDj6L07pjB821m+k2iHWazy/OhIvDCvGSMx1cvkY9ZBajXpQO5uUCZY51vw==", "type": "package", "path": "playlistsnet/1.1.2", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net45/PlaylistsNET.dll", "lib/netstandard1.4/PlaylistsNET.dll", "lib/netstandard2.0/PlaylistsNET.dll", "playlistsnet.1.1.2.nupkg.sha512", "playlistsnet.nuspec" ] }, "Portable.BouncyCastle/1.8.6.7": { "sha512": "RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==", "type": "package", "path": "portable.bouncycastle/1.8.6.7", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net40/BouncyCastle.Crypto.dll", "lib/net40/BouncyCastle.Crypto.xml", "lib/netstandard2.0/BouncyCastle.Crypto.dll", "lib/netstandard2.0/BouncyCastle.Crypto.xml", "portable.bouncycastle.1.8.6.7.nupkg.sha512", "portable.bouncycastle.nuspec" ] }, "runtime.native.System/4.3.0": { "sha512": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", "type": "package", "path": "runtime.native.system/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "runtime.native.system.4.3.0.nupkg.sha512", "runtime.native.system.nuspec" ] }, "SixLabors.ImageSharp/1.0.0": { "sha512": "8amvsk8NXnCxZV0lvJppAZJknViWgBOO/2V59IGR6DVoD13mSmG+/Z9eg5IwrHQuRHp5RD9lfXBXDZyk8rTKDg==", "type": "package", "path": "sixlabors.imagesharp/1.0.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net472/SixLabors.ImageSharp.dll", "lib/net472/SixLabors.ImageSharp.xml", "lib/netcoreapp2.1/SixLabors.ImageSharp.dll", "lib/netcoreapp2.1/SixLabors.ImageSharp.xml", "lib/netcoreapp3.1/SixLabors.ImageSharp.dll", "lib/netcoreapp3.1/SixLabors.ImageSharp.xml", "lib/netstandard1.3/SixLabors.ImageSharp.dll", "lib/netstandard1.3/SixLabors.ImageSharp.xml", "lib/netstandard2.0/SixLabors.ImageSharp.dll", "lib/netstandard2.0/SixLabors.ImageSharp.xml", "lib/netstandard2.1/SixLabors.ImageSharp.dll", "lib/netstandard2.1/SixLabors.ImageSharp.xml", "sixlabors.imagesharp.1.0.0.nupkg.sha512", "sixlabors.imagesharp.128.png", "sixlabors.imagesharp.nuspec" ] }, "Splamy.Ed25519.Toolkit/1.0.3": { "sha512": "Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==", "type": "package", "path": "splamy.ed25519.toolkit/1.0.3", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net46/Chaos.NaCl.dll", "lib/netcoreapp2.0/Chaos.NaCl.dll", "lib/netcoreapp2.1/Chaos.NaCl.dll", "lib/netstandard1.1/Chaos.NaCl.dll", "lib/netstandard2.0/Chaos.NaCl.dll", "splamy.ed25519.toolkit.1.0.3.nupkg.sha512", "splamy.ed25519.toolkit.nuspec" ] }, "System.Buffers/4.5.0": { "sha512": "pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==", "type": "package", "path": "system.buffers/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netcoreapp2.0/_._", "lib/netstandard1.1/System.Buffers.dll", "lib/netstandard1.1/System.Buffers.xml", "lib/netstandard2.0/System.Buffers.dll", "lib/netstandard2.0/System.Buffers.xml", "lib/uap10.0.16299/_._", "ref/net45/System.Buffers.dll", "ref/net45/System.Buffers.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.1/System.Buffers.dll", "ref/netstandard1.1/System.Buffers.xml", "ref/netstandard2.0/System.Buffers.dll", "ref/netstandard2.0/System.Buffers.xml", "ref/uap10.0.16299/_._", "system.buffers.4.5.0.nupkg.sha512", "system.buffers.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Collections/4.3.0": { "sha512": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "type": "package", "path": "system.collections/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Collections.dll", "ref/netcore50/System.Collections.xml", "ref/netcore50/de/System.Collections.xml", "ref/netcore50/es/System.Collections.xml", "ref/netcore50/fr/System.Collections.xml", "ref/netcore50/it/System.Collections.xml", "ref/netcore50/ja/System.Collections.xml", "ref/netcore50/ko/System.Collections.xml", "ref/netcore50/ru/System.Collections.xml", "ref/netcore50/zh-hans/System.Collections.xml", "ref/netcore50/zh-hant/System.Collections.xml", "ref/netstandard1.0/System.Collections.dll", "ref/netstandard1.0/System.Collections.xml", "ref/netstandard1.0/de/System.Collections.xml", "ref/netstandard1.0/es/System.Collections.xml", "ref/netstandard1.0/fr/System.Collections.xml", "ref/netstandard1.0/it/System.Collections.xml", "ref/netstandard1.0/ja/System.Collections.xml", "ref/netstandard1.0/ko/System.Collections.xml", "ref/netstandard1.0/ru/System.Collections.xml", "ref/netstandard1.0/zh-hans/System.Collections.xml", "ref/netstandard1.0/zh-hant/System.Collections.xml", "ref/netstandard1.3/System.Collections.dll", "ref/netstandard1.3/System.Collections.xml", "ref/netstandard1.3/de/System.Collections.xml", "ref/netstandard1.3/es/System.Collections.xml", "ref/netstandard1.3/fr/System.Collections.xml", "ref/netstandard1.3/it/System.Collections.xml", "ref/netstandard1.3/ja/System.Collections.xml", "ref/netstandard1.3/ko/System.Collections.xml", "ref/netstandard1.3/ru/System.Collections.xml", "ref/netstandard1.3/zh-hans/System.Collections.xml", "ref/netstandard1.3/zh-hant/System.Collections.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.collections.4.3.0.nupkg.sha512", "system.collections.nuspec" ] }, "System.Collections.Immutable/1.5.0": { "sha512": "EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==", "type": "package", "path": "system.collections.immutable/1.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.0/System.Collections.Immutable.dll", "lib/netstandard1.0/System.Collections.Immutable.xml", "lib/netstandard1.3/System.Collections.Immutable.dll", "lib/netstandard1.3/System.Collections.Immutable.xml", "lib/netstandard2.0/System.Collections.Immutable.dll", "lib/netstandard2.0/System.Collections.Immutable.xml", "lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.dll", "lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.xml", "system.collections.immutable.1.5.0.nupkg.sha512", "system.collections.immutable.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.ComponentModel.Annotations/4.5.0": { "sha512": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==", "type": "package", "path": "system.componentmodel.annotations/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net461/System.ComponentModel.Annotations.dll", "lib/netcore50/System.ComponentModel.Annotations.dll", "lib/netcoreapp2.0/_._", "lib/netstandard1.4/System.ComponentModel.Annotations.dll", "lib/netstandard2.0/System.ComponentModel.Annotations.dll", "lib/portable-net45+win8/_._", "lib/uap10.0.16299/_._", "lib/win8/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net461/System.ComponentModel.Annotations.dll", "ref/net461/System.ComponentModel.Annotations.xml", "ref/netcore50/System.ComponentModel.Annotations.dll", "ref/netcore50/System.ComponentModel.Annotations.xml", "ref/netcore50/de/System.ComponentModel.Annotations.xml", "ref/netcore50/es/System.ComponentModel.Annotations.xml", "ref/netcore50/fr/System.ComponentModel.Annotations.xml", "ref/netcore50/it/System.ComponentModel.Annotations.xml", "ref/netcore50/ja/System.ComponentModel.Annotations.xml", "ref/netcore50/ko/System.ComponentModel.Annotations.xml", "ref/netcore50/ru/System.ComponentModel.Annotations.xml", "ref/netcore50/zh-hans/System.ComponentModel.Annotations.xml", "ref/netcore50/zh-hant/System.ComponentModel.Annotations.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.1/System.ComponentModel.Annotations.dll", "ref/netstandard1.1/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/de/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/es/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/fr/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/it/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/ja/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/ko/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/ru/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/zh-hans/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/zh-hant/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/System.ComponentModel.Annotations.dll", "ref/netstandard1.3/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/de/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/es/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/fr/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/it/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/ja/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/ko/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/ru/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/zh-hans/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/zh-hant/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/System.ComponentModel.Annotations.dll", "ref/netstandard1.4/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/de/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/es/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/fr/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/it/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/ja/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/ko/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/ru/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/zh-hans/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/zh-hant/System.ComponentModel.Annotations.xml", "ref/netstandard2.0/System.ComponentModel.Annotations.dll", "ref/netstandard2.0/System.ComponentModel.Annotations.xml", "ref/portable-net45+win8/_._", "ref/uap10.0.16299/_._", "ref/win8/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.componentmodel.annotations.4.5.0.nupkg.sha512", "system.componentmodel.annotations.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Diagnostics.Debug/4.3.0": { "sha512": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "type": "package", "path": "system.diagnostics.debug/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Diagnostics.Debug.dll", "ref/netcore50/System.Diagnostics.Debug.xml", "ref/netcore50/de/System.Diagnostics.Debug.xml", "ref/netcore50/es/System.Diagnostics.Debug.xml", "ref/netcore50/fr/System.Diagnostics.Debug.xml", "ref/netcore50/it/System.Diagnostics.Debug.xml", "ref/netcore50/ja/System.Diagnostics.Debug.xml", "ref/netcore50/ko/System.Diagnostics.Debug.xml", "ref/netcore50/ru/System.Diagnostics.Debug.xml", "ref/netcore50/zh-hans/System.Diagnostics.Debug.xml", "ref/netcore50/zh-hant/System.Diagnostics.Debug.xml", "ref/netstandard1.0/System.Diagnostics.Debug.dll", "ref/netstandard1.0/System.Diagnostics.Debug.xml", "ref/netstandard1.0/de/System.Diagnostics.Debug.xml", "ref/netstandard1.0/es/System.Diagnostics.Debug.xml", "ref/netstandard1.0/fr/System.Diagnostics.Debug.xml", "ref/netstandard1.0/it/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ja/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ko/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ru/System.Diagnostics.Debug.xml", "ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml", "ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml", "ref/netstandard1.3/System.Diagnostics.Debug.dll", "ref/netstandard1.3/System.Diagnostics.Debug.xml", "ref/netstandard1.3/de/System.Diagnostics.Debug.xml", "ref/netstandard1.3/es/System.Diagnostics.Debug.xml", "ref/netstandard1.3/fr/System.Diagnostics.Debug.xml", "ref/netstandard1.3/it/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ja/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ko/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ru/System.Diagnostics.Debug.xml", "ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml", "ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.diagnostics.debug.4.3.0.nupkg.sha512", "system.diagnostics.debug.nuspec" ] }, "System.Diagnostics.DiagnosticSource/4.5.0": { "sha512": "eIHRELiYDQvsMToML81QFkXEEYXUSUT2F28t1SGrevWqP+epFdw80SyAXIKTXOHrIEXReFOEnEr7XlGiC2GgOg==", "type": "package", "path": "system.diagnostics.diagnosticsource/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net45/System.Diagnostics.DiagnosticSource.dll", "lib/net45/System.Diagnostics.DiagnosticSource.xml", "lib/net46/System.Diagnostics.DiagnosticSource.dll", "lib/net46/System.Diagnostics.DiagnosticSource.xml", "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll", "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml", "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll", "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml", "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll", "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml", "system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512", "system.diagnostics.diagnosticsource.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Diagnostics.Tracing/4.3.0": { "sha512": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "type": "package", "path": "system.diagnostics.tracing/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Diagnostics.Tracing.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Diagnostics.Tracing.dll", "ref/netcore50/System.Diagnostics.Tracing.dll", "ref/netcore50/System.Diagnostics.Tracing.xml", "ref/netcore50/de/System.Diagnostics.Tracing.xml", "ref/netcore50/es/System.Diagnostics.Tracing.xml", "ref/netcore50/fr/System.Diagnostics.Tracing.xml", "ref/netcore50/it/System.Diagnostics.Tracing.xml", "ref/netcore50/ja/System.Diagnostics.Tracing.xml", "ref/netcore50/ko/System.Diagnostics.Tracing.xml", "ref/netcore50/ru/System.Diagnostics.Tracing.xml", "ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml", "ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/System.Diagnostics.Tracing.dll", "ref/netstandard1.1/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/System.Diagnostics.Tracing.dll", "ref/netstandard1.2/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/System.Diagnostics.Tracing.dll", "ref/netstandard1.3/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/System.Diagnostics.Tracing.dll", "ref/netstandard1.5/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.diagnostics.tracing.4.3.0.nupkg.sha512", "system.diagnostics.tracing.nuspec" ] }, "System.Globalization/4.3.0": { "sha512": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "type": "package", "path": "system.globalization/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Globalization.dll", "ref/netcore50/System.Globalization.xml", "ref/netcore50/de/System.Globalization.xml", "ref/netcore50/es/System.Globalization.xml", "ref/netcore50/fr/System.Globalization.xml", "ref/netcore50/it/System.Globalization.xml", "ref/netcore50/ja/System.Globalization.xml", "ref/netcore50/ko/System.Globalization.xml", "ref/netcore50/ru/System.Globalization.xml", "ref/netcore50/zh-hans/System.Globalization.xml", "ref/netcore50/zh-hant/System.Globalization.xml", "ref/netstandard1.0/System.Globalization.dll", "ref/netstandard1.0/System.Globalization.xml", "ref/netstandard1.0/de/System.Globalization.xml", "ref/netstandard1.0/es/System.Globalization.xml", "ref/netstandard1.0/fr/System.Globalization.xml", "ref/netstandard1.0/it/System.Globalization.xml", "ref/netstandard1.0/ja/System.Globalization.xml", "ref/netstandard1.0/ko/System.Globalization.xml", "ref/netstandard1.0/ru/System.Globalization.xml", "ref/netstandard1.0/zh-hans/System.Globalization.xml", "ref/netstandard1.0/zh-hant/System.Globalization.xml", "ref/netstandard1.3/System.Globalization.dll", "ref/netstandard1.3/System.Globalization.xml", "ref/netstandard1.3/de/System.Globalization.xml", "ref/netstandard1.3/es/System.Globalization.xml", "ref/netstandard1.3/fr/System.Globalization.xml", "ref/netstandard1.3/it/System.Globalization.xml", "ref/netstandard1.3/ja/System.Globalization.xml", "ref/netstandard1.3/ko/System.Globalization.xml", "ref/netstandard1.3/ru/System.Globalization.xml", "ref/netstandard1.3/zh-hans/System.Globalization.xml", "ref/netstandard1.3/zh-hant/System.Globalization.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.globalization.4.3.0.nupkg.sha512", "system.globalization.nuspec" ] }, "System.IO/4.3.0": { "sha512": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "type": "package", "path": "system.io/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.IO.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.IO.dll", "ref/netcore50/System.IO.dll", "ref/netcore50/System.IO.xml", "ref/netcore50/de/System.IO.xml", "ref/netcore50/es/System.IO.xml", "ref/netcore50/fr/System.IO.xml", "ref/netcore50/it/System.IO.xml", "ref/netcore50/ja/System.IO.xml", "ref/netcore50/ko/System.IO.xml", "ref/netcore50/ru/System.IO.xml", "ref/netcore50/zh-hans/System.IO.xml", "ref/netcore50/zh-hant/System.IO.xml", "ref/netstandard1.0/System.IO.dll", "ref/netstandard1.0/System.IO.xml", "ref/netstandard1.0/de/System.IO.xml", "ref/netstandard1.0/es/System.IO.xml", "ref/netstandard1.0/fr/System.IO.xml", "ref/netstandard1.0/it/System.IO.xml", "ref/netstandard1.0/ja/System.IO.xml", "ref/netstandard1.0/ko/System.IO.xml", "ref/netstandard1.0/ru/System.IO.xml", "ref/netstandard1.0/zh-hans/System.IO.xml", "ref/netstandard1.0/zh-hant/System.IO.xml", "ref/netstandard1.3/System.IO.dll", "ref/netstandard1.3/System.IO.xml", "ref/netstandard1.3/de/System.IO.xml", "ref/netstandard1.3/es/System.IO.xml", "ref/netstandard1.3/fr/System.IO.xml", "ref/netstandard1.3/it/System.IO.xml", "ref/netstandard1.3/ja/System.IO.xml", "ref/netstandard1.3/ko/System.IO.xml", "ref/netstandard1.3/ru/System.IO.xml", "ref/netstandard1.3/zh-hans/System.IO.xml", "ref/netstandard1.3/zh-hant/System.IO.xml", "ref/netstandard1.5/System.IO.dll", "ref/netstandard1.5/System.IO.xml", "ref/netstandard1.5/de/System.IO.xml", "ref/netstandard1.5/es/System.IO.xml", "ref/netstandard1.5/fr/System.IO.xml", "ref/netstandard1.5/it/System.IO.xml", "ref/netstandard1.5/ja/System.IO.xml", "ref/netstandard1.5/ko/System.IO.xml", "ref/netstandard1.5/ru/System.IO.xml", "ref/netstandard1.5/zh-hans/System.IO.xml", "ref/netstandard1.5/zh-hant/System.IO.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.4.3.0.nupkg.sha512", "system.io.nuspec" ] }, "System.IO.FileSystem/4.3.0": { "sha512": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "type": "package", "path": "system.io.filesystem/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.IO.FileSystem.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.IO.FileSystem.dll", "ref/netstandard1.3/System.IO.FileSystem.dll", "ref/netstandard1.3/System.IO.FileSystem.xml", "ref/netstandard1.3/de/System.IO.FileSystem.xml", "ref/netstandard1.3/es/System.IO.FileSystem.xml", "ref/netstandard1.3/fr/System.IO.FileSystem.xml", "ref/netstandard1.3/it/System.IO.FileSystem.xml", "ref/netstandard1.3/ja/System.IO.FileSystem.xml", "ref/netstandard1.3/ko/System.IO.FileSystem.xml", "ref/netstandard1.3/ru/System.IO.FileSystem.xml", "ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml", "ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.filesystem.4.3.0.nupkg.sha512", "system.io.filesystem.nuspec" ] }, "System.IO.FileSystem.Primitives/4.3.0": { "sha512": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "type": "package", "path": "system.io.filesystem.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.IO.FileSystem.Primitives.dll", "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.IO.FileSystem.Primitives.dll", "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll", "ref/netstandard1.3/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.filesystem.primitives.4.3.0.nupkg.sha512", "system.io.filesystem.primitives.nuspec" ] }, "System.IO.Pipelines/4.7.2": { "sha512": "rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==", "type": "package", "path": "system.io.pipelines/4.7.2", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net461/System.IO.Pipelines.dll", "lib/net461/System.IO.Pipelines.xml", "lib/netcoreapp3.0/System.IO.Pipelines.dll", "lib/netcoreapp3.0/System.IO.Pipelines.xml", "lib/netstandard1.3/System.IO.Pipelines.dll", "lib/netstandard1.3/System.IO.Pipelines.xml", "lib/netstandard2.0/System.IO.Pipelines.dll", "lib/netstandard2.0/System.IO.Pipelines.xml", "ref/net461/System.IO.Pipelines.dll", "ref/net461/System.IO.Pipelines.xml", "ref/netcoreapp2.0/System.IO.Pipelines.dll", "ref/netcoreapp2.0/System.IO.Pipelines.xml", "system.io.pipelines.4.7.2.nupkg.sha512", "system.io.pipelines.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Linq/4.3.0": { "sha512": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "type": "package", "path": "system.linq/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net463/System.Linq.dll", "lib/netcore50/System.Linq.dll", "lib/netstandard1.6/System.Linq.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net463/System.Linq.dll", "ref/netcore50/System.Linq.dll", "ref/netcore50/System.Linq.xml", "ref/netcore50/de/System.Linq.xml", "ref/netcore50/es/System.Linq.xml", "ref/netcore50/fr/System.Linq.xml", "ref/netcore50/it/System.Linq.xml", "ref/netcore50/ja/System.Linq.xml", "ref/netcore50/ko/System.Linq.xml", "ref/netcore50/ru/System.Linq.xml", "ref/netcore50/zh-hans/System.Linq.xml", "ref/netcore50/zh-hant/System.Linq.xml", "ref/netstandard1.0/System.Linq.dll", "ref/netstandard1.0/System.Linq.xml", "ref/netstandard1.0/de/System.Linq.xml", "ref/netstandard1.0/es/System.Linq.xml", "ref/netstandard1.0/fr/System.Linq.xml", "ref/netstandard1.0/it/System.Linq.xml", "ref/netstandard1.0/ja/System.Linq.xml", "ref/netstandard1.0/ko/System.Linq.xml", "ref/netstandard1.0/ru/System.Linq.xml", "ref/netstandard1.0/zh-hans/System.Linq.xml", "ref/netstandard1.0/zh-hant/System.Linq.xml", "ref/netstandard1.6/System.Linq.dll", "ref/netstandard1.6/System.Linq.xml", "ref/netstandard1.6/de/System.Linq.xml", "ref/netstandard1.6/es/System.Linq.xml", "ref/netstandard1.6/fr/System.Linq.xml", "ref/netstandard1.6/it/System.Linq.xml", "ref/netstandard1.6/ja/System.Linq.xml", "ref/netstandard1.6/ko/System.Linq.xml", "ref/netstandard1.6/ru/System.Linq.xml", "ref/netstandard1.6/zh-hans/System.Linq.xml", "ref/netstandard1.6/zh-hant/System.Linq.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.linq.4.3.0.nupkg.sha512", "system.linq.nuspec" ] }, "System.Memory/4.5.4": { "sha512": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", "type": "package", "path": "system.memory/4.5.4", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net461/System.Memory.dll", "lib/net461/System.Memory.xml", "lib/netcoreapp2.1/_._", "lib/netstandard1.1/System.Memory.dll", "lib/netstandard1.1/System.Memory.xml", "lib/netstandard2.0/System.Memory.dll", "lib/netstandard2.0/System.Memory.xml", "ref/netcoreapp2.1/_._", "system.memory.4.5.4.nupkg.sha512", "system.memory.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Net.NetworkInformation/4.3.0": { "sha512": "zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==", "type": "package", "path": "system.net.networkinformation/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net46/System.Net.NetworkInformation.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net46/System.Net.NetworkInformation.dll", "ref/netcore50/System.Net.NetworkInformation.dll", "ref/netcore50/System.Net.NetworkInformation.xml", "ref/netcore50/de/System.Net.NetworkInformation.xml", "ref/netcore50/es/System.Net.NetworkInformation.xml", "ref/netcore50/fr/System.Net.NetworkInformation.xml", "ref/netcore50/it/System.Net.NetworkInformation.xml", "ref/netcore50/ja/System.Net.NetworkInformation.xml", "ref/netcore50/ko/System.Net.NetworkInformation.xml", "ref/netcore50/ru/System.Net.NetworkInformation.xml", "ref/netcore50/zh-hans/System.Net.NetworkInformation.xml", "ref/netcore50/zh-hant/System.Net.NetworkInformation.xml", "ref/netstandard1.0/System.Net.NetworkInformation.dll", "ref/netstandard1.0/System.Net.NetworkInformation.xml", "ref/netstandard1.0/de/System.Net.NetworkInformation.xml", "ref/netstandard1.0/es/System.Net.NetworkInformation.xml", "ref/netstandard1.0/fr/System.Net.NetworkInformation.xml", "ref/netstandard1.0/it/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ja/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ko/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ru/System.Net.NetworkInformation.xml", "ref/netstandard1.0/zh-hans/System.Net.NetworkInformation.xml", "ref/netstandard1.0/zh-hant/System.Net.NetworkInformation.xml", "ref/netstandard1.3/System.Net.NetworkInformation.dll", "ref/netstandard1.3/System.Net.NetworkInformation.xml", "ref/netstandard1.3/de/System.Net.NetworkInformation.xml", "ref/netstandard1.3/es/System.Net.NetworkInformation.xml", "ref/netstandard1.3/fr/System.Net.NetworkInformation.xml", "ref/netstandard1.3/it/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ja/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ko/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ru/System.Net.NetworkInformation.xml", "ref/netstandard1.3/zh-hans/System.Net.NetworkInformation.xml", "ref/netstandard1.3/zh-hant/System.Net.NetworkInformation.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll", "runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll", "runtimes/win/lib/net46/System.Net.NetworkInformation.dll", "runtimes/win/lib/netcore50/System.Net.NetworkInformation.dll", "runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll", "system.net.networkinformation.4.3.0.nupkg.sha512", "system.net.networkinformation.nuspec" ] }, "System.Net.Primitives/4.3.0": { "sha512": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "type": "package", "path": "system.net.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Net.Primitives.dll", "ref/netcore50/System.Net.Primitives.xml", "ref/netcore50/de/System.Net.Primitives.xml", "ref/netcore50/es/System.Net.Primitives.xml", "ref/netcore50/fr/System.Net.Primitives.xml", "ref/netcore50/it/System.Net.Primitives.xml", "ref/netcore50/ja/System.Net.Primitives.xml", "ref/netcore50/ko/System.Net.Primitives.xml", "ref/netcore50/ru/System.Net.Primitives.xml", "ref/netcore50/zh-hans/System.Net.Primitives.xml", "ref/netcore50/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.0/System.Net.Primitives.dll", "ref/netstandard1.0/System.Net.Primitives.xml", "ref/netstandard1.0/de/System.Net.Primitives.xml", "ref/netstandard1.0/es/System.Net.Primitives.xml", "ref/netstandard1.0/fr/System.Net.Primitives.xml", "ref/netstandard1.0/it/System.Net.Primitives.xml", "ref/netstandard1.0/ja/System.Net.Primitives.xml", "ref/netstandard1.0/ko/System.Net.Primitives.xml", "ref/netstandard1.0/ru/System.Net.Primitives.xml", "ref/netstandard1.0/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.0/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.1/System.Net.Primitives.dll", "ref/netstandard1.1/System.Net.Primitives.xml", "ref/netstandard1.1/de/System.Net.Primitives.xml", "ref/netstandard1.1/es/System.Net.Primitives.xml", "ref/netstandard1.1/fr/System.Net.Primitives.xml", "ref/netstandard1.1/it/System.Net.Primitives.xml", "ref/netstandard1.1/ja/System.Net.Primitives.xml", "ref/netstandard1.1/ko/System.Net.Primitives.xml", "ref/netstandard1.1/ru/System.Net.Primitives.xml", "ref/netstandard1.1/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.1/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.3/System.Net.Primitives.dll", "ref/netstandard1.3/System.Net.Primitives.xml", "ref/netstandard1.3/de/System.Net.Primitives.xml", "ref/netstandard1.3/es/System.Net.Primitives.xml", "ref/netstandard1.3/fr/System.Net.Primitives.xml", "ref/netstandard1.3/it/System.Net.Primitives.xml", "ref/netstandard1.3/ja/System.Net.Primitives.xml", "ref/netstandard1.3/ko/System.Net.Primitives.xml", "ref/netstandard1.3/ru/System.Net.Primitives.xml", "ref/netstandard1.3/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.3/zh-hant/System.Net.Primitives.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.net.primitives.4.3.0.nupkg.sha512", "system.net.primitives.nuspec" ] }, "System.Net.Sockets/4.3.0": { "sha512": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "type": "package", "path": "system.net.sockets/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Net.Sockets.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Net.Sockets.dll", "ref/netstandard1.3/System.Net.Sockets.dll", "ref/netstandard1.3/System.Net.Sockets.xml", "ref/netstandard1.3/de/System.Net.Sockets.xml", "ref/netstandard1.3/es/System.Net.Sockets.xml", "ref/netstandard1.3/fr/System.Net.Sockets.xml", "ref/netstandard1.3/it/System.Net.Sockets.xml", "ref/netstandard1.3/ja/System.Net.Sockets.xml", "ref/netstandard1.3/ko/System.Net.Sockets.xml", "ref/netstandard1.3/ru/System.Net.Sockets.xml", "ref/netstandard1.3/zh-hans/System.Net.Sockets.xml", "ref/netstandard1.3/zh-hant/System.Net.Sockets.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.net.sockets.4.3.0.nupkg.sha512", "system.net.sockets.nuspec" ] }, "System.Numerics.Vectors/4.5.0": { "sha512": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==", "type": "package", "path": "system.numerics.vectors/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Numerics.Vectors.dll", "lib/net46/System.Numerics.Vectors.xml", "lib/netcoreapp2.0/_._", "lib/netstandard1.0/System.Numerics.Vectors.dll", "lib/netstandard1.0/System.Numerics.Vectors.xml", "lib/netstandard2.0/System.Numerics.Vectors.dll", "lib/netstandard2.0/System.Numerics.Vectors.xml", "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.dll", "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.xml", "lib/uap10.0.16299/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/System.Numerics.Vectors.dll", "ref/net45/System.Numerics.Vectors.xml", "ref/net46/System.Numerics.Vectors.dll", "ref/net46/System.Numerics.Vectors.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.0/System.Numerics.Vectors.dll", "ref/netstandard1.0/System.Numerics.Vectors.xml", "ref/netstandard2.0/System.Numerics.Vectors.dll", "ref/netstandard2.0/System.Numerics.Vectors.xml", "ref/uap10.0.16299/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.numerics.vectors.4.5.0.nupkg.sha512", "system.numerics.vectors.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Reflection/4.3.0": { "sha512": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "type": "package", "path": "system.reflection/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Reflection.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Reflection.dll", "ref/netcore50/System.Reflection.dll", "ref/netcore50/System.Reflection.xml", "ref/netcore50/de/System.Reflection.xml", "ref/netcore50/es/System.Reflection.xml", "ref/netcore50/fr/System.Reflection.xml", "ref/netcore50/it/System.Reflection.xml", "ref/netcore50/ja/System.Reflection.xml", "ref/netcore50/ko/System.Reflection.xml", "ref/netcore50/ru/System.Reflection.xml", "ref/netcore50/zh-hans/System.Reflection.xml", "ref/netcore50/zh-hant/System.Reflection.xml", "ref/netstandard1.0/System.Reflection.dll", "ref/netstandard1.0/System.Reflection.xml", "ref/netstandard1.0/de/System.Reflection.xml", "ref/netstandard1.0/es/System.Reflection.xml", "ref/netstandard1.0/fr/System.Reflection.xml", "ref/netstandard1.0/it/System.Reflection.xml", "ref/netstandard1.0/ja/System.Reflection.xml", "ref/netstandard1.0/ko/System.Reflection.xml", "ref/netstandard1.0/ru/System.Reflection.xml", "ref/netstandard1.0/zh-hans/System.Reflection.xml", "ref/netstandard1.0/zh-hant/System.Reflection.xml", "ref/netstandard1.3/System.Reflection.dll", "ref/netstandard1.3/System.Reflection.xml", "ref/netstandard1.3/de/System.Reflection.xml", "ref/netstandard1.3/es/System.Reflection.xml", "ref/netstandard1.3/fr/System.Reflection.xml", "ref/netstandard1.3/it/System.Reflection.xml", "ref/netstandard1.3/ja/System.Reflection.xml", "ref/netstandard1.3/ko/System.Reflection.xml", "ref/netstandard1.3/ru/System.Reflection.xml", "ref/netstandard1.3/zh-hans/System.Reflection.xml", "ref/netstandard1.3/zh-hant/System.Reflection.xml", "ref/netstandard1.5/System.Reflection.dll", "ref/netstandard1.5/System.Reflection.xml", "ref/netstandard1.5/de/System.Reflection.xml", "ref/netstandard1.5/es/System.Reflection.xml", "ref/netstandard1.5/fr/System.Reflection.xml", "ref/netstandard1.5/it/System.Reflection.xml", "ref/netstandard1.5/ja/System.Reflection.xml", "ref/netstandard1.5/ko/System.Reflection.xml", "ref/netstandard1.5/ru/System.Reflection.xml", "ref/netstandard1.5/zh-hans/System.Reflection.xml", "ref/netstandard1.5/zh-hant/System.Reflection.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.reflection.4.3.0.nupkg.sha512", "system.reflection.nuspec" ] }, "System.Reflection.Metadata/1.6.0": { "sha512": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", "type": "package", "path": "system.reflection.metadata/1.6.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.1/System.Reflection.Metadata.dll", "lib/netstandard1.1/System.Reflection.Metadata.xml", "lib/netstandard2.0/System.Reflection.Metadata.dll", "lib/netstandard2.0/System.Reflection.Metadata.xml", "lib/portable-net45+win8/System.Reflection.Metadata.dll", "lib/portable-net45+win8/System.Reflection.Metadata.xml", "system.reflection.metadata.1.6.0.nupkg.sha512", "system.reflection.metadata.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Reflection.Primitives/4.3.0": { "sha512": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "type": "package", "path": "system.reflection.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Reflection.Primitives.dll", "ref/netcore50/System.Reflection.Primitives.xml", "ref/netcore50/de/System.Reflection.Primitives.xml", "ref/netcore50/es/System.Reflection.Primitives.xml", "ref/netcore50/fr/System.Reflection.Primitives.xml", "ref/netcore50/it/System.Reflection.Primitives.xml", "ref/netcore50/ja/System.Reflection.Primitives.xml", "ref/netcore50/ko/System.Reflection.Primitives.xml", "ref/netcore50/ru/System.Reflection.Primitives.xml", "ref/netcore50/zh-hans/System.Reflection.Primitives.xml", "ref/netcore50/zh-hant/System.Reflection.Primitives.xml", "ref/netstandard1.0/System.Reflection.Primitives.dll", "ref/netstandard1.0/System.Reflection.Primitives.xml", "ref/netstandard1.0/de/System.Reflection.Primitives.xml", "ref/netstandard1.0/es/System.Reflection.Primitives.xml", "ref/netstandard1.0/fr/System.Reflection.Primitives.xml", "ref/netstandard1.0/it/System.Reflection.Primitives.xml", "ref/netstandard1.0/ja/System.Reflection.Primitives.xml", "ref/netstandard1.0/ko/System.Reflection.Primitives.xml", "ref/netstandard1.0/ru/System.Reflection.Primitives.xml", "ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml", "ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.reflection.primitives.4.3.0.nupkg.sha512", "system.reflection.primitives.nuspec" ] }, "System.Reflection.TypeExtensions/4.3.0": { "sha512": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", "type": "package", "path": "system.reflection.typeextensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Reflection.TypeExtensions.dll", "lib/net462/System.Reflection.TypeExtensions.dll", "lib/netcore50/System.Reflection.TypeExtensions.dll", "lib/netstandard1.5/System.Reflection.TypeExtensions.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Reflection.TypeExtensions.dll", "ref/net462/System.Reflection.TypeExtensions.dll", "ref/netstandard1.3/System.Reflection.TypeExtensions.dll", "ref/netstandard1.3/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/System.Reflection.TypeExtensions.dll", "ref/netstandard1.5/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll", "system.reflection.typeextensions.4.3.0.nupkg.sha512", "system.reflection.typeextensions.nuspec" ] }, "System.Resources.ResourceManager/4.3.0": { "sha512": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "type": "package", "path": "system.resources.resourcemanager/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Resources.ResourceManager.dll", "ref/netcore50/System.Resources.ResourceManager.xml", "ref/netcore50/de/System.Resources.ResourceManager.xml", "ref/netcore50/es/System.Resources.ResourceManager.xml", "ref/netcore50/fr/System.Resources.ResourceManager.xml", "ref/netcore50/it/System.Resources.ResourceManager.xml", "ref/netcore50/ja/System.Resources.ResourceManager.xml", "ref/netcore50/ko/System.Resources.ResourceManager.xml", "ref/netcore50/ru/System.Resources.ResourceManager.xml", "ref/netcore50/zh-hans/System.Resources.ResourceManager.xml", "ref/netcore50/zh-hant/System.Resources.ResourceManager.xml", "ref/netstandard1.0/System.Resources.ResourceManager.dll", "ref/netstandard1.0/System.Resources.ResourceManager.xml", "ref/netstandard1.0/de/System.Resources.ResourceManager.xml", "ref/netstandard1.0/es/System.Resources.ResourceManager.xml", "ref/netstandard1.0/fr/System.Resources.ResourceManager.xml", "ref/netstandard1.0/it/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ja/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ko/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ru/System.Resources.ResourceManager.xml", "ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml", "ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.resources.resourcemanager.4.3.0.nupkg.sha512", "system.resources.resourcemanager.nuspec" ] }, "System.Runtime/4.3.0": { "sha512": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "type": "package", "path": "system.runtime/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.dll", "lib/portable-net45+win8+wp80+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.dll", "ref/netcore50/System.Runtime.dll", "ref/netcore50/System.Runtime.xml", "ref/netcore50/de/System.Runtime.xml", "ref/netcore50/es/System.Runtime.xml", "ref/netcore50/fr/System.Runtime.xml", "ref/netcore50/it/System.Runtime.xml", "ref/netcore50/ja/System.Runtime.xml", "ref/netcore50/ko/System.Runtime.xml", "ref/netcore50/ru/System.Runtime.xml", "ref/netcore50/zh-hans/System.Runtime.xml", "ref/netcore50/zh-hant/System.Runtime.xml", "ref/netstandard1.0/System.Runtime.dll", "ref/netstandard1.0/System.Runtime.xml", "ref/netstandard1.0/de/System.Runtime.xml", "ref/netstandard1.0/es/System.Runtime.xml", "ref/netstandard1.0/fr/System.Runtime.xml", "ref/netstandard1.0/it/System.Runtime.xml", "ref/netstandard1.0/ja/System.Runtime.xml", "ref/netstandard1.0/ko/System.Runtime.xml", "ref/netstandard1.0/ru/System.Runtime.xml", "ref/netstandard1.0/zh-hans/System.Runtime.xml", "ref/netstandard1.0/zh-hant/System.Runtime.xml", "ref/netstandard1.2/System.Runtime.dll", "ref/netstandard1.2/System.Runtime.xml", "ref/netstandard1.2/de/System.Runtime.xml", "ref/netstandard1.2/es/System.Runtime.xml", "ref/netstandard1.2/fr/System.Runtime.xml", "ref/netstandard1.2/it/System.Runtime.xml", "ref/netstandard1.2/ja/System.Runtime.xml", "ref/netstandard1.2/ko/System.Runtime.xml", "ref/netstandard1.2/ru/System.Runtime.xml", "ref/netstandard1.2/zh-hans/System.Runtime.xml", "ref/netstandard1.2/zh-hant/System.Runtime.xml", "ref/netstandard1.3/System.Runtime.dll", "ref/netstandard1.3/System.Runtime.xml", "ref/netstandard1.3/de/System.Runtime.xml", "ref/netstandard1.3/es/System.Runtime.xml", "ref/netstandard1.3/fr/System.Runtime.xml", "ref/netstandard1.3/it/System.Runtime.xml", "ref/netstandard1.3/ja/System.Runtime.xml", "ref/netstandard1.3/ko/System.Runtime.xml", "ref/netstandard1.3/ru/System.Runtime.xml", "ref/netstandard1.3/zh-hans/System.Runtime.xml", "ref/netstandard1.3/zh-hant/System.Runtime.xml", "ref/netstandard1.5/System.Runtime.dll", "ref/netstandard1.5/System.Runtime.xml", "ref/netstandard1.5/de/System.Runtime.xml", "ref/netstandard1.5/es/System.Runtime.xml", "ref/netstandard1.5/fr/System.Runtime.xml", "ref/netstandard1.5/it/System.Runtime.xml", "ref/netstandard1.5/ja/System.Runtime.xml", "ref/netstandard1.5/ko/System.Runtime.xml", "ref/netstandard1.5/ru/System.Runtime.xml", "ref/netstandard1.5/zh-hans/System.Runtime.xml", "ref/netstandard1.5/zh-hant/System.Runtime.xml", "ref/portable-net45+win8+wp80+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.4.3.0.nupkg.sha512", "system.runtime.nuspec" ] }, "System.Runtime.CompilerServices.Unsafe/4.7.0": { "sha512": "IpU1lcHz8/09yDr9N+Juc7SCgNUz+RohkCQI+KsWKR67XxpFr8Z6c8t1iENCXZuRuNCc4HBwme/MDHNVCwyAKg==", "type": "package", "path": "system.runtime.compilerservices.unsafe/4.7.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.xml", "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml", "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", "ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", "ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml", "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", "system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512", "system.runtime.compilerservices.unsafe.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Runtime.Extensions/4.3.0": { "sha512": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "type": "package", "path": "system.runtime.extensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.Extensions.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.Extensions.dll", "ref/netcore50/System.Runtime.Extensions.dll", "ref/netcore50/System.Runtime.Extensions.xml", "ref/netcore50/de/System.Runtime.Extensions.xml", "ref/netcore50/es/System.Runtime.Extensions.xml", "ref/netcore50/fr/System.Runtime.Extensions.xml", "ref/netcore50/it/System.Runtime.Extensions.xml", "ref/netcore50/ja/System.Runtime.Extensions.xml", "ref/netcore50/ko/System.Runtime.Extensions.xml", "ref/netcore50/ru/System.Runtime.Extensions.xml", "ref/netcore50/zh-hans/System.Runtime.Extensions.xml", "ref/netcore50/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.0/System.Runtime.Extensions.dll", "ref/netstandard1.0/System.Runtime.Extensions.xml", "ref/netstandard1.0/de/System.Runtime.Extensions.xml", "ref/netstandard1.0/es/System.Runtime.Extensions.xml", "ref/netstandard1.0/fr/System.Runtime.Extensions.xml", "ref/netstandard1.0/it/System.Runtime.Extensions.xml", "ref/netstandard1.0/ja/System.Runtime.Extensions.xml", "ref/netstandard1.0/ko/System.Runtime.Extensions.xml", "ref/netstandard1.0/ru/System.Runtime.Extensions.xml", "ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.3/System.Runtime.Extensions.dll", "ref/netstandard1.3/System.Runtime.Extensions.xml", "ref/netstandard1.3/de/System.Runtime.Extensions.xml", "ref/netstandard1.3/es/System.Runtime.Extensions.xml", "ref/netstandard1.3/fr/System.Runtime.Extensions.xml", "ref/netstandard1.3/it/System.Runtime.Extensions.xml", "ref/netstandard1.3/ja/System.Runtime.Extensions.xml", "ref/netstandard1.3/ko/System.Runtime.Extensions.xml", "ref/netstandard1.3/ru/System.Runtime.Extensions.xml", "ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.5/System.Runtime.Extensions.dll", "ref/netstandard1.5/System.Runtime.Extensions.xml", "ref/netstandard1.5/de/System.Runtime.Extensions.xml", "ref/netstandard1.5/es/System.Runtime.Extensions.xml", "ref/netstandard1.5/fr/System.Runtime.Extensions.xml", "ref/netstandard1.5/it/System.Runtime.Extensions.xml", "ref/netstandard1.5/ja/System.Runtime.Extensions.xml", "ref/netstandard1.5/ko/System.Runtime.Extensions.xml", "ref/netstandard1.5/ru/System.Runtime.Extensions.xml", "ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.extensions.4.3.0.nupkg.sha512", "system.runtime.extensions.nuspec" ] }, "System.Runtime.Handles/4.3.0": { "sha512": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "type": "package", "path": "system.runtime.handles/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/_._", "ref/netstandard1.3/System.Runtime.Handles.dll", "ref/netstandard1.3/System.Runtime.Handles.xml", "ref/netstandard1.3/de/System.Runtime.Handles.xml", "ref/netstandard1.3/es/System.Runtime.Handles.xml", "ref/netstandard1.3/fr/System.Runtime.Handles.xml", "ref/netstandard1.3/it/System.Runtime.Handles.xml", "ref/netstandard1.3/ja/System.Runtime.Handles.xml", "ref/netstandard1.3/ko/System.Runtime.Handles.xml", "ref/netstandard1.3/ru/System.Runtime.Handles.xml", "ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml", "ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.handles.4.3.0.nupkg.sha512", "system.runtime.handles.nuspec" ] }, "System.Runtime.InteropServices/4.3.0": { "sha512": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "type": "package", "path": "system.runtime.interopservices/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.InteropServices.dll", "lib/net463/System.Runtime.InteropServices.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.InteropServices.dll", "ref/net463/System.Runtime.InteropServices.dll", "ref/netcore50/System.Runtime.InteropServices.dll", "ref/netcore50/System.Runtime.InteropServices.xml", "ref/netcore50/de/System.Runtime.InteropServices.xml", "ref/netcore50/es/System.Runtime.InteropServices.xml", "ref/netcore50/fr/System.Runtime.InteropServices.xml", "ref/netcore50/it/System.Runtime.InteropServices.xml", "ref/netcore50/ja/System.Runtime.InteropServices.xml", "ref/netcore50/ko/System.Runtime.InteropServices.xml", "ref/netcore50/ru/System.Runtime.InteropServices.xml", "ref/netcore50/zh-hans/System.Runtime.InteropServices.xml", "ref/netcore50/zh-hant/System.Runtime.InteropServices.xml", "ref/netcoreapp1.1/System.Runtime.InteropServices.dll", "ref/netstandard1.1/System.Runtime.InteropServices.dll", "ref/netstandard1.1/System.Runtime.InteropServices.xml", "ref/netstandard1.1/de/System.Runtime.InteropServices.xml", "ref/netstandard1.1/es/System.Runtime.InteropServices.xml", "ref/netstandard1.1/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.1/it/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.2/System.Runtime.InteropServices.dll", "ref/netstandard1.2/System.Runtime.InteropServices.xml", "ref/netstandard1.2/de/System.Runtime.InteropServices.xml", "ref/netstandard1.2/es/System.Runtime.InteropServices.xml", "ref/netstandard1.2/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.2/it/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.3/System.Runtime.InteropServices.dll", "ref/netstandard1.3/System.Runtime.InteropServices.xml", "ref/netstandard1.3/de/System.Runtime.InteropServices.xml", "ref/netstandard1.3/es/System.Runtime.InteropServices.xml", "ref/netstandard1.3/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.3/it/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.5/System.Runtime.InteropServices.dll", "ref/netstandard1.5/System.Runtime.InteropServices.xml", "ref/netstandard1.5/de/System.Runtime.InteropServices.xml", "ref/netstandard1.5/es/System.Runtime.InteropServices.xml", "ref/netstandard1.5/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.5/it/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.interopservices.4.3.0.nupkg.sha512", "system.runtime.interopservices.nuspec" ] }, "System.Security.Claims/4.3.0": { "sha512": "P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "type": "package", "path": "system.security.claims/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Claims.dll", "lib/netstandard1.3/System.Security.Claims.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Claims.dll", "ref/netstandard1.3/System.Security.Claims.dll", "ref/netstandard1.3/System.Security.Claims.xml", "ref/netstandard1.3/de/System.Security.Claims.xml", "ref/netstandard1.3/es/System.Security.Claims.xml", "ref/netstandard1.3/fr/System.Security.Claims.xml", "ref/netstandard1.3/it/System.Security.Claims.xml", "ref/netstandard1.3/ja/System.Security.Claims.xml", "ref/netstandard1.3/ko/System.Security.Claims.xml", "ref/netstandard1.3/ru/System.Security.Claims.xml", "ref/netstandard1.3/zh-hans/System.Security.Claims.xml", "ref/netstandard1.3/zh-hant/System.Security.Claims.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.security.claims.4.3.0.nupkg.sha512", "system.security.claims.nuspec" ] }, "System.Security.Cryptography.Cng/4.5.0": { "sha512": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==", "type": "package", "path": "system.security.cryptography.cng/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Cryptography.Cng.dll", "lib/net461/System.Security.Cryptography.Cng.dll", "lib/net462/System.Security.Cryptography.Cng.dll", "lib/net47/System.Security.Cryptography.Cng.dll", "lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll", "lib/netstandard1.3/System.Security.Cryptography.Cng.dll", "lib/netstandard1.4/System.Security.Cryptography.Cng.dll", "lib/netstandard1.6/System.Security.Cryptography.Cng.dll", "lib/netstandard2.0/System.Security.Cryptography.Cng.dll", "lib/uap10.0.16299/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Cryptography.Cng.dll", "ref/net461/System.Security.Cryptography.Cng.dll", "ref/net461/System.Security.Cryptography.Cng.xml", "ref/net462/System.Security.Cryptography.Cng.dll", "ref/net462/System.Security.Cryptography.Cng.xml", "ref/net47/System.Security.Cryptography.Cng.dll", "ref/net47/System.Security.Cryptography.Cng.xml", "ref/netcoreapp2.0/System.Security.Cryptography.Cng.dll", "ref/netcoreapp2.0/System.Security.Cryptography.Cng.xml", "ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll", "ref/netcoreapp2.1/System.Security.Cryptography.Cng.xml", "ref/netstandard1.3/System.Security.Cryptography.Cng.dll", "ref/netstandard1.4/System.Security.Cryptography.Cng.dll", "ref/netstandard1.6/System.Security.Cryptography.Cng.dll", "ref/netstandard2.0/System.Security.Cryptography.Cng.dll", "ref/netstandard2.0/System.Security.Cryptography.Cng.xml", "ref/uap10.0.16299/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/win/lib/net46/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net461/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net462/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net47/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netcoreapp2.0/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.4/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/uap10.0.16299/_._", "system.security.cryptography.cng.4.5.0.nupkg.sha512", "system.security.cryptography.cng.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Security.Principal/4.3.0": { "sha512": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "type": "package", "path": "system.security.principal/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Security.Principal.dll", "lib/netstandard1.0/System.Security.Principal.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Security.Principal.dll", "ref/netcore50/System.Security.Principal.xml", "ref/netcore50/de/System.Security.Principal.xml", "ref/netcore50/es/System.Security.Principal.xml", "ref/netcore50/fr/System.Security.Principal.xml", "ref/netcore50/it/System.Security.Principal.xml", "ref/netcore50/ja/System.Security.Principal.xml", "ref/netcore50/ko/System.Security.Principal.xml", "ref/netcore50/ru/System.Security.Principal.xml", "ref/netcore50/zh-hans/System.Security.Principal.xml", "ref/netcore50/zh-hant/System.Security.Principal.xml", "ref/netstandard1.0/System.Security.Principal.dll", "ref/netstandard1.0/System.Security.Principal.xml", "ref/netstandard1.0/de/System.Security.Principal.xml", "ref/netstandard1.0/es/System.Security.Principal.xml", "ref/netstandard1.0/fr/System.Security.Principal.xml", "ref/netstandard1.0/it/System.Security.Principal.xml", "ref/netstandard1.0/ja/System.Security.Principal.xml", "ref/netstandard1.0/ko/System.Security.Principal.xml", "ref/netstandard1.0/ru/System.Security.Principal.xml", "ref/netstandard1.0/zh-hans/System.Security.Principal.xml", "ref/netstandard1.0/zh-hant/System.Security.Principal.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.security.principal.4.3.0.nupkg.sha512", "system.security.principal.nuspec" ] }, "System.Security.Principal.Windows/4.3.0": { "sha512": "HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", "type": "package", "path": "system.security.principal.windows/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Security.Principal.Windows.dll", "ref/net46/System.Security.Principal.Windows.dll", "ref/netstandard1.3/System.Security.Principal.Windows.dll", "ref/netstandard1.3/System.Security.Principal.Windows.xml", "ref/netstandard1.3/de/System.Security.Principal.Windows.xml", "ref/netstandard1.3/es/System.Security.Principal.Windows.xml", "ref/netstandard1.3/fr/System.Security.Principal.Windows.xml", "ref/netstandard1.3/it/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ja/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ko/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ru/System.Security.Principal.Windows.xml", "ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml", "ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml", "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll", "runtimes/win/lib/net46/System.Security.Principal.Windows.dll", "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll", "system.security.principal.windows.4.3.0.nupkg.sha512", "system.security.principal.windows.nuspec" ] }, "System.Text.Encoding/4.3.0": { "sha512": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "type": "package", "path": "system.text.encoding/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Text.Encoding.dll", "ref/netcore50/System.Text.Encoding.xml", "ref/netcore50/de/System.Text.Encoding.xml", "ref/netcore50/es/System.Text.Encoding.xml", "ref/netcore50/fr/System.Text.Encoding.xml", "ref/netcore50/it/System.Text.Encoding.xml", "ref/netcore50/ja/System.Text.Encoding.xml", "ref/netcore50/ko/System.Text.Encoding.xml", "ref/netcore50/ru/System.Text.Encoding.xml", "ref/netcore50/zh-hans/System.Text.Encoding.xml", "ref/netcore50/zh-hant/System.Text.Encoding.xml", "ref/netstandard1.0/System.Text.Encoding.dll", "ref/netstandard1.0/System.Text.Encoding.xml", "ref/netstandard1.0/de/System.Text.Encoding.xml", "ref/netstandard1.0/es/System.Text.Encoding.xml", "ref/netstandard1.0/fr/System.Text.Encoding.xml", "ref/netstandard1.0/it/System.Text.Encoding.xml", "ref/netstandard1.0/ja/System.Text.Encoding.xml", "ref/netstandard1.0/ko/System.Text.Encoding.xml", "ref/netstandard1.0/ru/System.Text.Encoding.xml", "ref/netstandard1.0/zh-hans/System.Text.Encoding.xml", "ref/netstandard1.0/zh-hant/System.Text.Encoding.xml", "ref/netstandard1.3/System.Text.Encoding.dll", "ref/netstandard1.3/System.Text.Encoding.xml", "ref/netstandard1.3/de/System.Text.Encoding.xml", "ref/netstandard1.3/es/System.Text.Encoding.xml", "ref/netstandard1.3/fr/System.Text.Encoding.xml", "ref/netstandard1.3/it/System.Text.Encoding.xml", "ref/netstandard1.3/ja/System.Text.Encoding.xml", "ref/netstandard1.3/ko/System.Text.Encoding.xml", "ref/netstandard1.3/ru/System.Text.Encoding.xml", "ref/netstandard1.3/zh-hans/System.Text.Encoding.xml", "ref/netstandard1.3/zh-hant/System.Text.Encoding.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.text.encoding.4.3.0.nupkg.sha512", "system.text.encoding.nuspec" ] }, "System.Text.Encoding.CodePages/4.5.1": { "sha512": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", "type": "package", "path": "system.text.encoding.codepages/4.5.1", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Text.Encoding.CodePages.dll", "lib/net461/System.Text.Encoding.CodePages.dll", "lib/netstandard1.3/System.Text.Encoding.CodePages.dll", "lib/netstandard2.0/System.Text.Encoding.CodePages.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/win/lib/net461/System.Text.Encoding.CodePages.dll", "runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll", "runtimes/win/lib/netstandard1.3/System.Text.Encoding.CodePages.dll", "runtimes/win/lib/netstandard2.0/System.Text.Encoding.CodePages.dll", "system.text.encoding.codepages.4.5.1.nupkg.sha512", "system.text.encoding.codepages.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Text.Encodings.Web/4.5.0": { "sha512": "Xg4G4Indi4dqP1iuAiMSwpiWS54ZghzR644OtsRCm/m/lBMG8dUBhLVN7hLm8NNrNTR+iGbshCPTwrvxZPlm4g==", "type": "package", "path": "system.text.encodings.web/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.0/System.Text.Encodings.Web.dll", "lib/netstandard1.0/System.Text.Encodings.Web.xml", "lib/netstandard2.0/System.Text.Encodings.Web.dll", "lib/netstandard2.0/System.Text.Encodings.Web.xml", "system.text.encodings.web.4.5.0.nupkg.sha512", "system.text.encodings.web.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Threading/4.3.0": { "sha512": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "type": "package", "path": "system.threading/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Threading.dll", "lib/netstandard1.3/System.Threading.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Threading.dll", "ref/netcore50/System.Threading.xml", "ref/netcore50/de/System.Threading.xml", "ref/netcore50/es/System.Threading.xml", "ref/netcore50/fr/System.Threading.xml", "ref/netcore50/it/System.Threading.xml", "ref/netcore50/ja/System.Threading.xml", "ref/netcore50/ko/System.Threading.xml", "ref/netcore50/ru/System.Threading.xml", "ref/netcore50/zh-hans/System.Threading.xml", "ref/netcore50/zh-hant/System.Threading.xml", "ref/netstandard1.0/System.Threading.dll", "ref/netstandard1.0/System.Threading.xml", "ref/netstandard1.0/de/System.Threading.xml", "ref/netstandard1.0/es/System.Threading.xml", "ref/netstandard1.0/fr/System.Threading.xml", "ref/netstandard1.0/it/System.Threading.xml", "ref/netstandard1.0/ja/System.Threading.xml", "ref/netstandard1.0/ko/System.Threading.xml", "ref/netstandard1.0/ru/System.Threading.xml", "ref/netstandard1.0/zh-hans/System.Threading.xml", "ref/netstandard1.0/zh-hant/System.Threading.xml", "ref/netstandard1.3/System.Threading.dll", "ref/netstandard1.3/System.Threading.xml", "ref/netstandard1.3/de/System.Threading.xml", "ref/netstandard1.3/es/System.Threading.xml", "ref/netstandard1.3/fr/System.Threading.xml", "ref/netstandard1.3/it/System.Threading.xml", "ref/netstandard1.3/ja/System.Threading.xml", "ref/netstandard1.3/ko/System.Threading.xml", "ref/netstandard1.3/ru/System.Threading.xml", "ref/netstandard1.3/zh-hans/System.Threading.xml", "ref/netstandard1.3/zh-hant/System.Threading.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Threading.dll", "system.threading.4.3.0.nupkg.sha512", "system.threading.nuspec" ] }, "System.Threading.Overlapped/4.3.0": { "sha512": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", "type": "package", "path": "system.threading.overlapped/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Threading.Overlapped.dll", "ref/net46/System.Threading.Overlapped.dll", "ref/netstandard1.3/System.Threading.Overlapped.dll", "ref/netstandard1.3/System.Threading.Overlapped.xml", "ref/netstandard1.3/de/System.Threading.Overlapped.xml", "ref/netstandard1.3/es/System.Threading.Overlapped.xml", "ref/netstandard1.3/fr/System.Threading.Overlapped.xml", "ref/netstandard1.3/it/System.Threading.Overlapped.xml", "ref/netstandard1.3/ja/System.Threading.Overlapped.xml", "ref/netstandard1.3/ko/System.Threading.Overlapped.xml", "ref/netstandard1.3/ru/System.Threading.Overlapped.xml", "ref/netstandard1.3/zh-hans/System.Threading.Overlapped.xml", "ref/netstandard1.3/zh-hant/System.Threading.Overlapped.xml", "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll", "runtimes/win/lib/net46/System.Threading.Overlapped.dll", "runtimes/win/lib/netcore50/System.Threading.Overlapped.dll", "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll", "system.threading.overlapped.4.3.0.nupkg.sha512", "system.threading.overlapped.nuspec" ] }, "System.Threading.Tasks/4.3.0": { "sha512": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "type": "package", "path": "system.threading.tasks/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Threading.Tasks.dll", "ref/netcore50/System.Threading.Tasks.xml", "ref/netcore50/de/System.Threading.Tasks.xml", "ref/netcore50/es/System.Threading.Tasks.xml", "ref/netcore50/fr/System.Threading.Tasks.xml", "ref/netcore50/it/System.Threading.Tasks.xml", "ref/netcore50/ja/System.Threading.Tasks.xml", "ref/netcore50/ko/System.Threading.Tasks.xml", "ref/netcore50/ru/System.Threading.Tasks.xml", "ref/netcore50/zh-hans/System.Threading.Tasks.xml", "ref/netcore50/zh-hant/System.Threading.Tasks.xml", "ref/netstandard1.0/System.Threading.Tasks.dll", "ref/netstandard1.0/System.Threading.Tasks.xml", "ref/netstandard1.0/de/System.Threading.Tasks.xml", "ref/netstandard1.0/es/System.Threading.Tasks.xml", "ref/netstandard1.0/fr/System.Threading.Tasks.xml", "ref/netstandard1.0/it/System.Threading.Tasks.xml", "ref/netstandard1.0/ja/System.Threading.Tasks.xml", "ref/netstandard1.0/ko/System.Threading.Tasks.xml", "ref/netstandard1.0/ru/System.Threading.Tasks.xml", "ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml", "ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml", "ref/netstandard1.3/System.Threading.Tasks.dll", "ref/netstandard1.3/System.Threading.Tasks.xml", "ref/netstandard1.3/de/System.Threading.Tasks.xml", "ref/netstandard1.3/es/System.Threading.Tasks.xml", "ref/netstandard1.3/fr/System.Threading.Tasks.xml", "ref/netstandard1.3/it/System.Threading.Tasks.xml", "ref/netstandard1.3/ja/System.Threading.Tasks.xml", "ref/netstandard1.3/ko/System.Threading.Tasks.xml", "ref/netstandard1.3/ru/System.Threading.Tasks.xml", "ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml", "ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.tasks.4.3.0.nupkg.sha512", "system.threading.tasks.nuspec" ] }, "System.Threading.Tasks.Extensions/4.5.3": { "sha512": "+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==", "type": "package", "path": "system.threading.tasks.extensions/4.5.3", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/netcoreapp2.1/_._", "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll", "lib/netstandard1.0/System.Threading.Tasks.Extensions.xml", "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll", "lib/netstandard2.0/System.Threading.Tasks.Extensions.xml", "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll", "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/netcoreapp2.1/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.tasks.extensions.4.5.3.nupkg.sha512", "system.threading.tasks.extensions.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Threading.Thread/4.3.0": { "sha512": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", "type": "package", "path": "system.threading.thread/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Threading.Thread.dll", "lib/netcore50/_._", "lib/netstandard1.3/System.Threading.Thread.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Threading.Thread.dll", "ref/netstandard1.3/System.Threading.Thread.dll", "ref/netstandard1.3/System.Threading.Thread.xml", "ref/netstandard1.3/de/System.Threading.Thread.xml", "ref/netstandard1.3/es/System.Threading.Thread.xml", "ref/netstandard1.3/fr/System.Threading.Thread.xml", "ref/netstandard1.3/it/System.Threading.Thread.xml", "ref/netstandard1.3/ja/System.Threading.Thread.xml", "ref/netstandard1.3/ko/System.Threading.Thread.xml", "ref/netstandard1.3/ru/System.Threading.Thread.xml", "ref/netstandard1.3/zh-hans/System.Threading.Thread.xml", "ref/netstandard1.3/zh-hant/System.Threading.Thread.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.thread.4.3.0.nupkg.sha512", "system.threading.thread.nuspec" ] }, "System.Threading.ThreadPool/4.3.0": { "sha512": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", "type": "package", "path": "system.threading.threadpool/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Threading.ThreadPool.dll", "lib/netcore50/_._", "lib/netstandard1.3/System.Threading.ThreadPool.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Threading.ThreadPool.dll", "ref/netstandard1.3/System.Threading.ThreadPool.dll", "ref/netstandard1.3/System.Threading.ThreadPool.xml", "ref/netstandard1.3/de/System.Threading.ThreadPool.xml", "ref/netstandard1.3/es/System.Threading.ThreadPool.xml", "ref/netstandard1.3/fr/System.Threading.ThreadPool.xml", "ref/netstandard1.3/it/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ja/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ko/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ru/System.Threading.ThreadPool.xml", "ref/netstandard1.3/zh-hans/System.Threading.ThreadPool.xml", "ref/netstandard1.3/zh-hant/System.Threading.ThreadPool.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.threadpool.4.3.0.nupkg.sha512", "system.threading.threadpool.nuspec" ] }, "Splamy.TSLib/1.1.0": { "type": "project", "path": "../TSLib/TSLib.csproj", "msbuildProject": "../TSLib/TSLib.csproj" } }, "projectFileDependencyGroups": { ".NETCoreApp,Version=v3.1": [ "CliWrap >= 3.1.0", "CommandLineParser >= 2.8.0", "LiteDB >= 4.1.4", "Microsoft.AspNetCore.Cors >= 2.2.0", "Microsoft.AspNetCore.Server.Kestrel >= 2.2.0", "Microsoft.AspNetCore.StaticFiles >= 2.2.0", "Microsoft.CodeAnalysis.CSharp >= 3.7.0", "NLog >= 4.7.3", "Nett >= 0.15.0", "Newtonsoft.Json >= 12.0.3", "PlaylistsNET >= 1.1.2", "SixLabors.ImageSharp >= 1.0.0", "Splamy.TSLib >= 1.1.0" ] }, "packageFolders": { "C:\\Users\\Saopig\\.nuget\\packages\\": {} }, "project": { "version": "1.0.0", "restore": { "projectUniqueName": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "projectName": "TS3AudioBot", "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "packagesPath": "C:\\Users\\Saopig\\.nuget\\packages\\", "outputPath": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\", "projectStyle": "PackageReference", "configFilePaths": [ "C:\\Users\\Saopig\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": { "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj" } } } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "dependencies": { "CliWrap": { "target": "Package", "version": "[3.1.0, )" }, "CommandLineParser": { "target": "Package", "version": "[2.8.0, )" }, "LiteDB": { "target": "Package", "version": "[4.1.4, )" }, "Microsoft.AspNetCore.Cors": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.Server.Kestrel": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.StaticFiles": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.CodeAnalysis.CSharp": { "include": "Runtime, Compile, Build, Native, ContentFiles, BuildTransitive", "target": "Package", "version": "[3.7.0, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Nett": { "target": "Package", "version": "[0.15.0, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "PlaylistsNET": { "target": "Package", "version": "[1.1.2, )" }, "SixLabors.ImageSharp": { "target": "Package", "version": "[1.0.0, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" } } } } ================================================ FILE: TS3AudioBot/obj/project.nuget.cache ================================================ { "version": 2, "dgSpecHash": "J7tJv0YcqG0d5IPgJ7rAW9fFKKYWX4NBPsJzRILeX1f7yDLsMjNlu7iA1N86hVe2cWtIkdeEqMGh58SREh4uhw==", "success": true, "projectFilePath": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "expectedPackageFiles": [ "C:\\Users\\Saopig\\.nuget\\packages\\cliwrap\\3.1.0\\cliwrap.3.1.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\commandlineparser\\2.8.0\\commandlineparser.2.8.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\heijden.dns.portable\\2.0.19\\heijden.dns.portable.2.0.19.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\litedb\\4.1.4\\litedb.4.1.4.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.connections.abstractions\\2.2.0\\microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.cors\\2.2.0\\microsoft.aspnetcore.cors.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.hosting\\2.2.0\\microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.hosting.abstractions\\2.2.0\\microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.hosting.server.abstractions\\2.2.0\\microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.http\\2.2.0\\microsoft.aspnetcore.http.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.http.abstractions\\2.2.0\\microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.http.extensions\\2.2.0\\microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.http.features\\2.2.0\\microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel\\2.2.0\\microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.core\\2.2.0\\microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.https\\2.2.0\\microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.transport.abstractions\\2.2.0\\microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.transport.sockets\\2.2.0\\microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.staticfiles\\2.2.0\\microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.webutilities\\2.2.0\\microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.codeanalysis.analyzers\\3.0.0\\microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.codeanalysis.common\\3.7.0\\microsoft.codeanalysis.common.3.7.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.codeanalysis.csharp\\3.7.0\\microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.configuration\\2.2.0\\microsoft.extensions.configuration.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\2.2.0\\microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.configuration.binder\\2.2.0\\microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.configuration.environmentvariables\\2.2.0\\microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.configuration.fileextensions\\2.2.0\\microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\2.2.0\\microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\2.2.0\\microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.fileproviders.abstractions\\2.2.0\\microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.fileproviders.physical\\2.2.0\\microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.filesystemglobbing\\2.2.0\\microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.hosting.abstractions\\2.2.0\\microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.logging\\2.2.0\\microsoft.extensions.logging.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\2.2.0\\microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.objectpool\\2.2.0\\microsoft.extensions.objectpool.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.options\\2.2.0\\microsoft.extensions.options.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.primitives\\2.2.0\\microsoft.extensions.primitives.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.webencoders\\2.2.0\\microsoft.extensions.webencoders.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.net.http.headers\\2.2.0\\microsoft.net.http.headers.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.netcore.platforms\\2.1.2\\microsoft.netcore.platforms.2.1.2.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.netcore.targets\\1.1.0\\microsoft.netcore.targets.1.1.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.win32.primitives\\4.3.0\\microsoft.win32.primitives.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\nett\\0.15.0\\nett.0.15.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\newtonsoft.json\\12.0.3\\newtonsoft.json.12.0.3.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\nlog\\4.7.3\\nlog.4.7.3.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\playlistsnet\\1.1.2\\playlistsnet.1.1.2.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\portable.bouncycastle\\1.8.6.7\\portable.bouncycastle.1.8.6.7.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\runtime.native.system\\4.3.0\\runtime.native.system.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\sixlabors.imagesharp\\1.0.0\\sixlabors.imagesharp.1.0.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\splamy.ed25519.toolkit\\1.0.3\\splamy.ed25519.toolkit.1.0.3.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.buffers\\4.5.0\\system.buffers.4.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.collections\\4.3.0\\system.collections.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.collections.immutable\\1.5.0\\system.collections.immutable.1.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.componentmodel.annotations\\4.5.0\\system.componentmodel.annotations.4.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.diagnostics.debug\\4.3.0\\system.diagnostics.debug.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.diagnostics.diagnosticsource\\4.5.0\\system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.diagnostics.tracing\\4.3.0\\system.diagnostics.tracing.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.globalization\\4.3.0\\system.globalization.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.io\\4.3.0\\system.io.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.io.filesystem\\4.3.0\\system.io.filesystem.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.io.filesystem.primitives\\4.3.0\\system.io.filesystem.primitives.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.io.pipelines\\4.7.2\\system.io.pipelines.4.7.2.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.linq\\4.3.0\\system.linq.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.memory\\4.5.4\\system.memory.4.5.4.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.net.networkinformation\\4.3.0\\system.net.networkinformation.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.net.primitives\\4.3.0\\system.net.primitives.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.net.sockets\\4.3.0\\system.net.sockets.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.numerics.vectors\\4.5.0\\system.numerics.vectors.4.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.reflection\\4.3.0\\system.reflection.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.reflection.primitives\\4.3.0\\system.reflection.primitives.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.reflection.typeextensions\\4.3.0\\system.reflection.typeextensions.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.resources.resourcemanager\\4.3.0\\system.resources.resourcemanager.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime\\4.3.0\\system.runtime.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\4.7.0\\system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime.extensions\\4.3.0\\system.runtime.extensions.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime.handles\\4.3.0\\system.runtime.handles.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime.interopservices\\4.3.0\\system.runtime.interopservices.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.security.claims\\4.3.0\\system.security.claims.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.security.cryptography.cng\\4.5.0\\system.security.cryptography.cng.4.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.security.principal\\4.3.0\\system.security.principal.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.security.principal.windows\\4.3.0\\system.security.principal.windows.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.text.encoding\\4.3.0\\system.text.encoding.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.text.encoding.codepages\\4.5.1\\system.text.encoding.codepages.4.5.1.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.text.encodings.web\\4.5.0\\system.text.encodings.web.4.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading\\4.3.0\\system.threading.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.overlapped\\4.3.0\\system.threading.overlapped.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.tasks\\4.3.0\\system.threading.tasks.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.tasks.extensions\\4.5.3\\system.threading.tasks.extensions.4.5.3.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.thread\\4.3.0\\system.threading.thread.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.threadpool\\4.3.0\\system.threading.threadpool.4.3.0.nupkg.sha512" ], "logs": [] } ================================================ FILE: TS3AudioBot/obj/publish/linux-x64/TS3AudioBot.csproj.nuget.dgspec.json ================================================ { "format": 1, "restore": { "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj": {} }, "projects": { "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj": { "version": "1.0.0", "restore": { "projectUniqueName": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "projectName": "TS3AudioBot", "projectPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "packagesPath": "C:\\Users\\13336\\.nuget\\packages\\", "outputPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\publish\\linux-x64\\", "projectStyle": "PackageReference", "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" ], "configFilePaths": [ "C:\\Users\\13336\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": { "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "projectPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj" } } } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "dependencies": { "CliWrap": { "target": "Package", "version": "[3.1.0, )" }, "CommandLineParser": { "target": "Package", "version": "[2.8.0, )" }, "LiteDB": { "target": "Package", "version": "[4.1.4, )" }, "Microsoft.AspNetCore.Cors": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.Server.Kestrel": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.StaticFiles": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.CodeAnalysis.CSharp": { "include": "Runtime, Compile, Build, Native, ContentFiles, BuildTransitive", "target": "Package", "version": "[3.7.0, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Nett": { "target": "Package", "version": "[0.15.0, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "PlaylistsNET": { "target": "Package", "version": "[1.1.2, )" }, "SixLabors.ImageSharp": { "target": "Package", "version": "[1.0.0, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48", "net481" ], "assetTargetFallback": true, "warn": true, "downloadDependencies": [ { "name": "Microsoft.AspNetCore.App.Ref", "version": "[3.1.10, 3.1.10]" }, { "name": "Microsoft.AspNetCore.App.Runtime.linux-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.NETCore.App.Host.linux-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.NETCore.App.Ref", "version": "[3.1.0, 3.1.0]" }, { "name": "Microsoft.NETCore.App.Runtime.linux-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.WindowsDesktop.App.Ref", "version": "[3.1.0, 3.1.0]" } ], "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.201\\RuntimeIdentifierGraph.json" } }, "runtimes": { "linux-x64": { "#import": [] } } }, "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "version": "1.1.0", "restore": { "projectUniqueName": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "projectName": "Splamy.TSLib", "projectPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "packagesPath": "C:\\Users\\13336\\.nuget\\packages\\", "outputPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\", "projectStyle": "PackageReference", "crossTargeting": true, "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" ], "configFilePaths": [ "C:\\Users\\13336\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1", "netstandard2.0", "netstandard2.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": {} }, "netstandard2.0": { "targetAlias": "netstandard2.0", "projectReferences": {} }, "netstandard2.1": { "targetAlias": "netstandard2.1", "projectReferences": {} } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48", "net481" ], "assetTargetFallback": true, "warn": true, "downloadDependencies": [ { "name": "Microsoft.AspNetCore.App.Ref", "version": "[3.1.10, 3.1.10]" }, { "name": "Microsoft.AspNetCore.App.Runtime.linux-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.NETCore.App.Ref", "version": "[3.1.0, 3.1.0]" }, { "name": "Microsoft.NETCore.App.Runtime.linux-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.WindowsDesktop.App.Ref", "version": "[3.1.0, 3.1.0]" } ], "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.201\\RuntimeIdentifierGraph.json" }, "netstandard2.0": { "targetAlias": "netstandard2.0", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NETStandard.Library": { "suppressParent": "All", "target": "Package", "version": "[2.0.3, )", "autoReferenced": true }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" }, "System.Memory": { "target": "Package", "version": "[4.5.4, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48", "net481" ], "assetTargetFallback": true, "warn": true, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.201\\RuntimeIdentifierGraph.json" }, "netstandard2.1": { "targetAlias": "netstandard2.1", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48", "net481" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "NETStandard.Library": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.201\\RuntimeIdentifierGraph.json" } }, "runtimes": { "linux-x64": { "#import": [] } } } } } ================================================ FILE: TS3AudioBot/obj/publish/linux-x64/TS3AudioBot.csproj.nuget.g.props ================================================  True NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ C:\Users\13336\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages PackageReference 6.5.0 C:\Users\13336\.nuget\packages\microsoft.codeanalysis.analyzers\3.0.0 ================================================ FILE: TS3AudioBot/obj/publish/linux-x64/TS3AudioBot.csproj.nuget.g.targets ================================================  ================================================ FILE: TS3AudioBot/obj/publish/linux-x64/project.assets.json ================================================ { "version": 3, "targets": { ".NETCoreApp,Version=v3.1": { "CliWrap/3.1.0": { "type": "package", "compile": { "lib/netcoreapp3.0/CliWrap.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp3.0/CliWrap.dll": { "related": ".xml" } } }, "CommandLineParser/2.8.0": { "type": "package", "compile": { "lib/netstandard2.0/CommandLine.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/CommandLine.dll": { "related": ".xml" } } }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "compile": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} } }, "LiteDB/4.1.4": { "type": "package", "dependencies": { "System.Reflection": "4.3.0", "System.Reflection.TypeExtensions": "4.3.0" }, "compile": { "lib/netstandard2.0/LiteDB.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/LiteDB.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.IO.Pipelines": "4.5.2" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Cors/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Hosting/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.Configuration.EnvironmentVariables": "2.2.0", "Microsoft.Extensions.Configuration.FileExtensions": "2.2.0", "Microsoft.Extensions.DependencyInjection": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0", "Microsoft.Extensions.Logging": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Diagnostics.DiagnosticSource": "4.5.0", "System.Reflection.Metadata": "1.6.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Server.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.ObjectPool": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Buffers": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Https": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Memory": "4.5.1", "System.Numerics.Vectors": "4.5.0", "System.Runtime.CompilerServices.Unsafe": "4.5.1", "System.Security.Cryptography.Cng": "4.5.0", "System.Threading.Tasks.Extensions": "4.5.1" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Connections.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.WebEncoders": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "type": "package", "dependencies": { "Microsoft.Net.Http.Headers": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": { "related": ".xml" } } }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": { "type": "package", "build": { "build/_._": {} } }, "Microsoft.CodeAnalysis.Common/3.7.0": { "type": "package", "dependencies": { "Microsoft.CodeAnalysis.Analyzers": "3.0.0", "System.Collections.Immutable": "1.5.0", "System.Memory": "4.5.4", "System.Reflection.Metadata": "1.6.0", "System.Runtime.CompilerServices.Unsafe": "4.7.0", "System.Text.Encoding.CodePages": "4.5.1", "System.Threading.Tasks.Extensions": "4.5.3" }, "compile": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": { "related": ".pdb;.xml" } }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": { "related": ".pdb;.xml" } }, "resource": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "type": "package", "dependencies": { "Microsoft.CodeAnalysis.Common": "[3.7.0]" }, "compile": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": { "related": ".pdb;.xml" } }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": { "related": ".pdb;.xml" } }, "resource": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.Extensions.Configuration/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0" }, "compile": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": { "related": ".xml" } } }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.FileSystemGlobbing": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": { "related": ".xml" } } }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Logging/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.ObjectPool/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Options/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Primitives": "2.2.0", "System.ComponentModel.Annotations": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Primitives/2.2.0": { "type": "package", "dependencies": { "System.Memory": "4.5.1", "System.Runtime.CompilerServices.Unsafe": "4.5.1" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": { "related": ".xml" } } }, "Microsoft.Extensions.WebEncoders/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": { "related": ".xml" } } }, "Microsoft.Net.Http.Headers/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0", "System.Buffers": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": { "related": ".xml" } } }, "Microsoft.NETCore.Platforms/2.1.2": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } } }, "Nett/0.15.0": { "type": "package", "compile": { "lib/netstandard2.0/Nett.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Nett.dll": { "related": ".xml" } } }, "Newtonsoft.Json/12.0.3": { "type": "package", "compile": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "related": ".xml" } } }, "NLog/4.7.3": { "type": "package", "compile": { "lib/netstandard2.0/NLog.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/NLog.dll": { "related": ".xml" } } }, "PlaylistsNET/1.1.2": { "type": "package", "compile": { "lib/netstandard2.0/PlaylistsNET.dll": {} }, "runtime": { "lib/netstandard2.0/PlaylistsNET.dll": {} } }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "compile": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "related": ".xml" } } }, "runtime.native.System/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "SixLabors.ImageSharp/1.0.0": { "type": "package", "compile": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": { "related": ".xml" } } }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "compile": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} }, "runtime": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} } }, "System.Buffers/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Collections/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } } }, "System.Collections.Immutable/1.5.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Collections.Immutable.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/System.Collections.Immutable.dll": { "related": ".xml" } } }, "System.ComponentModel.Annotations/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } } }, "System.Diagnostics.DiagnosticSource/4.5.0": { "type": "package", "compile": { "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": { "related": ".xml" } } }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": { "related": ".xml" } } }, "System.Globalization/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } } }, "System.IO/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.5/System.IO.dll": { "related": ".xml" } } }, "System.IO.FileSystem/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } } }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} } }, "System.IO.Pipelines/4.7.2": { "type": "package", "compile": { "ref/netcoreapp2.0/System.IO.Pipelines.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp3.0/System.IO.Pipelines.dll": { "related": ".xml" } } }, "System.Linq/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" }, "compile": { "ref/netstandard1.6/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.6/System.Linq.dll": {} } }, "System.Memory/4.5.4": { "type": "package", "compile": { "ref/netcoreapp2.1/_._": {} }, "runtime": { "lib/netcoreapp2.1/_._": {} } }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.NetworkInformation.dll": { "related": ".xml" } }, "runtimeTargets": { "runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "linux" }, "runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "osx" }, "runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Net.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Primitives.dll": { "related": ".xml" } } }, "System.Net.Sockets/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Sockets.dll": { "related": ".xml" } } }, "System.Numerics.Vectors/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Reflection/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Reflection.dll": { "related": ".xml" } } }, "System.Reflection.Metadata/1.6.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Reflection.Metadata.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/System.Reflection.Metadata.dll": { "related": ".xml" } } }, "System.Reflection.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/System.Reflection.Primitives.dll": { "related": ".xml" } } }, "System.Reflection.TypeExtensions/4.3.0": { "type": "package", "dependencies": { "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Reflection.TypeExtensions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.5/System.Reflection.TypeExtensions.dll": {} } }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": { "related": ".xml" } } }, "System.Runtime/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "ref/netstandard1.5/System.Runtime.dll": { "related": ".xml" } } }, "System.Runtime.CompilerServices.Unsafe/4.7.0": { "type": "package", "compile": { "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll": { "related": ".xml" } } }, "System.Runtime.Extensions/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": { "related": ".xml" } } }, "System.Runtime.Handles/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Runtime.Handles.dll": { "related": ".xml" } } }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netcoreapp1.1/_._": {} } }, "System.Security.Claims/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Security.Claims.dll": {} } }, "System.Security.Cryptography.Cng/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll": {} }, "runtimeTargets": { "runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Security.Principal/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.0/System.Security.Principal.dll": {} } }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Text.Encoding/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Text.Encoding.dll": { "related": ".xml" } } }, "System.Text.Encoding.CodePages/4.5.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "System.Runtime.CompilerServices.Unsafe": "4.5.2" }, "compile": { "lib/netstandard2.0/System.Text.Encoding.CodePages.dll": {} }, "runtime": { "lib/netstandard2.0/System.Text.Encoding.CodePages.dll": {} }, "runtimeTargets": { "runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Text.Encodings.Web/4.5.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Text.Encodings.Web.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/System.Text.Encodings.Web.dll": { "related": ".xml" } } }, "System.Threading/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Threading.dll": {} } }, "System.Threading.Overlapped/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Threading.Tasks/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Threading.Tasks.dll": { "related": ".xml" } } }, "System.Threading.Tasks.Extensions/4.5.3": { "type": "package", "compile": { "ref/netcoreapp2.1/_._": {} }, "runtime": { "lib/netcoreapp2.1/_._": {} } }, "System.Threading.Thread/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Threading.Thread.dll": {} } }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Threading.ThreadPool.dll": {} } }, "Splamy.TSLib/1.1.0": { "type": "project", "framework": ".NETCoreApp,Version=v3.1", "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2" }, "compile": { "bin/placeholder/Splamy.TSLib.dll": {} }, "runtime": { "bin/placeholder/Splamy.TSLib.dll": {} } } }, ".NETCoreApp,Version=v3.1/linux-x64": { "CliWrap/3.1.0": { "type": "package", "compile": { "lib/netcoreapp3.0/CliWrap.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp3.0/CliWrap.dll": { "related": ".xml" } } }, "CommandLineParser/2.8.0": { "type": "package", "compile": { "lib/netstandard2.0/CommandLine.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/CommandLine.dll": { "related": ".xml" } } }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "compile": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} } }, "LiteDB/4.1.4": { "type": "package", "dependencies": { "System.Reflection": "4.3.0", "System.Reflection.TypeExtensions": "4.3.0" }, "compile": { "lib/netstandard2.0/LiteDB.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/LiteDB.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.IO.Pipelines": "4.5.2" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Cors/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Hosting/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.Configuration.EnvironmentVariables": "2.2.0", "Microsoft.Extensions.Configuration.FileExtensions": "2.2.0", "Microsoft.Extensions.DependencyInjection": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0", "Microsoft.Extensions.Logging": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Diagnostics.DiagnosticSource": "4.5.0", "System.Reflection.Metadata": "1.6.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Server.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.ObjectPool": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Buffers": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Https": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Memory": "4.5.1", "System.Numerics.Vectors": "4.5.0", "System.Runtime.CompilerServices.Unsafe": "4.5.1", "System.Security.Cryptography.Cng": "4.5.0", "System.Threading.Tasks.Extensions": "4.5.1" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Connections.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.WebEncoders": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "type": "package", "dependencies": { "Microsoft.Net.Http.Headers": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": { "related": ".xml" } } }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": { "type": "package", "build": { "build/_._": {} } }, "Microsoft.CodeAnalysis.Common/3.7.0": { "type": "package", "dependencies": { "Microsoft.CodeAnalysis.Analyzers": "3.0.0", "System.Collections.Immutable": "1.5.0", "System.Memory": "4.5.4", "System.Reflection.Metadata": "1.6.0", "System.Runtime.CompilerServices.Unsafe": "4.7.0", "System.Text.Encoding.CodePages": "4.5.1", "System.Threading.Tasks.Extensions": "4.5.3" }, "compile": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": { "related": ".pdb;.xml" } }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": { "related": ".pdb;.xml" } }, "resource": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "type": "package", "dependencies": { "Microsoft.CodeAnalysis.Common": "[3.7.0]" }, "compile": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": { "related": ".pdb;.xml" } }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": { "related": ".pdb;.xml" } }, "resource": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.Extensions.Configuration/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0" }, "compile": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": { "related": ".xml" } } }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.FileSystemGlobbing": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": { "related": ".xml" } } }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Logging/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.ObjectPool/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Options/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Primitives": "2.2.0", "System.ComponentModel.Annotations": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Primitives/2.2.0": { "type": "package", "dependencies": { "System.Memory": "4.5.1", "System.Runtime.CompilerServices.Unsafe": "4.5.1" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": { "related": ".xml" } } }, "Microsoft.Extensions.WebEncoders/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": { "related": ".xml" } } }, "Microsoft.Net.Http.Headers/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0", "System.Buffers": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": { "related": ".xml" } } }, "Microsoft.NETCore.Platforms/2.1.2": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.unix.Microsoft.Win32.Primitives": "4.3.0" }, "compile": { "ref/netstandard1.3/Microsoft.Win32.Primitives.dll": { "related": ".xml" } } }, "Nett/0.15.0": { "type": "package", "compile": { "lib/netstandard2.0/Nett.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Nett.dll": { "related": ".xml" } } }, "Newtonsoft.Json/12.0.3": { "type": "package", "compile": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "related": ".xml" } } }, "NLog/4.7.3": { "type": "package", "compile": { "lib/netstandard2.0/NLog.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/NLog.dll": { "related": ".xml" } } }, "PlaylistsNET/1.1.2": { "type": "package", "compile": { "lib/netstandard2.0/PlaylistsNET.dll": {} }, "runtime": { "lib/netstandard2.0/PlaylistsNET.dll": {} } }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "compile": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "related": ".xml" } } }, "runtime.any.System.Collections/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Collections.dll": {} } }, "runtime.any.System.Diagnostics.Tracing/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.5/System.Diagnostics.Tracing.dll": {} } }, "runtime.any.System.Globalization/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Globalization.dll": {} } }, "runtime.any.System.IO/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.5/System.IO.dll": {} } }, "runtime.any.System.Reflection/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.5/System.Reflection.dll": {} } }, "runtime.any.System.Reflection.Primitives/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Reflection.Primitives.dll": {} } }, "runtime.any.System.Resources.ResourceManager/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Resources.ResourceManager.dll": {} } }, "runtime.any.System.Runtime/4.3.0": { "type": "package", "dependencies": { "System.Private.Uri": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.5/System.Runtime.dll": {} } }, "runtime.any.System.Runtime.Handles/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Runtime.Handles.dll": {} } }, "runtime.any.System.Runtime.InteropServices/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.6/System.Runtime.InteropServices.dll": {} } }, "runtime.any.System.Text.Encoding/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Text.Encoding.dll": {} } }, "runtime.any.System.Text.Encoding.Extensions/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Text.Encoding.Extensions.dll": {} } }, "runtime.any.System.Threading.Tasks/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.Tasks.dll": {} } }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package" }, "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package" }, "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package" }, "runtime.native.System/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "dependencies": { "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package" }, "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package" }, "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package" }, "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package" }, "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package" }, "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package" }, "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package" }, "runtime.unix.Microsoft.Win32.Primitives/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "runtimes/unix/lib/netstandard1.3/Microsoft.Win32.Primitives.dll": {} } }, "runtime.unix.System.Diagnostics.Debug/4.3.0": { "type": "package", "dependencies": { "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "runtimes/unix/lib/netstandard1.3/System.Diagnostics.Debug.dll": {} } }, "runtime.unix.System.IO.FileSystem/4.3.0": { "type": "package", "dependencies": { "System.Buffers": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Text.Encoding.Extensions": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "runtimes/unix/lib/netstandard1.3/System.IO.FileSystem.dll": {} } }, "runtime.unix.System.Net.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Threading": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "runtimes/unix/lib/netstandard1.3/System.Net.Primitives.dll": {} } }, "runtime.unix.System.Net.Sockets/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.Net.NameResolution": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "runtimes/unix/lib/netstandard1.3/System.Net.Sockets.dll": {} } }, "runtime.unix.System.Private.Uri/4.3.0": { "type": "package", "dependencies": { "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "runtimes/unix/lib/netstandard1.0/System.Private.Uri.dll": {} } }, "runtime.unix.System.Runtime.Extensions/4.3.0": { "type": "package", "dependencies": { "System.Private.Uri": "4.3.0", "runtime.native.System": "4.3.0", "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "runtimes/unix/lib/netstandard1.5/System.Runtime.Extensions.dll": {} } }, "SixLabors.ImageSharp/1.0.0": { "type": "package", "compile": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": { "related": ".xml" } } }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "compile": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} }, "runtime": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} } }, "System.Buffers/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Collections/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Collections": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Collections.dll": { "related": ".xml" } } }, "System.Collections.Immutable/1.5.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Collections.Immutable.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/System.Collections.Immutable.dll": { "related": ".xml" } } }, "System.ComponentModel.Annotations/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.unix.System.Diagnostics.Debug": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Diagnostics.Debug.dll": { "related": ".xml" } } }, "System.Diagnostics.DiagnosticSource/4.5.0": { "type": "package", "compile": { "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": { "related": ".xml" } } }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Diagnostics.Tracing": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Diagnostics.Tracing.dll": { "related": ".xml" } } }, "System.Globalization/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Globalization": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Globalization.dll": { "related": ".xml" } } }, "System.IO/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.any.System.IO": "4.3.0" }, "compile": { "ref/netstandard1.5/System.IO.dll": { "related": ".xml" } } }, "System.IO.FileSystem/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.unix.System.IO.FileSystem": "4.3.0" }, "compile": { "ref/netstandard1.3/System.IO.FileSystem.dll": { "related": ".xml" } } }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} } }, "System.IO.Pipelines/4.7.2": { "type": "package", "compile": { "ref/netcoreapp2.0/System.IO.Pipelines.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp3.0/System.IO.Pipelines.dll": { "related": ".xml" } } }, "System.Linq/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" }, "compile": { "ref/netstandard1.6/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.6/System.Linq.dll": {} } }, "System.Memory/4.5.4": { "type": "package", "compile": { "ref/netcoreapp2.1/_._": {} }, "runtime": { "lib/netcoreapp2.1/_._": {} } }, "System.Net.NameResolution/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.NameResolution.dll": { "related": ".xml" } }, "runtime": { "runtimes/unix/lib/netstandard1.3/System.Net.NameResolution.dll": {} } }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.NetworkInformation.dll": { "related": ".xml" } }, "runtime": { "runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll": {} } }, "System.Net.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "runtime.unix.System.Net.Primitives": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Primitives.dll": { "related": ".xml" } } }, "System.Net.Sockets/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.unix.System.Net.Sockets": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Sockets.dll": { "related": ".xml" } } }, "System.Numerics.Vectors/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Private.Uri/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "runtime.unix.System.Private.Uri": "4.3.0" }, "compile": { "ref/netstandard/_._": {} } }, "System.Reflection/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "runtime.any.System.Reflection": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Reflection.dll": { "related": ".xml" } } }, "System.Reflection.Metadata/1.6.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Reflection.Metadata.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/System.Reflection.Metadata.dll": { "related": ".xml" } } }, "System.Reflection.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Reflection.Primitives": "4.3.0" }, "compile": { "ref/netstandard1.0/System.Reflection.Primitives.dll": { "related": ".xml" } } }, "System.Reflection.TypeExtensions/4.3.0": { "type": "package", "dependencies": { "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Reflection.TypeExtensions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.5/System.Reflection.TypeExtensions.dll": {} } }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0", "runtime.any.System.Resources.ResourceManager": "4.3.0" }, "compile": { "ref/netstandard1.0/System.Resources.ResourceManager.dll": { "related": ".xml" } } }, "System.Runtime/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "runtime.any.System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Runtime.dll": { "related": ".xml" } } }, "System.Runtime.CompilerServices.Unsafe/4.7.0": { "type": "package", "compile": { "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll": { "related": ".xml" } } }, "System.Runtime.Extensions/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.unix.System.Runtime.Extensions": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Runtime.Extensions.dll": { "related": ".xml" } } }, "System.Runtime.Handles/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Runtime.Handles.dll": { "related": ".xml" } } }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "runtime.any.System.Runtime.InteropServices": "4.3.0" }, "compile": { "ref/netcoreapp1.1/System.Runtime.InteropServices.dll": {} } }, "System.Security.Claims/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Security.Claims.dll": {} } }, "System.Security.Cryptography.Cng/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll": {} } }, "System.Security.Principal/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.0/System.Security.Principal.dll": {} } }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll": {} } }, "System.Text.Encoding/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Text.Encoding": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Text.Encoding.dll": { "related": ".xml" } } }, "System.Text.Encoding.CodePages/4.5.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "System.Runtime.CompilerServices.Unsafe": "4.5.2" }, "compile": { "lib/netstandard2.0/System.Text.Encoding.CodePages.dll": {} }, "runtime": { "lib/netstandard2.0/System.Text.Encoding.CodePages.dll": {} } }, "System.Text.Encoding.Extensions/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "runtime.any.System.Text.Encoding.Extensions": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Text.Encoding.Extensions.dll": { "related": ".xml" } } }, "System.Text.Encodings.Web/4.5.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Text.Encodings.Web.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/System.Text.Encodings.Web.dll": { "related": ".xml" } } }, "System.Threading/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Threading.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Threading.dll": {} } }, "System.Threading.Overlapped/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll": {} } }, "System.Threading.Tasks/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Threading.Tasks.dll": { "related": ".xml" } } }, "System.Threading.Tasks.Extensions/4.5.3": { "type": "package", "compile": { "ref/netcoreapp2.1/_._": {} }, "runtime": { "lib/netcoreapp2.1/_._": {} } }, "System.Threading.Thread/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Threading.Thread.dll": {} } }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Threading.ThreadPool.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Threading.ThreadPool.dll": {} } }, "Splamy.TSLib/1.1.0": { "type": "project", "framework": ".NETCoreApp,Version=v3.1", "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2" }, "compile": { "bin/placeholder/Splamy.TSLib.dll": {} }, "runtime": { "bin/placeholder/Splamy.TSLib.dll": {} } } } }, "libraries": { "CliWrap/3.1.0": { "sha512": "vbQ+rpxRgdkWBHmZXl8De4PYzKTOxa37Tfz6Zb01OP8f7eFBOjCj5IY2+Ghb81pPMA6rCDPrYEbod1EzbcFG2w==", "type": "package", "path": "cliwrap/3.1.0", "files": [ ".nupkg.metadata", ".signature.p7s", "cliwrap.3.1.0.nupkg.sha512", "cliwrap.nuspec", "favicon.png", "lib/net461/CliWrap.dll", "lib/net461/CliWrap.xml", "lib/netcoreapp3.0/CliWrap.dll", "lib/netcoreapp3.0/CliWrap.xml", "lib/netstandard2.0/CliWrap.dll", "lib/netstandard2.0/CliWrap.xml", "lib/netstandard2.1/CliWrap.dll", "lib/netstandard2.1/CliWrap.xml" ] }, "CommandLineParser/2.8.0": { "sha512": "eco2HlKQBY4Joz9odHigzGpVzv6pjsXnY5lziioMveQxr+i2Z7xYcIOMeZTgYiqnMtMAbXMXsVhrNfWO5vJS8Q==", "type": "package", "path": "commandlineparser/2.8.0", "files": [ ".nupkg.metadata", ".signature.p7s", "CommandLine20.png", "License.md", "README.md", "commandlineparser.2.8.0.nupkg.sha512", "commandlineparser.nuspec", "lib/net40/CommandLine.dll", "lib/net40/CommandLine.xml", "lib/net45/CommandLine.dll", "lib/net45/CommandLine.xml", "lib/net461/CommandLine.dll", "lib/net461/CommandLine.xml", "lib/netstandard2.0/CommandLine.dll", "lib/netstandard2.0/CommandLine.xml" ] }, "Heijden.Dns.Portable/2.0.19": { "sha512": "i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==", "type": "package", "path": "heijden.dns.portable/2.0.19", "files": [ ".nupkg.metadata", ".signature.p7s", "heijden.dns.portable.2.0.19.nupkg.sha512", "heijden.dns.portable.nuspec", "lib/netstandard1.3/Heijden.Dns.Portable.dll" ] }, "LiteDB/4.1.4": { "sha512": "g4g9JlHzRBZl+Gd2UbiRdszZ7t8wozU2wX7+5xY5uE79tmcgcDhha+ubAP84G1VLbwQmhBGCzRfIx+epLmJciQ==", "type": "package", "path": "litedb/4.1.4", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net35/LiteDB.dll", "lib/net35/LiteDB.xml", "lib/net40/LiteDB.dll", "lib/net40/LiteDB.xml", "lib/netstandard1.3/LiteDB.dll", "lib/netstandard1.3/LiteDB.xml", "lib/netstandard2.0/LiteDB.dll", "lib/netstandard2.0/LiteDB.xml", "litedb.4.1.4.nupkg.sha512", "litedb.nuspec" ] }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "sha512": "Aqr/16Cu5XmGv7mLKJvXRxhhd05UJ7cTTSaUV4MZ3ynAzfgWjsAdpIU8FWuxwAjmVdmI8oOWuVDrbs+sRkhKnA==", "type": "package", "path": "microsoft.aspnetcore.connections.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.xml", "microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.connections.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Cors/2.2.0": { "sha512": "LFlTM3ThS3ZCILuKnjy8HyK9/IlDh3opogdbCVx6tMGyDzTQBgMPXLjGDLtMk5QmLDCcP3l1TO3z/+1viA8GUg==", "type": "package", "path": "microsoft.aspnetcore.cors/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Cors.xml", "microsoft.aspnetcore.cors.2.2.0.nupkg.sha512", "microsoft.aspnetcore.cors.nuspec" ] }, "Microsoft.AspNetCore.Hosting/2.2.0": { "sha512": "7t4RbUGugpHtQmzAkc9fpDdYJg6t/jcB2VVnjensVYbZFnLDU8pNrG0hrekk1DQG7P2UzpSqKLzDsFF0/lkkbw==", "type": "package", "path": "microsoft.aspnetcore.hosting/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.xml", "microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512", "microsoft.aspnetcore.hosting.nuspec" ] }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "sha512": "ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==", "type": "package", "path": "microsoft.aspnetcore.hosting.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.xml", "microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.hosting.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "sha512": "1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==", "type": "package", "path": "microsoft.aspnetcore.hosting.server.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.xml", "microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.hosting.server.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Http/2.2.0": { "sha512": "YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==", "type": "package", "path": "microsoft.aspnetcore.http/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.xml", "microsoft.aspnetcore.http.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.nuspec" ] }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "sha512": "Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==", "type": "package", "path": "microsoft.aspnetcore.http.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.xml", "microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "sha512": "2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==", "type": "package", "path": "microsoft.aspnetcore.http.extensions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.xml", "microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.extensions.nuspec" ] }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "sha512": "ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==", "type": "package", "path": "microsoft.aspnetcore.http.features/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.xml", "microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.features.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "sha512": "D0vGB8Tp0UNMiAhT+pwAVeqDDx2OFrfpu/plwm0WhA+1DZvTLc99eDwGISL6LAY8x7a12lhl9w7/m+VdoyDu8Q==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.xml", "microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "sha512": "F6/Vesd3ODq/ISbHfcvfRf7IzRtTvrNX8VA36Knm5e7bteJhoRA2GKQUVQ+neoO1njLvaQKnjcA3rdCZ6AF6cg==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.core/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.xml", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.xml", "microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.core.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "sha512": "nEH5mU6idUYS3/+9BKw2stMOM25ZdGwIH4P4kyj6PVkMPgQUTkBQ7l/ScPkepdhejcOlPa+g3+M4dYsSYPUJ8g==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.https/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.xml", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.xml", "microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.https.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "sha512": "j1ai2CG8BGp4mYf2TWSFjjy1pRgW9XbqhdR4EOVvrlFVbcpEPfXNIPEdjkcgK+txWCupGzkFnFF8oZsASMtmyw==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.transport.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.xml", "microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.transport.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "sha512": "qTACI0wePgAKCH+YKrMgChyfqJpjwgGZEtSuwBw6TjWLQ66THGasleia/7EZz2t2eAjwWxw8RA/D8ODrBqpj9A==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.transport.sockets/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml", "microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.transport.sockets.nuspec" ] }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "sha512": "byZDrjir6Co5EoWbraQyG0qbPCUG6XgGYQstipMF9lucOAjq/mqnIyt8B8iMWnin/ghZoOln9Y01af4rUAwOhA==", "type": "package", "path": "microsoft.aspnetcore.staticfiles/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll", "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.xml", "microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512", "microsoft.aspnetcore.staticfiles.nuspec" ] }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "sha512": "9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==", "type": "package", "path": "microsoft.aspnetcore.webutilities/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll", "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.xml", "microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512", "microsoft.aspnetcore.webutilities.nuspec" ] }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": { "sha512": "ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g==", "type": "package", "path": "microsoft.codeanalysis.analyzers/3.0.0", "hasTools": true, "files": [ ".nupkg.metadata", ".signature.p7s", "EULA.rtf", "ThirdPartyNotices.rtf", "analyzers/dotnet/cs/Microsoft.CodeAnalysis.Analyzers.dll", "analyzers/dotnet/cs/Microsoft.CodeAnalysis.CSharp.Analyzers.dll", "analyzers/dotnet/cs/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/de/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/es/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/it/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/Microsoft.CodeAnalysis.Analyzers.dll", "analyzers/dotnet/vb/Microsoft.CodeAnalysis.VisualBasic.Analyzers.dll", "analyzers/dotnet/vb/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/de/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/es/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/it/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll", "build/Microsoft.CodeAnalysis.Analyzers.props", "build/Microsoft.CodeAnalysis.Analyzers.targets", "documentation/Analyzer Configuration.md", "documentation/Microsoft.CodeAnalysis.Analyzers.md", "documentation/Microsoft.CodeAnalysis.Analyzers.sarif", "editorconfig/AllRulesDefault/.editorconfig", "editorconfig/AllRulesDisabled/.editorconfig", "editorconfig/AllRulesEnabled/.editorconfig", "editorconfig/CorrectnessRulesDefault/.editorconfig", "editorconfig/CorrectnessRulesEnabled/.editorconfig", "editorconfig/DataflowRulesDefault/.editorconfig", "editorconfig/DataflowRulesEnabled/.editorconfig", "editorconfig/LibraryRulesDefault/.editorconfig", "editorconfig/LibraryRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCompatibilityRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCompatibilityRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCorrectnessRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCorrectnessRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDesignRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDesignRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDocumentationRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDocumentationRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisLocalizationRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisLocalizationRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisPerformanceRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisPerformanceRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled/.editorconfig", "editorconfig/PortedFromFxCopRulesDefault/.editorconfig", "editorconfig/PortedFromFxCopRulesEnabled/.editorconfig", "microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512", "microsoft.codeanalysis.analyzers.nuspec", "rulesets/AllRulesDefault.ruleset", "rulesets/AllRulesDisabled.ruleset", "rulesets/AllRulesEnabled.ruleset", "rulesets/CorrectnessRulesDefault.ruleset", "rulesets/CorrectnessRulesEnabled.ruleset", "rulesets/DataflowRulesDefault.ruleset", "rulesets/DataflowRulesEnabled.ruleset", "rulesets/LibraryRulesDefault.ruleset", "rulesets/LibraryRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisCompatibilityRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisCompatibilityRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisCorrectnessRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisCorrectnessRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisDesignRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisDesignRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisDocumentationRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisDocumentationRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisLocalizationRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisLocalizationRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisPerformanceRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisPerformanceRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled.ruleset", "rulesets/PortedFromFxCopRulesDefault.ruleset", "rulesets/PortedFromFxCopRulesEnabled.ruleset", "tools/install.ps1", "tools/uninstall.ps1" ] }, "Microsoft.CodeAnalysis.Common/3.7.0": { "sha512": "SFEdnbw8204hTlde3JePYSIpNX58h/MMXa7LctUsUDigWMR8Ar9gE8LnsLqAIFM0O33JEuQbJ0G4Sat+cPGldw==", "type": "package", "path": "microsoft.codeanalysis.common/3.7.0", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "ThirdPartyNotices.rtf", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.pdb", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.xml", "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.pdb", "lib/netstandard2.0/Microsoft.CodeAnalysis.xml", "lib/netstandard2.0/cs/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/de/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/es/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/fr/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/it/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/ja/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/ko/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/pl/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/ru/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/tr/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll", "microsoft.codeanalysis.common.3.7.0.nupkg.sha512", "microsoft.codeanalysis.common.nuspec" ] }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "sha512": "sKi5PIVy9nVDerkbplY6OQhJBNzEO4XJsMGrnmb6KFEa6K1ulGCHIv6NtDjdUQ/dGrouU3OExc3yzww0COD76w==", "type": "package", "path": "microsoft.codeanalysis.csharp/3.7.0", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "ThirdPartyNotices.rtf", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.pdb", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.xml", "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.pdb", "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.xml", "lib/netstandard2.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll", "microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512", "microsoft.codeanalysis.csharp.nuspec" ] }, "Microsoft.Extensions.Configuration/2.2.0": { "sha512": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==", "type": "package", "path": "microsoft.extensions.configuration/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.xml", "microsoft.extensions.configuration.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.nuspec" ] }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "sha512": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", "type": "package", "path": "microsoft.extensions.configuration.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.xml", "microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.abstractions.nuspec" ] }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "sha512": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==", "type": "package", "path": "microsoft.extensions.configuration.binder/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.xml", "microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.binder.nuspec" ] }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "sha512": "gIqt9PkKO01hZ0zmHnWrZ1E45MDreZTVoyDbL1kMWKtDgxxWTJpYtESTEcgpvR1uB1iex1zKGYzJpOMgmuP5TQ==", "type": "package", "path": "microsoft.extensions.configuration.environmentvariables/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.xml", "microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.environmentvariables.nuspec" ] }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "sha512": "H1qCpWBC8Ed4tguTR/qYkbb3F6DI5Su3t8xyFo3/5MzAd8PwPpHzgX8X04KbBxKmk173Pb64x7xMHarczVFQUA==", "type": "package", "path": "microsoft.extensions.configuration.fileextensions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.xml", "microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.fileextensions.nuspec" ] }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "sha512": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==", "type": "package", "path": "microsoft.extensions.dependencyinjection/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net461/Microsoft.Extensions.DependencyInjection.dll", "lib/net461/Microsoft.Extensions.DependencyInjection.xml", "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll", "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.xml", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml", "microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512", "microsoft.extensions.dependencyinjection.nuspec" ] }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "sha512": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==", "type": "package", "path": "microsoft.extensions.dependencyinjection.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", "microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.dependencyinjection.abstractions.nuspec" ] }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "sha512": "EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==", "type": "package", "path": "microsoft.extensions.fileproviders.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.xml", "microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.fileproviders.abstractions.nuspec" ] }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "sha512": "tbDHZnBJkjYd9NjlRZ9ondDiv1Te3KYCTW2RWpR1B0e1Z8+EnFRo7qNnHkkSCixLdlPZzhjlX24d/PixQ7w2dA==", "type": "package", "path": "microsoft.extensions.fileproviders.physical/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.xml", "microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512", "microsoft.extensions.fileproviders.physical.nuspec" ] }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "sha512": "ZSsHZp3PyW6vk37tDEdypjgGlNtpJ0EixBMOfUod2Thx7GtwfFSAQXUQx8a8BN8vfWKGGMbp7jPWdoHx/At4wQ==", "type": "package", "path": "microsoft.extensions.filesystemglobbing/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll", "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.xml", "microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512", "microsoft.extensions.filesystemglobbing.nuspec" ] }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "sha512": "+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==", "type": "package", "path": "microsoft.extensions.hosting.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.xml", "microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.hosting.abstractions.nuspec" ] }, "Microsoft.Extensions.Logging/2.2.0": { "sha512": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==", "type": "package", "path": "microsoft.extensions.logging/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Logging.dll", "lib/netstandard2.0/Microsoft.Extensions.Logging.xml", "microsoft.extensions.logging.2.2.0.nupkg.sha512", "microsoft.extensions.logging.nuspec" ] }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "sha512": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==", "type": "package", "path": "microsoft.extensions.logging.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", "microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.logging.abstractions.nuspec" ] }, "Microsoft.Extensions.ObjectPool/2.2.0": { "sha512": "gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==", "type": "package", "path": "microsoft.extensions.objectpool/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll", "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.xml", "microsoft.extensions.objectpool.2.2.0.nupkg.sha512", "microsoft.extensions.objectpool.nuspec" ] }, "Microsoft.Extensions.Options/2.2.0": { "sha512": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==", "type": "package", "path": "microsoft.extensions.options/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Options.dll", "lib/netstandard2.0/Microsoft.Extensions.Options.xml", "microsoft.extensions.options.2.2.0.nupkg.sha512", "microsoft.extensions.options.nuspec" ] }, "Microsoft.Extensions.Primitives/2.2.0": { "sha512": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==", "type": "package", "path": "microsoft.extensions.primitives/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll", "lib/netstandard2.0/Microsoft.Extensions.Primitives.xml", "microsoft.extensions.primitives.2.2.0.nupkg.sha512", "microsoft.extensions.primitives.nuspec" ] }, "Microsoft.Extensions.WebEncoders/2.2.0": { "sha512": "V8XcqYcpcdBAxUhLeyYcuKmxu4CtNQA9IphTnARpQGhkop4A93v2XgM3AtaVVJo3H2cDWxWM6aeO8HxkifREqw==", "type": "package", "path": "microsoft.extensions.webencoders/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll", "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.xml", "microsoft.extensions.webencoders.2.2.0.nupkg.sha512", "microsoft.extensions.webencoders.nuspec" ] }, "Microsoft.Net.Http.Headers/2.2.0": { "sha512": "iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==", "type": "package", "path": "microsoft.net.http.headers/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll", "lib/netstandard2.0/Microsoft.Net.Http.Headers.xml", "microsoft.net.http.headers.2.2.0.nupkg.sha512", "microsoft.net.http.headers.nuspec" ] }, "Microsoft.NETCore.Platforms/2.1.2": { "sha512": "mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==", "type": "package", "path": "microsoft.netcore.platforms/2.1.2", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.0/_._", "microsoft.netcore.platforms.2.1.2.nupkg.sha512", "microsoft.netcore.platforms.nuspec", "runtime.json", "useSharedDesignerContext.txt", "version.txt" ] }, "Microsoft.NETCore.Targets/1.1.0": { "sha512": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "type": "package", "path": "microsoft.netcore.targets/1.1.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "microsoft.netcore.targets.1.1.0.nupkg.sha512", "microsoft.netcore.targets.nuspec", "runtime.json" ] }, "Microsoft.Win32.Primitives/4.3.0": { "sha512": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "type": "package", "path": "microsoft.win32.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/Microsoft.Win32.Primitives.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "microsoft.win32.primitives.4.3.0.nupkg.sha512", "microsoft.win32.primitives.nuspec", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/Microsoft.Win32.Primitives.dll", "ref/netstandard1.3/Microsoft.Win32.Primitives.dll", "ref/netstandard1.3/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "Nett/0.15.0": { "sha512": "/0SoN9ugPKfmLndtKy3gaRxOlzji94/yrNgQLe45/1ZgExj0BaVozbXD+oWD8E6MCLvTs+YWzmn315mQOXGCcw==", "type": "package", "path": "nett/0.15.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net40/Nett.dll", "lib/net40/Nett.xml", "lib/netstandard2.0/Nett.dll", "lib/netstandard2.0/Nett.xml", "nett.0.15.0.nupkg.sha512", "nett.nuspec" ] }, "Newtonsoft.Json/12.0.3": { "sha512": "6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==", "type": "package", "path": "newtonsoft.json/12.0.3", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.md", "lib/net20/Newtonsoft.Json.dll", "lib/net20/Newtonsoft.Json.xml", "lib/net35/Newtonsoft.Json.dll", "lib/net35/Newtonsoft.Json.xml", "lib/net40/Newtonsoft.Json.dll", "lib/net40/Newtonsoft.Json.xml", "lib/net45/Newtonsoft.Json.dll", "lib/net45/Newtonsoft.Json.xml", "lib/netstandard1.0/Newtonsoft.Json.dll", "lib/netstandard1.0/Newtonsoft.Json.xml", "lib/netstandard1.3/Newtonsoft.Json.dll", "lib/netstandard1.3/Newtonsoft.Json.xml", "lib/netstandard2.0/Newtonsoft.Json.dll", "lib/netstandard2.0/Newtonsoft.Json.xml", "lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.dll", "lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.xml", "lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.dll", "lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.xml", "newtonsoft.json.12.0.3.nupkg.sha512", "newtonsoft.json.nuspec", "packageIcon.png" ] }, "NLog/4.7.3": { "sha512": "3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==", "type": "package", "path": "nlog/4.7.3", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/monoandroid44/NLog.dll", "lib/monoandroid44/NLog.xml", "lib/net35/NLog.dll", "lib/net35/NLog.xml", "lib/net40-client/NLog.dll", "lib/net40-client/NLog.xml", "lib/net45/NLog.dll", "lib/net45/NLog.xml", "lib/netstandard1.3/NLog.dll", "lib/netstandard1.3/NLog.xml", "lib/netstandard1.5/NLog.dll", "lib/netstandard1.5/NLog.xml", "lib/netstandard2.0/NLog.dll", "lib/netstandard2.0/NLog.xml", "lib/sl4/NLog.dll", "lib/sl4/NLog.xml", "lib/sl5/NLog.dll", "lib/sl5/NLog.xml", "lib/wp8/NLog.dll", "lib/wp8/NLog.xml", "lib/xamarinios10/NLog.dll", "lib/xamarinios10/NLog.xml", "nlog.4.7.3.nupkg.sha512", "nlog.nuspec" ] }, "PlaylistsNET/1.1.2": { "sha512": "IGzVterTV49b9FjzY7gMUcxnzOvVDj6L07pjB821m+k2iHWazy/OhIvDCvGSMx1cvkY9ZBajXpQO5uUCZY51vw==", "type": "package", "path": "playlistsnet/1.1.2", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net45/PlaylistsNET.dll", "lib/netstandard1.4/PlaylistsNET.dll", "lib/netstandard2.0/PlaylistsNET.dll", "playlistsnet.1.1.2.nupkg.sha512", "playlistsnet.nuspec" ] }, "Portable.BouncyCastle/1.8.6.7": { "sha512": "RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==", "type": "package", "path": "portable.bouncycastle/1.8.6.7", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net40/BouncyCastle.Crypto.dll", "lib/net40/BouncyCastle.Crypto.xml", "lib/netstandard2.0/BouncyCastle.Crypto.dll", "lib/netstandard2.0/BouncyCastle.Crypto.xml", "portable.bouncycastle.1.8.6.7.nupkg.sha512", "portable.bouncycastle.nuspec" ] }, "runtime.any.System.Collections/4.3.0": { "sha512": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", "type": "package", "path": "runtime.any.system.collections/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Collections.dll", "lib/netstandard1.3/System.Collections.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.collections.4.3.0.nupkg.sha512", "runtime.any.system.collections.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Diagnostics.Tracing/4.3.0": { "sha512": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==", "type": "package", "path": "runtime.any.system.diagnostics.tracing/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Diagnostics.Tracing.dll", "lib/netstandard1.5/System.Diagnostics.Tracing.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512", "runtime.any.system.diagnostics.tracing.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Globalization/4.3.0": { "sha512": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==", "type": "package", "path": "runtime.any.system.globalization/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Globalization.dll", "lib/netstandard1.3/System.Globalization.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.globalization.4.3.0.nupkg.sha512", "runtime.any.system.globalization.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.IO/4.3.0": { "sha512": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==", "type": "package", "path": "runtime.any.system.io/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.IO.dll", "lib/netstandard1.5/System.IO.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.io.4.3.0.nupkg.sha512", "runtime.any.system.io.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Reflection/4.3.0": { "sha512": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==", "type": "package", "path": "runtime.any.system.reflection/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Reflection.dll", "lib/netstandard1.5/System.Reflection.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.reflection.4.3.0.nupkg.sha512", "runtime.any.system.reflection.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Reflection.Primitives/4.3.0": { "sha512": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==", "type": "package", "path": "runtime.any.system.reflection.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Reflection.Primitives.dll", "lib/netstandard1.3/System.Reflection.Primitives.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512", "runtime.any.system.reflection.primitives.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Resources.ResourceManager/4.3.0": { "sha512": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==", "type": "package", "path": "runtime.any.system.resources.resourcemanager/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Resources.ResourceManager.dll", "lib/netstandard1.3/System.Resources.ResourceManager.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512", "runtime.any.system.resources.resourcemanager.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Runtime/4.3.0": { "sha512": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", "type": "package", "path": "runtime.any.system.runtime/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Runtime.dll", "lib/netstandard1.5/System.Runtime.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.runtime.4.3.0.nupkg.sha512", "runtime.any.system.runtime.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Runtime.Handles/4.3.0": { "sha512": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==", "type": "package", "path": "runtime.any.system.runtime.handles/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/_._", "lib/netstandard1.3/System.Runtime.Handles.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.runtime.handles.4.3.0.nupkg.sha512", "runtime.any.system.runtime.handles.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Runtime.InteropServices/4.3.0": { "sha512": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==", "type": "package", "path": "runtime.any.system.runtime.interopservices/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Runtime.InteropServices.dll", "lib/netstandard1.5/System.Runtime.InteropServices.dll", "lib/netstandard1.6/System.Runtime.InteropServices.dll", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512", "runtime.any.system.runtime.interopservices.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Text.Encoding/4.3.0": { "sha512": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==", "type": "package", "path": "runtime.any.system.text.encoding/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Text.Encoding.dll", "lib/netstandard1.3/System.Text.Encoding.dll", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.text.encoding.4.3.0.nupkg.sha512", "runtime.any.system.text.encoding.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Text.Encoding.Extensions/4.3.0": { "sha512": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==", "type": "package", "path": "runtime.any.system.text.encoding.extensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Text.Encoding.Extensions.dll", "lib/netstandard1.3/System.Text.Encoding.Extensions.dll", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512", "runtime.any.system.text.encoding.extensions.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Threading.Tasks/4.3.0": { "sha512": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==", "type": "package", "path": "runtime.any.system.threading.tasks/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Threading.Tasks.dll", "lib/netstandard1.3/System.Threading.Tasks.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.threading.tasks.4.3.0.nupkg.sha512", "runtime.any.system.threading.tasks.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "sha512": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==", "type": "package", "path": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.nuspec", "runtimes/debian.8-x64/native/System.Security.Cryptography.Native.OpenSsl.so" ] }, "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "sha512": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==", "type": "package", "path": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.nuspec", "runtimes/fedora.23-x64/native/System.Security.Cryptography.Native.OpenSsl.so" ] }, "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "sha512": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==", "type": "package", "path": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.nuspec", "runtimes/fedora.24-x64/native/System.Security.Cryptography.Native.OpenSsl.so" ] }, "runtime.native.System/4.3.0": { "sha512": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", "type": "package", "path": "runtime.native.system/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "runtime.native.system.4.3.0.nupkg.sha512", "runtime.native.system.nuspec" ] }, "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "sha512": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", "type": "package", "path": "runtime.native.system.security.cryptography.openssl/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "runtime.native.system.security.cryptography.openssl.nuspec" ] }, "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "sha512": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==", "type": "package", "path": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.nuspec", "runtimes/opensuse.13.2-x64/native/System.Security.Cryptography.Native.OpenSsl.so" ] }, "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "sha512": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==", "type": "package", "path": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.nuspec", "runtimes/opensuse.42.1-x64/native/System.Security.Cryptography.Native.OpenSsl.so" ] }, "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "sha512": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==", "type": "package", "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.nuspec", "runtimes/osx.10.10-x64/native/System.Security.Cryptography.Native.OpenSsl.dylib" ] }, "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "sha512": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==", "type": "package", "path": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.nuspec", "runtimes/rhel.7-x64/native/System.Security.Cryptography.Native.OpenSsl.so" ] }, "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "sha512": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==", "type": "package", "path": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.nuspec", "runtimes/ubuntu.14.04-x64/native/System.Security.Cryptography.Native.OpenSsl.so" ] }, "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "sha512": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==", "type": "package", "path": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.nuspec", "runtimes/ubuntu.16.04-x64/native/System.Security.Cryptography.Native.OpenSsl.so" ] }, "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "sha512": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==", "type": "package", "path": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.nuspec", "runtimes/ubuntu.16.10-x64/native/System.Security.Cryptography.Native.OpenSsl.so" ] }, "runtime.unix.Microsoft.Win32.Primitives/4.3.0": { "sha512": "2mI2Mfq+CVatgr4RWGvAWBjoCfUafy6VNFU7G9OA52DjO8x/okfIbsEq2UPgeGfdpO7X5gmPXKT8slx0tn0Mhw==", "type": "package", "path": "runtime.unix.microsoft.win32.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "runtime.unix.microsoft.win32.primitives.4.3.0.nupkg.sha512", "runtime.unix.microsoft.win32.primitives.nuspec", "runtimes/unix/lib/netstandard1.3/Microsoft.Win32.Primitives.dll" ] }, "runtime.unix.System.Diagnostics.Debug/4.3.0": { "sha512": "WV8KLRHWVUVUDduFnvGMHt0FsEt2wK6xPl1EgDKlaMx2KnZ43A/O0GzP8wIuvAC7mq4T9V1mm90r+PXkL9FPdQ==", "type": "package", "path": "runtime.unix.system.diagnostics.debug/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "runtime.unix.system.diagnostics.debug.4.3.0.nupkg.sha512", "runtime.unix.system.diagnostics.debug.nuspec", "runtimes/unix/lib/netstandard1.3/System.Diagnostics.Debug.dll" ] }, "runtime.unix.System.IO.FileSystem/4.3.0": { "sha512": "ajmTcjrqc3vgV1TH54DRioshbEniaFbOAJ0kReGuNsp9uIcqYle0RmUo6+Qlwqe3JIs4TDxgnqs3UzX3gRJ1rA==", "type": "package", "path": "runtime.unix.system.io.filesystem/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "runtime.unix.system.io.filesystem.4.3.0.nupkg.sha512", "runtime.unix.system.io.filesystem.nuspec", "runtimes/unix/lib/netstandard1.3/System.IO.FileSystem.dll" ] }, "runtime.unix.System.Net.Primitives/4.3.0": { "sha512": "AZcRXhH7Gamr+bckUfX3iHefPIrujJTt9XWQWo0elNiP1SNasX0KBWINZkDKY0GsOrsyJ7cB4MgIRTZzLlsTKg==", "type": "package", "path": "runtime.unix.system.net.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "runtime.unix.system.net.primitives.4.3.0.nupkg.sha512", "runtime.unix.system.net.primitives.nuspec", "runtimes/unix/lib/netstandard1.3/System.Net.Primitives.dll" ] }, "runtime.unix.System.Net.Sockets/4.3.0": { "sha512": "4NcLbqajFaD3PvhOdmbieeBlKY4d8/kBfgJ5g28n6k1jWEICabvLM62gvmUS/CvyfvcZxVanKPl+E9LhPzfXZw==", "type": "package", "path": "runtime.unix.system.net.sockets/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "runtime.unix.system.net.sockets.4.3.0.nupkg.sha512", "runtime.unix.system.net.sockets.nuspec", "runtimes/unix/lib/netstandard1.3/System.Net.Sockets.dll" ] }, "runtime.unix.System.Private.Uri/4.3.0": { "sha512": "ooWzobr5RAq34r9uan1r/WPXJYG1XWy9KanrxNvEnBzbFdQbMG7Y3bVi4QxR7xZMNLOxLLTAyXvnSkfj5boZSg==", "type": "package", "path": "runtime.unix.system.private.uri/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "runtime.unix.system.private.uri.4.3.0.nupkg.sha512", "runtime.unix.system.private.uri.nuspec", "runtimes/unix/lib/netstandard1.0/System.Private.Uri.dll" ] }, "runtime.unix.System.Runtime.Extensions/4.3.0": { "sha512": "zQiTBVpiLftTQZW8GFsV0gjYikB1WMkEPIxF5O6RkUrSV/OgvRRTYgeFQha/0keBpuS0HYweraGRwhfhJ7dj7w==", "type": "package", "path": "runtime.unix.system.runtime.extensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "runtime.unix.system.runtime.extensions.4.3.0.nupkg.sha512", "runtime.unix.system.runtime.extensions.nuspec", "runtimes/unix/lib/netstandard1.5/System.Runtime.Extensions.dll" ] }, "SixLabors.ImageSharp/1.0.0": { "sha512": "8amvsk8NXnCxZV0lvJppAZJknViWgBOO/2V59IGR6DVoD13mSmG+/Z9eg5IwrHQuRHp5RD9lfXBXDZyk8rTKDg==", "type": "package", "path": "sixlabors.imagesharp/1.0.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net472/SixLabors.ImageSharp.dll", "lib/net472/SixLabors.ImageSharp.xml", "lib/netcoreapp2.1/SixLabors.ImageSharp.dll", "lib/netcoreapp2.1/SixLabors.ImageSharp.xml", "lib/netcoreapp3.1/SixLabors.ImageSharp.dll", "lib/netcoreapp3.1/SixLabors.ImageSharp.xml", "lib/netstandard1.3/SixLabors.ImageSharp.dll", "lib/netstandard1.3/SixLabors.ImageSharp.xml", "lib/netstandard2.0/SixLabors.ImageSharp.dll", "lib/netstandard2.0/SixLabors.ImageSharp.xml", "lib/netstandard2.1/SixLabors.ImageSharp.dll", "lib/netstandard2.1/SixLabors.ImageSharp.xml", "sixlabors.imagesharp.1.0.0.nupkg.sha512", "sixlabors.imagesharp.128.png", "sixlabors.imagesharp.nuspec" ] }, "Splamy.Ed25519.Toolkit/1.0.3": { "sha512": "Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==", "type": "package", "path": "splamy.ed25519.toolkit/1.0.3", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net46/Chaos.NaCl.dll", "lib/netcoreapp2.0/Chaos.NaCl.dll", "lib/netcoreapp2.1/Chaos.NaCl.dll", "lib/netstandard1.1/Chaos.NaCl.dll", "lib/netstandard2.0/Chaos.NaCl.dll", "splamy.ed25519.toolkit.1.0.3.nupkg.sha512", "splamy.ed25519.toolkit.nuspec" ] }, "System.Buffers/4.5.0": { "sha512": "pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==", "type": "package", "path": "system.buffers/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netcoreapp2.0/_._", "lib/netstandard1.1/System.Buffers.dll", "lib/netstandard1.1/System.Buffers.xml", "lib/netstandard2.0/System.Buffers.dll", "lib/netstandard2.0/System.Buffers.xml", "lib/uap10.0.16299/_._", "ref/net45/System.Buffers.dll", "ref/net45/System.Buffers.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.1/System.Buffers.dll", "ref/netstandard1.1/System.Buffers.xml", "ref/netstandard2.0/System.Buffers.dll", "ref/netstandard2.0/System.Buffers.xml", "ref/uap10.0.16299/_._", "system.buffers.4.5.0.nupkg.sha512", "system.buffers.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Collections/4.3.0": { "sha512": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "type": "package", "path": "system.collections/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Collections.dll", "ref/netcore50/System.Collections.xml", "ref/netcore50/de/System.Collections.xml", "ref/netcore50/es/System.Collections.xml", "ref/netcore50/fr/System.Collections.xml", "ref/netcore50/it/System.Collections.xml", "ref/netcore50/ja/System.Collections.xml", "ref/netcore50/ko/System.Collections.xml", "ref/netcore50/ru/System.Collections.xml", "ref/netcore50/zh-hans/System.Collections.xml", "ref/netcore50/zh-hant/System.Collections.xml", "ref/netstandard1.0/System.Collections.dll", "ref/netstandard1.0/System.Collections.xml", "ref/netstandard1.0/de/System.Collections.xml", "ref/netstandard1.0/es/System.Collections.xml", "ref/netstandard1.0/fr/System.Collections.xml", "ref/netstandard1.0/it/System.Collections.xml", "ref/netstandard1.0/ja/System.Collections.xml", "ref/netstandard1.0/ko/System.Collections.xml", "ref/netstandard1.0/ru/System.Collections.xml", "ref/netstandard1.0/zh-hans/System.Collections.xml", "ref/netstandard1.0/zh-hant/System.Collections.xml", "ref/netstandard1.3/System.Collections.dll", "ref/netstandard1.3/System.Collections.xml", "ref/netstandard1.3/de/System.Collections.xml", "ref/netstandard1.3/es/System.Collections.xml", "ref/netstandard1.3/fr/System.Collections.xml", "ref/netstandard1.3/it/System.Collections.xml", "ref/netstandard1.3/ja/System.Collections.xml", "ref/netstandard1.3/ko/System.Collections.xml", "ref/netstandard1.3/ru/System.Collections.xml", "ref/netstandard1.3/zh-hans/System.Collections.xml", "ref/netstandard1.3/zh-hant/System.Collections.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.collections.4.3.0.nupkg.sha512", "system.collections.nuspec" ] }, "System.Collections.Immutable/1.5.0": { "sha512": "EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==", "type": "package", "path": "system.collections.immutable/1.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.0/System.Collections.Immutable.dll", "lib/netstandard1.0/System.Collections.Immutable.xml", "lib/netstandard1.3/System.Collections.Immutable.dll", "lib/netstandard1.3/System.Collections.Immutable.xml", "lib/netstandard2.0/System.Collections.Immutable.dll", "lib/netstandard2.0/System.Collections.Immutable.xml", "lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.dll", "lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.xml", "system.collections.immutable.1.5.0.nupkg.sha512", "system.collections.immutable.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.ComponentModel.Annotations/4.5.0": { "sha512": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==", "type": "package", "path": "system.componentmodel.annotations/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net461/System.ComponentModel.Annotations.dll", "lib/netcore50/System.ComponentModel.Annotations.dll", "lib/netcoreapp2.0/_._", "lib/netstandard1.4/System.ComponentModel.Annotations.dll", "lib/netstandard2.0/System.ComponentModel.Annotations.dll", "lib/portable-net45+win8/_._", "lib/uap10.0.16299/_._", "lib/win8/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net461/System.ComponentModel.Annotations.dll", "ref/net461/System.ComponentModel.Annotations.xml", "ref/netcore50/System.ComponentModel.Annotations.dll", "ref/netcore50/System.ComponentModel.Annotations.xml", "ref/netcore50/de/System.ComponentModel.Annotations.xml", "ref/netcore50/es/System.ComponentModel.Annotations.xml", "ref/netcore50/fr/System.ComponentModel.Annotations.xml", "ref/netcore50/it/System.ComponentModel.Annotations.xml", "ref/netcore50/ja/System.ComponentModel.Annotations.xml", "ref/netcore50/ko/System.ComponentModel.Annotations.xml", "ref/netcore50/ru/System.ComponentModel.Annotations.xml", "ref/netcore50/zh-hans/System.ComponentModel.Annotations.xml", "ref/netcore50/zh-hant/System.ComponentModel.Annotations.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.1/System.ComponentModel.Annotations.dll", "ref/netstandard1.1/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/de/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/es/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/fr/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/it/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/ja/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/ko/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/ru/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/zh-hans/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/zh-hant/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/System.ComponentModel.Annotations.dll", "ref/netstandard1.3/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/de/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/es/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/fr/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/it/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/ja/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/ko/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/ru/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/zh-hans/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/zh-hant/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/System.ComponentModel.Annotations.dll", "ref/netstandard1.4/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/de/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/es/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/fr/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/it/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/ja/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/ko/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/ru/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/zh-hans/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/zh-hant/System.ComponentModel.Annotations.xml", "ref/netstandard2.0/System.ComponentModel.Annotations.dll", "ref/netstandard2.0/System.ComponentModel.Annotations.xml", "ref/portable-net45+win8/_._", "ref/uap10.0.16299/_._", "ref/win8/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.componentmodel.annotations.4.5.0.nupkg.sha512", "system.componentmodel.annotations.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Diagnostics.Debug/4.3.0": { "sha512": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "type": "package", "path": "system.diagnostics.debug/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Diagnostics.Debug.dll", "ref/netcore50/System.Diagnostics.Debug.xml", "ref/netcore50/de/System.Diagnostics.Debug.xml", "ref/netcore50/es/System.Diagnostics.Debug.xml", "ref/netcore50/fr/System.Diagnostics.Debug.xml", "ref/netcore50/it/System.Diagnostics.Debug.xml", "ref/netcore50/ja/System.Diagnostics.Debug.xml", "ref/netcore50/ko/System.Diagnostics.Debug.xml", "ref/netcore50/ru/System.Diagnostics.Debug.xml", "ref/netcore50/zh-hans/System.Diagnostics.Debug.xml", "ref/netcore50/zh-hant/System.Diagnostics.Debug.xml", "ref/netstandard1.0/System.Diagnostics.Debug.dll", "ref/netstandard1.0/System.Diagnostics.Debug.xml", "ref/netstandard1.0/de/System.Diagnostics.Debug.xml", "ref/netstandard1.0/es/System.Diagnostics.Debug.xml", "ref/netstandard1.0/fr/System.Diagnostics.Debug.xml", "ref/netstandard1.0/it/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ja/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ko/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ru/System.Diagnostics.Debug.xml", "ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml", "ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml", "ref/netstandard1.3/System.Diagnostics.Debug.dll", "ref/netstandard1.3/System.Diagnostics.Debug.xml", "ref/netstandard1.3/de/System.Diagnostics.Debug.xml", "ref/netstandard1.3/es/System.Diagnostics.Debug.xml", "ref/netstandard1.3/fr/System.Diagnostics.Debug.xml", "ref/netstandard1.3/it/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ja/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ko/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ru/System.Diagnostics.Debug.xml", "ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml", "ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.diagnostics.debug.4.3.0.nupkg.sha512", "system.diagnostics.debug.nuspec" ] }, "System.Diagnostics.DiagnosticSource/4.5.0": { "sha512": "eIHRELiYDQvsMToML81QFkXEEYXUSUT2F28t1SGrevWqP+epFdw80SyAXIKTXOHrIEXReFOEnEr7XlGiC2GgOg==", "type": "package", "path": "system.diagnostics.diagnosticsource/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net45/System.Diagnostics.DiagnosticSource.dll", "lib/net45/System.Diagnostics.DiagnosticSource.xml", "lib/net46/System.Diagnostics.DiagnosticSource.dll", "lib/net46/System.Diagnostics.DiagnosticSource.xml", "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll", "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml", "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll", "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml", "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll", "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml", "system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512", "system.diagnostics.diagnosticsource.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Diagnostics.Tracing/4.3.0": { "sha512": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "type": "package", "path": "system.diagnostics.tracing/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Diagnostics.Tracing.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Diagnostics.Tracing.dll", "ref/netcore50/System.Diagnostics.Tracing.dll", "ref/netcore50/System.Diagnostics.Tracing.xml", "ref/netcore50/de/System.Diagnostics.Tracing.xml", "ref/netcore50/es/System.Diagnostics.Tracing.xml", "ref/netcore50/fr/System.Diagnostics.Tracing.xml", "ref/netcore50/it/System.Diagnostics.Tracing.xml", "ref/netcore50/ja/System.Diagnostics.Tracing.xml", "ref/netcore50/ko/System.Diagnostics.Tracing.xml", "ref/netcore50/ru/System.Diagnostics.Tracing.xml", "ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml", "ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/System.Diagnostics.Tracing.dll", "ref/netstandard1.1/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/System.Diagnostics.Tracing.dll", "ref/netstandard1.2/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/System.Diagnostics.Tracing.dll", "ref/netstandard1.3/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/System.Diagnostics.Tracing.dll", "ref/netstandard1.5/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.diagnostics.tracing.4.3.0.nupkg.sha512", "system.diagnostics.tracing.nuspec" ] }, "System.Globalization/4.3.0": { "sha512": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "type": "package", "path": "system.globalization/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Globalization.dll", "ref/netcore50/System.Globalization.xml", "ref/netcore50/de/System.Globalization.xml", "ref/netcore50/es/System.Globalization.xml", "ref/netcore50/fr/System.Globalization.xml", "ref/netcore50/it/System.Globalization.xml", "ref/netcore50/ja/System.Globalization.xml", "ref/netcore50/ko/System.Globalization.xml", "ref/netcore50/ru/System.Globalization.xml", "ref/netcore50/zh-hans/System.Globalization.xml", "ref/netcore50/zh-hant/System.Globalization.xml", "ref/netstandard1.0/System.Globalization.dll", "ref/netstandard1.0/System.Globalization.xml", "ref/netstandard1.0/de/System.Globalization.xml", "ref/netstandard1.0/es/System.Globalization.xml", "ref/netstandard1.0/fr/System.Globalization.xml", "ref/netstandard1.0/it/System.Globalization.xml", "ref/netstandard1.0/ja/System.Globalization.xml", "ref/netstandard1.0/ko/System.Globalization.xml", "ref/netstandard1.0/ru/System.Globalization.xml", "ref/netstandard1.0/zh-hans/System.Globalization.xml", "ref/netstandard1.0/zh-hant/System.Globalization.xml", "ref/netstandard1.3/System.Globalization.dll", "ref/netstandard1.3/System.Globalization.xml", "ref/netstandard1.3/de/System.Globalization.xml", "ref/netstandard1.3/es/System.Globalization.xml", "ref/netstandard1.3/fr/System.Globalization.xml", "ref/netstandard1.3/it/System.Globalization.xml", "ref/netstandard1.3/ja/System.Globalization.xml", "ref/netstandard1.3/ko/System.Globalization.xml", "ref/netstandard1.3/ru/System.Globalization.xml", "ref/netstandard1.3/zh-hans/System.Globalization.xml", "ref/netstandard1.3/zh-hant/System.Globalization.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.globalization.4.3.0.nupkg.sha512", "system.globalization.nuspec" ] }, "System.IO/4.3.0": { "sha512": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "type": "package", "path": "system.io/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.IO.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.IO.dll", "ref/netcore50/System.IO.dll", "ref/netcore50/System.IO.xml", "ref/netcore50/de/System.IO.xml", "ref/netcore50/es/System.IO.xml", "ref/netcore50/fr/System.IO.xml", "ref/netcore50/it/System.IO.xml", "ref/netcore50/ja/System.IO.xml", "ref/netcore50/ko/System.IO.xml", "ref/netcore50/ru/System.IO.xml", "ref/netcore50/zh-hans/System.IO.xml", "ref/netcore50/zh-hant/System.IO.xml", "ref/netstandard1.0/System.IO.dll", "ref/netstandard1.0/System.IO.xml", "ref/netstandard1.0/de/System.IO.xml", "ref/netstandard1.0/es/System.IO.xml", "ref/netstandard1.0/fr/System.IO.xml", "ref/netstandard1.0/it/System.IO.xml", "ref/netstandard1.0/ja/System.IO.xml", "ref/netstandard1.0/ko/System.IO.xml", "ref/netstandard1.0/ru/System.IO.xml", "ref/netstandard1.0/zh-hans/System.IO.xml", "ref/netstandard1.0/zh-hant/System.IO.xml", "ref/netstandard1.3/System.IO.dll", "ref/netstandard1.3/System.IO.xml", "ref/netstandard1.3/de/System.IO.xml", "ref/netstandard1.3/es/System.IO.xml", "ref/netstandard1.3/fr/System.IO.xml", "ref/netstandard1.3/it/System.IO.xml", "ref/netstandard1.3/ja/System.IO.xml", "ref/netstandard1.3/ko/System.IO.xml", "ref/netstandard1.3/ru/System.IO.xml", "ref/netstandard1.3/zh-hans/System.IO.xml", "ref/netstandard1.3/zh-hant/System.IO.xml", "ref/netstandard1.5/System.IO.dll", "ref/netstandard1.5/System.IO.xml", "ref/netstandard1.5/de/System.IO.xml", "ref/netstandard1.5/es/System.IO.xml", "ref/netstandard1.5/fr/System.IO.xml", "ref/netstandard1.5/it/System.IO.xml", "ref/netstandard1.5/ja/System.IO.xml", "ref/netstandard1.5/ko/System.IO.xml", "ref/netstandard1.5/ru/System.IO.xml", "ref/netstandard1.5/zh-hans/System.IO.xml", "ref/netstandard1.5/zh-hant/System.IO.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.4.3.0.nupkg.sha512", "system.io.nuspec" ] }, "System.IO.FileSystem/4.3.0": { "sha512": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "type": "package", "path": "system.io.filesystem/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.IO.FileSystem.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.IO.FileSystem.dll", "ref/netstandard1.3/System.IO.FileSystem.dll", "ref/netstandard1.3/System.IO.FileSystem.xml", "ref/netstandard1.3/de/System.IO.FileSystem.xml", "ref/netstandard1.3/es/System.IO.FileSystem.xml", "ref/netstandard1.3/fr/System.IO.FileSystem.xml", "ref/netstandard1.3/it/System.IO.FileSystem.xml", "ref/netstandard1.3/ja/System.IO.FileSystem.xml", "ref/netstandard1.3/ko/System.IO.FileSystem.xml", "ref/netstandard1.3/ru/System.IO.FileSystem.xml", "ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml", "ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.filesystem.4.3.0.nupkg.sha512", "system.io.filesystem.nuspec" ] }, "System.IO.FileSystem.Primitives/4.3.0": { "sha512": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "type": "package", "path": "system.io.filesystem.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.IO.FileSystem.Primitives.dll", "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.IO.FileSystem.Primitives.dll", "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll", "ref/netstandard1.3/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.filesystem.primitives.4.3.0.nupkg.sha512", "system.io.filesystem.primitives.nuspec" ] }, "System.IO.Pipelines/4.7.2": { "sha512": "rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==", "type": "package", "path": "system.io.pipelines/4.7.2", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net461/System.IO.Pipelines.dll", "lib/net461/System.IO.Pipelines.xml", "lib/netcoreapp3.0/System.IO.Pipelines.dll", "lib/netcoreapp3.0/System.IO.Pipelines.xml", "lib/netstandard1.3/System.IO.Pipelines.dll", "lib/netstandard1.3/System.IO.Pipelines.xml", "lib/netstandard2.0/System.IO.Pipelines.dll", "lib/netstandard2.0/System.IO.Pipelines.xml", "ref/net461/System.IO.Pipelines.dll", "ref/net461/System.IO.Pipelines.xml", "ref/netcoreapp2.0/System.IO.Pipelines.dll", "ref/netcoreapp2.0/System.IO.Pipelines.xml", "system.io.pipelines.4.7.2.nupkg.sha512", "system.io.pipelines.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Linq/4.3.0": { "sha512": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "type": "package", "path": "system.linq/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net463/System.Linq.dll", "lib/netcore50/System.Linq.dll", "lib/netstandard1.6/System.Linq.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net463/System.Linq.dll", "ref/netcore50/System.Linq.dll", "ref/netcore50/System.Linq.xml", "ref/netcore50/de/System.Linq.xml", "ref/netcore50/es/System.Linq.xml", "ref/netcore50/fr/System.Linq.xml", "ref/netcore50/it/System.Linq.xml", "ref/netcore50/ja/System.Linq.xml", "ref/netcore50/ko/System.Linq.xml", "ref/netcore50/ru/System.Linq.xml", "ref/netcore50/zh-hans/System.Linq.xml", "ref/netcore50/zh-hant/System.Linq.xml", "ref/netstandard1.0/System.Linq.dll", "ref/netstandard1.0/System.Linq.xml", "ref/netstandard1.0/de/System.Linq.xml", "ref/netstandard1.0/es/System.Linq.xml", "ref/netstandard1.0/fr/System.Linq.xml", "ref/netstandard1.0/it/System.Linq.xml", "ref/netstandard1.0/ja/System.Linq.xml", "ref/netstandard1.0/ko/System.Linq.xml", "ref/netstandard1.0/ru/System.Linq.xml", "ref/netstandard1.0/zh-hans/System.Linq.xml", "ref/netstandard1.0/zh-hant/System.Linq.xml", "ref/netstandard1.6/System.Linq.dll", "ref/netstandard1.6/System.Linq.xml", "ref/netstandard1.6/de/System.Linq.xml", "ref/netstandard1.6/es/System.Linq.xml", "ref/netstandard1.6/fr/System.Linq.xml", "ref/netstandard1.6/it/System.Linq.xml", "ref/netstandard1.6/ja/System.Linq.xml", "ref/netstandard1.6/ko/System.Linq.xml", "ref/netstandard1.6/ru/System.Linq.xml", "ref/netstandard1.6/zh-hans/System.Linq.xml", "ref/netstandard1.6/zh-hant/System.Linq.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.linq.4.3.0.nupkg.sha512", "system.linq.nuspec" ] }, "System.Memory/4.5.4": { "sha512": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", "type": "package", "path": "system.memory/4.5.4", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net461/System.Memory.dll", "lib/net461/System.Memory.xml", "lib/netcoreapp2.1/_._", "lib/netstandard1.1/System.Memory.dll", "lib/netstandard1.1/System.Memory.xml", "lib/netstandard2.0/System.Memory.dll", "lib/netstandard2.0/System.Memory.xml", "ref/netcoreapp2.1/_._", "system.memory.4.5.4.nupkg.sha512", "system.memory.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Net.NameResolution/4.3.0": { "sha512": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", "type": "package", "path": "system.net.nameresolution/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Net.NameResolution.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Net.NameResolution.dll", "ref/netstandard1.3/System.Net.NameResolution.dll", "ref/netstandard1.3/System.Net.NameResolution.xml", "ref/netstandard1.3/de/System.Net.NameResolution.xml", "ref/netstandard1.3/es/System.Net.NameResolution.xml", "ref/netstandard1.3/fr/System.Net.NameResolution.xml", "ref/netstandard1.3/it/System.Net.NameResolution.xml", "ref/netstandard1.3/ja/System.Net.NameResolution.xml", "ref/netstandard1.3/ko/System.Net.NameResolution.xml", "ref/netstandard1.3/ru/System.Net.NameResolution.xml", "ref/netstandard1.3/zh-hans/System.Net.NameResolution.xml", "ref/netstandard1.3/zh-hant/System.Net.NameResolution.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/unix/lib/netstandard1.3/System.Net.NameResolution.dll", "runtimes/win/lib/net46/System.Net.NameResolution.dll", "runtimes/win/lib/netcore50/System.Net.NameResolution.dll", "runtimes/win/lib/netstandard1.3/System.Net.NameResolution.dll", "system.net.nameresolution.4.3.0.nupkg.sha512", "system.net.nameresolution.nuspec" ] }, "System.Net.NetworkInformation/4.3.0": { "sha512": "zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==", "type": "package", "path": "system.net.networkinformation/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net46/System.Net.NetworkInformation.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net46/System.Net.NetworkInformation.dll", "ref/netcore50/System.Net.NetworkInformation.dll", "ref/netcore50/System.Net.NetworkInformation.xml", "ref/netcore50/de/System.Net.NetworkInformation.xml", "ref/netcore50/es/System.Net.NetworkInformation.xml", "ref/netcore50/fr/System.Net.NetworkInformation.xml", "ref/netcore50/it/System.Net.NetworkInformation.xml", "ref/netcore50/ja/System.Net.NetworkInformation.xml", "ref/netcore50/ko/System.Net.NetworkInformation.xml", "ref/netcore50/ru/System.Net.NetworkInformation.xml", "ref/netcore50/zh-hans/System.Net.NetworkInformation.xml", "ref/netcore50/zh-hant/System.Net.NetworkInformation.xml", "ref/netstandard1.0/System.Net.NetworkInformation.dll", "ref/netstandard1.0/System.Net.NetworkInformation.xml", "ref/netstandard1.0/de/System.Net.NetworkInformation.xml", "ref/netstandard1.0/es/System.Net.NetworkInformation.xml", "ref/netstandard1.0/fr/System.Net.NetworkInformation.xml", "ref/netstandard1.0/it/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ja/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ko/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ru/System.Net.NetworkInformation.xml", "ref/netstandard1.0/zh-hans/System.Net.NetworkInformation.xml", "ref/netstandard1.0/zh-hant/System.Net.NetworkInformation.xml", "ref/netstandard1.3/System.Net.NetworkInformation.dll", "ref/netstandard1.3/System.Net.NetworkInformation.xml", "ref/netstandard1.3/de/System.Net.NetworkInformation.xml", "ref/netstandard1.3/es/System.Net.NetworkInformation.xml", "ref/netstandard1.3/fr/System.Net.NetworkInformation.xml", "ref/netstandard1.3/it/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ja/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ko/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ru/System.Net.NetworkInformation.xml", "ref/netstandard1.3/zh-hans/System.Net.NetworkInformation.xml", "ref/netstandard1.3/zh-hant/System.Net.NetworkInformation.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll", "runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll", "runtimes/win/lib/net46/System.Net.NetworkInformation.dll", "runtimes/win/lib/netcore50/System.Net.NetworkInformation.dll", "runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll", "system.net.networkinformation.4.3.0.nupkg.sha512", "system.net.networkinformation.nuspec" ] }, "System.Net.Primitives/4.3.0": { "sha512": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "type": "package", "path": "system.net.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Net.Primitives.dll", "ref/netcore50/System.Net.Primitives.xml", "ref/netcore50/de/System.Net.Primitives.xml", "ref/netcore50/es/System.Net.Primitives.xml", "ref/netcore50/fr/System.Net.Primitives.xml", "ref/netcore50/it/System.Net.Primitives.xml", "ref/netcore50/ja/System.Net.Primitives.xml", "ref/netcore50/ko/System.Net.Primitives.xml", "ref/netcore50/ru/System.Net.Primitives.xml", "ref/netcore50/zh-hans/System.Net.Primitives.xml", "ref/netcore50/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.0/System.Net.Primitives.dll", "ref/netstandard1.0/System.Net.Primitives.xml", "ref/netstandard1.0/de/System.Net.Primitives.xml", "ref/netstandard1.0/es/System.Net.Primitives.xml", "ref/netstandard1.0/fr/System.Net.Primitives.xml", "ref/netstandard1.0/it/System.Net.Primitives.xml", "ref/netstandard1.0/ja/System.Net.Primitives.xml", "ref/netstandard1.0/ko/System.Net.Primitives.xml", "ref/netstandard1.0/ru/System.Net.Primitives.xml", "ref/netstandard1.0/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.0/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.1/System.Net.Primitives.dll", "ref/netstandard1.1/System.Net.Primitives.xml", "ref/netstandard1.1/de/System.Net.Primitives.xml", "ref/netstandard1.1/es/System.Net.Primitives.xml", "ref/netstandard1.1/fr/System.Net.Primitives.xml", "ref/netstandard1.1/it/System.Net.Primitives.xml", "ref/netstandard1.1/ja/System.Net.Primitives.xml", "ref/netstandard1.1/ko/System.Net.Primitives.xml", "ref/netstandard1.1/ru/System.Net.Primitives.xml", "ref/netstandard1.1/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.1/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.3/System.Net.Primitives.dll", "ref/netstandard1.3/System.Net.Primitives.xml", "ref/netstandard1.3/de/System.Net.Primitives.xml", "ref/netstandard1.3/es/System.Net.Primitives.xml", "ref/netstandard1.3/fr/System.Net.Primitives.xml", "ref/netstandard1.3/it/System.Net.Primitives.xml", "ref/netstandard1.3/ja/System.Net.Primitives.xml", "ref/netstandard1.3/ko/System.Net.Primitives.xml", "ref/netstandard1.3/ru/System.Net.Primitives.xml", "ref/netstandard1.3/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.3/zh-hant/System.Net.Primitives.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.net.primitives.4.3.0.nupkg.sha512", "system.net.primitives.nuspec" ] }, "System.Net.Sockets/4.3.0": { "sha512": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "type": "package", "path": "system.net.sockets/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Net.Sockets.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Net.Sockets.dll", "ref/netstandard1.3/System.Net.Sockets.dll", "ref/netstandard1.3/System.Net.Sockets.xml", "ref/netstandard1.3/de/System.Net.Sockets.xml", "ref/netstandard1.3/es/System.Net.Sockets.xml", "ref/netstandard1.3/fr/System.Net.Sockets.xml", "ref/netstandard1.3/it/System.Net.Sockets.xml", "ref/netstandard1.3/ja/System.Net.Sockets.xml", "ref/netstandard1.3/ko/System.Net.Sockets.xml", "ref/netstandard1.3/ru/System.Net.Sockets.xml", "ref/netstandard1.3/zh-hans/System.Net.Sockets.xml", "ref/netstandard1.3/zh-hant/System.Net.Sockets.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.net.sockets.4.3.0.nupkg.sha512", "system.net.sockets.nuspec" ] }, "System.Numerics.Vectors/4.5.0": { "sha512": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==", "type": "package", "path": "system.numerics.vectors/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Numerics.Vectors.dll", "lib/net46/System.Numerics.Vectors.xml", "lib/netcoreapp2.0/_._", "lib/netstandard1.0/System.Numerics.Vectors.dll", "lib/netstandard1.0/System.Numerics.Vectors.xml", "lib/netstandard2.0/System.Numerics.Vectors.dll", "lib/netstandard2.0/System.Numerics.Vectors.xml", "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.dll", "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.xml", "lib/uap10.0.16299/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/System.Numerics.Vectors.dll", "ref/net45/System.Numerics.Vectors.xml", "ref/net46/System.Numerics.Vectors.dll", "ref/net46/System.Numerics.Vectors.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.0/System.Numerics.Vectors.dll", "ref/netstandard1.0/System.Numerics.Vectors.xml", "ref/netstandard2.0/System.Numerics.Vectors.dll", "ref/netstandard2.0/System.Numerics.Vectors.xml", "ref/uap10.0.16299/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.numerics.vectors.4.5.0.nupkg.sha512", "system.numerics.vectors.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Private.Uri/4.3.0": { "sha512": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", "type": "package", "path": "system.private.uri/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "system.private.uri.4.3.0.nupkg.sha512", "system.private.uri.nuspec" ] }, "System.Reflection/4.3.0": { "sha512": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "type": "package", "path": "system.reflection/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Reflection.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Reflection.dll", "ref/netcore50/System.Reflection.dll", "ref/netcore50/System.Reflection.xml", "ref/netcore50/de/System.Reflection.xml", "ref/netcore50/es/System.Reflection.xml", "ref/netcore50/fr/System.Reflection.xml", "ref/netcore50/it/System.Reflection.xml", "ref/netcore50/ja/System.Reflection.xml", "ref/netcore50/ko/System.Reflection.xml", "ref/netcore50/ru/System.Reflection.xml", "ref/netcore50/zh-hans/System.Reflection.xml", "ref/netcore50/zh-hant/System.Reflection.xml", "ref/netstandard1.0/System.Reflection.dll", "ref/netstandard1.0/System.Reflection.xml", "ref/netstandard1.0/de/System.Reflection.xml", "ref/netstandard1.0/es/System.Reflection.xml", "ref/netstandard1.0/fr/System.Reflection.xml", "ref/netstandard1.0/it/System.Reflection.xml", "ref/netstandard1.0/ja/System.Reflection.xml", "ref/netstandard1.0/ko/System.Reflection.xml", "ref/netstandard1.0/ru/System.Reflection.xml", "ref/netstandard1.0/zh-hans/System.Reflection.xml", "ref/netstandard1.0/zh-hant/System.Reflection.xml", "ref/netstandard1.3/System.Reflection.dll", "ref/netstandard1.3/System.Reflection.xml", "ref/netstandard1.3/de/System.Reflection.xml", "ref/netstandard1.3/es/System.Reflection.xml", "ref/netstandard1.3/fr/System.Reflection.xml", "ref/netstandard1.3/it/System.Reflection.xml", "ref/netstandard1.3/ja/System.Reflection.xml", "ref/netstandard1.3/ko/System.Reflection.xml", "ref/netstandard1.3/ru/System.Reflection.xml", "ref/netstandard1.3/zh-hans/System.Reflection.xml", "ref/netstandard1.3/zh-hant/System.Reflection.xml", "ref/netstandard1.5/System.Reflection.dll", "ref/netstandard1.5/System.Reflection.xml", "ref/netstandard1.5/de/System.Reflection.xml", "ref/netstandard1.5/es/System.Reflection.xml", "ref/netstandard1.5/fr/System.Reflection.xml", "ref/netstandard1.5/it/System.Reflection.xml", "ref/netstandard1.5/ja/System.Reflection.xml", "ref/netstandard1.5/ko/System.Reflection.xml", "ref/netstandard1.5/ru/System.Reflection.xml", "ref/netstandard1.5/zh-hans/System.Reflection.xml", "ref/netstandard1.5/zh-hant/System.Reflection.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.reflection.4.3.0.nupkg.sha512", "system.reflection.nuspec" ] }, "System.Reflection.Metadata/1.6.0": { "sha512": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", "type": "package", "path": "system.reflection.metadata/1.6.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.1/System.Reflection.Metadata.dll", "lib/netstandard1.1/System.Reflection.Metadata.xml", "lib/netstandard2.0/System.Reflection.Metadata.dll", "lib/netstandard2.0/System.Reflection.Metadata.xml", "lib/portable-net45+win8/System.Reflection.Metadata.dll", "lib/portable-net45+win8/System.Reflection.Metadata.xml", "system.reflection.metadata.1.6.0.nupkg.sha512", "system.reflection.metadata.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Reflection.Primitives/4.3.0": { "sha512": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "type": "package", "path": "system.reflection.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Reflection.Primitives.dll", "ref/netcore50/System.Reflection.Primitives.xml", "ref/netcore50/de/System.Reflection.Primitives.xml", "ref/netcore50/es/System.Reflection.Primitives.xml", "ref/netcore50/fr/System.Reflection.Primitives.xml", "ref/netcore50/it/System.Reflection.Primitives.xml", "ref/netcore50/ja/System.Reflection.Primitives.xml", "ref/netcore50/ko/System.Reflection.Primitives.xml", "ref/netcore50/ru/System.Reflection.Primitives.xml", "ref/netcore50/zh-hans/System.Reflection.Primitives.xml", "ref/netcore50/zh-hant/System.Reflection.Primitives.xml", "ref/netstandard1.0/System.Reflection.Primitives.dll", "ref/netstandard1.0/System.Reflection.Primitives.xml", "ref/netstandard1.0/de/System.Reflection.Primitives.xml", "ref/netstandard1.0/es/System.Reflection.Primitives.xml", "ref/netstandard1.0/fr/System.Reflection.Primitives.xml", "ref/netstandard1.0/it/System.Reflection.Primitives.xml", "ref/netstandard1.0/ja/System.Reflection.Primitives.xml", "ref/netstandard1.0/ko/System.Reflection.Primitives.xml", "ref/netstandard1.0/ru/System.Reflection.Primitives.xml", "ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml", "ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.reflection.primitives.4.3.0.nupkg.sha512", "system.reflection.primitives.nuspec" ] }, "System.Reflection.TypeExtensions/4.3.0": { "sha512": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", "type": "package", "path": "system.reflection.typeextensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Reflection.TypeExtensions.dll", "lib/net462/System.Reflection.TypeExtensions.dll", "lib/netcore50/System.Reflection.TypeExtensions.dll", "lib/netstandard1.5/System.Reflection.TypeExtensions.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Reflection.TypeExtensions.dll", "ref/net462/System.Reflection.TypeExtensions.dll", "ref/netstandard1.3/System.Reflection.TypeExtensions.dll", "ref/netstandard1.3/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/System.Reflection.TypeExtensions.dll", "ref/netstandard1.5/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll", "system.reflection.typeextensions.4.3.0.nupkg.sha512", "system.reflection.typeextensions.nuspec" ] }, "System.Resources.ResourceManager/4.3.0": { "sha512": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "type": "package", "path": "system.resources.resourcemanager/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Resources.ResourceManager.dll", "ref/netcore50/System.Resources.ResourceManager.xml", "ref/netcore50/de/System.Resources.ResourceManager.xml", "ref/netcore50/es/System.Resources.ResourceManager.xml", "ref/netcore50/fr/System.Resources.ResourceManager.xml", "ref/netcore50/it/System.Resources.ResourceManager.xml", "ref/netcore50/ja/System.Resources.ResourceManager.xml", "ref/netcore50/ko/System.Resources.ResourceManager.xml", "ref/netcore50/ru/System.Resources.ResourceManager.xml", "ref/netcore50/zh-hans/System.Resources.ResourceManager.xml", "ref/netcore50/zh-hant/System.Resources.ResourceManager.xml", "ref/netstandard1.0/System.Resources.ResourceManager.dll", "ref/netstandard1.0/System.Resources.ResourceManager.xml", "ref/netstandard1.0/de/System.Resources.ResourceManager.xml", "ref/netstandard1.0/es/System.Resources.ResourceManager.xml", "ref/netstandard1.0/fr/System.Resources.ResourceManager.xml", "ref/netstandard1.0/it/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ja/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ko/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ru/System.Resources.ResourceManager.xml", "ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml", "ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.resources.resourcemanager.4.3.0.nupkg.sha512", "system.resources.resourcemanager.nuspec" ] }, "System.Runtime/4.3.0": { "sha512": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "type": "package", "path": "system.runtime/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.dll", "lib/portable-net45+win8+wp80+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.dll", "ref/netcore50/System.Runtime.dll", "ref/netcore50/System.Runtime.xml", "ref/netcore50/de/System.Runtime.xml", "ref/netcore50/es/System.Runtime.xml", "ref/netcore50/fr/System.Runtime.xml", "ref/netcore50/it/System.Runtime.xml", "ref/netcore50/ja/System.Runtime.xml", "ref/netcore50/ko/System.Runtime.xml", "ref/netcore50/ru/System.Runtime.xml", "ref/netcore50/zh-hans/System.Runtime.xml", "ref/netcore50/zh-hant/System.Runtime.xml", "ref/netstandard1.0/System.Runtime.dll", "ref/netstandard1.0/System.Runtime.xml", "ref/netstandard1.0/de/System.Runtime.xml", "ref/netstandard1.0/es/System.Runtime.xml", "ref/netstandard1.0/fr/System.Runtime.xml", "ref/netstandard1.0/it/System.Runtime.xml", "ref/netstandard1.0/ja/System.Runtime.xml", "ref/netstandard1.0/ko/System.Runtime.xml", "ref/netstandard1.0/ru/System.Runtime.xml", "ref/netstandard1.0/zh-hans/System.Runtime.xml", "ref/netstandard1.0/zh-hant/System.Runtime.xml", "ref/netstandard1.2/System.Runtime.dll", "ref/netstandard1.2/System.Runtime.xml", "ref/netstandard1.2/de/System.Runtime.xml", "ref/netstandard1.2/es/System.Runtime.xml", "ref/netstandard1.2/fr/System.Runtime.xml", "ref/netstandard1.2/it/System.Runtime.xml", "ref/netstandard1.2/ja/System.Runtime.xml", "ref/netstandard1.2/ko/System.Runtime.xml", "ref/netstandard1.2/ru/System.Runtime.xml", "ref/netstandard1.2/zh-hans/System.Runtime.xml", "ref/netstandard1.2/zh-hant/System.Runtime.xml", "ref/netstandard1.3/System.Runtime.dll", "ref/netstandard1.3/System.Runtime.xml", "ref/netstandard1.3/de/System.Runtime.xml", "ref/netstandard1.3/es/System.Runtime.xml", "ref/netstandard1.3/fr/System.Runtime.xml", "ref/netstandard1.3/it/System.Runtime.xml", "ref/netstandard1.3/ja/System.Runtime.xml", "ref/netstandard1.3/ko/System.Runtime.xml", "ref/netstandard1.3/ru/System.Runtime.xml", "ref/netstandard1.3/zh-hans/System.Runtime.xml", "ref/netstandard1.3/zh-hant/System.Runtime.xml", "ref/netstandard1.5/System.Runtime.dll", "ref/netstandard1.5/System.Runtime.xml", "ref/netstandard1.5/de/System.Runtime.xml", "ref/netstandard1.5/es/System.Runtime.xml", "ref/netstandard1.5/fr/System.Runtime.xml", "ref/netstandard1.5/it/System.Runtime.xml", "ref/netstandard1.5/ja/System.Runtime.xml", "ref/netstandard1.5/ko/System.Runtime.xml", "ref/netstandard1.5/ru/System.Runtime.xml", "ref/netstandard1.5/zh-hans/System.Runtime.xml", "ref/netstandard1.5/zh-hant/System.Runtime.xml", "ref/portable-net45+win8+wp80+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.4.3.0.nupkg.sha512", "system.runtime.nuspec" ] }, "System.Runtime.CompilerServices.Unsafe/4.7.0": { "sha512": "IpU1lcHz8/09yDr9N+Juc7SCgNUz+RohkCQI+KsWKR67XxpFr8Z6c8t1iENCXZuRuNCc4HBwme/MDHNVCwyAKg==", "type": "package", "path": "system.runtime.compilerservices.unsafe/4.7.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.xml", "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml", "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", "ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", "ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml", "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", "system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512", "system.runtime.compilerservices.unsafe.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Runtime.Extensions/4.3.0": { "sha512": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "type": "package", "path": "system.runtime.extensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.Extensions.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.Extensions.dll", "ref/netcore50/System.Runtime.Extensions.dll", "ref/netcore50/System.Runtime.Extensions.xml", "ref/netcore50/de/System.Runtime.Extensions.xml", "ref/netcore50/es/System.Runtime.Extensions.xml", "ref/netcore50/fr/System.Runtime.Extensions.xml", "ref/netcore50/it/System.Runtime.Extensions.xml", "ref/netcore50/ja/System.Runtime.Extensions.xml", "ref/netcore50/ko/System.Runtime.Extensions.xml", "ref/netcore50/ru/System.Runtime.Extensions.xml", "ref/netcore50/zh-hans/System.Runtime.Extensions.xml", "ref/netcore50/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.0/System.Runtime.Extensions.dll", "ref/netstandard1.0/System.Runtime.Extensions.xml", "ref/netstandard1.0/de/System.Runtime.Extensions.xml", "ref/netstandard1.0/es/System.Runtime.Extensions.xml", "ref/netstandard1.0/fr/System.Runtime.Extensions.xml", "ref/netstandard1.0/it/System.Runtime.Extensions.xml", "ref/netstandard1.0/ja/System.Runtime.Extensions.xml", "ref/netstandard1.0/ko/System.Runtime.Extensions.xml", "ref/netstandard1.0/ru/System.Runtime.Extensions.xml", "ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.3/System.Runtime.Extensions.dll", "ref/netstandard1.3/System.Runtime.Extensions.xml", "ref/netstandard1.3/de/System.Runtime.Extensions.xml", "ref/netstandard1.3/es/System.Runtime.Extensions.xml", "ref/netstandard1.3/fr/System.Runtime.Extensions.xml", "ref/netstandard1.3/it/System.Runtime.Extensions.xml", "ref/netstandard1.3/ja/System.Runtime.Extensions.xml", "ref/netstandard1.3/ko/System.Runtime.Extensions.xml", "ref/netstandard1.3/ru/System.Runtime.Extensions.xml", "ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.5/System.Runtime.Extensions.dll", "ref/netstandard1.5/System.Runtime.Extensions.xml", "ref/netstandard1.5/de/System.Runtime.Extensions.xml", "ref/netstandard1.5/es/System.Runtime.Extensions.xml", "ref/netstandard1.5/fr/System.Runtime.Extensions.xml", "ref/netstandard1.5/it/System.Runtime.Extensions.xml", "ref/netstandard1.5/ja/System.Runtime.Extensions.xml", "ref/netstandard1.5/ko/System.Runtime.Extensions.xml", "ref/netstandard1.5/ru/System.Runtime.Extensions.xml", "ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.extensions.4.3.0.nupkg.sha512", "system.runtime.extensions.nuspec" ] }, "System.Runtime.Handles/4.3.0": { "sha512": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "type": "package", "path": "system.runtime.handles/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/_._", "ref/netstandard1.3/System.Runtime.Handles.dll", "ref/netstandard1.3/System.Runtime.Handles.xml", "ref/netstandard1.3/de/System.Runtime.Handles.xml", "ref/netstandard1.3/es/System.Runtime.Handles.xml", "ref/netstandard1.3/fr/System.Runtime.Handles.xml", "ref/netstandard1.3/it/System.Runtime.Handles.xml", "ref/netstandard1.3/ja/System.Runtime.Handles.xml", "ref/netstandard1.3/ko/System.Runtime.Handles.xml", "ref/netstandard1.3/ru/System.Runtime.Handles.xml", "ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml", "ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.handles.4.3.0.nupkg.sha512", "system.runtime.handles.nuspec" ] }, "System.Runtime.InteropServices/4.3.0": { "sha512": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "type": "package", "path": "system.runtime.interopservices/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.InteropServices.dll", "lib/net463/System.Runtime.InteropServices.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.InteropServices.dll", "ref/net463/System.Runtime.InteropServices.dll", "ref/netcore50/System.Runtime.InteropServices.dll", "ref/netcore50/System.Runtime.InteropServices.xml", "ref/netcore50/de/System.Runtime.InteropServices.xml", "ref/netcore50/es/System.Runtime.InteropServices.xml", "ref/netcore50/fr/System.Runtime.InteropServices.xml", "ref/netcore50/it/System.Runtime.InteropServices.xml", "ref/netcore50/ja/System.Runtime.InteropServices.xml", "ref/netcore50/ko/System.Runtime.InteropServices.xml", "ref/netcore50/ru/System.Runtime.InteropServices.xml", "ref/netcore50/zh-hans/System.Runtime.InteropServices.xml", "ref/netcore50/zh-hant/System.Runtime.InteropServices.xml", "ref/netcoreapp1.1/System.Runtime.InteropServices.dll", "ref/netstandard1.1/System.Runtime.InteropServices.dll", "ref/netstandard1.1/System.Runtime.InteropServices.xml", "ref/netstandard1.1/de/System.Runtime.InteropServices.xml", "ref/netstandard1.1/es/System.Runtime.InteropServices.xml", "ref/netstandard1.1/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.1/it/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.2/System.Runtime.InteropServices.dll", "ref/netstandard1.2/System.Runtime.InteropServices.xml", "ref/netstandard1.2/de/System.Runtime.InteropServices.xml", "ref/netstandard1.2/es/System.Runtime.InteropServices.xml", "ref/netstandard1.2/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.2/it/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.3/System.Runtime.InteropServices.dll", "ref/netstandard1.3/System.Runtime.InteropServices.xml", "ref/netstandard1.3/de/System.Runtime.InteropServices.xml", "ref/netstandard1.3/es/System.Runtime.InteropServices.xml", "ref/netstandard1.3/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.3/it/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.5/System.Runtime.InteropServices.dll", "ref/netstandard1.5/System.Runtime.InteropServices.xml", "ref/netstandard1.5/de/System.Runtime.InteropServices.xml", "ref/netstandard1.5/es/System.Runtime.InteropServices.xml", "ref/netstandard1.5/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.5/it/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.interopservices.4.3.0.nupkg.sha512", "system.runtime.interopservices.nuspec" ] }, "System.Security.Claims/4.3.0": { "sha512": "P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "type": "package", "path": "system.security.claims/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Claims.dll", "lib/netstandard1.3/System.Security.Claims.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Claims.dll", "ref/netstandard1.3/System.Security.Claims.dll", "ref/netstandard1.3/System.Security.Claims.xml", "ref/netstandard1.3/de/System.Security.Claims.xml", "ref/netstandard1.3/es/System.Security.Claims.xml", "ref/netstandard1.3/fr/System.Security.Claims.xml", "ref/netstandard1.3/it/System.Security.Claims.xml", "ref/netstandard1.3/ja/System.Security.Claims.xml", "ref/netstandard1.3/ko/System.Security.Claims.xml", "ref/netstandard1.3/ru/System.Security.Claims.xml", "ref/netstandard1.3/zh-hans/System.Security.Claims.xml", "ref/netstandard1.3/zh-hant/System.Security.Claims.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.security.claims.4.3.0.nupkg.sha512", "system.security.claims.nuspec" ] }, "System.Security.Cryptography.Cng/4.5.0": { "sha512": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==", "type": "package", "path": "system.security.cryptography.cng/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Cryptography.Cng.dll", "lib/net461/System.Security.Cryptography.Cng.dll", "lib/net462/System.Security.Cryptography.Cng.dll", "lib/net47/System.Security.Cryptography.Cng.dll", "lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll", "lib/netstandard1.3/System.Security.Cryptography.Cng.dll", "lib/netstandard1.4/System.Security.Cryptography.Cng.dll", "lib/netstandard1.6/System.Security.Cryptography.Cng.dll", "lib/netstandard2.0/System.Security.Cryptography.Cng.dll", "lib/uap10.0.16299/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Cryptography.Cng.dll", "ref/net461/System.Security.Cryptography.Cng.dll", "ref/net461/System.Security.Cryptography.Cng.xml", "ref/net462/System.Security.Cryptography.Cng.dll", "ref/net462/System.Security.Cryptography.Cng.xml", "ref/net47/System.Security.Cryptography.Cng.dll", "ref/net47/System.Security.Cryptography.Cng.xml", "ref/netcoreapp2.0/System.Security.Cryptography.Cng.dll", "ref/netcoreapp2.0/System.Security.Cryptography.Cng.xml", "ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll", "ref/netcoreapp2.1/System.Security.Cryptography.Cng.xml", "ref/netstandard1.3/System.Security.Cryptography.Cng.dll", "ref/netstandard1.4/System.Security.Cryptography.Cng.dll", "ref/netstandard1.6/System.Security.Cryptography.Cng.dll", "ref/netstandard2.0/System.Security.Cryptography.Cng.dll", "ref/netstandard2.0/System.Security.Cryptography.Cng.xml", "ref/uap10.0.16299/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/win/lib/net46/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net461/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net462/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net47/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netcoreapp2.0/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.4/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/uap10.0.16299/_._", "system.security.cryptography.cng.4.5.0.nupkg.sha512", "system.security.cryptography.cng.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Security.Principal/4.3.0": { "sha512": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "type": "package", "path": "system.security.principal/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Security.Principal.dll", "lib/netstandard1.0/System.Security.Principal.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Security.Principal.dll", "ref/netcore50/System.Security.Principal.xml", "ref/netcore50/de/System.Security.Principal.xml", "ref/netcore50/es/System.Security.Principal.xml", "ref/netcore50/fr/System.Security.Principal.xml", "ref/netcore50/it/System.Security.Principal.xml", "ref/netcore50/ja/System.Security.Principal.xml", "ref/netcore50/ko/System.Security.Principal.xml", "ref/netcore50/ru/System.Security.Principal.xml", "ref/netcore50/zh-hans/System.Security.Principal.xml", "ref/netcore50/zh-hant/System.Security.Principal.xml", "ref/netstandard1.0/System.Security.Principal.dll", "ref/netstandard1.0/System.Security.Principal.xml", "ref/netstandard1.0/de/System.Security.Principal.xml", "ref/netstandard1.0/es/System.Security.Principal.xml", "ref/netstandard1.0/fr/System.Security.Principal.xml", "ref/netstandard1.0/it/System.Security.Principal.xml", "ref/netstandard1.0/ja/System.Security.Principal.xml", "ref/netstandard1.0/ko/System.Security.Principal.xml", "ref/netstandard1.0/ru/System.Security.Principal.xml", "ref/netstandard1.0/zh-hans/System.Security.Principal.xml", "ref/netstandard1.0/zh-hant/System.Security.Principal.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.security.principal.4.3.0.nupkg.sha512", "system.security.principal.nuspec" ] }, "System.Security.Principal.Windows/4.3.0": { "sha512": "HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", "type": "package", "path": "system.security.principal.windows/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Security.Principal.Windows.dll", "ref/net46/System.Security.Principal.Windows.dll", "ref/netstandard1.3/System.Security.Principal.Windows.dll", "ref/netstandard1.3/System.Security.Principal.Windows.xml", "ref/netstandard1.3/de/System.Security.Principal.Windows.xml", "ref/netstandard1.3/es/System.Security.Principal.Windows.xml", "ref/netstandard1.3/fr/System.Security.Principal.Windows.xml", "ref/netstandard1.3/it/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ja/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ko/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ru/System.Security.Principal.Windows.xml", "ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml", "ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml", "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll", "runtimes/win/lib/net46/System.Security.Principal.Windows.dll", "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll", "system.security.principal.windows.4.3.0.nupkg.sha512", "system.security.principal.windows.nuspec" ] }, "System.Text.Encoding/4.3.0": { "sha512": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "type": "package", "path": "system.text.encoding/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Text.Encoding.dll", "ref/netcore50/System.Text.Encoding.xml", "ref/netcore50/de/System.Text.Encoding.xml", "ref/netcore50/es/System.Text.Encoding.xml", "ref/netcore50/fr/System.Text.Encoding.xml", "ref/netcore50/it/System.Text.Encoding.xml", "ref/netcore50/ja/System.Text.Encoding.xml", "ref/netcore50/ko/System.Text.Encoding.xml", "ref/netcore50/ru/System.Text.Encoding.xml", "ref/netcore50/zh-hans/System.Text.Encoding.xml", "ref/netcore50/zh-hant/System.Text.Encoding.xml", "ref/netstandard1.0/System.Text.Encoding.dll", "ref/netstandard1.0/System.Text.Encoding.xml", "ref/netstandard1.0/de/System.Text.Encoding.xml", "ref/netstandard1.0/es/System.Text.Encoding.xml", "ref/netstandard1.0/fr/System.Text.Encoding.xml", "ref/netstandard1.0/it/System.Text.Encoding.xml", "ref/netstandard1.0/ja/System.Text.Encoding.xml", "ref/netstandard1.0/ko/System.Text.Encoding.xml", "ref/netstandard1.0/ru/System.Text.Encoding.xml", "ref/netstandard1.0/zh-hans/System.Text.Encoding.xml", "ref/netstandard1.0/zh-hant/System.Text.Encoding.xml", "ref/netstandard1.3/System.Text.Encoding.dll", "ref/netstandard1.3/System.Text.Encoding.xml", "ref/netstandard1.3/de/System.Text.Encoding.xml", "ref/netstandard1.3/es/System.Text.Encoding.xml", "ref/netstandard1.3/fr/System.Text.Encoding.xml", "ref/netstandard1.3/it/System.Text.Encoding.xml", "ref/netstandard1.3/ja/System.Text.Encoding.xml", "ref/netstandard1.3/ko/System.Text.Encoding.xml", "ref/netstandard1.3/ru/System.Text.Encoding.xml", "ref/netstandard1.3/zh-hans/System.Text.Encoding.xml", "ref/netstandard1.3/zh-hant/System.Text.Encoding.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.text.encoding.4.3.0.nupkg.sha512", "system.text.encoding.nuspec" ] }, "System.Text.Encoding.CodePages/4.5.1": { "sha512": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", "type": "package", "path": "system.text.encoding.codepages/4.5.1", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Text.Encoding.CodePages.dll", "lib/net461/System.Text.Encoding.CodePages.dll", "lib/netstandard1.3/System.Text.Encoding.CodePages.dll", "lib/netstandard2.0/System.Text.Encoding.CodePages.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/win/lib/net461/System.Text.Encoding.CodePages.dll", "runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll", "runtimes/win/lib/netstandard1.3/System.Text.Encoding.CodePages.dll", "runtimes/win/lib/netstandard2.0/System.Text.Encoding.CodePages.dll", "system.text.encoding.codepages.4.5.1.nupkg.sha512", "system.text.encoding.codepages.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Text.Encoding.Extensions/4.3.0": { "sha512": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", "type": "package", "path": "system.text.encoding.extensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Text.Encoding.Extensions.dll", "ref/netcore50/System.Text.Encoding.Extensions.xml", "ref/netcore50/de/System.Text.Encoding.Extensions.xml", "ref/netcore50/es/System.Text.Encoding.Extensions.xml", "ref/netcore50/fr/System.Text.Encoding.Extensions.xml", "ref/netcore50/it/System.Text.Encoding.Extensions.xml", "ref/netcore50/ja/System.Text.Encoding.Extensions.xml", "ref/netcore50/ko/System.Text.Encoding.Extensions.xml", "ref/netcore50/ru/System.Text.Encoding.Extensions.xml", "ref/netcore50/zh-hans/System.Text.Encoding.Extensions.xml", "ref/netcore50/zh-hant/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/System.Text.Encoding.Extensions.dll", "ref/netstandard1.0/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/de/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/es/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/fr/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/it/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/ja/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/ko/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/ru/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/zh-hans/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/zh-hant/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/System.Text.Encoding.Extensions.dll", "ref/netstandard1.3/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/de/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/es/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/fr/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/it/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/ja/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/ko/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/ru/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/zh-hans/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/zh-hant/System.Text.Encoding.Extensions.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.text.encoding.extensions.4.3.0.nupkg.sha512", "system.text.encoding.extensions.nuspec" ] }, "System.Text.Encodings.Web/4.5.0": { "sha512": "Xg4G4Indi4dqP1iuAiMSwpiWS54ZghzR644OtsRCm/m/lBMG8dUBhLVN7hLm8NNrNTR+iGbshCPTwrvxZPlm4g==", "type": "package", "path": "system.text.encodings.web/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.0/System.Text.Encodings.Web.dll", "lib/netstandard1.0/System.Text.Encodings.Web.xml", "lib/netstandard2.0/System.Text.Encodings.Web.dll", "lib/netstandard2.0/System.Text.Encodings.Web.xml", "system.text.encodings.web.4.5.0.nupkg.sha512", "system.text.encodings.web.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Threading/4.3.0": { "sha512": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "type": "package", "path": "system.threading/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Threading.dll", "lib/netstandard1.3/System.Threading.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Threading.dll", "ref/netcore50/System.Threading.xml", "ref/netcore50/de/System.Threading.xml", "ref/netcore50/es/System.Threading.xml", "ref/netcore50/fr/System.Threading.xml", "ref/netcore50/it/System.Threading.xml", "ref/netcore50/ja/System.Threading.xml", "ref/netcore50/ko/System.Threading.xml", "ref/netcore50/ru/System.Threading.xml", "ref/netcore50/zh-hans/System.Threading.xml", "ref/netcore50/zh-hant/System.Threading.xml", "ref/netstandard1.0/System.Threading.dll", "ref/netstandard1.0/System.Threading.xml", "ref/netstandard1.0/de/System.Threading.xml", "ref/netstandard1.0/es/System.Threading.xml", "ref/netstandard1.0/fr/System.Threading.xml", "ref/netstandard1.0/it/System.Threading.xml", "ref/netstandard1.0/ja/System.Threading.xml", "ref/netstandard1.0/ko/System.Threading.xml", "ref/netstandard1.0/ru/System.Threading.xml", "ref/netstandard1.0/zh-hans/System.Threading.xml", "ref/netstandard1.0/zh-hant/System.Threading.xml", "ref/netstandard1.3/System.Threading.dll", "ref/netstandard1.3/System.Threading.xml", "ref/netstandard1.3/de/System.Threading.xml", "ref/netstandard1.3/es/System.Threading.xml", "ref/netstandard1.3/fr/System.Threading.xml", "ref/netstandard1.3/it/System.Threading.xml", "ref/netstandard1.3/ja/System.Threading.xml", "ref/netstandard1.3/ko/System.Threading.xml", "ref/netstandard1.3/ru/System.Threading.xml", "ref/netstandard1.3/zh-hans/System.Threading.xml", "ref/netstandard1.3/zh-hant/System.Threading.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Threading.dll", "system.threading.4.3.0.nupkg.sha512", "system.threading.nuspec" ] }, "System.Threading.Overlapped/4.3.0": { "sha512": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", "type": "package", "path": "system.threading.overlapped/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Threading.Overlapped.dll", "ref/net46/System.Threading.Overlapped.dll", "ref/netstandard1.3/System.Threading.Overlapped.dll", "ref/netstandard1.3/System.Threading.Overlapped.xml", "ref/netstandard1.3/de/System.Threading.Overlapped.xml", "ref/netstandard1.3/es/System.Threading.Overlapped.xml", "ref/netstandard1.3/fr/System.Threading.Overlapped.xml", "ref/netstandard1.3/it/System.Threading.Overlapped.xml", "ref/netstandard1.3/ja/System.Threading.Overlapped.xml", "ref/netstandard1.3/ko/System.Threading.Overlapped.xml", "ref/netstandard1.3/ru/System.Threading.Overlapped.xml", "ref/netstandard1.3/zh-hans/System.Threading.Overlapped.xml", "ref/netstandard1.3/zh-hant/System.Threading.Overlapped.xml", "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll", "runtimes/win/lib/net46/System.Threading.Overlapped.dll", "runtimes/win/lib/netcore50/System.Threading.Overlapped.dll", "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll", "system.threading.overlapped.4.3.0.nupkg.sha512", "system.threading.overlapped.nuspec" ] }, "System.Threading.Tasks/4.3.0": { "sha512": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "type": "package", "path": "system.threading.tasks/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Threading.Tasks.dll", "ref/netcore50/System.Threading.Tasks.xml", "ref/netcore50/de/System.Threading.Tasks.xml", "ref/netcore50/es/System.Threading.Tasks.xml", "ref/netcore50/fr/System.Threading.Tasks.xml", "ref/netcore50/it/System.Threading.Tasks.xml", "ref/netcore50/ja/System.Threading.Tasks.xml", "ref/netcore50/ko/System.Threading.Tasks.xml", "ref/netcore50/ru/System.Threading.Tasks.xml", "ref/netcore50/zh-hans/System.Threading.Tasks.xml", "ref/netcore50/zh-hant/System.Threading.Tasks.xml", "ref/netstandard1.0/System.Threading.Tasks.dll", "ref/netstandard1.0/System.Threading.Tasks.xml", "ref/netstandard1.0/de/System.Threading.Tasks.xml", "ref/netstandard1.0/es/System.Threading.Tasks.xml", "ref/netstandard1.0/fr/System.Threading.Tasks.xml", "ref/netstandard1.0/it/System.Threading.Tasks.xml", "ref/netstandard1.0/ja/System.Threading.Tasks.xml", "ref/netstandard1.0/ko/System.Threading.Tasks.xml", "ref/netstandard1.0/ru/System.Threading.Tasks.xml", "ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml", "ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml", "ref/netstandard1.3/System.Threading.Tasks.dll", "ref/netstandard1.3/System.Threading.Tasks.xml", "ref/netstandard1.3/de/System.Threading.Tasks.xml", "ref/netstandard1.3/es/System.Threading.Tasks.xml", "ref/netstandard1.3/fr/System.Threading.Tasks.xml", "ref/netstandard1.3/it/System.Threading.Tasks.xml", "ref/netstandard1.3/ja/System.Threading.Tasks.xml", "ref/netstandard1.3/ko/System.Threading.Tasks.xml", "ref/netstandard1.3/ru/System.Threading.Tasks.xml", "ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml", "ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.tasks.4.3.0.nupkg.sha512", "system.threading.tasks.nuspec" ] }, "System.Threading.Tasks.Extensions/4.5.3": { "sha512": "+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==", "type": "package", "path": "system.threading.tasks.extensions/4.5.3", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/netcoreapp2.1/_._", "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll", "lib/netstandard1.0/System.Threading.Tasks.Extensions.xml", "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll", "lib/netstandard2.0/System.Threading.Tasks.Extensions.xml", "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll", "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/netcoreapp2.1/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.tasks.extensions.4.5.3.nupkg.sha512", "system.threading.tasks.extensions.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Threading.Thread/4.3.0": { "sha512": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", "type": "package", "path": "system.threading.thread/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Threading.Thread.dll", "lib/netcore50/_._", "lib/netstandard1.3/System.Threading.Thread.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Threading.Thread.dll", "ref/netstandard1.3/System.Threading.Thread.dll", "ref/netstandard1.3/System.Threading.Thread.xml", "ref/netstandard1.3/de/System.Threading.Thread.xml", "ref/netstandard1.3/es/System.Threading.Thread.xml", "ref/netstandard1.3/fr/System.Threading.Thread.xml", "ref/netstandard1.3/it/System.Threading.Thread.xml", "ref/netstandard1.3/ja/System.Threading.Thread.xml", "ref/netstandard1.3/ko/System.Threading.Thread.xml", "ref/netstandard1.3/ru/System.Threading.Thread.xml", "ref/netstandard1.3/zh-hans/System.Threading.Thread.xml", "ref/netstandard1.3/zh-hant/System.Threading.Thread.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.thread.4.3.0.nupkg.sha512", "system.threading.thread.nuspec" ] }, "System.Threading.ThreadPool/4.3.0": { "sha512": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", "type": "package", "path": "system.threading.threadpool/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Threading.ThreadPool.dll", "lib/netcore50/_._", "lib/netstandard1.3/System.Threading.ThreadPool.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Threading.ThreadPool.dll", "ref/netstandard1.3/System.Threading.ThreadPool.dll", "ref/netstandard1.3/System.Threading.ThreadPool.xml", "ref/netstandard1.3/de/System.Threading.ThreadPool.xml", "ref/netstandard1.3/es/System.Threading.ThreadPool.xml", "ref/netstandard1.3/fr/System.Threading.ThreadPool.xml", "ref/netstandard1.3/it/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ja/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ko/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ru/System.Threading.ThreadPool.xml", "ref/netstandard1.3/zh-hans/System.Threading.ThreadPool.xml", "ref/netstandard1.3/zh-hant/System.Threading.ThreadPool.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.threadpool.4.3.0.nupkg.sha512", "system.threading.threadpool.nuspec" ] }, "Splamy.TSLib/1.1.0": { "type": "project", "path": "../TSLib/TSLib.csproj", "msbuildProject": "../TSLib/TSLib.csproj" } }, "projectFileDependencyGroups": { ".NETCoreApp,Version=v3.1": [ "CliWrap >= 3.1.0", "CommandLineParser >= 2.8.0", "LiteDB >= 4.1.4", "Microsoft.AspNetCore.Cors >= 2.2.0", "Microsoft.AspNetCore.Server.Kestrel >= 2.2.0", "Microsoft.AspNetCore.StaticFiles >= 2.2.0", "Microsoft.CodeAnalysis.CSharp >= 3.7.0", "NLog >= 4.7.3", "Nett >= 0.15.0", "Newtonsoft.Json >= 12.0.3", "PlaylistsNET >= 1.1.2", "SixLabors.ImageSharp >= 1.0.0", "Splamy.TSLib >= 1.1.0" ] }, "packageFolders": { "C:\\Users\\13336\\.nuget\\packages\\": {}, "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} }, "project": { "version": "1.0.0", "restore": { "projectUniqueName": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "projectName": "TS3AudioBot", "projectPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "packagesPath": "C:\\Users\\13336\\.nuget\\packages\\", "outputPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\publish\\linux-x64\\", "projectStyle": "PackageReference", "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" ], "configFilePaths": [ "C:\\Users\\13336\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": { "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "projectPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj" } } } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "dependencies": { "CliWrap": { "target": "Package", "version": "[3.1.0, )" }, "CommandLineParser": { "target": "Package", "version": "[2.8.0, )" }, "LiteDB": { "target": "Package", "version": "[4.1.4, )" }, "Microsoft.AspNetCore.Cors": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.Server.Kestrel": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.StaticFiles": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.CodeAnalysis.CSharp": { "include": "Runtime, Compile, Build, Native, ContentFiles, BuildTransitive", "target": "Package", "version": "[3.7.0, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Nett": { "target": "Package", "version": "[0.15.0, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "PlaylistsNET": { "target": "Package", "version": "[1.1.2, )" }, "SixLabors.ImageSharp": { "target": "Package", "version": "[1.0.0, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48", "net481" ], "assetTargetFallback": true, "warn": true, "downloadDependencies": [ { "name": "Microsoft.AspNetCore.App.Ref", "version": "[3.1.10, 3.1.10]" }, { "name": "Microsoft.AspNetCore.App.Runtime.linux-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.NETCore.App.Host.linux-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.NETCore.App.Ref", "version": "[3.1.0, 3.1.0]" }, { "name": "Microsoft.NETCore.App.Runtime.linux-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.WindowsDesktop.App.Ref", "version": "[3.1.0, 3.1.0]" } ], "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.201\\RuntimeIdentifierGraph.json" } }, "runtimes": { "linux-x64": { "#import": [] } } } } ================================================ FILE: TS3AudioBot/obj/publish/linux-x64/project.nuget.cache ================================================ { "version": 2, "dgSpecHash": "feDkyr6+p4BNPXLHgdp0NSpZnATQp0QhkuyK6wp9pLOhaMzgeOkgcKblcwInM4z3gjlwrMHRQGd1OQ8iAFDEwg==", "success": true, "projectFilePath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "expectedPackageFiles": [ "C:\\Users\\13336\\.nuget\\packages\\cliwrap\\3.1.0\\cliwrap.3.1.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\commandlineparser\\2.8.0\\commandlineparser.2.8.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\heijden.dns.portable\\2.0.19\\heijden.dns.portable.2.0.19.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\litedb\\4.1.4\\litedb.4.1.4.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.connections.abstractions\\2.2.0\\microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.cors\\2.2.0\\microsoft.aspnetcore.cors.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.hosting\\2.2.0\\microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.hosting.abstractions\\2.2.0\\microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.hosting.server.abstractions\\2.2.0\\microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.http\\2.2.0\\microsoft.aspnetcore.http.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.http.abstractions\\2.2.0\\microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.http.extensions\\2.2.0\\microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.http.features\\2.2.0\\microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel\\2.2.0\\microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.core\\2.2.0\\microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.https\\2.2.0\\microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.transport.abstractions\\2.2.0\\microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.transport.sockets\\2.2.0\\microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.staticfiles\\2.2.0\\microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.webutilities\\2.2.0\\microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.codeanalysis.analyzers\\3.0.0\\microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.codeanalysis.common\\3.7.0\\microsoft.codeanalysis.common.3.7.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.codeanalysis.csharp\\3.7.0\\microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.configuration\\2.2.0\\microsoft.extensions.configuration.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\2.2.0\\microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.configuration.binder\\2.2.0\\microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.configuration.environmentvariables\\2.2.0\\microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.configuration.fileextensions\\2.2.0\\microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\2.2.0\\microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\2.2.0\\microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.fileproviders.abstractions\\2.2.0\\microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.fileproviders.physical\\2.2.0\\microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.filesystemglobbing\\2.2.0\\microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.hosting.abstractions\\2.2.0\\microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.logging\\2.2.0\\microsoft.extensions.logging.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\2.2.0\\microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.objectpool\\2.2.0\\microsoft.extensions.objectpool.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.options\\2.2.0\\microsoft.extensions.options.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.primitives\\2.2.0\\microsoft.extensions.primitives.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.webencoders\\2.2.0\\microsoft.extensions.webencoders.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.net.http.headers\\2.2.0\\microsoft.net.http.headers.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.netcore.platforms\\2.1.2\\microsoft.netcore.platforms.2.1.2.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.netcore.targets\\1.1.0\\microsoft.netcore.targets.1.1.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.win32.primitives\\4.3.0\\microsoft.win32.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\nett\\0.15.0\\nett.0.15.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\newtonsoft.json\\12.0.3\\newtonsoft.json.12.0.3.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\nlog\\4.7.3\\nlog.4.7.3.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\playlistsnet\\1.1.2\\playlistsnet.1.1.2.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\portable.bouncycastle\\1.8.6.7\\portable.bouncycastle.1.8.6.7.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.collections\\4.3.0\\runtime.any.system.collections.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.diagnostics.tracing\\4.3.0\\runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.globalization\\4.3.0\\runtime.any.system.globalization.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.io\\4.3.0\\runtime.any.system.io.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.reflection\\4.3.0\\runtime.any.system.reflection.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.reflection.primitives\\4.3.0\\runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.resources.resourcemanager\\4.3.0\\runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.runtime\\4.3.0\\runtime.any.system.runtime.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.runtime.handles\\4.3.0\\runtime.any.system.runtime.handles.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.runtime.interopservices\\4.3.0\\runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.text.encoding\\4.3.0\\runtime.any.system.text.encoding.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.text.encoding.extensions\\4.3.0\\runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.threading.tasks\\4.3.0\\runtime.any.system.threading.tasks.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.native.system\\4.3.0\\runtime.native.system.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.unix.microsoft.win32.primitives\\4.3.0\\runtime.unix.microsoft.win32.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.unix.system.diagnostics.debug\\4.3.0\\runtime.unix.system.diagnostics.debug.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.unix.system.io.filesystem\\4.3.0\\runtime.unix.system.io.filesystem.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.unix.system.net.primitives\\4.3.0\\runtime.unix.system.net.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.unix.system.net.sockets\\4.3.0\\runtime.unix.system.net.sockets.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.unix.system.private.uri\\4.3.0\\runtime.unix.system.private.uri.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.unix.system.runtime.extensions\\4.3.0\\runtime.unix.system.runtime.extensions.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\sixlabors.imagesharp\\1.0.0\\sixlabors.imagesharp.1.0.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\splamy.ed25519.toolkit\\1.0.3\\splamy.ed25519.toolkit.1.0.3.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.buffers\\4.5.0\\system.buffers.4.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.collections\\4.3.0\\system.collections.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.collections.immutable\\1.5.0\\system.collections.immutable.1.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.componentmodel.annotations\\4.5.0\\system.componentmodel.annotations.4.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.diagnostics.debug\\4.3.0\\system.diagnostics.debug.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.diagnostics.diagnosticsource\\4.5.0\\system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.diagnostics.tracing\\4.3.0\\system.diagnostics.tracing.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.globalization\\4.3.0\\system.globalization.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.io\\4.3.0\\system.io.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.io.filesystem\\4.3.0\\system.io.filesystem.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.io.filesystem.primitives\\4.3.0\\system.io.filesystem.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.io.pipelines\\4.7.2\\system.io.pipelines.4.7.2.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.linq\\4.3.0\\system.linq.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.memory\\4.5.4\\system.memory.4.5.4.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.net.nameresolution\\4.3.0\\system.net.nameresolution.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.net.networkinformation\\4.3.0\\system.net.networkinformation.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.net.primitives\\4.3.0\\system.net.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.net.sockets\\4.3.0\\system.net.sockets.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.numerics.vectors\\4.5.0\\system.numerics.vectors.4.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.private.uri\\4.3.0\\system.private.uri.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.reflection\\4.3.0\\system.reflection.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.reflection.primitives\\4.3.0\\system.reflection.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.reflection.typeextensions\\4.3.0\\system.reflection.typeextensions.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.resources.resourcemanager\\4.3.0\\system.resources.resourcemanager.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.runtime\\4.3.0\\system.runtime.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\4.7.0\\system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.runtime.extensions\\4.3.0\\system.runtime.extensions.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.runtime.handles\\4.3.0\\system.runtime.handles.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.runtime.interopservices\\4.3.0\\system.runtime.interopservices.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.security.claims\\4.3.0\\system.security.claims.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.security.cryptography.cng\\4.5.0\\system.security.cryptography.cng.4.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.security.principal\\4.3.0\\system.security.principal.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.security.principal.windows\\4.3.0\\system.security.principal.windows.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.text.encoding\\4.3.0\\system.text.encoding.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.text.encoding.codepages\\4.5.1\\system.text.encoding.codepages.4.5.1.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.text.encoding.extensions\\4.3.0\\system.text.encoding.extensions.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.text.encodings.web\\4.5.0\\system.text.encodings.web.4.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.threading\\4.3.0\\system.threading.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.threading.overlapped\\4.3.0\\system.threading.overlapped.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.threading.tasks\\4.3.0\\system.threading.tasks.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.threading.tasks.extensions\\4.5.3\\system.threading.tasks.extensions.4.5.3.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.threading.thread\\4.3.0\\system.threading.thread.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.threading.threadpool\\4.3.0\\system.threading.threadpool.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.netcore.app.ref\\3.1.0\\microsoft.netcore.app.ref.3.1.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\3.1.0\\microsoft.windowsdesktop.app.ref.3.1.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.netcore.app.runtime.linux-x64\\3.1.32\\microsoft.netcore.app.runtime.linux-x64.3.1.32.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.app.runtime.linux-x64\\3.1.32\\microsoft.aspnetcore.app.runtime.linux-x64.3.1.32.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.netcore.app.host.linux-x64\\3.1.32\\microsoft.netcore.app.host.linux-x64.3.1.32.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\3.1.10\\microsoft.aspnetcore.app.ref.3.1.10.nupkg.sha512" ], "logs": [] } ================================================ FILE: TS3AudioBot/obj/publish/win-x64/TS3AudioBot.csproj.nuget.dgspec.json ================================================ { "format": 1, "restore": { "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj": {} }, "projects": { "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj": { "version": "1.0.0", "restore": { "projectUniqueName": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "projectName": "TS3AudioBot", "projectPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "packagesPath": "C:\\Users\\13336\\.nuget\\packages\\", "outputPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\publish\\win-x64\\", "projectStyle": "PackageReference", "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" ], "configFilePaths": [ "C:\\Users\\13336\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": { "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "projectPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj" } } } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "dependencies": { "CliWrap": { "target": "Package", "version": "[3.1.0, )" }, "CommandLineParser": { "target": "Package", "version": "[2.8.0, )" }, "LiteDB": { "target": "Package", "version": "[4.1.4, )" }, "Microsoft.AspNetCore.Cors": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.Server.Kestrel": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.StaticFiles": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.CodeAnalysis.CSharp": { "include": "Runtime, Compile, Build, Native, ContentFiles, BuildTransitive", "target": "Package", "version": "[3.7.0, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Nett": { "target": "Package", "version": "[0.15.0, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "PlaylistsNET": { "target": "Package", "version": "[1.1.2, )" }, "SixLabors.ImageSharp": { "target": "Package", "version": "[1.0.0, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48", "net481" ], "assetTargetFallback": true, "warn": true, "downloadDependencies": [ { "name": "Microsoft.AspNetCore.App.Ref", "version": "[3.1.10, 3.1.10]" }, { "name": "Microsoft.AspNetCore.App.Runtime.win-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.NETCore.App.Host.win-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.NETCore.App.Ref", "version": "[3.1.0, 3.1.0]" }, { "name": "Microsoft.NETCore.App.Runtime.win-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.WindowsDesktop.App.Ref", "version": "[3.1.0, 3.1.0]" }, { "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", "version": "[3.1.32, 3.1.32]" } ], "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.201\\RuntimeIdentifierGraph.json" } }, "runtimes": { "win-x64": { "#import": [] } } }, "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "version": "1.1.0", "restore": { "projectUniqueName": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "projectName": "Splamy.TSLib", "projectPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "packagesPath": "C:\\Users\\13336\\.nuget\\packages\\", "outputPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\", "projectStyle": "PackageReference", "crossTargeting": true, "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" ], "configFilePaths": [ "C:\\Users\\13336\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1", "netstandard2.0", "netstandard2.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": {} }, "netstandard2.0": { "targetAlias": "netstandard2.0", "projectReferences": {} }, "netstandard2.1": { "targetAlias": "netstandard2.1", "projectReferences": {} } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48", "net481" ], "assetTargetFallback": true, "warn": true, "downloadDependencies": [ { "name": "Microsoft.AspNetCore.App.Ref", "version": "[3.1.10, 3.1.10]" }, { "name": "Microsoft.AspNetCore.App.Runtime.win-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.NETCore.App.Ref", "version": "[3.1.0, 3.1.0]" }, { "name": "Microsoft.NETCore.App.Runtime.win-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.WindowsDesktop.App.Ref", "version": "[3.1.0, 3.1.0]" }, { "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", "version": "[3.1.32, 3.1.32]" } ], "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.201\\RuntimeIdentifierGraph.json" }, "netstandard2.0": { "targetAlias": "netstandard2.0", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NETStandard.Library": { "suppressParent": "All", "target": "Package", "version": "[2.0.3, )", "autoReferenced": true }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" }, "System.Memory": { "target": "Package", "version": "[4.5.4, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48", "net481" ], "assetTargetFallback": true, "warn": true, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.201\\RuntimeIdentifierGraph.json" }, "netstandard2.1": { "targetAlias": "netstandard2.1", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48", "net481" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "NETStandard.Library": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.201\\RuntimeIdentifierGraph.json" } }, "runtimes": { "win-x64": { "#import": [] } } } } } ================================================ FILE: TS3AudioBot/obj/publish/win-x64/TS3AudioBot.csproj.nuget.g.props ================================================  True NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ C:\Users\13336\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages PackageReference 6.5.0 C:\Users\13336\.nuget\packages\microsoft.codeanalysis.analyzers\3.0.0 ================================================ FILE: TS3AudioBot/obj/publish/win-x64/TS3AudioBot.csproj.nuget.g.targets ================================================  ================================================ FILE: TS3AudioBot/obj/publish/win-x64/project.assets.json ================================================ { "version": 3, "targets": { ".NETCoreApp,Version=v3.1": { "CliWrap/3.1.0": { "type": "package", "compile": { "lib/netcoreapp3.0/CliWrap.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp3.0/CliWrap.dll": { "related": ".xml" } } }, "CommandLineParser/2.8.0": { "type": "package", "compile": { "lib/netstandard2.0/CommandLine.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/CommandLine.dll": { "related": ".xml" } } }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "compile": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} } }, "LiteDB/4.1.4": { "type": "package", "dependencies": { "System.Reflection": "4.3.0", "System.Reflection.TypeExtensions": "4.3.0" }, "compile": { "lib/netstandard2.0/LiteDB.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/LiteDB.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.IO.Pipelines": "4.5.2" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Cors/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Hosting/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.Configuration.EnvironmentVariables": "2.2.0", "Microsoft.Extensions.Configuration.FileExtensions": "2.2.0", "Microsoft.Extensions.DependencyInjection": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0", "Microsoft.Extensions.Logging": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Diagnostics.DiagnosticSource": "4.5.0", "System.Reflection.Metadata": "1.6.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Server.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.ObjectPool": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Buffers": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Https": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Memory": "4.5.1", "System.Numerics.Vectors": "4.5.0", "System.Runtime.CompilerServices.Unsafe": "4.5.1", "System.Security.Cryptography.Cng": "4.5.0", "System.Threading.Tasks.Extensions": "4.5.1" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Connections.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.WebEncoders": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "type": "package", "dependencies": { "Microsoft.Net.Http.Headers": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": { "related": ".xml" } } }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": { "type": "package", "build": { "build/_._": {} } }, "Microsoft.CodeAnalysis.Common/3.7.0": { "type": "package", "dependencies": { "Microsoft.CodeAnalysis.Analyzers": "3.0.0", "System.Collections.Immutable": "1.5.0", "System.Memory": "4.5.4", "System.Reflection.Metadata": "1.6.0", "System.Runtime.CompilerServices.Unsafe": "4.7.0", "System.Text.Encoding.CodePages": "4.5.1", "System.Threading.Tasks.Extensions": "4.5.3" }, "compile": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": { "related": ".pdb;.xml" } }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": { "related": ".pdb;.xml" } }, "resource": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "type": "package", "dependencies": { "Microsoft.CodeAnalysis.Common": "[3.7.0]" }, "compile": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": { "related": ".pdb;.xml" } }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": { "related": ".pdb;.xml" } }, "resource": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.Extensions.Configuration/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0" }, "compile": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": { "related": ".xml" } } }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.FileSystemGlobbing": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": { "related": ".xml" } } }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Logging/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.ObjectPool/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Options/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Primitives": "2.2.0", "System.ComponentModel.Annotations": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Primitives/2.2.0": { "type": "package", "dependencies": { "System.Memory": "4.5.1", "System.Runtime.CompilerServices.Unsafe": "4.5.1" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": { "related": ".xml" } } }, "Microsoft.Extensions.WebEncoders/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": { "related": ".xml" } } }, "Microsoft.Net.Http.Headers/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0", "System.Buffers": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": { "related": ".xml" } } }, "Microsoft.NETCore.Platforms/2.1.2": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } } }, "Nett/0.15.0": { "type": "package", "compile": { "lib/netstandard2.0/Nett.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Nett.dll": { "related": ".xml" } } }, "Newtonsoft.Json/12.0.3": { "type": "package", "compile": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "related": ".xml" } } }, "NLog/4.7.3": { "type": "package", "compile": { "lib/netstandard2.0/NLog.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/NLog.dll": { "related": ".xml" } } }, "PlaylistsNET/1.1.2": { "type": "package", "compile": { "lib/netstandard2.0/PlaylistsNET.dll": {} }, "runtime": { "lib/netstandard2.0/PlaylistsNET.dll": {} } }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "compile": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "related": ".xml" } } }, "runtime.native.System/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "SixLabors.ImageSharp/1.0.0": { "type": "package", "compile": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": { "related": ".xml" } } }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "compile": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} }, "runtime": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} } }, "System.Buffers/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Collections/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } } }, "System.Collections.Immutable/1.5.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Collections.Immutable.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/System.Collections.Immutable.dll": { "related": ".xml" } } }, "System.ComponentModel.Annotations/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } } }, "System.Diagnostics.DiagnosticSource/4.5.0": { "type": "package", "compile": { "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": { "related": ".xml" } } }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": { "related": ".xml" } } }, "System.Globalization/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } } }, "System.IO/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.5/System.IO.dll": { "related": ".xml" } } }, "System.IO.FileSystem/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } } }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} } }, "System.IO.Pipelines/4.7.2": { "type": "package", "compile": { "ref/netcoreapp2.0/System.IO.Pipelines.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp3.0/System.IO.Pipelines.dll": { "related": ".xml" } } }, "System.Linq/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" }, "compile": { "ref/netstandard1.6/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.6/System.Linq.dll": {} } }, "System.Memory/4.5.4": { "type": "package", "compile": { "ref/netcoreapp2.1/_._": {} }, "runtime": { "lib/netcoreapp2.1/_._": {} } }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.NetworkInformation.dll": { "related": ".xml" } }, "runtimeTargets": { "runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "linux" }, "runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "osx" }, "runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Net.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Primitives.dll": { "related": ".xml" } } }, "System.Net.Sockets/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Sockets.dll": { "related": ".xml" } } }, "System.Numerics.Vectors/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Reflection/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Reflection.dll": { "related": ".xml" } } }, "System.Reflection.Metadata/1.6.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Reflection.Metadata.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/System.Reflection.Metadata.dll": { "related": ".xml" } } }, "System.Reflection.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/System.Reflection.Primitives.dll": { "related": ".xml" } } }, "System.Reflection.TypeExtensions/4.3.0": { "type": "package", "dependencies": { "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Reflection.TypeExtensions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.5/System.Reflection.TypeExtensions.dll": {} } }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": { "related": ".xml" } } }, "System.Runtime/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "ref/netstandard1.5/System.Runtime.dll": { "related": ".xml" } } }, "System.Runtime.CompilerServices.Unsafe/4.7.0": { "type": "package", "compile": { "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll": { "related": ".xml" } } }, "System.Runtime.Extensions/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": { "related": ".xml" } } }, "System.Runtime.Handles/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Runtime.Handles.dll": { "related": ".xml" } } }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netcoreapp1.1/_._": {} } }, "System.Security.Claims/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Security.Claims.dll": {} } }, "System.Security.Cryptography.Cng/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll": {} }, "runtimeTargets": { "runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Security.Principal/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.0/System.Security.Principal.dll": {} } }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Text.Encoding/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Text.Encoding.dll": { "related": ".xml" } } }, "System.Text.Encoding.CodePages/4.5.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "System.Runtime.CompilerServices.Unsafe": "4.5.2" }, "compile": { "lib/netstandard2.0/System.Text.Encoding.CodePages.dll": {} }, "runtime": { "lib/netstandard2.0/System.Text.Encoding.CodePages.dll": {} }, "runtimeTargets": { "runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Text.Encodings.Web/4.5.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Text.Encodings.Web.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/System.Text.Encodings.Web.dll": { "related": ".xml" } } }, "System.Threading/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Threading.dll": {} } }, "System.Threading.Overlapped/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Threading.Tasks/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Threading.Tasks.dll": { "related": ".xml" } } }, "System.Threading.Tasks.Extensions/4.5.3": { "type": "package", "compile": { "ref/netcoreapp2.1/_._": {} }, "runtime": { "lib/netcoreapp2.1/_._": {} } }, "System.Threading.Thread/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Threading.Thread.dll": {} } }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Threading.ThreadPool.dll": {} } }, "Splamy.TSLib/1.1.0": { "type": "project", "framework": ".NETCoreApp,Version=v3.1", "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2" }, "compile": { "bin/placeholder/Splamy.TSLib.dll": {} }, "runtime": { "bin/placeholder/Splamy.TSLib.dll": {} } } }, ".NETCoreApp,Version=v3.1/win-x64": { "CliWrap/3.1.0": { "type": "package", "compile": { "lib/netcoreapp3.0/CliWrap.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp3.0/CliWrap.dll": { "related": ".xml" } } }, "CommandLineParser/2.8.0": { "type": "package", "compile": { "lib/netstandard2.0/CommandLine.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/CommandLine.dll": { "related": ".xml" } } }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "compile": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} } }, "LiteDB/4.1.4": { "type": "package", "dependencies": { "System.Reflection": "4.3.0", "System.Reflection.TypeExtensions": "4.3.0" }, "compile": { "lib/netstandard2.0/LiteDB.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/LiteDB.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.IO.Pipelines": "4.5.2" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Cors/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Hosting/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.Configuration.EnvironmentVariables": "2.2.0", "Microsoft.Extensions.Configuration.FileExtensions": "2.2.0", "Microsoft.Extensions.DependencyInjection": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0", "Microsoft.Extensions.Logging": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Diagnostics.DiagnosticSource": "4.5.0", "System.Reflection.Metadata": "1.6.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Server.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.ObjectPool": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Buffers": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Https": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Memory": "4.5.1", "System.Numerics.Vectors": "4.5.0", "System.Runtime.CompilerServices.Unsafe": "4.5.1", "System.Security.Cryptography.Cng": "4.5.0", "System.Threading.Tasks.Extensions": "4.5.1" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Connections.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.WebEncoders": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": { "related": ".xml" } } }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "type": "package", "dependencies": { "Microsoft.Net.Http.Headers": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": { "related": ".xml" } } }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": { "type": "package", "build": { "build/_._": {} } }, "Microsoft.CodeAnalysis.Common/3.7.0": { "type": "package", "dependencies": { "Microsoft.CodeAnalysis.Analyzers": "3.0.0", "System.Collections.Immutable": "1.5.0", "System.Memory": "4.5.4", "System.Reflection.Metadata": "1.6.0", "System.Runtime.CompilerServices.Unsafe": "4.7.0", "System.Text.Encoding.CodePages": "4.5.1", "System.Threading.Tasks.Extensions": "4.5.3" }, "compile": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": { "related": ".pdb;.xml" } }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": { "related": ".pdb;.xml" } }, "resource": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "type": "package", "dependencies": { "Microsoft.CodeAnalysis.Common": "[3.7.0]" }, "compile": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": { "related": ".pdb;.xml" } }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": { "related": ".pdb;.xml" } }, "resource": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.Extensions.Configuration/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0" }, "compile": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": { "related": ".xml" } } }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.FileSystemGlobbing": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": { "related": ".xml" } } }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Logging/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { "related": ".xml" } } }, "Microsoft.Extensions.ObjectPool/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Options/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Primitives": "2.2.0", "System.ComponentModel.Annotations": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": { "related": ".xml" } } }, "Microsoft.Extensions.Primitives/2.2.0": { "type": "package", "dependencies": { "System.Memory": "4.5.1", "System.Runtime.CompilerServices.Unsafe": "4.5.1" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": { "related": ".xml" } } }, "Microsoft.Extensions.WebEncoders/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": { "related": ".xml" } } }, "Microsoft.Net.Http.Headers/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0", "System.Buffers": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": { "related": ".xml" } } }, "Microsoft.NETCore.Platforms/2.1.2": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.win.Microsoft.Win32.Primitives": "4.3.0" }, "compile": { "ref/netstandard1.3/Microsoft.Win32.Primitives.dll": { "related": ".xml" } } }, "Nett/0.15.0": { "type": "package", "compile": { "lib/netstandard2.0/Nett.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Nett.dll": { "related": ".xml" } } }, "Newtonsoft.Json/12.0.3": { "type": "package", "compile": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "related": ".xml" } } }, "NLog/4.7.3": { "type": "package", "compile": { "lib/netstandard2.0/NLog.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/NLog.dll": { "related": ".xml" } } }, "PlaylistsNET/1.1.2": { "type": "package", "compile": { "lib/netstandard2.0/PlaylistsNET.dll": {} }, "runtime": { "lib/netstandard2.0/PlaylistsNET.dll": {} } }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "compile": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "related": ".xml" } } }, "runtime.any.System.Collections/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Collections.dll": {} } }, "runtime.any.System.Diagnostics.Tracing/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.5/System.Diagnostics.Tracing.dll": {} } }, "runtime.any.System.Globalization/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Globalization.dll": {} } }, "runtime.any.System.IO/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.5/System.IO.dll": {} } }, "runtime.any.System.Reflection/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.5/System.Reflection.dll": {} } }, "runtime.any.System.Reflection.Primitives/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Reflection.Primitives.dll": {} } }, "runtime.any.System.Resources.ResourceManager/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Resources.ResourceManager.dll": {} } }, "runtime.any.System.Runtime/4.3.0": { "type": "package", "dependencies": { "System.Private.Uri": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.5/System.Runtime.dll": {} } }, "runtime.any.System.Runtime.Handles/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Runtime.Handles.dll": {} } }, "runtime.any.System.Runtime.InteropServices/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.6/System.Runtime.InteropServices.dll": {} } }, "runtime.any.System.Text.Encoding/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Text.Encoding.dll": {} } }, "runtime.any.System.Text.Encoding.Extensions/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Text.Encoding.Extensions.dll": {} } }, "runtime.any.System.Threading.Tasks/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.Tasks.dll": {} } }, "runtime.native.System/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "runtime.win.Microsoft.Win32.Primitives/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.InteropServices": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "runtimes/win/lib/netstandard1.3/Microsoft.Win32.Primitives.dll": {} } }, "runtime.win.System.Diagnostics.Debug/4.3.0": { "type": "package", "compile": { "ref/netstandard/_._": {} }, "runtime": { "runtimes/win/lib/netstandard1.3/System.Diagnostics.Debug.dll": {} } }, "runtime.win.System.IO.FileSystem/4.3.0": { "type": "package", "dependencies": { "System.Buffers": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Text.Encoding.Extensions": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "runtimes/win/lib/netstandard1.3/System.IO.FileSystem.dll": {} } }, "runtime.win.System.Net.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Threading": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "runtimes/win/lib/netstandard1.3/System.Net.Primitives.dll": {} } }, "runtime.win.System.Net.Sockets/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Net.NameResolution": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "runtimes/win/lib/netstandard1.3/System.Net.Sockets.dll": {} } }, "runtime.win.System.Runtime.Extensions/4.3.0": { "type": "package", "dependencies": { "System.Private.Uri": "4.3.0" }, "compile": { "ref/netstandard/_._": {} }, "runtime": { "runtimes/win/lib/netstandard1.5/System.Runtime.Extensions.dll": {} } }, "SixLabors.ImageSharp/1.0.0": { "type": "package", "compile": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": { "related": ".xml" } } }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "compile": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} }, "runtime": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} } }, "System.Buffers/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Collections/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Collections": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Collections.dll": { "related": ".xml" } } }, "System.Collections.Immutable/1.5.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Collections.Immutable.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/System.Collections.Immutable.dll": { "related": ".xml" } } }, "System.ComponentModel.Annotations/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.win.System.Diagnostics.Debug": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Diagnostics.Debug.dll": { "related": ".xml" } } }, "System.Diagnostics.DiagnosticSource/4.5.0": { "type": "package", "compile": { "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": { "related": ".xml" } } }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Diagnostics.Tracing": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Diagnostics.Tracing.dll": { "related": ".xml" } } }, "System.Globalization/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Globalization": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Globalization.dll": { "related": ".xml" } } }, "System.IO/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.any.System.IO": "4.3.0" }, "compile": { "ref/netstandard1.5/System.IO.dll": { "related": ".xml" } } }, "System.IO.FileSystem/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.win.System.IO.FileSystem": "4.3.0" }, "compile": { "ref/netstandard1.3/System.IO.FileSystem.dll": { "related": ".xml" } } }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} } }, "System.IO.Pipelines/4.7.2": { "type": "package", "compile": { "ref/netcoreapp2.0/System.IO.Pipelines.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp3.0/System.IO.Pipelines.dll": { "related": ".xml" } } }, "System.Linq/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" }, "compile": { "ref/netstandard1.6/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.6/System.Linq.dll": {} } }, "System.Memory/4.5.4": { "type": "package", "compile": { "ref/netcoreapp2.1/_._": {} }, "runtime": { "lib/netcoreapp2.1/_._": {} } }, "System.Net.NameResolution/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.NameResolution.dll": { "related": ".xml" } }, "runtime": { "runtimes/win/lib/netstandard1.3/System.Net.NameResolution.dll": {} } }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.NetworkInformation.dll": { "related": ".xml" } }, "runtime": { "runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll": {} } }, "System.Net.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "runtime.win.System.Net.Primitives": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Primitives.dll": { "related": ".xml" } } }, "System.Net.Sockets/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0", "runtime.win.System.Net.Sockets": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Sockets.dll": { "related": ".xml" } } }, "System.Numerics.Vectors/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Private.Uri/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "ref/netstandard/_._": {} } }, "System.Reflection/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "runtime.any.System.Reflection": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Reflection.dll": { "related": ".xml" } } }, "System.Reflection.Metadata/1.6.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Reflection.Metadata.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/System.Reflection.Metadata.dll": { "related": ".xml" } } }, "System.Reflection.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Reflection.Primitives": "4.3.0" }, "compile": { "ref/netstandard1.0/System.Reflection.Primitives.dll": { "related": ".xml" } } }, "System.Reflection.TypeExtensions/4.3.0": { "type": "package", "dependencies": { "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Reflection.TypeExtensions.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.5/System.Reflection.TypeExtensions.dll": {} } }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0", "runtime.any.System.Resources.ResourceManager": "4.3.0" }, "compile": { "ref/netstandard1.0/System.Resources.ResourceManager.dll": { "related": ".xml" } } }, "System.Runtime/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "runtime.any.System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Runtime.dll": { "related": ".xml" } } }, "System.Runtime.CompilerServices.Unsafe/4.7.0": { "type": "package", "compile": { "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { "related": ".xml" } }, "runtime": { "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll": { "related": ".xml" } } }, "System.Runtime.Extensions/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.win.System.Runtime.Extensions": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Runtime.Extensions.dll": { "related": ".xml" } } }, "System.Runtime.Handles/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Runtime.Handles.dll": { "related": ".xml" } } }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "runtime.any.System.Runtime.InteropServices": "4.3.0" }, "compile": { "ref/netcoreapp1.1/System.Runtime.InteropServices.dll": {} } }, "System.Security.Claims/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Security.Claims.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Security.Claims.dll": {} } }, "System.Security.Cryptography.Cng/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll": { "related": ".xml" } }, "runtime": { "runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll": {} } }, "System.Security.Principal/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/System.Security.Principal.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.0/System.Security.Principal.dll": {} } }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Security.Principal.Windows.dll": { "related": ".xml" } }, "runtime": { "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll": {} } }, "System.Text.Encoding/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Text.Encoding": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Text.Encoding.dll": { "related": ".xml" } } }, "System.Text.Encoding.CodePages/4.5.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "System.Runtime.CompilerServices.Unsafe": "4.5.2" }, "compile": { "lib/netstandard2.0/System.Text.Encoding.CodePages.dll": {} }, "runtime": { "runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll": {} } }, "System.Text.Encoding.Extensions/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "runtime.any.System.Text.Encoding.Extensions": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Text.Encoding.Extensions.dll": { "related": ".xml" } } }, "System.Text.Encodings.Web/4.5.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Text.Encodings.Web.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard2.0/System.Text.Encodings.Web.dll": { "related": ".xml" } } }, "System.Threading/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Threading.dll": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Threading.dll": {} } }, "System.Threading.Overlapped/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Threading.Overlapped.dll": { "related": ".xml" } }, "runtime": { "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll": {} } }, "System.Threading.Tasks/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "runtime.any.System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Threading.Tasks.dll": { "related": ".xml" } } }, "System.Threading.Tasks.Extensions/4.5.3": { "type": "package", "compile": { "ref/netcoreapp2.1/_._": {} }, "runtime": { "lib/netcoreapp2.1/_._": {} } }, "System.Threading.Thread/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Threading.Thread.dll": {} } }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": { "related": ".xml" } }, "runtime": { "lib/netstandard1.3/System.Threading.ThreadPool.dll": {} } }, "Splamy.TSLib/1.1.0": { "type": "project", "framework": ".NETCoreApp,Version=v3.1", "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2" }, "compile": { "bin/placeholder/Splamy.TSLib.dll": {} }, "runtime": { "bin/placeholder/Splamy.TSLib.dll": {} } } } }, "libraries": { "CliWrap/3.1.0": { "sha512": "vbQ+rpxRgdkWBHmZXl8De4PYzKTOxa37Tfz6Zb01OP8f7eFBOjCj5IY2+Ghb81pPMA6rCDPrYEbod1EzbcFG2w==", "type": "package", "path": "cliwrap/3.1.0", "files": [ ".nupkg.metadata", ".signature.p7s", "cliwrap.3.1.0.nupkg.sha512", "cliwrap.nuspec", "favicon.png", "lib/net461/CliWrap.dll", "lib/net461/CliWrap.xml", "lib/netcoreapp3.0/CliWrap.dll", "lib/netcoreapp3.0/CliWrap.xml", "lib/netstandard2.0/CliWrap.dll", "lib/netstandard2.0/CliWrap.xml", "lib/netstandard2.1/CliWrap.dll", "lib/netstandard2.1/CliWrap.xml" ] }, "CommandLineParser/2.8.0": { "sha512": "eco2HlKQBY4Joz9odHigzGpVzv6pjsXnY5lziioMveQxr+i2Z7xYcIOMeZTgYiqnMtMAbXMXsVhrNfWO5vJS8Q==", "type": "package", "path": "commandlineparser/2.8.0", "files": [ ".nupkg.metadata", ".signature.p7s", "CommandLine20.png", "License.md", "README.md", "commandlineparser.2.8.0.nupkg.sha512", "commandlineparser.nuspec", "lib/net40/CommandLine.dll", "lib/net40/CommandLine.xml", "lib/net45/CommandLine.dll", "lib/net45/CommandLine.xml", "lib/net461/CommandLine.dll", "lib/net461/CommandLine.xml", "lib/netstandard2.0/CommandLine.dll", "lib/netstandard2.0/CommandLine.xml" ] }, "Heijden.Dns.Portable/2.0.19": { "sha512": "i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==", "type": "package", "path": "heijden.dns.portable/2.0.19", "files": [ ".nupkg.metadata", ".signature.p7s", "heijden.dns.portable.2.0.19.nupkg.sha512", "heijden.dns.portable.nuspec", "lib/netstandard1.3/Heijden.Dns.Portable.dll" ] }, "LiteDB/4.1.4": { "sha512": "g4g9JlHzRBZl+Gd2UbiRdszZ7t8wozU2wX7+5xY5uE79tmcgcDhha+ubAP84G1VLbwQmhBGCzRfIx+epLmJciQ==", "type": "package", "path": "litedb/4.1.4", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net35/LiteDB.dll", "lib/net35/LiteDB.xml", "lib/net40/LiteDB.dll", "lib/net40/LiteDB.xml", "lib/netstandard1.3/LiteDB.dll", "lib/netstandard1.3/LiteDB.xml", "lib/netstandard2.0/LiteDB.dll", "lib/netstandard2.0/LiteDB.xml", "litedb.4.1.4.nupkg.sha512", "litedb.nuspec" ] }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "sha512": "Aqr/16Cu5XmGv7mLKJvXRxhhd05UJ7cTTSaUV4MZ3ynAzfgWjsAdpIU8FWuxwAjmVdmI8oOWuVDrbs+sRkhKnA==", "type": "package", "path": "microsoft.aspnetcore.connections.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.xml", "microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.connections.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Cors/2.2.0": { "sha512": "LFlTM3ThS3ZCILuKnjy8HyK9/IlDh3opogdbCVx6tMGyDzTQBgMPXLjGDLtMk5QmLDCcP3l1TO3z/+1viA8GUg==", "type": "package", "path": "microsoft.aspnetcore.cors/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Cors.xml", "microsoft.aspnetcore.cors.2.2.0.nupkg.sha512", "microsoft.aspnetcore.cors.nuspec" ] }, "Microsoft.AspNetCore.Hosting/2.2.0": { "sha512": "7t4RbUGugpHtQmzAkc9fpDdYJg6t/jcB2VVnjensVYbZFnLDU8pNrG0hrekk1DQG7P2UzpSqKLzDsFF0/lkkbw==", "type": "package", "path": "microsoft.aspnetcore.hosting/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.xml", "microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512", "microsoft.aspnetcore.hosting.nuspec" ] }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "sha512": "ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==", "type": "package", "path": "microsoft.aspnetcore.hosting.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.xml", "microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.hosting.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "sha512": "1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==", "type": "package", "path": "microsoft.aspnetcore.hosting.server.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.xml", "microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.hosting.server.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Http/2.2.0": { "sha512": "YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==", "type": "package", "path": "microsoft.aspnetcore.http/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.xml", "microsoft.aspnetcore.http.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.nuspec" ] }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "sha512": "Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==", "type": "package", "path": "microsoft.aspnetcore.http.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.xml", "microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "sha512": "2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==", "type": "package", "path": "microsoft.aspnetcore.http.extensions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.xml", "microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.extensions.nuspec" ] }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "sha512": "ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==", "type": "package", "path": "microsoft.aspnetcore.http.features/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.xml", "microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.features.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "sha512": "D0vGB8Tp0UNMiAhT+pwAVeqDDx2OFrfpu/plwm0WhA+1DZvTLc99eDwGISL6LAY8x7a12lhl9w7/m+VdoyDu8Q==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.xml", "microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "sha512": "F6/Vesd3ODq/ISbHfcvfRf7IzRtTvrNX8VA36Knm5e7bteJhoRA2GKQUVQ+neoO1njLvaQKnjcA3rdCZ6AF6cg==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.core/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.xml", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.xml", "microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.core.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "sha512": "nEH5mU6idUYS3/+9BKw2stMOM25ZdGwIH4P4kyj6PVkMPgQUTkBQ7l/ScPkepdhejcOlPa+g3+M4dYsSYPUJ8g==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.https/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.xml", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.xml", "microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.https.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "sha512": "j1ai2CG8BGp4mYf2TWSFjjy1pRgW9XbqhdR4EOVvrlFVbcpEPfXNIPEdjkcgK+txWCupGzkFnFF8oZsASMtmyw==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.transport.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.xml", "microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.transport.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "sha512": "qTACI0wePgAKCH+YKrMgChyfqJpjwgGZEtSuwBw6TjWLQ66THGasleia/7EZz2t2eAjwWxw8RA/D8ODrBqpj9A==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.transport.sockets/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml", "microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.transport.sockets.nuspec" ] }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "sha512": "byZDrjir6Co5EoWbraQyG0qbPCUG6XgGYQstipMF9lucOAjq/mqnIyt8B8iMWnin/ghZoOln9Y01af4rUAwOhA==", "type": "package", "path": "microsoft.aspnetcore.staticfiles/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll", "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.xml", "microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512", "microsoft.aspnetcore.staticfiles.nuspec" ] }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "sha512": "9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==", "type": "package", "path": "microsoft.aspnetcore.webutilities/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll", "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.xml", "microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512", "microsoft.aspnetcore.webutilities.nuspec" ] }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": { "sha512": "ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g==", "type": "package", "path": "microsoft.codeanalysis.analyzers/3.0.0", "hasTools": true, "files": [ ".nupkg.metadata", ".signature.p7s", "EULA.rtf", "ThirdPartyNotices.rtf", "analyzers/dotnet/cs/Microsoft.CodeAnalysis.Analyzers.dll", "analyzers/dotnet/cs/Microsoft.CodeAnalysis.CSharp.Analyzers.dll", "analyzers/dotnet/cs/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/de/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/es/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/it/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/Microsoft.CodeAnalysis.Analyzers.dll", "analyzers/dotnet/vb/Microsoft.CodeAnalysis.VisualBasic.Analyzers.dll", "analyzers/dotnet/vb/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/de/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/es/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/it/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll", "build/Microsoft.CodeAnalysis.Analyzers.props", "build/Microsoft.CodeAnalysis.Analyzers.targets", "documentation/Analyzer Configuration.md", "documentation/Microsoft.CodeAnalysis.Analyzers.md", "documentation/Microsoft.CodeAnalysis.Analyzers.sarif", "editorconfig/AllRulesDefault/.editorconfig", "editorconfig/AllRulesDisabled/.editorconfig", "editorconfig/AllRulesEnabled/.editorconfig", "editorconfig/CorrectnessRulesDefault/.editorconfig", "editorconfig/CorrectnessRulesEnabled/.editorconfig", "editorconfig/DataflowRulesDefault/.editorconfig", "editorconfig/DataflowRulesEnabled/.editorconfig", "editorconfig/LibraryRulesDefault/.editorconfig", "editorconfig/LibraryRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCompatibilityRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCompatibilityRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCorrectnessRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCorrectnessRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDesignRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDesignRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDocumentationRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDocumentationRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisLocalizationRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisLocalizationRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisPerformanceRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisPerformanceRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled/.editorconfig", "editorconfig/PortedFromFxCopRulesDefault/.editorconfig", "editorconfig/PortedFromFxCopRulesEnabled/.editorconfig", "microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512", "microsoft.codeanalysis.analyzers.nuspec", "rulesets/AllRulesDefault.ruleset", "rulesets/AllRulesDisabled.ruleset", "rulesets/AllRulesEnabled.ruleset", "rulesets/CorrectnessRulesDefault.ruleset", "rulesets/CorrectnessRulesEnabled.ruleset", "rulesets/DataflowRulesDefault.ruleset", "rulesets/DataflowRulesEnabled.ruleset", "rulesets/LibraryRulesDefault.ruleset", "rulesets/LibraryRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisCompatibilityRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisCompatibilityRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisCorrectnessRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisCorrectnessRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisDesignRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisDesignRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisDocumentationRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisDocumentationRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisLocalizationRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisLocalizationRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisPerformanceRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisPerformanceRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled.ruleset", "rulesets/PortedFromFxCopRulesDefault.ruleset", "rulesets/PortedFromFxCopRulesEnabled.ruleset", "tools/install.ps1", "tools/uninstall.ps1" ] }, "Microsoft.CodeAnalysis.Common/3.7.0": { "sha512": "SFEdnbw8204hTlde3JePYSIpNX58h/MMXa7LctUsUDigWMR8Ar9gE8LnsLqAIFM0O33JEuQbJ0G4Sat+cPGldw==", "type": "package", "path": "microsoft.codeanalysis.common/3.7.0", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "ThirdPartyNotices.rtf", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.pdb", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.xml", "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.pdb", "lib/netstandard2.0/Microsoft.CodeAnalysis.xml", "lib/netstandard2.0/cs/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/de/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/es/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/fr/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/it/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/ja/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/ko/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/pl/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/ru/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/tr/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll", "microsoft.codeanalysis.common.3.7.0.nupkg.sha512", "microsoft.codeanalysis.common.nuspec" ] }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "sha512": "sKi5PIVy9nVDerkbplY6OQhJBNzEO4XJsMGrnmb6KFEa6K1ulGCHIv6NtDjdUQ/dGrouU3OExc3yzww0COD76w==", "type": "package", "path": "microsoft.codeanalysis.csharp/3.7.0", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "ThirdPartyNotices.rtf", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.pdb", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.xml", "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.pdb", "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.xml", "lib/netstandard2.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll", "microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512", "microsoft.codeanalysis.csharp.nuspec" ] }, "Microsoft.Extensions.Configuration/2.2.0": { "sha512": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==", "type": "package", "path": "microsoft.extensions.configuration/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.xml", "microsoft.extensions.configuration.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.nuspec" ] }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "sha512": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", "type": "package", "path": "microsoft.extensions.configuration.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.xml", "microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.abstractions.nuspec" ] }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "sha512": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==", "type": "package", "path": "microsoft.extensions.configuration.binder/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.xml", "microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.binder.nuspec" ] }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "sha512": "gIqt9PkKO01hZ0zmHnWrZ1E45MDreZTVoyDbL1kMWKtDgxxWTJpYtESTEcgpvR1uB1iex1zKGYzJpOMgmuP5TQ==", "type": "package", "path": "microsoft.extensions.configuration.environmentvariables/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.xml", "microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.environmentvariables.nuspec" ] }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "sha512": "H1qCpWBC8Ed4tguTR/qYkbb3F6DI5Su3t8xyFo3/5MzAd8PwPpHzgX8X04KbBxKmk173Pb64x7xMHarczVFQUA==", "type": "package", "path": "microsoft.extensions.configuration.fileextensions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.xml", "microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.fileextensions.nuspec" ] }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "sha512": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==", "type": "package", "path": "microsoft.extensions.dependencyinjection/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net461/Microsoft.Extensions.DependencyInjection.dll", "lib/net461/Microsoft.Extensions.DependencyInjection.xml", "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll", "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.xml", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml", "microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512", "microsoft.extensions.dependencyinjection.nuspec" ] }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "sha512": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==", "type": "package", "path": "microsoft.extensions.dependencyinjection.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", "microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.dependencyinjection.abstractions.nuspec" ] }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "sha512": "EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==", "type": "package", "path": "microsoft.extensions.fileproviders.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.xml", "microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.fileproviders.abstractions.nuspec" ] }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "sha512": "tbDHZnBJkjYd9NjlRZ9ondDiv1Te3KYCTW2RWpR1B0e1Z8+EnFRo7qNnHkkSCixLdlPZzhjlX24d/PixQ7w2dA==", "type": "package", "path": "microsoft.extensions.fileproviders.physical/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.xml", "microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512", "microsoft.extensions.fileproviders.physical.nuspec" ] }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "sha512": "ZSsHZp3PyW6vk37tDEdypjgGlNtpJ0EixBMOfUod2Thx7GtwfFSAQXUQx8a8BN8vfWKGGMbp7jPWdoHx/At4wQ==", "type": "package", "path": "microsoft.extensions.filesystemglobbing/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll", "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.xml", "microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512", "microsoft.extensions.filesystemglobbing.nuspec" ] }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "sha512": "+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==", "type": "package", "path": "microsoft.extensions.hosting.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.xml", "microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.hosting.abstractions.nuspec" ] }, "Microsoft.Extensions.Logging/2.2.0": { "sha512": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==", "type": "package", "path": "microsoft.extensions.logging/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Logging.dll", "lib/netstandard2.0/Microsoft.Extensions.Logging.xml", "microsoft.extensions.logging.2.2.0.nupkg.sha512", "microsoft.extensions.logging.nuspec" ] }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "sha512": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==", "type": "package", "path": "microsoft.extensions.logging.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", "microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.logging.abstractions.nuspec" ] }, "Microsoft.Extensions.ObjectPool/2.2.0": { "sha512": "gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==", "type": "package", "path": "microsoft.extensions.objectpool/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll", "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.xml", "microsoft.extensions.objectpool.2.2.0.nupkg.sha512", "microsoft.extensions.objectpool.nuspec" ] }, "Microsoft.Extensions.Options/2.2.0": { "sha512": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==", "type": "package", "path": "microsoft.extensions.options/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Options.dll", "lib/netstandard2.0/Microsoft.Extensions.Options.xml", "microsoft.extensions.options.2.2.0.nupkg.sha512", "microsoft.extensions.options.nuspec" ] }, "Microsoft.Extensions.Primitives/2.2.0": { "sha512": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==", "type": "package", "path": "microsoft.extensions.primitives/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll", "lib/netstandard2.0/Microsoft.Extensions.Primitives.xml", "microsoft.extensions.primitives.2.2.0.nupkg.sha512", "microsoft.extensions.primitives.nuspec" ] }, "Microsoft.Extensions.WebEncoders/2.2.0": { "sha512": "V8XcqYcpcdBAxUhLeyYcuKmxu4CtNQA9IphTnARpQGhkop4A93v2XgM3AtaVVJo3H2cDWxWM6aeO8HxkifREqw==", "type": "package", "path": "microsoft.extensions.webencoders/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll", "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.xml", "microsoft.extensions.webencoders.2.2.0.nupkg.sha512", "microsoft.extensions.webencoders.nuspec" ] }, "Microsoft.Net.Http.Headers/2.2.0": { "sha512": "iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==", "type": "package", "path": "microsoft.net.http.headers/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll", "lib/netstandard2.0/Microsoft.Net.Http.Headers.xml", "microsoft.net.http.headers.2.2.0.nupkg.sha512", "microsoft.net.http.headers.nuspec" ] }, "Microsoft.NETCore.Platforms/2.1.2": { "sha512": "mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==", "type": "package", "path": "microsoft.netcore.platforms/2.1.2", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.0/_._", "microsoft.netcore.platforms.2.1.2.nupkg.sha512", "microsoft.netcore.platforms.nuspec", "runtime.json", "useSharedDesignerContext.txt", "version.txt" ] }, "Microsoft.NETCore.Targets/1.1.0": { "sha512": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "type": "package", "path": "microsoft.netcore.targets/1.1.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "microsoft.netcore.targets.1.1.0.nupkg.sha512", "microsoft.netcore.targets.nuspec", "runtime.json" ] }, "Microsoft.Win32.Primitives/4.3.0": { "sha512": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "type": "package", "path": "microsoft.win32.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/Microsoft.Win32.Primitives.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "microsoft.win32.primitives.4.3.0.nupkg.sha512", "microsoft.win32.primitives.nuspec", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/Microsoft.Win32.Primitives.dll", "ref/netstandard1.3/Microsoft.Win32.Primitives.dll", "ref/netstandard1.3/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "Nett/0.15.0": { "sha512": "/0SoN9ugPKfmLndtKy3gaRxOlzji94/yrNgQLe45/1ZgExj0BaVozbXD+oWD8E6MCLvTs+YWzmn315mQOXGCcw==", "type": "package", "path": "nett/0.15.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net40/Nett.dll", "lib/net40/Nett.xml", "lib/netstandard2.0/Nett.dll", "lib/netstandard2.0/Nett.xml", "nett.0.15.0.nupkg.sha512", "nett.nuspec" ] }, "Newtonsoft.Json/12.0.3": { "sha512": "6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==", "type": "package", "path": "newtonsoft.json/12.0.3", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.md", "lib/net20/Newtonsoft.Json.dll", "lib/net20/Newtonsoft.Json.xml", "lib/net35/Newtonsoft.Json.dll", "lib/net35/Newtonsoft.Json.xml", "lib/net40/Newtonsoft.Json.dll", "lib/net40/Newtonsoft.Json.xml", "lib/net45/Newtonsoft.Json.dll", "lib/net45/Newtonsoft.Json.xml", "lib/netstandard1.0/Newtonsoft.Json.dll", "lib/netstandard1.0/Newtonsoft.Json.xml", "lib/netstandard1.3/Newtonsoft.Json.dll", "lib/netstandard1.3/Newtonsoft.Json.xml", "lib/netstandard2.0/Newtonsoft.Json.dll", "lib/netstandard2.0/Newtonsoft.Json.xml", "lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.dll", "lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.xml", "lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.dll", "lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.xml", "newtonsoft.json.12.0.3.nupkg.sha512", "newtonsoft.json.nuspec", "packageIcon.png" ] }, "NLog/4.7.3": { "sha512": "3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==", "type": "package", "path": "nlog/4.7.3", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/monoandroid44/NLog.dll", "lib/monoandroid44/NLog.xml", "lib/net35/NLog.dll", "lib/net35/NLog.xml", "lib/net40-client/NLog.dll", "lib/net40-client/NLog.xml", "lib/net45/NLog.dll", "lib/net45/NLog.xml", "lib/netstandard1.3/NLog.dll", "lib/netstandard1.3/NLog.xml", "lib/netstandard1.5/NLog.dll", "lib/netstandard1.5/NLog.xml", "lib/netstandard2.0/NLog.dll", "lib/netstandard2.0/NLog.xml", "lib/sl4/NLog.dll", "lib/sl4/NLog.xml", "lib/sl5/NLog.dll", "lib/sl5/NLog.xml", "lib/wp8/NLog.dll", "lib/wp8/NLog.xml", "lib/xamarinios10/NLog.dll", "lib/xamarinios10/NLog.xml", "nlog.4.7.3.nupkg.sha512", "nlog.nuspec" ] }, "PlaylistsNET/1.1.2": { "sha512": "IGzVterTV49b9FjzY7gMUcxnzOvVDj6L07pjB821m+k2iHWazy/OhIvDCvGSMx1cvkY9ZBajXpQO5uUCZY51vw==", "type": "package", "path": "playlistsnet/1.1.2", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net45/PlaylistsNET.dll", "lib/netstandard1.4/PlaylistsNET.dll", "lib/netstandard2.0/PlaylistsNET.dll", "playlistsnet.1.1.2.nupkg.sha512", "playlistsnet.nuspec" ] }, "Portable.BouncyCastle/1.8.6.7": { "sha512": "RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==", "type": "package", "path": "portable.bouncycastle/1.8.6.7", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net40/BouncyCastle.Crypto.dll", "lib/net40/BouncyCastle.Crypto.xml", "lib/netstandard2.0/BouncyCastle.Crypto.dll", "lib/netstandard2.0/BouncyCastle.Crypto.xml", "portable.bouncycastle.1.8.6.7.nupkg.sha512", "portable.bouncycastle.nuspec" ] }, "runtime.any.System.Collections/4.3.0": { "sha512": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", "type": "package", "path": "runtime.any.system.collections/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Collections.dll", "lib/netstandard1.3/System.Collections.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.collections.4.3.0.nupkg.sha512", "runtime.any.system.collections.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Diagnostics.Tracing/4.3.0": { "sha512": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==", "type": "package", "path": "runtime.any.system.diagnostics.tracing/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Diagnostics.Tracing.dll", "lib/netstandard1.5/System.Diagnostics.Tracing.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512", "runtime.any.system.diagnostics.tracing.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Globalization/4.3.0": { "sha512": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==", "type": "package", "path": "runtime.any.system.globalization/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Globalization.dll", "lib/netstandard1.3/System.Globalization.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.globalization.4.3.0.nupkg.sha512", "runtime.any.system.globalization.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.IO/4.3.0": { "sha512": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==", "type": "package", "path": "runtime.any.system.io/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.IO.dll", "lib/netstandard1.5/System.IO.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.io.4.3.0.nupkg.sha512", "runtime.any.system.io.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Reflection/4.3.0": { "sha512": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==", "type": "package", "path": "runtime.any.system.reflection/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Reflection.dll", "lib/netstandard1.5/System.Reflection.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.reflection.4.3.0.nupkg.sha512", "runtime.any.system.reflection.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Reflection.Primitives/4.3.0": { "sha512": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==", "type": "package", "path": "runtime.any.system.reflection.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Reflection.Primitives.dll", "lib/netstandard1.3/System.Reflection.Primitives.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512", "runtime.any.system.reflection.primitives.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Resources.ResourceManager/4.3.0": { "sha512": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==", "type": "package", "path": "runtime.any.system.resources.resourcemanager/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Resources.ResourceManager.dll", "lib/netstandard1.3/System.Resources.ResourceManager.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512", "runtime.any.system.resources.resourcemanager.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Runtime/4.3.0": { "sha512": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", "type": "package", "path": "runtime.any.system.runtime/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Runtime.dll", "lib/netstandard1.5/System.Runtime.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.runtime.4.3.0.nupkg.sha512", "runtime.any.system.runtime.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Runtime.Handles/4.3.0": { "sha512": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==", "type": "package", "path": "runtime.any.system.runtime.handles/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/_._", "lib/netstandard1.3/System.Runtime.Handles.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.runtime.handles.4.3.0.nupkg.sha512", "runtime.any.system.runtime.handles.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Runtime.InteropServices/4.3.0": { "sha512": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==", "type": "package", "path": "runtime.any.system.runtime.interopservices/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Runtime.InteropServices.dll", "lib/netstandard1.5/System.Runtime.InteropServices.dll", "lib/netstandard1.6/System.Runtime.InteropServices.dll", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512", "runtime.any.system.runtime.interopservices.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Text.Encoding/4.3.0": { "sha512": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==", "type": "package", "path": "runtime.any.system.text.encoding/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Text.Encoding.dll", "lib/netstandard1.3/System.Text.Encoding.dll", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.text.encoding.4.3.0.nupkg.sha512", "runtime.any.system.text.encoding.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Text.Encoding.Extensions/4.3.0": { "sha512": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==", "type": "package", "path": "runtime.any.system.text.encoding.extensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Text.Encoding.Extensions.dll", "lib/netstandard1.3/System.Text.Encoding.Extensions.dll", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512", "runtime.any.system.text.encoding.extensions.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.any.System.Threading.Tasks/4.3.0": { "sha512": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==", "type": "package", "path": "runtime.any.system.threading.tasks/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Threading.Tasks.dll", "lib/netstandard1.3/System.Threading.Tasks.dll", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/netstandard/_._", "runtime.any.system.threading.tasks.4.3.0.nupkg.sha512", "runtime.any.system.threading.tasks.nuspec", "runtimes/aot/lib/netcore50/_._" ] }, "runtime.native.System/4.3.0": { "sha512": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", "type": "package", "path": "runtime.native.system/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "runtime.native.system.4.3.0.nupkg.sha512", "runtime.native.system.nuspec" ] }, "runtime.win.Microsoft.Win32.Primitives/4.3.0": { "sha512": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", "type": "package", "path": "runtime.win.microsoft.win32.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "runtime.win.microsoft.win32.primitives.4.3.0.nupkg.sha512", "runtime.win.microsoft.win32.primitives.nuspec", "runtimes/win/lib/net/_._", "runtimes/win/lib/netstandard1.3/Microsoft.Win32.Primitives.dll" ] }, "runtime.win.System.Diagnostics.Debug/4.3.0": { "sha512": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==", "type": "package", "path": "runtime.win.system.diagnostics.debug/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "runtime.win.system.diagnostics.debug.4.3.0.nupkg.sha512", "runtime.win.system.diagnostics.debug.nuspec", "runtimes/aot/lib/netcore50/System.Diagnostics.Debug.dll", "runtimes/win/lib/net45/_._", "runtimes/win/lib/netcore50/System.Diagnostics.Debug.dll", "runtimes/win/lib/netstandard1.3/System.Diagnostics.Debug.dll", "runtimes/win/lib/win8/_._", "runtimes/win/lib/wp80/_._", "runtimes/win/lib/wpa81/_._" ] }, "runtime.win.System.IO.FileSystem/4.3.0": { "sha512": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", "type": "package", "path": "runtime.win.system.io.filesystem/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "runtime.win.system.io.filesystem.4.3.0.nupkg.sha512", "runtime.win.system.io.filesystem.nuspec", "runtimes/win/lib/net/_._", "runtimes/win/lib/netcore50/System.IO.FileSystem.dll", "runtimes/win/lib/netstandard1.3/System.IO.FileSystem.dll", "runtimes/win/lib/win8/_._", "runtimes/win/lib/wp8/_._", "runtimes/win/lib/wpa81/_._" ] }, "runtime.win.System.Net.Primitives/4.3.0": { "sha512": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", "type": "package", "path": "runtime.win.system.net.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "runtime.win.system.net.primitives.4.3.0.nupkg.sha512", "runtime.win.system.net.primitives.nuspec", "runtimes/win/lib/net/_._", "runtimes/win/lib/netcore50/System.Net.Primitives.dll", "runtimes/win/lib/netstandard1.3/System.Net.Primitives.dll" ] }, "runtime.win.System.Net.Sockets/4.3.0": { "sha512": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", "type": "package", "path": "runtime.win.system.net.sockets/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "runtime.win.system.net.sockets.4.3.0.nupkg.sha512", "runtime.win.system.net.sockets.nuspec", "runtimes/win/lib/net/_._", "runtimes/win/lib/netcore50/System.Net.Sockets.dll", "runtimes/win/lib/netstandard1.3/System.Net.Sockets.dll" ] }, "runtime.win.System.Runtime.Extensions/4.3.0": { "sha512": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", "type": "package", "path": "runtime.win.system.runtime.extensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "runtime.win.system.runtime.extensions.4.3.0.nupkg.sha512", "runtime.win.system.runtime.extensions.nuspec", "runtimes/aot/lib/netcore50/System.Runtime.Extensions.dll", "runtimes/win/lib/net/_._", "runtimes/win/lib/netcore50/System.Runtime.Extensions.dll", "runtimes/win/lib/netstandard1.5/System.Runtime.Extensions.dll" ] }, "SixLabors.ImageSharp/1.0.0": { "sha512": "8amvsk8NXnCxZV0lvJppAZJknViWgBOO/2V59IGR6DVoD13mSmG+/Z9eg5IwrHQuRHp5RD9lfXBXDZyk8rTKDg==", "type": "package", "path": "sixlabors.imagesharp/1.0.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net472/SixLabors.ImageSharp.dll", "lib/net472/SixLabors.ImageSharp.xml", "lib/netcoreapp2.1/SixLabors.ImageSharp.dll", "lib/netcoreapp2.1/SixLabors.ImageSharp.xml", "lib/netcoreapp3.1/SixLabors.ImageSharp.dll", "lib/netcoreapp3.1/SixLabors.ImageSharp.xml", "lib/netstandard1.3/SixLabors.ImageSharp.dll", "lib/netstandard1.3/SixLabors.ImageSharp.xml", "lib/netstandard2.0/SixLabors.ImageSharp.dll", "lib/netstandard2.0/SixLabors.ImageSharp.xml", "lib/netstandard2.1/SixLabors.ImageSharp.dll", "lib/netstandard2.1/SixLabors.ImageSharp.xml", "sixlabors.imagesharp.1.0.0.nupkg.sha512", "sixlabors.imagesharp.128.png", "sixlabors.imagesharp.nuspec" ] }, "Splamy.Ed25519.Toolkit/1.0.3": { "sha512": "Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==", "type": "package", "path": "splamy.ed25519.toolkit/1.0.3", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net46/Chaos.NaCl.dll", "lib/netcoreapp2.0/Chaos.NaCl.dll", "lib/netcoreapp2.1/Chaos.NaCl.dll", "lib/netstandard1.1/Chaos.NaCl.dll", "lib/netstandard2.0/Chaos.NaCl.dll", "splamy.ed25519.toolkit.1.0.3.nupkg.sha512", "splamy.ed25519.toolkit.nuspec" ] }, "System.Buffers/4.5.0": { "sha512": "pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==", "type": "package", "path": "system.buffers/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netcoreapp2.0/_._", "lib/netstandard1.1/System.Buffers.dll", "lib/netstandard1.1/System.Buffers.xml", "lib/netstandard2.0/System.Buffers.dll", "lib/netstandard2.0/System.Buffers.xml", "lib/uap10.0.16299/_._", "ref/net45/System.Buffers.dll", "ref/net45/System.Buffers.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.1/System.Buffers.dll", "ref/netstandard1.1/System.Buffers.xml", "ref/netstandard2.0/System.Buffers.dll", "ref/netstandard2.0/System.Buffers.xml", "ref/uap10.0.16299/_._", "system.buffers.4.5.0.nupkg.sha512", "system.buffers.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Collections/4.3.0": { "sha512": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "type": "package", "path": "system.collections/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Collections.dll", "ref/netcore50/System.Collections.xml", "ref/netcore50/de/System.Collections.xml", "ref/netcore50/es/System.Collections.xml", "ref/netcore50/fr/System.Collections.xml", "ref/netcore50/it/System.Collections.xml", "ref/netcore50/ja/System.Collections.xml", "ref/netcore50/ko/System.Collections.xml", "ref/netcore50/ru/System.Collections.xml", "ref/netcore50/zh-hans/System.Collections.xml", "ref/netcore50/zh-hant/System.Collections.xml", "ref/netstandard1.0/System.Collections.dll", "ref/netstandard1.0/System.Collections.xml", "ref/netstandard1.0/de/System.Collections.xml", "ref/netstandard1.0/es/System.Collections.xml", "ref/netstandard1.0/fr/System.Collections.xml", "ref/netstandard1.0/it/System.Collections.xml", "ref/netstandard1.0/ja/System.Collections.xml", "ref/netstandard1.0/ko/System.Collections.xml", "ref/netstandard1.0/ru/System.Collections.xml", "ref/netstandard1.0/zh-hans/System.Collections.xml", "ref/netstandard1.0/zh-hant/System.Collections.xml", "ref/netstandard1.3/System.Collections.dll", "ref/netstandard1.3/System.Collections.xml", "ref/netstandard1.3/de/System.Collections.xml", "ref/netstandard1.3/es/System.Collections.xml", "ref/netstandard1.3/fr/System.Collections.xml", "ref/netstandard1.3/it/System.Collections.xml", "ref/netstandard1.3/ja/System.Collections.xml", "ref/netstandard1.3/ko/System.Collections.xml", "ref/netstandard1.3/ru/System.Collections.xml", "ref/netstandard1.3/zh-hans/System.Collections.xml", "ref/netstandard1.3/zh-hant/System.Collections.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.collections.4.3.0.nupkg.sha512", "system.collections.nuspec" ] }, "System.Collections.Immutable/1.5.0": { "sha512": "EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==", "type": "package", "path": "system.collections.immutable/1.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.0/System.Collections.Immutable.dll", "lib/netstandard1.0/System.Collections.Immutable.xml", "lib/netstandard1.3/System.Collections.Immutable.dll", "lib/netstandard1.3/System.Collections.Immutable.xml", "lib/netstandard2.0/System.Collections.Immutable.dll", "lib/netstandard2.0/System.Collections.Immutable.xml", "lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.dll", "lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.xml", "system.collections.immutable.1.5.0.nupkg.sha512", "system.collections.immutable.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.ComponentModel.Annotations/4.5.0": { "sha512": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==", "type": "package", "path": "system.componentmodel.annotations/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net461/System.ComponentModel.Annotations.dll", "lib/netcore50/System.ComponentModel.Annotations.dll", "lib/netcoreapp2.0/_._", "lib/netstandard1.4/System.ComponentModel.Annotations.dll", "lib/netstandard2.0/System.ComponentModel.Annotations.dll", "lib/portable-net45+win8/_._", "lib/uap10.0.16299/_._", "lib/win8/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net461/System.ComponentModel.Annotations.dll", "ref/net461/System.ComponentModel.Annotations.xml", "ref/netcore50/System.ComponentModel.Annotations.dll", "ref/netcore50/System.ComponentModel.Annotations.xml", "ref/netcore50/de/System.ComponentModel.Annotations.xml", "ref/netcore50/es/System.ComponentModel.Annotations.xml", "ref/netcore50/fr/System.ComponentModel.Annotations.xml", "ref/netcore50/it/System.ComponentModel.Annotations.xml", "ref/netcore50/ja/System.ComponentModel.Annotations.xml", "ref/netcore50/ko/System.ComponentModel.Annotations.xml", "ref/netcore50/ru/System.ComponentModel.Annotations.xml", "ref/netcore50/zh-hans/System.ComponentModel.Annotations.xml", "ref/netcore50/zh-hant/System.ComponentModel.Annotations.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.1/System.ComponentModel.Annotations.dll", "ref/netstandard1.1/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/de/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/es/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/fr/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/it/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/ja/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/ko/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/ru/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/zh-hans/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/zh-hant/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/System.ComponentModel.Annotations.dll", "ref/netstandard1.3/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/de/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/es/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/fr/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/it/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/ja/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/ko/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/ru/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/zh-hans/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/zh-hant/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/System.ComponentModel.Annotations.dll", "ref/netstandard1.4/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/de/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/es/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/fr/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/it/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/ja/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/ko/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/ru/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/zh-hans/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/zh-hant/System.ComponentModel.Annotations.xml", "ref/netstandard2.0/System.ComponentModel.Annotations.dll", "ref/netstandard2.0/System.ComponentModel.Annotations.xml", "ref/portable-net45+win8/_._", "ref/uap10.0.16299/_._", "ref/win8/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.componentmodel.annotations.4.5.0.nupkg.sha512", "system.componentmodel.annotations.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Diagnostics.Debug/4.3.0": { "sha512": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "type": "package", "path": "system.diagnostics.debug/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Diagnostics.Debug.dll", "ref/netcore50/System.Diagnostics.Debug.xml", "ref/netcore50/de/System.Diagnostics.Debug.xml", "ref/netcore50/es/System.Diagnostics.Debug.xml", "ref/netcore50/fr/System.Diagnostics.Debug.xml", "ref/netcore50/it/System.Diagnostics.Debug.xml", "ref/netcore50/ja/System.Diagnostics.Debug.xml", "ref/netcore50/ko/System.Diagnostics.Debug.xml", "ref/netcore50/ru/System.Diagnostics.Debug.xml", "ref/netcore50/zh-hans/System.Diagnostics.Debug.xml", "ref/netcore50/zh-hant/System.Diagnostics.Debug.xml", "ref/netstandard1.0/System.Diagnostics.Debug.dll", "ref/netstandard1.0/System.Diagnostics.Debug.xml", "ref/netstandard1.0/de/System.Diagnostics.Debug.xml", "ref/netstandard1.0/es/System.Diagnostics.Debug.xml", "ref/netstandard1.0/fr/System.Diagnostics.Debug.xml", "ref/netstandard1.0/it/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ja/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ko/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ru/System.Diagnostics.Debug.xml", "ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml", "ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml", "ref/netstandard1.3/System.Diagnostics.Debug.dll", "ref/netstandard1.3/System.Diagnostics.Debug.xml", "ref/netstandard1.3/de/System.Diagnostics.Debug.xml", "ref/netstandard1.3/es/System.Diagnostics.Debug.xml", "ref/netstandard1.3/fr/System.Diagnostics.Debug.xml", "ref/netstandard1.3/it/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ja/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ko/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ru/System.Diagnostics.Debug.xml", "ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml", "ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.diagnostics.debug.4.3.0.nupkg.sha512", "system.diagnostics.debug.nuspec" ] }, "System.Diagnostics.DiagnosticSource/4.5.0": { "sha512": "eIHRELiYDQvsMToML81QFkXEEYXUSUT2F28t1SGrevWqP+epFdw80SyAXIKTXOHrIEXReFOEnEr7XlGiC2GgOg==", "type": "package", "path": "system.diagnostics.diagnosticsource/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net45/System.Diagnostics.DiagnosticSource.dll", "lib/net45/System.Diagnostics.DiagnosticSource.xml", "lib/net46/System.Diagnostics.DiagnosticSource.dll", "lib/net46/System.Diagnostics.DiagnosticSource.xml", "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll", "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml", "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll", "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml", "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll", "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml", "system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512", "system.diagnostics.diagnosticsource.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Diagnostics.Tracing/4.3.0": { "sha512": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "type": "package", "path": "system.diagnostics.tracing/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Diagnostics.Tracing.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Diagnostics.Tracing.dll", "ref/netcore50/System.Diagnostics.Tracing.dll", "ref/netcore50/System.Diagnostics.Tracing.xml", "ref/netcore50/de/System.Diagnostics.Tracing.xml", "ref/netcore50/es/System.Diagnostics.Tracing.xml", "ref/netcore50/fr/System.Diagnostics.Tracing.xml", "ref/netcore50/it/System.Diagnostics.Tracing.xml", "ref/netcore50/ja/System.Diagnostics.Tracing.xml", "ref/netcore50/ko/System.Diagnostics.Tracing.xml", "ref/netcore50/ru/System.Diagnostics.Tracing.xml", "ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml", "ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/System.Diagnostics.Tracing.dll", "ref/netstandard1.1/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/System.Diagnostics.Tracing.dll", "ref/netstandard1.2/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/System.Diagnostics.Tracing.dll", "ref/netstandard1.3/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/System.Diagnostics.Tracing.dll", "ref/netstandard1.5/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.diagnostics.tracing.4.3.0.nupkg.sha512", "system.diagnostics.tracing.nuspec" ] }, "System.Globalization/4.3.0": { "sha512": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "type": "package", "path": "system.globalization/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Globalization.dll", "ref/netcore50/System.Globalization.xml", "ref/netcore50/de/System.Globalization.xml", "ref/netcore50/es/System.Globalization.xml", "ref/netcore50/fr/System.Globalization.xml", "ref/netcore50/it/System.Globalization.xml", "ref/netcore50/ja/System.Globalization.xml", "ref/netcore50/ko/System.Globalization.xml", "ref/netcore50/ru/System.Globalization.xml", "ref/netcore50/zh-hans/System.Globalization.xml", "ref/netcore50/zh-hant/System.Globalization.xml", "ref/netstandard1.0/System.Globalization.dll", "ref/netstandard1.0/System.Globalization.xml", "ref/netstandard1.0/de/System.Globalization.xml", "ref/netstandard1.0/es/System.Globalization.xml", "ref/netstandard1.0/fr/System.Globalization.xml", "ref/netstandard1.0/it/System.Globalization.xml", "ref/netstandard1.0/ja/System.Globalization.xml", "ref/netstandard1.0/ko/System.Globalization.xml", "ref/netstandard1.0/ru/System.Globalization.xml", "ref/netstandard1.0/zh-hans/System.Globalization.xml", "ref/netstandard1.0/zh-hant/System.Globalization.xml", "ref/netstandard1.3/System.Globalization.dll", "ref/netstandard1.3/System.Globalization.xml", "ref/netstandard1.3/de/System.Globalization.xml", "ref/netstandard1.3/es/System.Globalization.xml", "ref/netstandard1.3/fr/System.Globalization.xml", "ref/netstandard1.3/it/System.Globalization.xml", "ref/netstandard1.3/ja/System.Globalization.xml", "ref/netstandard1.3/ko/System.Globalization.xml", "ref/netstandard1.3/ru/System.Globalization.xml", "ref/netstandard1.3/zh-hans/System.Globalization.xml", "ref/netstandard1.3/zh-hant/System.Globalization.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.globalization.4.3.0.nupkg.sha512", "system.globalization.nuspec" ] }, "System.IO/4.3.0": { "sha512": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "type": "package", "path": "system.io/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.IO.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.IO.dll", "ref/netcore50/System.IO.dll", "ref/netcore50/System.IO.xml", "ref/netcore50/de/System.IO.xml", "ref/netcore50/es/System.IO.xml", "ref/netcore50/fr/System.IO.xml", "ref/netcore50/it/System.IO.xml", "ref/netcore50/ja/System.IO.xml", "ref/netcore50/ko/System.IO.xml", "ref/netcore50/ru/System.IO.xml", "ref/netcore50/zh-hans/System.IO.xml", "ref/netcore50/zh-hant/System.IO.xml", "ref/netstandard1.0/System.IO.dll", "ref/netstandard1.0/System.IO.xml", "ref/netstandard1.0/de/System.IO.xml", "ref/netstandard1.0/es/System.IO.xml", "ref/netstandard1.0/fr/System.IO.xml", "ref/netstandard1.0/it/System.IO.xml", "ref/netstandard1.0/ja/System.IO.xml", "ref/netstandard1.0/ko/System.IO.xml", "ref/netstandard1.0/ru/System.IO.xml", "ref/netstandard1.0/zh-hans/System.IO.xml", "ref/netstandard1.0/zh-hant/System.IO.xml", "ref/netstandard1.3/System.IO.dll", "ref/netstandard1.3/System.IO.xml", "ref/netstandard1.3/de/System.IO.xml", "ref/netstandard1.3/es/System.IO.xml", "ref/netstandard1.3/fr/System.IO.xml", "ref/netstandard1.3/it/System.IO.xml", "ref/netstandard1.3/ja/System.IO.xml", "ref/netstandard1.3/ko/System.IO.xml", "ref/netstandard1.3/ru/System.IO.xml", "ref/netstandard1.3/zh-hans/System.IO.xml", "ref/netstandard1.3/zh-hant/System.IO.xml", "ref/netstandard1.5/System.IO.dll", "ref/netstandard1.5/System.IO.xml", "ref/netstandard1.5/de/System.IO.xml", "ref/netstandard1.5/es/System.IO.xml", "ref/netstandard1.5/fr/System.IO.xml", "ref/netstandard1.5/it/System.IO.xml", "ref/netstandard1.5/ja/System.IO.xml", "ref/netstandard1.5/ko/System.IO.xml", "ref/netstandard1.5/ru/System.IO.xml", "ref/netstandard1.5/zh-hans/System.IO.xml", "ref/netstandard1.5/zh-hant/System.IO.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.4.3.0.nupkg.sha512", "system.io.nuspec" ] }, "System.IO.FileSystem/4.3.0": { "sha512": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "type": "package", "path": "system.io.filesystem/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.IO.FileSystem.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.IO.FileSystem.dll", "ref/netstandard1.3/System.IO.FileSystem.dll", "ref/netstandard1.3/System.IO.FileSystem.xml", "ref/netstandard1.3/de/System.IO.FileSystem.xml", "ref/netstandard1.3/es/System.IO.FileSystem.xml", "ref/netstandard1.3/fr/System.IO.FileSystem.xml", "ref/netstandard1.3/it/System.IO.FileSystem.xml", "ref/netstandard1.3/ja/System.IO.FileSystem.xml", "ref/netstandard1.3/ko/System.IO.FileSystem.xml", "ref/netstandard1.3/ru/System.IO.FileSystem.xml", "ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml", "ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.filesystem.4.3.0.nupkg.sha512", "system.io.filesystem.nuspec" ] }, "System.IO.FileSystem.Primitives/4.3.0": { "sha512": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "type": "package", "path": "system.io.filesystem.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.IO.FileSystem.Primitives.dll", "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.IO.FileSystem.Primitives.dll", "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll", "ref/netstandard1.3/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.filesystem.primitives.4.3.0.nupkg.sha512", "system.io.filesystem.primitives.nuspec" ] }, "System.IO.Pipelines/4.7.2": { "sha512": "rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==", "type": "package", "path": "system.io.pipelines/4.7.2", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net461/System.IO.Pipelines.dll", "lib/net461/System.IO.Pipelines.xml", "lib/netcoreapp3.0/System.IO.Pipelines.dll", "lib/netcoreapp3.0/System.IO.Pipelines.xml", "lib/netstandard1.3/System.IO.Pipelines.dll", "lib/netstandard1.3/System.IO.Pipelines.xml", "lib/netstandard2.0/System.IO.Pipelines.dll", "lib/netstandard2.0/System.IO.Pipelines.xml", "ref/net461/System.IO.Pipelines.dll", "ref/net461/System.IO.Pipelines.xml", "ref/netcoreapp2.0/System.IO.Pipelines.dll", "ref/netcoreapp2.0/System.IO.Pipelines.xml", "system.io.pipelines.4.7.2.nupkg.sha512", "system.io.pipelines.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Linq/4.3.0": { "sha512": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "type": "package", "path": "system.linq/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net463/System.Linq.dll", "lib/netcore50/System.Linq.dll", "lib/netstandard1.6/System.Linq.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net463/System.Linq.dll", "ref/netcore50/System.Linq.dll", "ref/netcore50/System.Linq.xml", "ref/netcore50/de/System.Linq.xml", "ref/netcore50/es/System.Linq.xml", "ref/netcore50/fr/System.Linq.xml", "ref/netcore50/it/System.Linq.xml", "ref/netcore50/ja/System.Linq.xml", "ref/netcore50/ko/System.Linq.xml", "ref/netcore50/ru/System.Linq.xml", "ref/netcore50/zh-hans/System.Linq.xml", "ref/netcore50/zh-hant/System.Linq.xml", "ref/netstandard1.0/System.Linq.dll", "ref/netstandard1.0/System.Linq.xml", "ref/netstandard1.0/de/System.Linq.xml", "ref/netstandard1.0/es/System.Linq.xml", "ref/netstandard1.0/fr/System.Linq.xml", "ref/netstandard1.0/it/System.Linq.xml", "ref/netstandard1.0/ja/System.Linq.xml", "ref/netstandard1.0/ko/System.Linq.xml", "ref/netstandard1.0/ru/System.Linq.xml", "ref/netstandard1.0/zh-hans/System.Linq.xml", "ref/netstandard1.0/zh-hant/System.Linq.xml", "ref/netstandard1.6/System.Linq.dll", "ref/netstandard1.6/System.Linq.xml", "ref/netstandard1.6/de/System.Linq.xml", "ref/netstandard1.6/es/System.Linq.xml", "ref/netstandard1.6/fr/System.Linq.xml", "ref/netstandard1.6/it/System.Linq.xml", "ref/netstandard1.6/ja/System.Linq.xml", "ref/netstandard1.6/ko/System.Linq.xml", "ref/netstandard1.6/ru/System.Linq.xml", "ref/netstandard1.6/zh-hans/System.Linq.xml", "ref/netstandard1.6/zh-hant/System.Linq.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.linq.4.3.0.nupkg.sha512", "system.linq.nuspec" ] }, "System.Memory/4.5.4": { "sha512": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", "type": "package", "path": "system.memory/4.5.4", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net461/System.Memory.dll", "lib/net461/System.Memory.xml", "lib/netcoreapp2.1/_._", "lib/netstandard1.1/System.Memory.dll", "lib/netstandard1.1/System.Memory.xml", "lib/netstandard2.0/System.Memory.dll", "lib/netstandard2.0/System.Memory.xml", "ref/netcoreapp2.1/_._", "system.memory.4.5.4.nupkg.sha512", "system.memory.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Net.NameResolution/4.3.0": { "sha512": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", "type": "package", "path": "system.net.nameresolution/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Net.NameResolution.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Net.NameResolution.dll", "ref/netstandard1.3/System.Net.NameResolution.dll", "ref/netstandard1.3/System.Net.NameResolution.xml", "ref/netstandard1.3/de/System.Net.NameResolution.xml", "ref/netstandard1.3/es/System.Net.NameResolution.xml", "ref/netstandard1.3/fr/System.Net.NameResolution.xml", "ref/netstandard1.3/it/System.Net.NameResolution.xml", "ref/netstandard1.3/ja/System.Net.NameResolution.xml", "ref/netstandard1.3/ko/System.Net.NameResolution.xml", "ref/netstandard1.3/ru/System.Net.NameResolution.xml", "ref/netstandard1.3/zh-hans/System.Net.NameResolution.xml", "ref/netstandard1.3/zh-hant/System.Net.NameResolution.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/unix/lib/netstandard1.3/System.Net.NameResolution.dll", "runtimes/win/lib/net46/System.Net.NameResolution.dll", "runtimes/win/lib/netcore50/System.Net.NameResolution.dll", "runtimes/win/lib/netstandard1.3/System.Net.NameResolution.dll", "system.net.nameresolution.4.3.0.nupkg.sha512", "system.net.nameresolution.nuspec" ] }, "System.Net.NetworkInformation/4.3.0": { "sha512": "zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==", "type": "package", "path": "system.net.networkinformation/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net46/System.Net.NetworkInformation.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net46/System.Net.NetworkInformation.dll", "ref/netcore50/System.Net.NetworkInformation.dll", "ref/netcore50/System.Net.NetworkInformation.xml", "ref/netcore50/de/System.Net.NetworkInformation.xml", "ref/netcore50/es/System.Net.NetworkInformation.xml", "ref/netcore50/fr/System.Net.NetworkInformation.xml", "ref/netcore50/it/System.Net.NetworkInformation.xml", "ref/netcore50/ja/System.Net.NetworkInformation.xml", "ref/netcore50/ko/System.Net.NetworkInformation.xml", "ref/netcore50/ru/System.Net.NetworkInformation.xml", "ref/netcore50/zh-hans/System.Net.NetworkInformation.xml", "ref/netcore50/zh-hant/System.Net.NetworkInformation.xml", "ref/netstandard1.0/System.Net.NetworkInformation.dll", "ref/netstandard1.0/System.Net.NetworkInformation.xml", "ref/netstandard1.0/de/System.Net.NetworkInformation.xml", "ref/netstandard1.0/es/System.Net.NetworkInformation.xml", "ref/netstandard1.0/fr/System.Net.NetworkInformation.xml", "ref/netstandard1.0/it/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ja/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ko/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ru/System.Net.NetworkInformation.xml", "ref/netstandard1.0/zh-hans/System.Net.NetworkInformation.xml", "ref/netstandard1.0/zh-hant/System.Net.NetworkInformation.xml", "ref/netstandard1.3/System.Net.NetworkInformation.dll", "ref/netstandard1.3/System.Net.NetworkInformation.xml", "ref/netstandard1.3/de/System.Net.NetworkInformation.xml", "ref/netstandard1.3/es/System.Net.NetworkInformation.xml", "ref/netstandard1.3/fr/System.Net.NetworkInformation.xml", "ref/netstandard1.3/it/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ja/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ko/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ru/System.Net.NetworkInformation.xml", "ref/netstandard1.3/zh-hans/System.Net.NetworkInformation.xml", "ref/netstandard1.3/zh-hant/System.Net.NetworkInformation.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll", "runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll", "runtimes/win/lib/net46/System.Net.NetworkInformation.dll", "runtimes/win/lib/netcore50/System.Net.NetworkInformation.dll", "runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll", "system.net.networkinformation.4.3.0.nupkg.sha512", "system.net.networkinformation.nuspec" ] }, "System.Net.Primitives/4.3.0": { "sha512": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "type": "package", "path": "system.net.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Net.Primitives.dll", "ref/netcore50/System.Net.Primitives.xml", "ref/netcore50/de/System.Net.Primitives.xml", "ref/netcore50/es/System.Net.Primitives.xml", "ref/netcore50/fr/System.Net.Primitives.xml", "ref/netcore50/it/System.Net.Primitives.xml", "ref/netcore50/ja/System.Net.Primitives.xml", "ref/netcore50/ko/System.Net.Primitives.xml", "ref/netcore50/ru/System.Net.Primitives.xml", "ref/netcore50/zh-hans/System.Net.Primitives.xml", "ref/netcore50/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.0/System.Net.Primitives.dll", "ref/netstandard1.0/System.Net.Primitives.xml", "ref/netstandard1.0/de/System.Net.Primitives.xml", "ref/netstandard1.0/es/System.Net.Primitives.xml", "ref/netstandard1.0/fr/System.Net.Primitives.xml", "ref/netstandard1.0/it/System.Net.Primitives.xml", "ref/netstandard1.0/ja/System.Net.Primitives.xml", "ref/netstandard1.0/ko/System.Net.Primitives.xml", "ref/netstandard1.0/ru/System.Net.Primitives.xml", "ref/netstandard1.0/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.0/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.1/System.Net.Primitives.dll", "ref/netstandard1.1/System.Net.Primitives.xml", "ref/netstandard1.1/de/System.Net.Primitives.xml", "ref/netstandard1.1/es/System.Net.Primitives.xml", "ref/netstandard1.1/fr/System.Net.Primitives.xml", "ref/netstandard1.1/it/System.Net.Primitives.xml", "ref/netstandard1.1/ja/System.Net.Primitives.xml", "ref/netstandard1.1/ko/System.Net.Primitives.xml", "ref/netstandard1.1/ru/System.Net.Primitives.xml", "ref/netstandard1.1/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.1/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.3/System.Net.Primitives.dll", "ref/netstandard1.3/System.Net.Primitives.xml", "ref/netstandard1.3/de/System.Net.Primitives.xml", "ref/netstandard1.3/es/System.Net.Primitives.xml", "ref/netstandard1.3/fr/System.Net.Primitives.xml", "ref/netstandard1.3/it/System.Net.Primitives.xml", "ref/netstandard1.3/ja/System.Net.Primitives.xml", "ref/netstandard1.3/ko/System.Net.Primitives.xml", "ref/netstandard1.3/ru/System.Net.Primitives.xml", "ref/netstandard1.3/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.3/zh-hant/System.Net.Primitives.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.net.primitives.4.3.0.nupkg.sha512", "system.net.primitives.nuspec" ] }, "System.Net.Sockets/4.3.0": { "sha512": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "type": "package", "path": "system.net.sockets/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Net.Sockets.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Net.Sockets.dll", "ref/netstandard1.3/System.Net.Sockets.dll", "ref/netstandard1.3/System.Net.Sockets.xml", "ref/netstandard1.3/de/System.Net.Sockets.xml", "ref/netstandard1.3/es/System.Net.Sockets.xml", "ref/netstandard1.3/fr/System.Net.Sockets.xml", "ref/netstandard1.3/it/System.Net.Sockets.xml", "ref/netstandard1.3/ja/System.Net.Sockets.xml", "ref/netstandard1.3/ko/System.Net.Sockets.xml", "ref/netstandard1.3/ru/System.Net.Sockets.xml", "ref/netstandard1.3/zh-hans/System.Net.Sockets.xml", "ref/netstandard1.3/zh-hant/System.Net.Sockets.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.net.sockets.4.3.0.nupkg.sha512", "system.net.sockets.nuspec" ] }, "System.Numerics.Vectors/4.5.0": { "sha512": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==", "type": "package", "path": "system.numerics.vectors/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Numerics.Vectors.dll", "lib/net46/System.Numerics.Vectors.xml", "lib/netcoreapp2.0/_._", "lib/netstandard1.0/System.Numerics.Vectors.dll", "lib/netstandard1.0/System.Numerics.Vectors.xml", "lib/netstandard2.0/System.Numerics.Vectors.dll", "lib/netstandard2.0/System.Numerics.Vectors.xml", "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.dll", "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.xml", "lib/uap10.0.16299/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/System.Numerics.Vectors.dll", "ref/net45/System.Numerics.Vectors.xml", "ref/net46/System.Numerics.Vectors.dll", "ref/net46/System.Numerics.Vectors.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.0/System.Numerics.Vectors.dll", "ref/netstandard1.0/System.Numerics.Vectors.xml", "ref/netstandard2.0/System.Numerics.Vectors.dll", "ref/netstandard2.0/System.Numerics.Vectors.xml", "ref/uap10.0.16299/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.numerics.vectors.4.5.0.nupkg.sha512", "system.numerics.vectors.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Private.Uri/4.3.0": { "sha512": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", "type": "package", "path": "system.private.uri/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "ref/netstandard/_._", "system.private.uri.4.3.0.nupkg.sha512", "system.private.uri.nuspec" ] }, "System.Reflection/4.3.0": { "sha512": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "type": "package", "path": "system.reflection/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Reflection.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Reflection.dll", "ref/netcore50/System.Reflection.dll", "ref/netcore50/System.Reflection.xml", "ref/netcore50/de/System.Reflection.xml", "ref/netcore50/es/System.Reflection.xml", "ref/netcore50/fr/System.Reflection.xml", "ref/netcore50/it/System.Reflection.xml", "ref/netcore50/ja/System.Reflection.xml", "ref/netcore50/ko/System.Reflection.xml", "ref/netcore50/ru/System.Reflection.xml", "ref/netcore50/zh-hans/System.Reflection.xml", "ref/netcore50/zh-hant/System.Reflection.xml", "ref/netstandard1.0/System.Reflection.dll", "ref/netstandard1.0/System.Reflection.xml", "ref/netstandard1.0/de/System.Reflection.xml", "ref/netstandard1.0/es/System.Reflection.xml", "ref/netstandard1.0/fr/System.Reflection.xml", "ref/netstandard1.0/it/System.Reflection.xml", "ref/netstandard1.0/ja/System.Reflection.xml", "ref/netstandard1.0/ko/System.Reflection.xml", "ref/netstandard1.0/ru/System.Reflection.xml", "ref/netstandard1.0/zh-hans/System.Reflection.xml", "ref/netstandard1.0/zh-hant/System.Reflection.xml", "ref/netstandard1.3/System.Reflection.dll", "ref/netstandard1.3/System.Reflection.xml", "ref/netstandard1.3/de/System.Reflection.xml", "ref/netstandard1.3/es/System.Reflection.xml", "ref/netstandard1.3/fr/System.Reflection.xml", "ref/netstandard1.3/it/System.Reflection.xml", "ref/netstandard1.3/ja/System.Reflection.xml", "ref/netstandard1.3/ko/System.Reflection.xml", "ref/netstandard1.3/ru/System.Reflection.xml", "ref/netstandard1.3/zh-hans/System.Reflection.xml", "ref/netstandard1.3/zh-hant/System.Reflection.xml", "ref/netstandard1.5/System.Reflection.dll", "ref/netstandard1.5/System.Reflection.xml", "ref/netstandard1.5/de/System.Reflection.xml", "ref/netstandard1.5/es/System.Reflection.xml", "ref/netstandard1.5/fr/System.Reflection.xml", "ref/netstandard1.5/it/System.Reflection.xml", "ref/netstandard1.5/ja/System.Reflection.xml", "ref/netstandard1.5/ko/System.Reflection.xml", "ref/netstandard1.5/ru/System.Reflection.xml", "ref/netstandard1.5/zh-hans/System.Reflection.xml", "ref/netstandard1.5/zh-hant/System.Reflection.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.reflection.4.3.0.nupkg.sha512", "system.reflection.nuspec" ] }, "System.Reflection.Metadata/1.6.0": { "sha512": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", "type": "package", "path": "system.reflection.metadata/1.6.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.1/System.Reflection.Metadata.dll", "lib/netstandard1.1/System.Reflection.Metadata.xml", "lib/netstandard2.0/System.Reflection.Metadata.dll", "lib/netstandard2.0/System.Reflection.Metadata.xml", "lib/portable-net45+win8/System.Reflection.Metadata.dll", "lib/portable-net45+win8/System.Reflection.Metadata.xml", "system.reflection.metadata.1.6.0.nupkg.sha512", "system.reflection.metadata.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Reflection.Primitives/4.3.0": { "sha512": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "type": "package", "path": "system.reflection.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Reflection.Primitives.dll", "ref/netcore50/System.Reflection.Primitives.xml", "ref/netcore50/de/System.Reflection.Primitives.xml", "ref/netcore50/es/System.Reflection.Primitives.xml", "ref/netcore50/fr/System.Reflection.Primitives.xml", "ref/netcore50/it/System.Reflection.Primitives.xml", "ref/netcore50/ja/System.Reflection.Primitives.xml", "ref/netcore50/ko/System.Reflection.Primitives.xml", "ref/netcore50/ru/System.Reflection.Primitives.xml", "ref/netcore50/zh-hans/System.Reflection.Primitives.xml", "ref/netcore50/zh-hant/System.Reflection.Primitives.xml", "ref/netstandard1.0/System.Reflection.Primitives.dll", "ref/netstandard1.0/System.Reflection.Primitives.xml", "ref/netstandard1.0/de/System.Reflection.Primitives.xml", "ref/netstandard1.0/es/System.Reflection.Primitives.xml", "ref/netstandard1.0/fr/System.Reflection.Primitives.xml", "ref/netstandard1.0/it/System.Reflection.Primitives.xml", "ref/netstandard1.0/ja/System.Reflection.Primitives.xml", "ref/netstandard1.0/ko/System.Reflection.Primitives.xml", "ref/netstandard1.0/ru/System.Reflection.Primitives.xml", "ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml", "ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.reflection.primitives.4.3.0.nupkg.sha512", "system.reflection.primitives.nuspec" ] }, "System.Reflection.TypeExtensions/4.3.0": { "sha512": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", "type": "package", "path": "system.reflection.typeextensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Reflection.TypeExtensions.dll", "lib/net462/System.Reflection.TypeExtensions.dll", "lib/netcore50/System.Reflection.TypeExtensions.dll", "lib/netstandard1.5/System.Reflection.TypeExtensions.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Reflection.TypeExtensions.dll", "ref/net462/System.Reflection.TypeExtensions.dll", "ref/netstandard1.3/System.Reflection.TypeExtensions.dll", "ref/netstandard1.3/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/System.Reflection.TypeExtensions.dll", "ref/netstandard1.5/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll", "system.reflection.typeextensions.4.3.0.nupkg.sha512", "system.reflection.typeextensions.nuspec" ] }, "System.Resources.ResourceManager/4.3.0": { "sha512": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "type": "package", "path": "system.resources.resourcemanager/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Resources.ResourceManager.dll", "ref/netcore50/System.Resources.ResourceManager.xml", "ref/netcore50/de/System.Resources.ResourceManager.xml", "ref/netcore50/es/System.Resources.ResourceManager.xml", "ref/netcore50/fr/System.Resources.ResourceManager.xml", "ref/netcore50/it/System.Resources.ResourceManager.xml", "ref/netcore50/ja/System.Resources.ResourceManager.xml", "ref/netcore50/ko/System.Resources.ResourceManager.xml", "ref/netcore50/ru/System.Resources.ResourceManager.xml", "ref/netcore50/zh-hans/System.Resources.ResourceManager.xml", "ref/netcore50/zh-hant/System.Resources.ResourceManager.xml", "ref/netstandard1.0/System.Resources.ResourceManager.dll", "ref/netstandard1.0/System.Resources.ResourceManager.xml", "ref/netstandard1.0/de/System.Resources.ResourceManager.xml", "ref/netstandard1.0/es/System.Resources.ResourceManager.xml", "ref/netstandard1.0/fr/System.Resources.ResourceManager.xml", "ref/netstandard1.0/it/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ja/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ko/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ru/System.Resources.ResourceManager.xml", "ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml", "ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.resources.resourcemanager.4.3.0.nupkg.sha512", "system.resources.resourcemanager.nuspec" ] }, "System.Runtime/4.3.0": { "sha512": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "type": "package", "path": "system.runtime/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.dll", "lib/portable-net45+win8+wp80+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.dll", "ref/netcore50/System.Runtime.dll", "ref/netcore50/System.Runtime.xml", "ref/netcore50/de/System.Runtime.xml", "ref/netcore50/es/System.Runtime.xml", "ref/netcore50/fr/System.Runtime.xml", "ref/netcore50/it/System.Runtime.xml", "ref/netcore50/ja/System.Runtime.xml", "ref/netcore50/ko/System.Runtime.xml", "ref/netcore50/ru/System.Runtime.xml", "ref/netcore50/zh-hans/System.Runtime.xml", "ref/netcore50/zh-hant/System.Runtime.xml", "ref/netstandard1.0/System.Runtime.dll", "ref/netstandard1.0/System.Runtime.xml", "ref/netstandard1.0/de/System.Runtime.xml", "ref/netstandard1.0/es/System.Runtime.xml", "ref/netstandard1.0/fr/System.Runtime.xml", "ref/netstandard1.0/it/System.Runtime.xml", "ref/netstandard1.0/ja/System.Runtime.xml", "ref/netstandard1.0/ko/System.Runtime.xml", "ref/netstandard1.0/ru/System.Runtime.xml", "ref/netstandard1.0/zh-hans/System.Runtime.xml", "ref/netstandard1.0/zh-hant/System.Runtime.xml", "ref/netstandard1.2/System.Runtime.dll", "ref/netstandard1.2/System.Runtime.xml", "ref/netstandard1.2/de/System.Runtime.xml", "ref/netstandard1.2/es/System.Runtime.xml", "ref/netstandard1.2/fr/System.Runtime.xml", "ref/netstandard1.2/it/System.Runtime.xml", "ref/netstandard1.2/ja/System.Runtime.xml", "ref/netstandard1.2/ko/System.Runtime.xml", "ref/netstandard1.2/ru/System.Runtime.xml", "ref/netstandard1.2/zh-hans/System.Runtime.xml", "ref/netstandard1.2/zh-hant/System.Runtime.xml", "ref/netstandard1.3/System.Runtime.dll", "ref/netstandard1.3/System.Runtime.xml", "ref/netstandard1.3/de/System.Runtime.xml", "ref/netstandard1.3/es/System.Runtime.xml", "ref/netstandard1.3/fr/System.Runtime.xml", "ref/netstandard1.3/it/System.Runtime.xml", "ref/netstandard1.3/ja/System.Runtime.xml", "ref/netstandard1.3/ko/System.Runtime.xml", "ref/netstandard1.3/ru/System.Runtime.xml", "ref/netstandard1.3/zh-hans/System.Runtime.xml", "ref/netstandard1.3/zh-hant/System.Runtime.xml", "ref/netstandard1.5/System.Runtime.dll", "ref/netstandard1.5/System.Runtime.xml", "ref/netstandard1.5/de/System.Runtime.xml", "ref/netstandard1.5/es/System.Runtime.xml", "ref/netstandard1.5/fr/System.Runtime.xml", "ref/netstandard1.5/it/System.Runtime.xml", "ref/netstandard1.5/ja/System.Runtime.xml", "ref/netstandard1.5/ko/System.Runtime.xml", "ref/netstandard1.5/ru/System.Runtime.xml", "ref/netstandard1.5/zh-hans/System.Runtime.xml", "ref/netstandard1.5/zh-hant/System.Runtime.xml", "ref/portable-net45+win8+wp80+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.4.3.0.nupkg.sha512", "system.runtime.nuspec" ] }, "System.Runtime.CompilerServices.Unsafe/4.7.0": { "sha512": "IpU1lcHz8/09yDr9N+Juc7SCgNUz+RohkCQI+KsWKR67XxpFr8Z6c8t1iENCXZuRuNCc4HBwme/MDHNVCwyAKg==", "type": "package", "path": "system.runtime.compilerservices.unsafe/4.7.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.xml", "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml", "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", "ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", "ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml", "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", "system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512", "system.runtime.compilerservices.unsafe.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Runtime.Extensions/4.3.0": { "sha512": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "type": "package", "path": "system.runtime.extensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.Extensions.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.Extensions.dll", "ref/netcore50/System.Runtime.Extensions.dll", "ref/netcore50/System.Runtime.Extensions.xml", "ref/netcore50/de/System.Runtime.Extensions.xml", "ref/netcore50/es/System.Runtime.Extensions.xml", "ref/netcore50/fr/System.Runtime.Extensions.xml", "ref/netcore50/it/System.Runtime.Extensions.xml", "ref/netcore50/ja/System.Runtime.Extensions.xml", "ref/netcore50/ko/System.Runtime.Extensions.xml", "ref/netcore50/ru/System.Runtime.Extensions.xml", "ref/netcore50/zh-hans/System.Runtime.Extensions.xml", "ref/netcore50/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.0/System.Runtime.Extensions.dll", "ref/netstandard1.0/System.Runtime.Extensions.xml", "ref/netstandard1.0/de/System.Runtime.Extensions.xml", "ref/netstandard1.0/es/System.Runtime.Extensions.xml", "ref/netstandard1.0/fr/System.Runtime.Extensions.xml", "ref/netstandard1.0/it/System.Runtime.Extensions.xml", "ref/netstandard1.0/ja/System.Runtime.Extensions.xml", "ref/netstandard1.0/ko/System.Runtime.Extensions.xml", "ref/netstandard1.0/ru/System.Runtime.Extensions.xml", "ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.3/System.Runtime.Extensions.dll", "ref/netstandard1.3/System.Runtime.Extensions.xml", "ref/netstandard1.3/de/System.Runtime.Extensions.xml", "ref/netstandard1.3/es/System.Runtime.Extensions.xml", "ref/netstandard1.3/fr/System.Runtime.Extensions.xml", "ref/netstandard1.3/it/System.Runtime.Extensions.xml", "ref/netstandard1.3/ja/System.Runtime.Extensions.xml", "ref/netstandard1.3/ko/System.Runtime.Extensions.xml", "ref/netstandard1.3/ru/System.Runtime.Extensions.xml", "ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.5/System.Runtime.Extensions.dll", "ref/netstandard1.5/System.Runtime.Extensions.xml", "ref/netstandard1.5/de/System.Runtime.Extensions.xml", "ref/netstandard1.5/es/System.Runtime.Extensions.xml", "ref/netstandard1.5/fr/System.Runtime.Extensions.xml", "ref/netstandard1.5/it/System.Runtime.Extensions.xml", "ref/netstandard1.5/ja/System.Runtime.Extensions.xml", "ref/netstandard1.5/ko/System.Runtime.Extensions.xml", "ref/netstandard1.5/ru/System.Runtime.Extensions.xml", "ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.extensions.4.3.0.nupkg.sha512", "system.runtime.extensions.nuspec" ] }, "System.Runtime.Handles/4.3.0": { "sha512": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "type": "package", "path": "system.runtime.handles/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/_._", "ref/netstandard1.3/System.Runtime.Handles.dll", "ref/netstandard1.3/System.Runtime.Handles.xml", "ref/netstandard1.3/de/System.Runtime.Handles.xml", "ref/netstandard1.3/es/System.Runtime.Handles.xml", "ref/netstandard1.3/fr/System.Runtime.Handles.xml", "ref/netstandard1.3/it/System.Runtime.Handles.xml", "ref/netstandard1.3/ja/System.Runtime.Handles.xml", "ref/netstandard1.3/ko/System.Runtime.Handles.xml", "ref/netstandard1.3/ru/System.Runtime.Handles.xml", "ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml", "ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.handles.4.3.0.nupkg.sha512", "system.runtime.handles.nuspec" ] }, "System.Runtime.InteropServices/4.3.0": { "sha512": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "type": "package", "path": "system.runtime.interopservices/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.InteropServices.dll", "lib/net463/System.Runtime.InteropServices.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.InteropServices.dll", "ref/net463/System.Runtime.InteropServices.dll", "ref/netcore50/System.Runtime.InteropServices.dll", "ref/netcore50/System.Runtime.InteropServices.xml", "ref/netcore50/de/System.Runtime.InteropServices.xml", "ref/netcore50/es/System.Runtime.InteropServices.xml", "ref/netcore50/fr/System.Runtime.InteropServices.xml", "ref/netcore50/it/System.Runtime.InteropServices.xml", "ref/netcore50/ja/System.Runtime.InteropServices.xml", "ref/netcore50/ko/System.Runtime.InteropServices.xml", "ref/netcore50/ru/System.Runtime.InteropServices.xml", "ref/netcore50/zh-hans/System.Runtime.InteropServices.xml", "ref/netcore50/zh-hant/System.Runtime.InteropServices.xml", "ref/netcoreapp1.1/System.Runtime.InteropServices.dll", "ref/netstandard1.1/System.Runtime.InteropServices.dll", "ref/netstandard1.1/System.Runtime.InteropServices.xml", "ref/netstandard1.1/de/System.Runtime.InteropServices.xml", "ref/netstandard1.1/es/System.Runtime.InteropServices.xml", "ref/netstandard1.1/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.1/it/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.2/System.Runtime.InteropServices.dll", "ref/netstandard1.2/System.Runtime.InteropServices.xml", "ref/netstandard1.2/de/System.Runtime.InteropServices.xml", "ref/netstandard1.2/es/System.Runtime.InteropServices.xml", "ref/netstandard1.2/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.2/it/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.3/System.Runtime.InteropServices.dll", "ref/netstandard1.3/System.Runtime.InteropServices.xml", "ref/netstandard1.3/de/System.Runtime.InteropServices.xml", "ref/netstandard1.3/es/System.Runtime.InteropServices.xml", "ref/netstandard1.3/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.3/it/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.5/System.Runtime.InteropServices.dll", "ref/netstandard1.5/System.Runtime.InteropServices.xml", "ref/netstandard1.5/de/System.Runtime.InteropServices.xml", "ref/netstandard1.5/es/System.Runtime.InteropServices.xml", "ref/netstandard1.5/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.5/it/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.interopservices.4.3.0.nupkg.sha512", "system.runtime.interopservices.nuspec" ] }, "System.Security.Claims/4.3.0": { "sha512": "P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "type": "package", "path": "system.security.claims/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Claims.dll", "lib/netstandard1.3/System.Security.Claims.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Claims.dll", "ref/netstandard1.3/System.Security.Claims.dll", "ref/netstandard1.3/System.Security.Claims.xml", "ref/netstandard1.3/de/System.Security.Claims.xml", "ref/netstandard1.3/es/System.Security.Claims.xml", "ref/netstandard1.3/fr/System.Security.Claims.xml", "ref/netstandard1.3/it/System.Security.Claims.xml", "ref/netstandard1.3/ja/System.Security.Claims.xml", "ref/netstandard1.3/ko/System.Security.Claims.xml", "ref/netstandard1.3/ru/System.Security.Claims.xml", "ref/netstandard1.3/zh-hans/System.Security.Claims.xml", "ref/netstandard1.3/zh-hant/System.Security.Claims.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.security.claims.4.3.0.nupkg.sha512", "system.security.claims.nuspec" ] }, "System.Security.Cryptography.Cng/4.5.0": { "sha512": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==", "type": "package", "path": "system.security.cryptography.cng/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Cryptography.Cng.dll", "lib/net461/System.Security.Cryptography.Cng.dll", "lib/net462/System.Security.Cryptography.Cng.dll", "lib/net47/System.Security.Cryptography.Cng.dll", "lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll", "lib/netstandard1.3/System.Security.Cryptography.Cng.dll", "lib/netstandard1.4/System.Security.Cryptography.Cng.dll", "lib/netstandard1.6/System.Security.Cryptography.Cng.dll", "lib/netstandard2.0/System.Security.Cryptography.Cng.dll", "lib/uap10.0.16299/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Cryptography.Cng.dll", "ref/net461/System.Security.Cryptography.Cng.dll", "ref/net461/System.Security.Cryptography.Cng.xml", "ref/net462/System.Security.Cryptography.Cng.dll", "ref/net462/System.Security.Cryptography.Cng.xml", "ref/net47/System.Security.Cryptography.Cng.dll", "ref/net47/System.Security.Cryptography.Cng.xml", "ref/netcoreapp2.0/System.Security.Cryptography.Cng.dll", "ref/netcoreapp2.0/System.Security.Cryptography.Cng.xml", "ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll", "ref/netcoreapp2.1/System.Security.Cryptography.Cng.xml", "ref/netstandard1.3/System.Security.Cryptography.Cng.dll", "ref/netstandard1.4/System.Security.Cryptography.Cng.dll", "ref/netstandard1.6/System.Security.Cryptography.Cng.dll", "ref/netstandard2.0/System.Security.Cryptography.Cng.dll", "ref/netstandard2.0/System.Security.Cryptography.Cng.xml", "ref/uap10.0.16299/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/win/lib/net46/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net461/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net462/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net47/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netcoreapp2.0/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.4/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/uap10.0.16299/_._", "system.security.cryptography.cng.4.5.0.nupkg.sha512", "system.security.cryptography.cng.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Security.Principal/4.3.0": { "sha512": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "type": "package", "path": "system.security.principal/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Security.Principal.dll", "lib/netstandard1.0/System.Security.Principal.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Security.Principal.dll", "ref/netcore50/System.Security.Principal.xml", "ref/netcore50/de/System.Security.Principal.xml", "ref/netcore50/es/System.Security.Principal.xml", "ref/netcore50/fr/System.Security.Principal.xml", "ref/netcore50/it/System.Security.Principal.xml", "ref/netcore50/ja/System.Security.Principal.xml", "ref/netcore50/ko/System.Security.Principal.xml", "ref/netcore50/ru/System.Security.Principal.xml", "ref/netcore50/zh-hans/System.Security.Principal.xml", "ref/netcore50/zh-hant/System.Security.Principal.xml", "ref/netstandard1.0/System.Security.Principal.dll", "ref/netstandard1.0/System.Security.Principal.xml", "ref/netstandard1.0/de/System.Security.Principal.xml", "ref/netstandard1.0/es/System.Security.Principal.xml", "ref/netstandard1.0/fr/System.Security.Principal.xml", "ref/netstandard1.0/it/System.Security.Principal.xml", "ref/netstandard1.0/ja/System.Security.Principal.xml", "ref/netstandard1.0/ko/System.Security.Principal.xml", "ref/netstandard1.0/ru/System.Security.Principal.xml", "ref/netstandard1.0/zh-hans/System.Security.Principal.xml", "ref/netstandard1.0/zh-hant/System.Security.Principal.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.security.principal.4.3.0.nupkg.sha512", "system.security.principal.nuspec" ] }, "System.Security.Principal.Windows/4.3.0": { "sha512": "HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", "type": "package", "path": "system.security.principal.windows/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Security.Principal.Windows.dll", "ref/net46/System.Security.Principal.Windows.dll", "ref/netstandard1.3/System.Security.Principal.Windows.dll", "ref/netstandard1.3/System.Security.Principal.Windows.xml", "ref/netstandard1.3/de/System.Security.Principal.Windows.xml", "ref/netstandard1.3/es/System.Security.Principal.Windows.xml", "ref/netstandard1.3/fr/System.Security.Principal.Windows.xml", "ref/netstandard1.3/it/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ja/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ko/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ru/System.Security.Principal.Windows.xml", "ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml", "ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml", "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll", "runtimes/win/lib/net46/System.Security.Principal.Windows.dll", "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll", "system.security.principal.windows.4.3.0.nupkg.sha512", "system.security.principal.windows.nuspec" ] }, "System.Text.Encoding/4.3.0": { "sha512": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "type": "package", "path": "system.text.encoding/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Text.Encoding.dll", "ref/netcore50/System.Text.Encoding.xml", "ref/netcore50/de/System.Text.Encoding.xml", "ref/netcore50/es/System.Text.Encoding.xml", "ref/netcore50/fr/System.Text.Encoding.xml", "ref/netcore50/it/System.Text.Encoding.xml", "ref/netcore50/ja/System.Text.Encoding.xml", "ref/netcore50/ko/System.Text.Encoding.xml", "ref/netcore50/ru/System.Text.Encoding.xml", "ref/netcore50/zh-hans/System.Text.Encoding.xml", "ref/netcore50/zh-hant/System.Text.Encoding.xml", "ref/netstandard1.0/System.Text.Encoding.dll", "ref/netstandard1.0/System.Text.Encoding.xml", "ref/netstandard1.0/de/System.Text.Encoding.xml", "ref/netstandard1.0/es/System.Text.Encoding.xml", "ref/netstandard1.0/fr/System.Text.Encoding.xml", "ref/netstandard1.0/it/System.Text.Encoding.xml", "ref/netstandard1.0/ja/System.Text.Encoding.xml", "ref/netstandard1.0/ko/System.Text.Encoding.xml", "ref/netstandard1.0/ru/System.Text.Encoding.xml", "ref/netstandard1.0/zh-hans/System.Text.Encoding.xml", "ref/netstandard1.0/zh-hant/System.Text.Encoding.xml", "ref/netstandard1.3/System.Text.Encoding.dll", "ref/netstandard1.3/System.Text.Encoding.xml", "ref/netstandard1.3/de/System.Text.Encoding.xml", "ref/netstandard1.3/es/System.Text.Encoding.xml", "ref/netstandard1.3/fr/System.Text.Encoding.xml", "ref/netstandard1.3/it/System.Text.Encoding.xml", "ref/netstandard1.3/ja/System.Text.Encoding.xml", "ref/netstandard1.3/ko/System.Text.Encoding.xml", "ref/netstandard1.3/ru/System.Text.Encoding.xml", "ref/netstandard1.3/zh-hans/System.Text.Encoding.xml", "ref/netstandard1.3/zh-hant/System.Text.Encoding.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.text.encoding.4.3.0.nupkg.sha512", "system.text.encoding.nuspec" ] }, "System.Text.Encoding.CodePages/4.5.1": { "sha512": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", "type": "package", "path": "system.text.encoding.codepages/4.5.1", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Text.Encoding.CodePages.dll", "lib/net461/System.Text.Encoding.CodePages.dll", "lib/netstandard1.3/System.Text.Encoding.CodePages.dll", "lib/netstandard2.0/System.Text.Encoding.CodePages.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/win/lib/net461/System.Text.Encoding.CodePages.dll", "runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll", "runtimes/win/lib/netstandard1.3/System.Text.Encoding.CodePages.dll", "runtimes/win/lib/netstandard2.0/System.Text.Encoding.CodePages.dll", "system.text.encoding.codepages.4.5.1.nupkg.sha512", "system.text.encoding.codepages.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Text.Encoding.Extensions/4.3.0": { "sha512": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", "type": "package", "path": "system.text.encoding.extensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Text.Encoding.Extensions.dll", "ref/netcore50/System.Text.Encoding.Extensions.xml", "ref/netcore50/de/System.Text.Encoding.Extensions.xml", "ref/netcore50/es/System.Text.Encoding.Extensions.xml", "ref/netcore50/fr/System.Text.Encoding.Extensions.xml", "ref/netcore50/it/System.Text.Encoding.Extensions.xml", "ref/netcore50/ja/System.Text.Encoding.Extensions.xml", "ref/netcore50/ko/System.Text.Encoding.Extensions.xml", "ref/netcore50/ru/System.Text.Encoding.Extensions.xml", "ref/netcore50/zh-hans/System.Text.Encoding.Extensions.xml", "ref/netcore50/zh-hant/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/System.Text.Encoding.Extensions.dll", "ref/netstandard1.0/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/de/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/es/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/fr/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/it/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/ja/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/ko/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/ru/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/zh-hans/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/zh-hant/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/System.Text.Encoding.Extensions.dll", "ref/netstandard1.3/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/de/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/es/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/fr/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/it/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/ja/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/ko/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/ru/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/zh-hans/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/zh-hant/System.Text.Encoding.Extensions.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.text.encoding.extensions.4.3.0.nupkg.sha512", "system.text.encoding.extensions.nuspec" ] }, "System.Text.Encodings.Web/4.5.0": { "sha512": "Xg4G4Indi4dqP1iuAiMSwpiWS54ZghzR644OtsRCm/m/lBMG8dUBhLVN7hLm8NNrNTR+iGbshCPTwrvxZPlm4g==", "type": "package", "path": "system.text.encodings.web/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.0/System.Text.Encodings.Web.dll", "lib/netstandard1.0/System.Text.Encodings.Web.xml", "lib/netstandard2.0/System.Text.Encodings.Web.dll", "lib/netstandard2.0/System.Text.Encodings.Web.xml", "system.text.encodings.web.4.5.0.nupkg.sha512", "system.text.encodings.web.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Threading/4.3.0": { "sha512": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "type": "package", "path": "system.threading/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Threading.dll", "lib/netstandard1.3/System.Threading.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Threading.dll", "ref/netcore50/System.Threading.xml", "ref/netcore50/de/System.Threading.xml", "ref/netcore50/es/System.Threading.xml", "ref/netcore50/fr/System.Threading.xml", "ref/netcore50/it/System.Threading.xml", "ref/netcore50/ja/System.Threading.xml", "ref/netcore50/ko/System.Threading.xml", "ref/netcore50/ru/System.Threading.xml", "ref/netcore50/zh-hans/System.Threading.xml", "ref/netcore50/zh-hant/System.Threading.xml", "ref/netstandard1.0/System.Threading.dll", "ref/netstandard1.0/System.Threading.xml", "ref/netstandard1.0/de/System.Threading.xml", "ref/netstandard1.0/es/System.Threading.xml", "ref/netstandard1.0/fr/System.Threading.xml", "ref/netstandard1.0/it/System.Threading.xml", "ref/netstandard1.0/ja/System.Threading.xml", "ref/netstandard1.0/ko/System.Threading.xml", "ref/netstandard1.0/ru/System.Threading.xml", "ref/netstandard1.0/zh-hans/System.Threading.xml", "ref/netstandard1.0/zh-hant/System.Threading.xml", "ref/netstandard1.3/System.Threading.dll", "ref/netstandard1.3/System.Threading.xml", "ref/netstandard1.3/de/System.Threading.xml", "ref/netstandard1.3/es/System.Threading.xml", "ref/netstandard1.3/fr/System.Threading.xml", "ref/netstandard1.3/it/System.Threading.xml", "ref/netstandard1.3/ja/System.Threading.xml", "ref/netstandard1.3/ko/System.Threading.xml", "ref/netstandard1.3/ru/System.Threading.xml", "ref/netstandard1.3/zh-hans/System.Threading.xml", "ref/netstandard1.3/zh-hant/System.Threading.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Threading.dll", "system.threading.4.3.0.nupkg.sha512", "system.threading.nuspec" ] }, "System.Threading.Overlapped/4.3.0": { "sha512": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", "type": "package", "path": "system.threading.overlapped/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Threading.Overlapped.dll", "ref/net46/System.Threading.Overlapped.dll", "ref/netstandard1.3/System.Threading.Overlapped.dll", "ref/netstandard1.3/System.Threading.Overlapped.xml", "ref/netstandard1.3/de/System.Threading.Overlapped.xml", "ref/netstandard1.3/es/System.Threading.Overlapped.xml", "ref/netstandard1.3/fr/System.Threading.Overlapped.xml", "ref/netstandard1.3/it/System.Threading.Overlapped.xml", "ref/netstandard1.3/ja/System.Threading.Overlapped.xml", "ref/netstandard1.3/ko/System.Threading.Overlapped.xml", "ref/netstandard1.3/ru/System.Threading.Overlapped.xml", "ref/netstandard1.3/zh-hans/System.Threading.Overlapped.xml", "ref/netstandard1.3/zh-hant/System.Threading.Overlapped.xml", "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll", "runtimes/win/lib/net46/System.Threading.Overlapped.dll", "runtimes/win/lib/netcore50/System.Threading.Overlapped.dll", "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll", "system.threading.overlapped.4.3.0.nupkg.sha512", "system.threading.overlapped.nuspec" ] }, "System.Threading.Tasks/4.3.0": { "sha512": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "type": "package", "path": "system.threading.tasks/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Threading.Tasks.dll", "ref/netcore50/System.Threading.Tasks.xml", "ref/netcore50/de/System.Threading.Tasks.xml", "ref/netcore50/es/System.Threading.Tasks.xml", "ref/netcore50/fr/System.Threading.Tasks.xml", "ref/netcore50/it/System.Threading.Tasks.xml", "ref/netcore50/ja/System.Threading.Tasks.xml", "ref/netcore50/ko/System.Threading.Tasks.xml", "ref/netcore50/ru/System.Threading.Tasks.xml", "ref/netcore50/zh-hans/System.Threading.Tasks.xml", "ref/netcore50/zh-hant/System.Threading.Tasks.xml", "ref/netstandard1.0/System.Threading.Tasks.dll", "ref/netstandard1.0/System.Threading.Tasks.xml", "ref/netstandard1.0/de/System.Threading.Tasks.xml", "ref/netstandard1.0/es/System.Threading.Tasks.xml", "ref/netstandard1.0/fr/System.Threading.Tasks.xml", "ref/netstandard1.0/it/System.Threading.Tasks.xml", "ref/netstandard1.0/ja/System.Threading.Tasks.xml", "ref/netstandard1.0/ko/System.Threading.Tasks.xml", "ref/netstandard1.0/ru/System.Threading.Tasks.xml", "ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml", "ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml", "ref/netstandard1.3/System.Threading.Tasks.dll", "ref/netstandard1.3/System.Threading.Tasks.xml", "ref/netstandard1.3/de/System.Threading.Tasks.xml", "ref/netstandard1.3/es/System.Threading.Tasks.xml", "ref/netstandard1.3/fr/System.Threading.Tasks.xml", "ref/netstandard1.3/it/System.Threading.Tasks.xml", "ref/netstandard1.3/ja/System.Threading.Tasks.xml", "ref/netstandard1.3/ko/System.Threading.Tasks.xml", "ref/netstandard1.3/ru/System.Threading.Tasks.xml", "ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml", "ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.tasks.4.3.0.nupkg.sha512", "system.threading.tasks.nuspec" ] }, "System.Threading.Tasks.Extensions/4.5.3": { "sha512": "+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==", "type": "package", "path": "system.threading.tasks.extensions/4.5.3", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/netcoreapp2.1/_._", "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll", "lib/netstandard1.0/System.Threading.Tasks.Extensions.xml", "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll", "lib/netstandard2.0/System.Threading.Tasks.Extensions.xml", "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll", "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/netcoreapp2.1/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.tasks.extensions.4.5.3.nupkg.sha512", "system.threading.tasks.extensions.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Threading.Thread/4.3.0": { "sha512": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", "type": "package", "path": "system.threading.thread/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Threading.Thread.dll", "lib/netcore50/_._", "lib/netstandard1.3/System.Threading.Thread.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Threading.Thread.dll", "ref/netstandard1.3/System.Threading.Thread.dll", "ref/netstandard1.3/System.Threading.Thread.xml", "ref/netstandard1.3/de/System.Threading.Thread.xml", "ref/netstandard1.3/es/System.Threading.Thread.xml", "ref/netstandard1.3/fr/System.Threading.Thread.xml", "ref/netstandard1.3/it/System.Threading.Thread.xml", "ref/netstandard1.3/ja/System.Threading.Thread.xml", "ref/netstandard1.3/ko/System.Threading.Thread.xml", "ref/netstandard1.3/ru/System.Threading.Thread.xml", "ref/netstandard1.3/zh-hans/System.Threading.Thread.xml", "ref/netstandard1.3/zh-hant/System.Threading.Thread.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.thread.4.3.0.nupkg.sha512", "system.threading.thread.nuspec" ] }, "System.Threading.ThreadPool/4.3.0": { "sha512": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", "type": "package", "path": "system.threading.threadpool/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Threading.ThreadPool.dll", "lib/netcore50/_._", "lib/netstandard1.3/System.Threading.ThreadPool.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Threading.ThreadPool.dll", "ref/netstandard1.3/System.Threading.ThreadPool.dll", "ref/netstandard1.3/System.Threading.ThreadPool.xml", "ref/netstandard1.3/de/System.Threading.ThreadPool.xml", "ref/netstandard1.3/es/System.Threading.ThreadPool.xml", "ref/netstandard1.3/fr/System.Threading.ThreadPool.xml", "ref/netstandard1.3/it/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ja/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ko/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ru/System.Threading.ThreadPool.xml", "ref/netstandard1.3/zh-hans/System.Threading.ThreadPool.xml", "ref/netstandard1.3/zh-hant/System.Threading.ThreadPool.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.threadpool.4.3.0.nupkg.sha512", "system.threading.threadpool.nuspec" ] }, "Splamy.TSLib/1.1.0": { "type": "project", "path": "../TSLib/TSLib.csproj", "msbuildProject": "../TSLib/TSLib.csproj" } }, "projectFileDependencyGroups": { ".NETCoreApp,Version=v3.1": [ "CliWrap >= 3.1.0", "CommandLineParser >= 2.8.0", "LiteDB >= 4.1.4", "Microsoft.AspNetCore.Cors >= 2.2.0", "Microsoft.AspNetCore.Server.Kestrel >= 2.2.0", "Microsoft.AspNetCore.StaticFiles >= 2.2.0", "Microsoft.CodeAnalysis.CSharp >= 3.7.0", "NLog >= 4.7.3", "Nett >= 0.15.0", "Newtonsoft.Json >= 12.0.3", "PlaylistsNET >= 1.1.2", "SixLabors.ImageSharp >= 1.0.0", "Splamy.TSLib >= 1.1.0" ] }, "packageFolders": { "C:\\Users\\13336\\.nuget\\packages\\": {}, "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} }, "project": { "version": "1.0.0", "restore": { "projectUniqueName": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "projectName": "TS3AudioBot", "projectPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "packagesPath": "C:\\Users\\13336\\.nuget\\packages\\", "outputPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\publish\\win-x64\\", "projectStyle": "PackageReference", "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" ], "configFilePaths": [ "C:\\Users\\13336\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": { "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "projectPath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj" } } } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "dependencies": { "CliWrap": { "target": "Package", "version": "[3.1.0, )" }, "CommandLineParser": { "target": "Package", "version": "[2.8.0, )" }, "LiteDB": { "target": "Package", "version": "[4.1.4, )" }, "Microsoft.AspNetCore.Cors": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.Server.Kestrel": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.StaticFiles": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.CodeAnalysis.CSharp": { "include": "Runtime, Compile, Build, Native, ContentFiles, BuildTransitive", "target": "Package", "version": "[3.7.0, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Nett": { "target": "Package", "version": "[0.15.0, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "PlaylistsNET": { "target": "Package", "version": "[1.1.2, )" }, "SixLabors.ImageSharp": { "target": "Package", "version": "[1.0.0, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48", "net481" ], "assetTargetFallback": true, "warn": true, "downloadDependencies": [ { "name": "Microsoft.AspNetCore.App.Ref", "version": "[3.1.10, 3.1.10]" }, { "name": "Microsoft.AspNetCore.App.Runtime.win-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.NETCore.App.Host.win-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.NETCore.App.Ref", "version": "[3.1.0, 3.1.0]" }, { "name": "Microsoft.NETCore.App.Runtime.win-x64", "version": "[3.1.32, 3.1.32]" }, { "name": "Microsoft.WindowsDesktop.App.Ref", "version": "[3.1.0, 3.1.0]" }, { "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", "version": "[3.1.32, 3.1.32]" } ], "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.201\\RuntimeIdentifierGraph.json" } }, "runtimes": { "win-x64": { "#import": [] } } } } ================================================ FILE: TS3AudioBot/obj/publish/win-x64/project.nuget.cache ================================================ { "version": 2, "dgSpecHash": "GYIGf3if42QEtG/dcHmDuBdig+mg3nhFkeLTDebbx7VJHr13q1tpcgriOzm4tmyW5aaepnvm1Emtb9YMk9b7Dw==", "success": true, "projectFilePath": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "expectedPackageFiles": [ "C:\\Users\\13336\\.nuget\\packages\\cliwrap\\3.1.0\\cliwrap.3.1.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\commandlineparser\\2.8.0\\commandlineparser.2.8.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\heijden.dns.portable\\2.0.19\\heijden.dns.portable.2.0.19.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\litedb\\4.1.4\\litedb.4.1.4.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.connections.abstractions\\2.2.0\\microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.cors\\2.2.0\\microsoft.aspnetcore.cors.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.hosting\\2.2.0\\microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.hosting.abstractions\\2.2.0\\microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.hosting.server.abstractions\\2.2.0\\microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.http\\2.2.0\\microsoft.aspnetcore.http.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.http.abstractions\\2.2.0\\microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.http.extensions\\2.2.0\\microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.http.features\\2.2.0\\microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel\\2.2.0\\microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.core\\2.2.0\\microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.https\\2.2.0\\microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.transport.abstractions\\2.2.0\\microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.transport.sockets\\2.2.0\\microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.staticfiles\\2.2.0\\microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.webutilities\\2.2.0\\microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.codeanalysis.analyzers\\3.0.0\\microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.codeanalysis.common\\3.7.0\\microsoft.codeanalysis.common.3.7.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.codeanalysis.csharp\\3.7.0\\microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.configuration\\2.2.0\\microsoft.extensions.configuration.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\2.2.0\\microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.configuration.binder\\2.2.0\\microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.configuration.environmentvariables\\2.2.0\\microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.configuration.fileextensions\\2.2.0\\microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\2.2.0\\microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\2.2.0\\microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.fileproviders.abstractions\\2.2.0\\microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.fileproviders.physical\\2.2.0\\microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.filesystemglobbing\\2.2.0\\microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.hosting.abstractions\\2.2.0\\microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.logging\\2.2.0\\microsoft.extensions.logging.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\2.2.0\\microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.objectpool\\2.2.0\\microsoft.extensions.objectpool.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.options\\2.2.0\\microsoft.extensions.options.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.primitives\\2.2.0\\microsoft.extensions.primitives.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.extensions.webencoders\\2.2.0\\microsoft.extensions.webencoders.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.net.http.headers\\2.2.0\\microsoft.net.http.headers.2.2.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.netcore.platforms\\2.1.2\\microsoft.netcore.platforms.2.1.2.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.netcore.targets\\1.1.0\\microsoft.netcore.targets.1.1.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.win32.primitives\\4.3.0\\microsoft.win32.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\nett\\0.15.0\\nett.0.15.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\newtonsoft.json\\12.0.3\\newtonsoft.json.12.0.3.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\nlog\\4.7.3\\nlog.4.7.3.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\playlistsnet\\1.1.2\\playlistsnet.1.1.2.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\portable.bouncycastle\\1.8.6.7\\portable.bouncycastle.1.8.6.7.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.collections\\4.3.0\\runtime.any.system.collections.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.diagnostics.tracing\\4.3.0\\runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.globalization\\4.3.0\\runtime.any.system.globalization.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.io\\4.3.0\\runtime.any.system.io.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.reflection\\4.3.0\\runtime.any.system.reflection.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.reflection.primitives\\4.3.0\\runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.resources.resourcemanager\\4.3.0\\runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.runtime\\4.3.0\\runtime.any.system.runtime.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.runtime.handles\\4.3.0\\runtime.any.system.runtime.handles.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.runtime.interopservices\\4.3.0\\runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.text.encoding\\4.3.0\\runtime.any.system.text.encoding.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.text.encoding.extensions\\4.3.0\\runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.any.system.threading.tasks\\4.3.0\\runtime.any.system.threading.tasks.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.native.system\\4.3.0\\runtime.native.system.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.win.microsoft.win32.primitives\\4.3.0\\runtime.win.microsoft.win32.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.win.system.diagnostics.debug\\4.3.0\\runtime.win.system.diagnostics.debug.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.win.system.io.filesystem\\4.3.0\\runtime.win.system.io.filesystem.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.win.system.net.primitives\\4.3.0\\runtime.win.system.net.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.win.system.net.sockets\\4.3.0\\runtime.win.system.net.sockets.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\runtime.win.system.runtime.extensions\\4.3.0\\runtime.win.system.runtime.extensions.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\sixlabors.imagesharp\\1.0.0\\sixlabors.imagesharp.1.0.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\splamy.ed25519.toolkit\\1.0.3\\splamy.ed25519.toolkit.1.0.3.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.buffers\\4.5.0\\system.buffers.4.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.collections\\4.3.0\\system.collections.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.collections.immutable\\1.5.0\\system.collections.immutable.1.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.componentmodel.annotations\\4.5.0\\system.componentmodel.annotations.4.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.diagnostics.debug\\4.3.0\\system.diagnostics.debug.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.diagnostics.diagnosticsource\\4.5.0\\system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.diagnostics.tracing\\4.3.0\\system.diagnostics.tracing.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.globalization\\4.3.0\\system.globalization.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.io\\4.3.0\\system.io.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.io.filesystem\\4.3.0\\system.io.filesystem.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.io.filesystem.primitives\\4.3.0\\system.io.filesystem.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.io.pipelines\\4.7.2\\system.io.pipelines.4.7.2.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.linq\\4.3.0\\system.linq.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.memory\\4.5.4\\system.memory.4.5.4.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.net.nameresolution\\4.3.0\\system.net.nameresolution.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.net.networkinformation\\4.3.0\\system.net.networkinformation.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.net.primitives\\4.3.0\\system.net.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.net.sockets\\4.3.0\\system.net.sockets.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.numerics.vectors\\4.5.0\\system.numerics.vectors.4.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.private.uri\\4.3.0\\system.private.uri.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.reflection\\4.3.0\\system.reflection.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.reflection.primitives\\4.3.0\\system.reflection.primitives.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.reflection.typeextensions\\4.3.0\\system.reflection.typeextensions.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.resources.resourcemanager\\4.3.0\\system.resources.resourcemanager.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.runtime\\4.3.0\\system.runtime.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\4.7.0\\system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.runtime.extensions\\4.3.0\\system.runtime.extensions.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.runtime.handles\\4.3.0\\system.runtime.handles.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.runtime.interopservices\\4.3.0\\system.runtime.interopservices.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.security.claims\\4.3.0\\system.security.claims.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.security.cryptography.cng\\4.5.0\\system.security.cryptography.cng.4.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.security.principal\\4.3.0\\system.security.principal.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.security.principal.windows\\4.3.0\\system.security.principal.windows.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.text.encoding\\4.3.0\\system.text.encoding.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.text.encoding.codepages\\4.5.1\\system.text.encoding.codepages.4.5.1.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.text.encoding.extensions\\4.3.0\\system.text.encoding.extensions.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.text.encodings.web\\4.5.0\\system.text.encodings.web.4.5.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.threading\\4.3.0\\system.threading.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.threading.overlapped\\4.3.0\\system.threading.overlapped.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.threading.tasks\\4.3.0\\system.threading.tasks.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.threading.tasks.extensions\\4.5.3\\system.threading.tasks.extensions.4.5.3.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.threading.thread\\4.3.0\\system.threading.thread.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\system.threading.threadpool\\4.3.0\\system.threading.threadpool.4.3.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.netcore.app.ref\\3.1.0\\microsoft.netcore.app.ref.3.1.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\3.1.0\\microsoft.windowsdesktop.app.ref.3.1.0.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.netcore.app.runtime.win-x64\\3.1.32\\microsoft.netcore.app.runtime.win-x64.3.1.32.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.windowsdesktop.app.runtime.win-x64\\3.1.32\\microsoft.windowsdesktop.app.runtime.win-x64.3.1.32.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.app.runtime.win-x64\\3.1.32\\microsoft.aspnetcore.app.runtime.win-x64.3.1.32.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.netcore.app.host.win-x64\\3.1.32\\microsoft.netcore.app.host.win-x64.3.1.32.nupkg.sha512", "C:\\Users\\13336\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\3.1.10\\microsoft.aspnetcore.app.ref.3.1.10.nupkg.sha512" ], "logs": [] } ================================================ FILE: TSLib/Audio/AudioInterfaces.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TSLib.Audio { public interface IAudioStream { } /// Passive producer will serve audio data that must be read. public interface IAudioPassiveProducer : IAudioStream, IDisposable { int Read(byte[] buffer, int offset, int length, out Meta? meta); } /// Active producer will push audio to the out stream. public interface IAudioActiveProducer : IAudioStream { IAudioPassiveConsumer? OutStream { get; set; } } /// Passive consumer will wait for manually passed audio data. public interface IAudioPassiveConsumer : IAudioStream { bool Active { get; } void Write(Span data, Meta? meta); } /// Active consumer will pull audio data when required. public interface IAudioActiveConsumer : IAudioStream { IAudioPassiveProducer? InStream { get; set; } } // Best practices for pipes: // - Use Active-Propagiation: `Active => OutStream?.Active ?? false` // - Alway check `OutStream != null` at begin of Write(...) public interface IAudioPipe : IAudioPassiveConsumer, IAudioActiveProducer { } public interface ISampleInfo { int SampleRate { get; } int Channels { get; } int BitsPerSample { get; } } public sealed class SampleInfo : ISampleInfo { public int SampleRate { get; } public int Channels { get; } public int BitsPerSample { get; } public SampleInfo(int sampleRate, int channels, int bitsPerSample) { SampleRate = sampleRate; Channels = channels; BitsPerSample = bitsPerSample; } } } ================================================ FILE: TSLib/Audio/AudioMeta.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; namespace TSLib.Audio { public class Meta { public Codec? Codec { get; set; } public MetaIn In; public MetaOut? Out { get; set; } //public PipeControl Control { get; set; } } public struct MetaIn { public ClientId Sender { get; set; } public bool Whisper { get; set; } } public class MetaOut { public TargetSendMode SendMode { get; set; } public ulong TargetId { get; set; } public GroupWhisperTarget GroupWhisperTarget { get; set; } public GroupWhisperType GroupWhisperType { get; set; } public IReadOnlyList? ChannelIds { get; set; } public IReadOnlyList? ClientIds { get; set; } } public enum TargetSendMode { None, Voice, Whisper, WhisperGroup, } public enum PipeControl { Data, EmptyTick, } } ================================================ FILE: TSLib/Audio/AudioPacketReader.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Buffers.Binary; namespace TSLib.Audio { public class AudioPacketReader : IAudioPipe { public bool Active => OutStream?.Active ?? false; public IAudioPassiveConsumer? OutStream { get; set; } public void Write(Span data, Meta? meta) { if (OutStream is null || meta is null) return; // End of stream is signalled with no data or a single byte. // The header has 5 bytes, so check for 6. if (data.Length < 6) return; // Skip [0,2) Voice Packet Id for now // TODO add packet id order checking // TODO add defragment start meta.In.Sender = (ClientId)BinaryPrimitives.ReadUInt16BigEndian(data.Slice(2, 2)); meta.Codec = (Codec)data[4]; OutStream?.Write(data.Slice(5), meta); } } } ================================================ FILE: TSLib/Audio/AudioPipeExtensions.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TSLib.Audio { public static class AudioPipeExtensions { public static T Chain(this IAudioActiveProducer producer, T addConsumer) where T : IAudioPassiveConsumer { if (producer.OutStream is null) { producer.OutStream = addConsumer; } else if (producer.OutStream is PassiveSplitterPipe splitter) { splitter.Add(addConsumer); } else { splitter = new PassiveSplitterPipe(); splitter.Add(addConsumer); splitter.Add(producer.OutStream); producer.OutStream = splitter; } return addConsumer; } public static T Chain(this IAudioActiveProducer producer, Action? init = null) where T : IAudioPassiveConsumer, new() { var addConsumer = new T(); init?.Invoke(addConsumer); return producer.Chain(addConsumer); } public static T Into(this IAudioPassiveProducer producer, T reader) where T : IAudioActiveConsumer { reader.InStream = producer; return reader; } public static T Into(this IAudioPassiveProducer producer, Action? init = null) where T : IAudioActiveConsumer, new() { var reader = new T(); init?.Invoke(reader); return producer.Into(reader); } } } ================================================ FILE: TSLib/Audio/AudioTools.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Runtime.InteropServices; namespace TSLib.Audio { public static class AudioTools { public static bool TryMonoToStereo(byte[] pcm, ref int length) { if (length / 2 >= pcm.Length) return false; var shortArr = MemoryMarshal.Cast(pcm); for (int i = (length / 2) - 1; i >= 0; i--) { shortArr[i * 2 + 0] = shortArr[i]; shortArr[i * 2 + 1] = shortArr[i]; } length *= 2; return true; } } } ================================================ FILE: TSLib/Audio/CheckActivePipe.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TSLib.Audio { public class CheckActivePipe : IAudioPipe { public bool Active => OutStream?.Active ?? false; public IAudioPassiveConsumer? OutStream { get; set; } public void Write(Span data, Meta? meta) { if (OutStream is null || data.IsEmpty || !Active) return; OutStream?.Write(data, meta); } } } ================================================ FILE: TSLib/Audio/ClientMixdown.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; namespace TSLib.Audio { public class ClientMixdown : PassiveMergePipe, IAudioPassiveConsumer { public bool Active => true; private const int BufferSize = 4096 * 8; private readonly Dictionary mixdownBuffer = new Dictionary(); public void Write(Span data, Meta? meta) { if (data.IsEmpty || meta is null) return; if (!mixdownBuffer.TryGetValue(meta.In.Sender, out var mix)) { mix = new ClientMix(BufferSize); mixdownBuffer.Add(meta.In.Sender, mix); Add(mix); } mix.Write(data, meta); /* List> remove = null; foreach (var item in mixdownBuffer) { if (item.Value.Length == 0) { remove = remove ?? new List>(); remove.Add(item); } } if (remove != null) { foreach (var item in remove) { mixdownBuffer.Remove(item.Key); Remove(item.Value); } }*/ } public class ClientMix : IAudioPassiveProducer { public byte[] Buffer { get; } public int Length { get; set; } = 0; public Meta? LastMeta { get; set; } private readonly object rwLock = new object(); public ClientMix(int bufferSize) { Buffer = new byte[bufferSize]; } public void Write(Span data, Meta meta) { lock (rwLock) { int take = Math.Min(data.Length, Buffer.Length - Length); data.Slice(0, take).CopyTo(Buffer.AsSpan(Length)); Length += take; LastMeta = meta; } } public int Read(byte[] buffer, int offset, int length, out Meta? meta) { lock (rwLock) { int take = Math.Min(Length, length); Array.Copy(Buffer, 0, buffer, offset, take); Array.Copy(Buffer, take, Buffer, 0, Buffer.Length - take); Length -= take; meta = default; return take; } } public void Dispose() { } } } } ================================================ FILE: TSLib/Audio/DecoderPipe.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using TSLib.Audio.Opus; namespace TSLib.Audio { public class DecoderPipe : IAudioPipe, IDisposable, ISampleInfo { public bool Active => OutStream?.Active ?? false; public IAudioPassiveConsumer? OutStream { get; set; } public int SampleRate { get; } = 48_000; public int Channels { get; } = 2; public int BitsPerSample { get; } = 16; // TOOO: // - Add some sort of decoder reuse to reduce concurrent amount of decoders (see ctl 'reset') // - Clean up decoders after some time (Control: Tick?) // - Make dispose threadsafe OR redefine thread safety requirements for pipes. private readonly Dictionary decoders = new Dictionary(); private readonly byte[] decodedBuffer; public DecoderPipe() { decodedBuffer = new byte[4096 * 2]; } public void Write(Span data, Meta? meta) { if (OutStream is null || meta?.Codec is null) return; switch (meta.Codec.Value) { case Codec.OpusVoice: { var decoder = GetDecoder(meta.In.Sender, Codec.OpusVoice); var decodedData = decoder.Decode(data, decodedBuffer.AsSpan(0, decodedBuffer.Length / 2)); int dataLength = decodedData.Length; if (!AudioTools.TryMonoToStereo(decodedBuffer, ref dataLength)) break; OutStream?.Write(decodedBuffer.AsSpan(0, dataLength), meta); } break; case Codec.OpusMusic: { var decoder = GetDecoder(meta.In.Sender, Codec.OpusMusic); var decodedData = decoder.Decode(data, decodedBuffer); OutStream?.Write(decodedData, meta); } break; default: // Cannot decode break; } } private OpusDecoder GetDecoder(ClientId sender, Codec codec) { if (decoders.TryGetValue(sender, out var decoder)) { if (decoder.Item2 == codec) return decoder.Item1; else decoder.Item1.Dispose(); } var newDecoder = CreateDecoder(codec); decoders[sender] = (newDecoder, codec); return newDecoder; } private OpusDecoder CreateDecoder(Codec codec) { return codec switch { Codec.OpusVoice => OpusDecoder.Create(SampleRate, 1), Codec.OpusMusic => OpusDecoder.Create(SampleRate, 2), _ => throw new NotSupportedException(), }; } public void Dispose() { foreach (var (decoder, _) in decoders.Values) { decoder.Dispose(); } } } } ================================================ FILE: TSLib/Audio/EncoderPipe.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using TSLib.Audio.Opus; namespace TSLib.Audio { public class EncoderPipe : IAudioPipe, IDisposable, ISampleInfo { public bool Active => OutStream?.Active ?? false; public IAudioPassiveConsumer? OutStream { get; set; } public Codec Codec { get; } public int SampleRate { get; } public int Channels { get; } public int BitsPerSample { get; } public int PacketSize { get; } public int Bitrate { get => opusEncoder.Bitrate; set => opusEncoder.Bitrate = value; } // opus private readonly OpusEncoder opusEncoder; private const int SegmentFrames = 960; // todo add upper limit to buffer size and drop everying over private byte[] notEncodedBuffer = Array.Empty(); private int notEncodedLength; // https://tools.ietf.org/html/rfc6716#section-3.2.1 private const int max_encoded_size = 255 * 4 + 255; private readonly byte[] encodedBuffer = new byte[max_encoded_size]; public EncoderPipe(Codec codec) { Codec = codec; switch (codec) { case Codec.Raw: throw new InvalidOperationException("Raw is not a valid encoding target"); case Codec.SpeexNarrowband: throw new NotSupportedException(); case Codec.SpeexWideband: throw new NotSupportedException(); case Codec.SpeexUltraWideband: throw new NotSupportedException(); case Codec.CeltMono: throw new NotSupportedException(); case Codec.OpusVoice: SampleRate = 48000; Channels = 1; opusEncoder = OpusEncoder.Create(SampleRate, Channels, Application.Voip); Bitrate = 8192 * 2; break; case Codec.OpusMusic: SampleRate = 48000; Channels = 2; opusEncoder = OpusEncoder.Create(SampleRate, Channels, Application.Audio); Bitrate = 8192 * 4; break; default: throw new ArgumentOutOfRangeException(nameof(codec)); } BitsPerSample = 16; PacketSize = opusEncoder.FrameByteCount(SegmentFrames); } public void Write(Span data, Meta? meta) { if (OutStream is null) return; int newSoundBufferLength = data.Length + notEncodedLength; if (newSoundBufferLength > notEncodedBuffer.Length) { var tmpSoundBuffer = new byte[newSoundBufferLength]; Array.Copy(notEncodedBuffer, 0, tmpSoundBuffer, 0, notEncodedLength); notEncodedBuffer = tmpSoundBuffer; } var soundBuffer = notEncodedBuffer.AsSpan(); data.CopyTo(soundBuffer.Slice(notEncodedLength)); int segmentCount = newSoundBufferLength / PacketSize; int segmentsEnd = segmentCount * PacketSize; notEncodedLength = newSoundBufferLength - segmentsEnd; for (int i = 0; i < segmentCount; i++) { var encodedData = opusEncoder.Encode(soundBuffer.Slice(i * PacketSize, PacketSize), PacketSize, encodedBuffer); meta ??= new Meta(); meta.Codec = Codec; // TODO copy ? OutStream?.Write(encodedData, meta); } soundBuffer.Slice(segmentsEnd, notEncodedLength).CopyTo(soundBuffer); } public TimeSpan GetPlayLength(int bytes) { return TimeSpan.FromSeconds(bytes / (double)(SampleRate * (BitsPerSample / 8) * Channels)); } public void Dispose() { opusEncoder?.Dispose(); } } } ================================================ FILE: TSLib/Audio/Opus/LICENSE ================================================ Copyright 2012 John Carruthers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: TSLib/Audio/Opus/NativeMethods.cs ================================================ // Copyright 2012 John Carruthers // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. using System; using System.Runtime.InteropServices; using TSLib.Helper; namespace TSLib.Audio.Opus { /// /// Wraps the Opus API. /// public static class NativeMethods { private static bool isPreloaded = false; private static bool wasPreloadSuccessful = false; static NativeMethods() { PreloadLibrary(); } public static bool PreloadLibrary() { if (!isPreloaded) { wasPreloadSuccessful = NativeLibraryLoader.DirectLoadLibrary("libopus", () => opus_get_version_string()); isPreloaded = true; } return wasPreloadSuccessful; } public static string Info { get { var verStrPtr = opus_get_version_string(); var verString = Marshal.PtrToStringAnsi(verStrPtr); return $"{verString} ({NativeLibraryLoader.ArchFolder})"; } } // ReSharper disable EnumUnderlyingTypeIsInt, InconsistentNaming #pragma warning disable IDE1006 [DllImport("libopus", CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr opus_encoder_create(int sampleRate, int channels, Application application, out IntPtr error); [DllImport("libopus", CallingConvention = CallingConvention.Cdecl)] internal static extern void opus_encoder_destroy(IntPtr encoder); [DllImport("libopus", CallingConvention = CallingConvention.Cdecl)] internal static extern int opus_encode(IntPtr st, in byte pcm, int frameSize, out byte data, int maxDataBytes); [DllImport("libopus", CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr opus_decoder_create(int sampleRate, int channels, out IntPtr error); [DllImport("libopus", CallingConvention = CallingConvention.Cdecl)] internal static extern void opus_decoder_destroy(IntPtr decoder); [DllImport("libopus", CallingConvention = CallingConvention.Cdecl)] internal static extern int opus_decode(IntPtr st, in byte data, int len, out byte pcm, int frameSize, int decodeFec); [DllImport("libopus", CallingConvention = CallingConvention.Cdecl)] internal static extern int opus_encoder_ctl(IntPtr st, Ctl request, int value); [DllImport("libopus", CallingConvention = CallingConvention.Cdecl)] internal static extern int opus_encoder_ctl(IntPtr st, Ctl request, out int value); [DllImport("libopus", CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr opus_get_version_string(); #pragma warning restore IDE1006 } public enum Ctl : int { SetBitrateRequest = 4002, GetBitrateRequest = 4003, SetInbandFecRequest = 4012, GetInbandFecRequest = 4013 } /// /// Supported coding modes. /// public enum Application : int { /// /// Best for most VoIP/videoconference applications where listening quality and intelligibility matter most. /// Voip = 2048, /// /// Best for broadcast/high-fidelity application where the decoded audio should be as close as possible to input. /// Audio = 2049, /// /// Only use when lowest-achievable latency is what matters most. Voice-optimized modes cannot be used. /// RestrictedLowLatency = 2051 } public enum Errors : int { /// /// No error. /// Ok = 0, /// /// One or more invalid/out of range arguments. /// BadArg = -1, /// /// The mode struct passed is invalid. /// BufferToSmall = -2, /// /// An internal error was detected. /// InternalError = -3, /// /// The compressed data passed is corrupted. /// InvalidPacket = -4, /// /// Invalid/unsupported request number. /// Unimplemented = -5, /// /// An encoder or decoder structure is invalid or already freed. /// InvalidState = -6, /// /// Memory allocation has failed. /// AllocFail = -7 } } ================================================ FILE: TSLib/Audio/Opus/OPUS_LICENSE ================================================ Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic, Jean-Marc Valin, Timothy B. Terriberry, CSIRO, Gregory Maxwell, Mark Borgerding, Erik de Castro Lopo Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Opus is subject to the royalty-free patent licenses which are specified at: Xiph.Org Foundation: https://datatracker.ietf.org/ipr/1524/ Skype Limited: https://datatracker.ietf.org/ipr/1602/ Broadcom Corporation: https://datatracker.ietf.org/ipr/1526/ ================================================ FILE: TSLib/Audio/Opus/OpusDecoder.cs ================================================ // Copyright 2012 John Carruthers // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. using System; using System.Runtime.InteropServices; namespace TSLib.Audio.Opus { /// /// Opus audio decoder. /// public sealed class OpusDecoder : IDisposable { /// /// Creates a new Opus decoder. /// /// Sample rate to decode at (Hz). This must be one of 8000, 12000, 16000, 24000, or 48000. /// Number of channels to decode. /// A new OpusDecoder. public static OpusDecoder Create(int outputSampleRate, int outputChannels) { if (outputSampleRate != 8000 && outputSampleRate != 12000 && outputSampleRate != 16000 && outputSampleRate != 24000 && outputSampleRate != 48000) throw new ArgumentOutOfRangeException(nameof(outputSampleRate)); if (outputChannels != 1 && outputChannels != 2) throw new ArgumentOutOfRangeException(nameof(outputChannels)); var decoderPtr = NativeMethods.opus_decoder_create(outputSampleRate, outputChannels, out IntPtr error); if ((Errors)error != Errors.Ok) { throw new Exception("Exception occured while creating decoder"); } return new OpusDecoder(decoderPtr, outputSampleRate, outputChannels); } private IntPtr decoder; private OpusDecoder(IntPtr decoder, int outputSamplingRate, int outputChannels) { this.decoder = decoder; OutputSamplingRate = outputSamplingRate; OutputChannels = outputChannels; } /// /// Produces PCM samples from Opus encoded data. /// /// Opus encoded data to decode, null for dropped packet. /// PCM audio samples buffer. /// PCM audio samples. public Span Decode(Span inputOpusData, Span outputDecodedBuffer) { if (disposed) throw new ObjectDisposedException(nameof(OpusDecoder)); if (inputOpusData.Length == 0) return Span.Empty; int frameSize = FrameCount(outputDecodedBuffer.Length); int length = NativeMethods.opus_decode(decoder, MemoryMarshal.GetReference(inputOpusData), inputOpusData.Length, out MemoryMarshal.GetReference(outputDecodedBuffer), frameSize, 0); if (length < 0) throw new Exception("Decoding failed - " + (Errors)length); // TODO implement forward error corrected packet //else // length = NativeMethods.opus_decode(decoder, null, 0, decoded, frameCount, (ForwardErrorCorrection) ? 1 : 0); var decodedLength = length * 2 * OutputChannels; return outputDecodedBuffer.Slice(0, decodedLength); } /// /// Determines the number of frames that can fit into a buffer of the given size. /// /// /// public int FrameCount(int bufferSize) { // seems like bitrate should be required const int bitrate = 16; int bytesPerSample = (bitrate / 8) * OutputChannels; return bufferSize / bytesPerSample; } /// /// Gets the output sampling rate of the decoder. /// public int OutputSamplingRate { get; } /// /// Gets the number of channels of the decoder. /// public int OutputChannels { get; } /// /// Gets or sets whether forward error correction is enabled or not. /// public bool ForwardErrorCorrection { get; set; } ~OpusDecoder() { Dispose(); } private bool disposed; public void Dispose() { if (disposed) return; GC.SuppressFinalize(this); if (decoder != IntPtr.Zero) { NativeMethods.opus_decoder_destroy(decoder); decoder = IntPtr.Zero; } disposed = true; } } } ================================================ FILE: TSLib/Audio/Opus/OpusEncoder.cs ================================================ // Copyright 2012 John Carruthers // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. using System; using System.Runtime.InteropServices; namespace TSLib.Audio.Opus { /// /// Opus codec wrapper. /// public sealed class OpusEncoder : IDisposable { /// /// Creates a new Opus encoder. /// /// Sampling rate of the input signal (Hz). This must be one of 8000, 12000, 16000, 24000, or 48000. /// Number of channels (1 or 2) in input signal. /// Coding mode. /// A new OpusEncoder public static OpusEncoder Create(int inputSamplingRate, int inputChannels, Application application) { if (inputSamplingRate != 8000 && inputSamplingRate != 12000 && inputSamplingRate != 16000 && inputSamplingRate != 24000 && inputSamplingRate != 48000) throw new ArgumentOutOfRangeException(nameof(inputSamplingRate)); if (inputChannels != 1 && inputChannels != 2) throw new ArgumentOutOfRangeException(nameof(inputChannels)); var encoderPtr = NativeMethods.opus_encoder_create(inputSamplingRate, inputChannels, application, out IntPtr error); if ((Errors)error != Errors.Ok) { throw new Exception("Exception occured while creating encoder"); } return new OpusEncoder(encoderPtr, inputSamplingRate, inputChannels, application); } private IntPtr encoder; private OpusEncoder(IntPtr encoder, int inputSamplingRate, int inputChannels, Application application) { this.encoder = encoder; InputSamplingRate = inputSamplingRate; InputChannels = inputChannels; Application = application; } /// /// Produces Opus encoded audio from PCM samples. /// /// PCM samples to encode. /// How many bytes to encode. /// The encoded data is written to this buffer. /// Opus encoded audio buffer. public Span Encode(ReadOnlySpan inputPcmSamples, int sampleLength, Span outputEncodedBuffer) { if (disposed) throw new ObjectDisposedException(nameof(OpusEncoder)); int frames = FrameCount(inputPcmSamples.Length); int encodedLength = NativeMethods.opus_encode(encoder, MemoryMarshal.GetReference(inputPcmSamples), frames, out MemoryMarshal.GetReference(outputEncodedBuffer), sampleLength); if (encodedLength < 0) throw new Exception("Encoding failed - " + (Errors)encodedLength); return outputEncodedBuffer.Slice(0, encodedLength); } /// /// Determines the number of frames in the PCM samples. /// /// /// public int FrameCount(int bufferSize) { // seems like bitrate should be required const int bitrate = 16; int bytesPerSample = (bitrate / 8) * InputChannels; return bufferSize / bytesPerSample; } /// /// Helper method to determine how many bytes are required for encoding to work. /// /// Target frame size. /// public int FrameByteCount(int frameCount) { const int bitrate = 16; int bytesPerSample = (bitrate / 8) * InputChannels; return frameCount * bytesPerSample; } /// /// Gets the input sampling rate of the encoder. /// public int InputSamplingRate { get; } /// /// Gets the number of channels of the encoder. /// public int InputChannels { get; } /// /// Gets the coding mode of the encoder. /// public Application Application { get; } /// /// Gets or sets the bitrate setting of the encoding. /// public int Bitrate { get { if (disposed) throw new ObjectDisposedException(nameof(OpusEncoder)); var ret = NativeMethods.opus_encoder_ctl(encoder, Ctl.GetBitrateRequest, out int bitrate); if (ret < 0) throw new Exception("Encoder error - " + ((Errors)ret).ToString()); return bitrate; } set { if (disposed) throw new ObjectDisposedException(nameof(OpusEncoder)); var ret = NativeMethods.opus_encoder_ctl(encoder, Ctl.SetBitrateRequest, value); if (ret < 0) throw new Exception("Encoder error - " + ((Errors)ret).ToString()); } } /// /// Gets or sets whether Forward Error Correction is enabled. /// public bool ForwardErrorCorrection { get { if (encoder == IntPtr.Zero) throw new ObjectDisposedException(nameof(OpusEncoder)); int ret = NativeMethods.opus_encoder_ctl(encoder, Ctl.GetInbandFecRequest, out int fec); if (ret < 0) throw new Exception("Encoder error - " + ((Errors)ret).ToString()); return fec > 0; } set { if (encoder == IntPtr.Zero) throw new ObjectDisposedException(nameof(OpusEncoder)); var ret = NativeMethods.opus_encoder_ctl(encoder, Ctl.SetInbandFecRequest, value ? 1 : 0); if (ret < 0) throw new Exception("Encoder error - " + ((Errors)ret).ToString()); } } ~OpusEncoder() { Dispose(); } private bool disposed; public void Dispose() { if (disposed) return; GC.SuppressFinalize(this); if (encoder != IntPtr.Zero) { NativeMethods.opus_encoder_destroy(encoder); encoder = IntPtr.Zero; } disposed = true; } } } ================================================ FILE: TSLib/Audio/Opus/README ================================================ The Opus.NET library was cloned from: https://github.com/JohnACarruthers/Opus.NET The LICENSE document in this folder applies to all files in this folder. All other files and projects within this solution are unaffected by this. ================================================ FILE: TSLib/Audio/PassiveMergePipe.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; namespace TSLib.Audio { public class PassiveMergePipe : IAudioPassiveProducer, ICollection { private IAudioPassiveProducer[] safeProducerList = Array.Empty(); private readonly List producerList = new List(); private readonly object listLock = new object(); private bool changed; private readonly int[] accBuffer = new int[4096]; public int Count => safeProducerList.Length; public bool IsReadOnly => false; public void Add(IAudioPassiveProducer addProducer) { if (!producerList.Contains(addProducer) && addProducer != this) { lock (listLock) { if (!producerList.Contains(addProducer)) { producerList.Add(addProducer); changed = true; } } } } public bool Remove(IAudioPassiveProducer removeProducer) { if (producerList.Contains(removeProducer) && removeProducer != this) { lock (listLock) { var removed = producerList.Remove(removeProducer); changed |= removed; return removed; } } return false; } public void Clear() { lock (listLock) { producerList.Clear(); changed = true; } } public int Read(byte[] buffer, int offset, int length, out Meta? meta) { if (changed) { lock (listLock) { if (changed) { safeProducerList = producerList.ToArray(); changed = false; } } } meta = null; if (safeProducerList.Length == 0) return 0; if (safeProducerList.Length == 1) return safeProducerList[0].Read(buffer, offset, length, out meta); int maxReadLength = Math.Min(accBuffer.Length, length); Array.Clear(accBuffer, 0, maxReadLength); var pcmBuffer = MemoryMarshal.Cast(buffer); int read = 0; foreach (var producer in safeProducerList) { int ppread = producer.Read(buffer, offset, maxReadLength, out meta); if (ppread == 0) continue; read = Math.Max(read, ppread); for (int i = 0; i < ppread / 2; i++) accBuffer[i] += pcmBuffer[i]; } for (int i = 0; i < read / 2; i++) pcmBuffer[i] = (short)Math.Max(Math.Min(accBuffer[i], short.MaxValue), short.MinValue); return read; } IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)safeProducerList).GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => safeProducerList.GetEnumerator(); public bool Contains(IAudioPassiveProducer item) => safeProducerList.Contains(item); public void CopyTo(IAudioPassiveProducer[] array, int arrayIndex) => Array.Copy(safeProducerList, 0, array, arrayIndex, array.Length); public void Dispose() { var list = safeProducerList; Clear(); foreach (var producer in list) producer.Dispose(); } } } ================================================ FILE: TSLib/Audio/PassiveSplitterPipe.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; namespace TSLib.Audio { public class PassiveSplitterPipe : IAudioPipe { public bool Active => consumerList.Count > 0 && consumerList.Any(x => x.Active); private readonly List safeConsumerList = new List(); private readonly List consumerList = new List(); private bool changed; private readonly object listLock = new object(); private byte[] buffer = Array.Empty(); public bool CloneMeta { get; set; } = false; public IAudioPassiveConsumer? OutStream { get => this; set { if (value is null) Clear(); else Add(value); } } public void Add(IAudioPassiveConsumer consumer) { lock (listLock) { if (!consumerList.Contains(consumer) && consumer != this) { consumerList.Add(consumer); changed = true; } } } public void Remove(IAudioPassiveConsumer consumer) { lock (listLock) { changed |= consumerList.Remove(consumer); } } public void Clear() { lock (listLock) { changed |= consumerList.Count > 0; consumerList.Clear(); } } public void Write(Span data, Meta? meta) { if (changed) { lock (listLock) { if (changed) { safeConsumerList.Clear(); safeConsumerList.AddRange(consumerList); changed = false; } } } if (safeConsumerList.Count == 0) return; if (safeConsumerList.Count == 1) { safeConsumerList[0].Write(data, meta); return; } if (buffer.Length < data.Length) buffer = new byte[data.Length]; var bufSpan = buffer.AsSpan(0, data.Length); for (int i = 0; i < safeConsumerList.Count - 1; i++) { data.CopyTo(bufSpan); safeConsumerList[i].Write(bufSpan, meta); } // safe one memcopy call by passing the last one our original data safeConsumerList[^1].Write(data, meta); } } } ================================================ FILE: TSLib/Audio/PreciseAudioTimer.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Diagnostics; namespace TSLib.Audio { /// Provides a precise way to measure a playbackbuffer by tracking /// sent bytes and elapsed time. public class PreciseAudioTimer : ISampleInfo { public int SampleRate { get; } public int Channels { get; } public int BitsPerSample { get; } public int BytesPerSecond { get; } private readonly Stopwatch stopwatch; /// How many bytes have added to the playback buffer. private long AbsoluteBufferLength { get; set; } /// The playback duration equivalent of the pushed buffer byte length. private TimeSpan AbsoluteBufferDuration => TimeSpan.FromSeconds(AbsoluteBufferLength / (double)BytesPerSecond); /// How many bytes (should) have been processed while playback was running. private long ElapsedBufferLength => (stopwatch.ElapsedMilliseconds * BytesPerSecond) / 1000; /// How many bytes are currently not processed in buffer for playback. private long RemainingBufferLength => AbsoluteBufferLength - ElapsedBufferLength; /// The playback duration equivalent of the currently not processed buffer byte length. public TimeSpan RemainingBufferDuration => TimeSpan.FromSeconds(RemainingBufferLength / (double)BytesPerSecond); /// Defines the song position base offset from which the SongPosition should be counted from. public TimeSpan SongPositionOffset { get; set; } /// The current playback position. public TimeSpan SongPosition => AbsoluteBufferDuration + SongPositionOffset; public PreciseAudioTimer(ISampleInfo sampleInfo) : this(sampleInfo.SampleRate, sampleInfo.BitsPerSample, sampleInfo.Channels) { } public PreciseAudioTimer(int sampleRate, int bits, int channel) { if (bits != 8 && bits != 16 && bits != 24 && bits != 32) throw new ArgumentException(nameof(bits)); if (channel != 1 && channel != 2) throw new ArgumentException(nameof(channel)); stopwatch = new Stopwatch(); SampleRate = sampleRate; BitsPerSample = bits; Channels = channel; BytesPerSecond = SampleRate * (BitsPerSample / 8) * Channels; } public void Start() { AbsoluteBufferLength = 0; stopwatch.Restart(); } public void Stop() => stopwatch.Stop(); public void Reset() { SongPositionOffset = TimeSpan.Zero; AbsoluteBufferLength = 0; } public void PushBytes(int count) => AbsoluteBufferLength += count; public void ResetRemoteBuffer() { SongPositionOffset = SongPosition; Start(); } } } ================================================ FILE: TSLib/Audio/PreciseTimedPipe.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Threading; using TSLib.Helper; namespace TSLib.Audio { public class PreciseTimedPipe : IAudioActiveConsumer, IAudioActiveProducer, IDisposable { public PreciseAudioTimer AudioTimer { get; } public IAudioPassiveProducer? InStream { get; set; } public IAudioPassiveConsumer? OutStream { get; set; } public TimeSpan AudioBufferLength { get; set; } = TimeSpan.FromMilliseconds(20); public TimeSpan SendCheckInterval { get; set; } = TimeSpan.FromMilliseconds(5); public int ReadBufferSize { get; set; } = 960 * 4; private byte[] readBuffer = Array.Empty(); private readonly Thread tickThread; private bool running; private bool paused; public bool Paused { get => paused; set { if (paused != value) { paused = value; if (value) { AudioTimer.SongPositionOffset = AudioTimer.SongPosition; AudioTimer.Stop(); } else AudioTimer.Start(); } } } public PreciseTimedPipe(ISampleInfo info, Id id) { running = true; paused = true; AudioTimer = new PreciseAudioTimer(info.SampleRate, info.BitsPerSample, info.Channels); AudioTimer.Start(); tickThread = new Thread(() => { Tools.SetLogId(id); ReadLoop(); }) { Name = $"AudioPipe[{id}]" }; tickThread.Start(); } public PreciseTimedPipe(ISampleInfo info, Id id, IAudioPassiveProducer inStream) : this(info, id) { InStream = inStream; } public PreciseTimedPipe(ISampleInfo info, Id id, IAudioPassiveConsumer outStream) : this(info, id) { OutStream = outStream; } public PreciseTimedPipe(ISampleInfo info, Id id, IAudioPassiveProducer inStream, IAudioPassiveConsumer outStream) : this(info, id) { InStream = inStream; OutStream = outStream; } private void ReadLoop() { while (running) { if (!Paused) ReadTick(); Thread.Sleep(SendCheckInterval); } } private void ReadTick() { var inStream = InStream; if (inStream is null) return; if (readBuffer.Length < ReadBufferSize) readBuffer = new byte[ReadBufferSize]; while (AudioTimer.RemainingBufferDuration < AudioBufferLength) { int read = inStream.Read(readBuffer, 0, readBuffer.Length, out var meta); if (read == 0) return; if (AudioTimer.RemainingBufferDuration < TimeSpan.Zero) AudioTimer.ResetRemoteBuffer(); AudioTimer.PushBytes(read); OutStream?.Write(readBuffer.AsSpan(0, read), meta); } } public void Dispose() { if (!running) return; running = false; tickThread.Join(); } } } ================================================ FILE: TSLib/Audio/StaticMetaPipe.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using TSLib.Helper; namespace TSLib.Audio { public class StaticMetaPipe : IAudioPipe { public bool Active => OutStream?.Active ?? false; public IAudioPassiveConsumer? OutStream { get; set; } private readonly MetaOut setMeta = new MetaOut(); public TargetSendMode SendMode { get; private set; } private void ClearData() { setMeta.ChannelIds = null; setMeta.ClientIds = null; } public void SetNone() { ClearData(); SendMode = TargetSendMode.None; } public void SetVoice() { ClearData(); SendMode = TargetSendMode.Voice; } public void SetWhisper(IReadOnlyList channelIds, IReadOnlyList clientIds) { ClearData(); SendMode = TargetSendMode.Whisper; setMeta.ChannelIds = channelIds; setMeta.ClientIds = clientIds; } public void SetWhisperGroup(GroupWhisperType type, GroupWhisperTarget target, ulong targetId = 0) { ClearData(); SendMode = TargetSendMode.WhisperGroup; setMeta.GroupWhisperType = type; setMeta.GroupWhisperTarget = target; setMeta.TargetId = targetId; } public void Write(Span data, Meta? meta) { if (OutStream is null || SendMode == TargetSendMode.None) return; meta ??= new Meta(); meta.Out ??= new MetaOut(); meta.Out.SendMode = SendMode; switch (SendMode) { case TargetSendMode.None: break; case TargetSendMode.Voice: break; case TargetSendMode.Whisper: meta.Out.ChannelIds = setMeta.ChannelIds; meta.Out.ClientIds = setMeta.ClientIds; break; case TargetSendMode.WhisperGroup: meta.Out.GroupWhisperTarget = setMeta.GroupWhisperTarget; meta.Out.GroupWhisperType = setMeta.GroupWhisperType; meta.Out.TargetId = setMeta.TargetId; break; default: throw Tools.UnhandledDefault(SendMode); } OutStream?.Write(data, meta); } } } ================================================ FILE: TSLib/Audio/StreamAudioProducer.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.IO; namespace TSLib.Audio { public class StreamAudioProducer : IAudioPassiveProducer { private readonly Stream stream; public StreamAudioProducer(Stream stream) { this.stream = stream; } public int Read(byte[] buffer, int offset, int length, out Meta? meta) { meta = default; return stream.Read(buffer, offset, length); } public void Dispose() => stream.Dispose(); } } ================================================ FILE: TSLib/Audio/VolumePipe.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Runtime.InteropServices; namespace TSLib.Audio { public class VolumePipe : IAudioPipe { public bool Active => OutStream?.Active ?? false; private float volume; /// Values are between including 0 and 1. public float Volume { get => volume; set { value = Math.Abs(value); if (IsAbout(value, 1)) volume = 1; else if (IsAbout(value, 0)) volume = 0; else volume = value; } } public IAudioPassiveConsumer? OutStream { get; set; } public static void AdjustVolume(Span audioSamples, float volume) { if (volume == 1) { /* Do nothing */ } else if (volume == 0) { audioSamples.Fill(0); } else if (volume < 1) // Clipping cannot occour on mult <1 { var shortArr = MemoryMarshal.Cast(audioSamples); for (int i = 0; i < shortArr.Length; i++) shortArr[i] = (short)(shortArr[i] * volume); } else { var shortArr = MemoryMarshal.Cast(audioSamples); for (int i = 0; i < shortArr.Length; i++) shortArr[i] = (short)Math.Max(Math.Min(shortArr[i] * volume, short.MaxValue), short.MinValue); } } private static bool IsAbout(float value, float compare) => Math.Abs(value - compare) < 1E-04f; public void Write(Span data, Meta? meta) { if (OutStream is null) return; AdjustVolume(data, Volume); OutStream?.Write(data, meta); } } } ================================================ FILE: TSLib/Commands/CommandMultiParameter.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TSLib.Commands { /// Represents an array of data. Will be expanded to a pipe seperated list when sent. /// Multiple will be merged automatically but will need the same array length. public sealed partial class CommandMultiParameter : ICommandPart { public string Key { get; } public string[] Values { get; } public CommandPartType Type => CommandPartType.MultiParameter; } } ================================================ FILE: TSLib/Commands/CommandOption.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Linq; using System.Text; using TSLib.Helper; namespace TSLib.Commands { /// Command options which will be added with "-name" at the and. public class CommandOption : ICommandPart { public string Value { get; } public CommandPartType Type => CommandPartType.Option; public CommandOption(string name) { Value = string.Concat(" -", name); } /// Creates one or many options from the enum. /// The enum must be a flag list which will be expanded. /// The name of each set enum flag will be used as the option name. /// public CommandOption(Enum values) { var strb = new StringBuilder(); foreach (var enu in values.GetFlags().Select(enu => enu.ToString())) strb.Append(" -").Append(enu); Value = strb.ToString(); } } } ================================================ FILE: TSLib/Commands/CommandParameter.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Diagnostics; using System.Globalization; using TSLib.Helper; namespace TSLib.Commands { /// Simple parameter which will be expanded to "Key=Value" and automatically escaped. public sealed partial class CommandParameter : ICommandPart { public string Key { get; } public string Value { get; } public CommandPartType Type => CommandPartType.SingleParameter; [DebuggerStepThrough] public static string Serialize(bool value) => value ? "1" : "0"; [DebuggerStepThrough] public static string Serialize(sbyte value) => value.ToString(CultureInfo.InvariantCulture); [DebuggerStepThrough] public static string Serialize(byte value) => value.ToString(CultureInfo.InvariantCulture); [DebuggerStepThrough] public static string Serialize(short value) => value.ToString(CultureInfo.InvariantCulture); [DebuggerStepThrough] public static string Serialize(ushort value) => value.ToString(CultureInfo.InvariantCulture); [DebuggerStepThrough] public static string Serialize(int value) => value.ToString(CultureInfo.InvariantCulture); [DebuggerStepThrough] public static string Serialize(uint value) => value.ToString(CultureInfo.InvariantCulture); [DebuggerStepThrough] public static string Serialize(long value) => value.ToString(CultureInfo.InvariantCulture); [DebuggerStepThrough] public static string Serialize(ulong value) => value.ToString(CultureInfo.InvariantCulture); [DebuggerStepThrough] public static string Serialize(float value) => value.ToString(CultureInfo.InvariantCulture); [DebuggerStepThrough] public static string Serialize(double value) => value.ToString(CultureInfo.InvariantCulture); [DebuggerStepThrough] public static string Serialize(string value) => TsString.Escape(value); [DebuggerStepThrough] public static string Serialize(DateTime value) => value.ToUnix().ToString(CultureInfo.InvariantCulture); } } ================================================ FILE: TSLib/Commands/ICommandPart.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TSLib.Commands { public interface ICommandPart { CommandPartType Type { get; } } public enum CommandPartType { SingleParameter, MultiParameter, Option, } } ================================================ FILE: TSLib/Commands/TsCommand.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Text.RegularExpressions; using TSLib.Helper; namespace TSLib.Commands { /// Builds TeamSpeak (query) commands from parameters. public partial class TsCommand : IEnumerable { private static readonly Regex CommandMatch = new Regex("[a-z0-9_]+", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ECMAScript); protected string? raw = null; public bool ExpectResponse { get; set; } public string Command { get; } private ICollection? parameter = null; /// Creates a new command. /// The command name. [DebuggerStepThrough] public TsCommand(string command) { ExpectResponse = true; Command = command; } /// Creates a new command. /// The command name. /// The parameters to be added to this command. /// See , or for more information. [DebuggerStepThrough] public TsCommand(string command, ICollection parameter) : this(command) { this.parameter = parameter; } [DebuggerStepThrough] public virtual TsCommand Add(ICommandPart? addParameter) { if (addParameter is null) return this; raw = null; if (parameter is null) parameter = new List(); else if (parameter.IsReadOnly) parameter = new List(parameter); parameter.Add(addParameter); return this; } /// /// Can be set to false when a command does not receive a error-return-code /// from teamspeak. /// This makes this command effectively a notification, as a response can only /// be sent back as a new notification. /// /// Whether or not to wait for the error-return-code /// Returns this command. Useful for fluent command building. [DebuggerStepThrough] public TsCommand ExpectsResponse(bool expects) { ExpectResponse = expects; return this; } /// Builds this command to the query-like command. /// The formatted query-like command. public override string ToString() => raw ??= BuildToString(Command, GetParameter()); /// Builds the command from its parameters and returns the query-like command. /// The command name. /// The parameter to be added to this command. /// The formatted query-like command. /// When a command is null or not valid. /// When multiple are added but have different array lengths. public static string BuildToString(string command, IEnumerable parameter) { if (string.IsNullOrWhiteSpace(command)) throw new ArgumentNullException(nameof(command)); if (!CommandMatch.IsMatch(command)) throw new ArgumentException("Invalid command characters", nameof(command)); var strb = new StringBuilder(TsString.Escape(command)); List? multiParamList = null; List? optionList = null; foreach (var param in parameter) { switch (param.Type) { case CommandPartType.SingleParameter: var singleParam = (CommandParameter)param; strb.Append(' ').Append(singleParam.Key).Append('=').Append(singleParam.Value); break; case CommandPartType.MultiParameter: multiParamList ??= new List(); multiParamList.Add((CommandMultiParameter)param); break; case CommandPartType.Option: optionList ??= new List(); optionList.Add((CommandOption)param); break; default: throw Tools.UnhandledDefault(param.Type); } } if (multiParamList != null) { // Safety check int matrixLength = multiParamList[0].Values.Length; foreach (var param in multiParamList) if (param.Values.Length != matrixLength) throw new ArgumentOutOfRangeException(nameof(parameter), "All multiparam key-value pairs must have the same length"); for (int i = 0; i < matrixLength; i++) { foreach (var param in multiParamList) { strb.Append(' ').Append(param.Key).Append('=').Append(param.Values[i]); } strb.Append('|'); } strb.Length--; } if (optionList != null) { foreach (var option in optionList) strb.Append(option.Value); } return strb.ToString(); } private IEnumerable GetParameter() => parameter ?? Enumerable.Empty(); public IEnumerator GetEnumerator() => GetParameter().GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetParameter().GetEnumerator(); } public class TsRawCommand : TsCommand { public TsRawCommand(string raw) : base(null!) { this.raw = raw; } public override TsCommand Add(ICommandPart? addParameter) { throw new InvalidOperationException("Raw commands cannot be extented"); } public override string ToString() { return raw!; } } } ================================================ FILE: TSLib/Commands/TsCommand.gen.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; namespace TSLib.Commands { partial class TsCommand { [DebuggerStepThrough] public TsCommand Add(string key, bool? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, bool value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, sbyte? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, sbyte value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, byte? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, byte value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, short? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, short value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, ushort? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, ushort value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, int? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, int value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, uint? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, uint value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, long? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, long value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, ulong? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, ulong value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, float? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, float value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, double? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, double value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, string value) { if(value != null) Add(new CommandParameter(key, value)); return this; } [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, DateTime? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, DateTime value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, Uid? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, Uid value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, ClientDbId? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, ClientDbId value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, ClientId? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, ClientId value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, ChannelId? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, ChannelId value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, ServerGroupId? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, ServerGroupId value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, ChannelGroupId? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, ChannelGroupId value) => Add(new CommandParameter(key, value)); [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable value) => Add(new CommandMultiParameter(key, value)); } partial class CommandParameter { [DebuggerStepThrough] public CommandParameter(string key, bool value) { Key = key; Value = Serialize(value); } [DebuggerStepThrough] public CommandParameter(string key, sbyte value) { Key = key; Value = Serialize(value); } [DebuggerStepThrough] public CommandParameter(string key, byte value) { Key = key; Value = Serialize(value); } [DebuggerStepThrough] public CommandParameter(string key, short value) { Key = key; Value = Serialize(value); } [DebuggerStepThrough] public CommandParameter(string key, ushort value) { Key = key; Value = Serialize(value); } [DebuggerStepThrough] public CommandParameter(string key, int value) { Key = key; Value = Serialize(value); } [DebuggerStepThrough] public CommandParameter(string key, uint value) { Key = key; Value = Serialize(value); } [DebuggerStepThrough] public CommandParameter(string key, long value) { Key = key; Value = Serialize(value); } [DebuggerStepThrough] public CommandParameter(string key, ulong value) { Key = key; Value = Serialize(value); } [DebuggerStepThrough] public CommandParameter(string key, float value) { Key = key; Value = Serialize(value); } [DebuggerStepThrough] public CommandParameter(string key, double value) { Key = key; Value = Serialize(value); } [DebuggerStepThrough] public CommandParameter(string key, string value) { Key = key; Value = Serialize(value); } [DebuggerStepThrough] public CommandParameter(string key, DateTime value) { Key = key; Value = Serialize(value); } [DebuggerStepThrough] public CommandParameter(string key, Uid value) { Key = key; Value = Serialize(value.Value); } [DebuggerStepThrough] public CommandParameter(string key, ClientDbId value) { Key = key; Value = Serialize(value.Value); } [DebuggerStepThrough] public CommandParameter(string key, ClientId value) { Key = key; Value = Serialize(value.Value); } [DebuggerStepThrough] public CommandParameter(string key, ChannelId value) { Key = key; Value = Serialize(value.Value); } [DebuggerStepThrough] public CommandParameter(string key, ServerGroupId value) { Key = key; Value = Serialize(value.Value); } [DebuggerStepThrough] public CommandParameter(string key, ChannelGroupId value) { Key = key; Value = Serialize(value.Value); } } partial class CommandMultiParameter { [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); } [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); } } } ================================================ FILE: TSLib/Commands/TsCommand.gen.tt ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // <#@ template debug="false" hostspecific="true" language="C#" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <#@ output extension=".cs" #> <# // "TimeSpan" (Currently removed, as it is too ambiguous) var types = new [] {"bool", "sbyte", "byte", "short", "ushort", "int", "uint", "long", "ulong", "float", "double", "string", "DateTime" }; var aliasTypes = new [] { "Uid", "ClientDbId", "ClientId", "ChannelId", "ServerGroupId", "ChannelGroupId" }; var classTypes = new [] { "string" }; #> using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; namespace TSLib.Commands { partial class TsCommand { <# foreach (var type in types.Concat(aliasTypes)) { if (classTypes.Contains(type)) { #> [DebuggerStepThrough] public TsCommand Add(string key, <#= type #> value) { if(value != null) Add(new CommandParameter(key, value)); return this; } <# } else { #> [DebuggerStepThrough] public TsCommand Add(string key, <#= type #>? value) { if(value != null) return Add(key, value.Value); return this; } [DebuggerStepThrough] public TsCommand Add(string key, <#= type #> value) => Add(new CommandParameter(key, value)); <# } #> [DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<<#= type #>> value) => Add(new CommandMultiParameter(key, value)); <# } #> } partial class CommandParameter { <# foreach (var type in types.Concat(aliasTypes)) { var value = aliasTypes.Contains(type) ? "value.Value" : "value"; #> [DebuggerStepThrough] public CommandParameter(string key, <#= type #> value) { Key = key; Value = Serialize(<#= value #>); } <# } #> } partial class CommandMultiParameter { <# foreach (var type in types.Concat(aliasTypes)) { if (aliasTypes.Contains(type)) { #> [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<<#= type #>> value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); } <# } else { #> [DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<<#= type #>> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); } <# } } #> } } ================================================ FILE: TSLib/Commands/TsConst.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TSLib.Commands { public class TsConst { public static TsConst Default { get; } = new TsConst(); public static TsConst Server_3_8_0 { get; } = new TsConst() { MaxSizeTextMessage = 8192 }; public static TsConst GetByServerBuildNum(ulong buildNum) { if (buildNum >= 1558938729UL) // 3.8.0 [Build: 1558938729] return Server_3_8_0; return Default; } // Common Definitions //limited length, measured in characters public int MaxSizeChannelName { get; private set; } = 40; public int MaxSizeVirtualserverName { get; private set; } = 64; public int MaxSizeClientNicknameSdk { get; private set; } = 64; public int MinSizeClientNicknameSdk { get; private set; } = 3; public int MaxSizeReasonMessage { get; private set; } = 80; //limited length, measured in bytes (utf8 encoded) public int MaxSizeTextMessage { get; private set; } = 1024; public int MaxSizeChannelTopic { get; private set; } = 255; public int MaxSizeChannelDescription { get; private set; } = 8192; public int MaxSizeVirtualserverWelcomeMessage { get; private set; } = 1024; // Rare Definitions //limited length, measured in characters public int MaxSizeClientNickname { get; private set; } = 30; public int MinSizeClientNickname { get; private set; } = 3; public int MaxSizeAwayMessage { get; private set; } = 80; public int MaxSizeGroupName { get; private set; } = 30; public int MaxSizeTalkRequestMessage { get; private set; } = 50; public int MaxSizeComplainMessage { get; private set; } = 200; public int MaxSizeClientDescription { get; private set; } = 200; public int MaxSizeHostMessage { get; private set; } = 200; public int MaxSizeHostbuttonTooltip { get; private set; } = 50; public int MaxSizepokeMessage { get; private set; } = 100; public int MaxSizeOfflineMessage { get; private set; } = 4096; public int MaxSizeOfflineMessageSubject { get; private set; } = 200; //limited length, measured in bytes (utf8 encoded) public int MaxSizePluginCommand { get; private set; } = 1024 * 8; public int MaxSizeVirtualserverHostbannerGfxUrl { get; private set; } = 2000; public TsConst() { } } } ================================================ FILE: TSLib/Commands/TsString.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Linq; using System.Text; using TSLib.Helper; #if NETCOREAPP3_1 using System.Runtime.Intrinsics; using System.Runtime.Intrinsics.X86; #endif namespace TSLib.Commands { public static class TsString { public static string Escape(string stringToEscape) => Escape(stringToEscape.AsSpan()); public static string Escape(ReadOnlySpan stringToEscape) { var strb = new StringBuilder(stringToEscape.Length); for (int i = 0; i < stringToEscape.Length; i++) { switch (stringToEscape[i]) { case '\\': strb.Append("\\\\"); break; // Backslash case '/': strb.Append("\\/"); break; // Slash case ' ': strb.Append("\\s"); break; // Whitespace case '|': strb.Append("\\p"); break; // Pipe case '\f': strb.Append("\\f"); break; // Formfeed case '\n': strb.Append("\\n"); break; // Newline case '\r': strb.Append("\\r"); break; // Carriage Return case '\t': strb.Append("\\t"); break; // Horizontal Tab case '\v': strb.Append("\\v"); break; // Vertical Tab default: strb.Append(stringToEscape[i]); break; } } return strb.ToString(); } public static string Unescape(string stringToUnescape) => Unescape(stringToUnescape.AsSpan()); public static string Unescape(ReadOnlySpan stringToUnescape) { var strb = new StringBuilder(stringToUnescape.Length); for (int i = 0; i < stringToUnescape.Length; i++) { char c = stringToUnescape[i]; if (c == '\\') { if (++i >= stringToUnescape.Length) throw new FormatException(); switch (stringToUnescape[i]) { case 'v': strb.Append('\v'); break; // Vertical Tab case 't': strb.Append('\t'); break; // Horizontal Tab case 'r': strb.Append('\r'); break; // Carriage Return case 'n': strb.Append('\n'); break; // Newline case 'f': strb.Append('\f'); break; // Formfeed case 'p': strb.Append('|'); break; // Pipe case 's': strb.Append(' '); break; // Whitespace case '/': strb.Append('/'); break; // Slash case '\\': strb.Append('\\'); break; // Backslash default: throw new FormatException(); } } else strb.Append(c); } return strb.ToString(); } public static string Unescape(ReadOnlySpan stringToUnescape) { // The unescaped string is always equal or shorter than the original. var strb = new byte[stringToUnescape.Length]; int writepos = 0; for (int i = 0; i < stringToUnescape.Length; i++) { byte c = stringToUnescape[i]; if (c == (byte)'\\') { if (++i >= stringToUnescape.Length) throw new FormatException(); strb[writepos++] = (stringToUnescape[i]) switch { (byte)'v' => (byte)'\v', // Vertical Tab (byte)'t' => (byte)'\t', // Horizontal Tab (byte)'r' => (byte)'\r', // Carriage Return (byte)'n' => (byte)'\n', // Newline (byte)'f' => (byte)'\f', // Formfeed (byte)'p' => (byte)'|', // Pipe (byte)'s' => (byte)' ', // Whitespace (byte)'/' => (byte)'/', // Slash (byte)'\\' => (byte)'\\',// Backslash _ => throw new FormatException(), }; } else strb[writepos++] = c; } return Tools.Utf8Encoder.GetString(strb, 0, writepos); } public static int TokenLength(string str) => Tools.Utf8Encoder.GetByteCount(str) + str.Count(IsDoubleChar); public static bool IsDoubleChar(char c) => unchecked(c == (byte)c) && IsDoubleChar(unchecked((byte)c)); #if NETCOREAPP3_1 private static readonly Vector128 doubleVec = Vector128.Create((byte)'\\', (byte)'/', (byte)' ', (byte)'|', (byte)'\f', (byte)'\n', (byte)'\r', (byte)'\t', (byte)'\v', 0, 0, 0, 0, 0, 0, 0); #endif public static bool IsDoubleChar(byte c) { #if NETCOREAPP3_1 if (Sse2.IsSupported) { var inc = Vector128.Create(c); var res = Sse2.CompareEqual(doubleVec, inc); var mask = Sse2.MoveMask(res); return mask != 0; } #endif return c == ' ' || c == '/' || c == '|' || c == '\\' || c == '\n' || c == '\r' || c == '\f' || c == '\t' || c == '\v'; } } } ================================================ FILE: TSLib/ConnectionData.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using TSLib.Full; using TSLib.Helper; namespace TSLib { /// Used to pass basic connecting information. (Usually for the query) public class ConnectionData { /// Hostname or Ip-Address including the port. This address can point to the /// server or the tsdns service. public string Address { get; } /// Attaches a name to log evets and threads. Useful for debugging. public Id LogId { get; } public ConnectionData(string address, Id? logId = null) { Address = address; LogId = logId ?? Id.Null; } } /// Used to pass detailed connecting information to the full client. public class ConnectionDataFull : ConnectionData { /// /// Secret identity of the user. /// public IdentityData Identity { get; } /// /// Set this to the TeamSpeak 3 Version this client should appear as. /// You can find predefined version data in the /// class. Please keep in mind that the version data has to have valid sign /// to be accepted by an official TeamSpeak 3 Server. /// public TsVersionSigned VersionSign { get; } /// The display username. public string Username { get; } /// The server password. Leave null if none. public Password ServerPassword { get; } /// /// The default channel this client should try to join when connecting. /// The channel can be specified with either the channel name path, example: "Lobby/Home". /// Or with the channel id in the following format: /<id>, example: "/5" /// public string DefaultChannel { get; } /// Password for the default channel. Leave null if none. public Password DefaultChannelPassword { get; } public ConnectionDataFull( string address, IdentityData identity, TsVersionSigned? versionSign = null, string? username = null, Password? serverPassword = null, string? defaultChannel = null, Password? defaultChannelPassword = null, Id? logId = null) : base(address, logId) { Identity = identity; VersionSign = versionSign ?? (Tools.IsLinux ? TsVersionSigned.VER_LIN_3_X_X : TsVersionSigned.VER_WIN_3_X_X); Username = username ?? "TSLibUser"; ServerPassword = serverPassword ?? Password.Empty; DefaultChannel = defaultChannel ?? string.Empty; DefaultChannelPassword = defaultChannelPassword ?? Password.Empty; } } public readonly struct Password { public static readonly Password Empty = FromHash(string.Empty); public string HashedPassword { get; } private Password(string hashed) { HashedPassword = hashed; } public static Password FromHash(string hash) => new Password(hash); public static Password FromPlain(string pass) => new Password(TsCrypt.HashPassword(pass)); public static implicit operator Password(string pass) => FromPlain(pass); } } ================================================ FILE: TSLib/DisconnectEventArgs.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using TSLib.Messages; namespace TSLib { public class DisconnectEventArgs : EventArgs { public Reason ExitReason { get; } public CommandError? Error { get; } public DisconnectEventArgs(Reason exitReason, CommandError? error = null) { ExitReason = exitReason; Error = error; } } } ================================================ FILE: TSLib/EventDispatcher.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Concurrent; using System.Threading; using TSLib.Helper; namespace TSLib { internal static class EventDispatcherHelper { public const string DispatcherTitle = "TS Dispatcher"; public const string EventLoopTitle = "TS MessageLoop"; internal static string CreateLogThreadName(string threadName, Id id) => threadName + (id == Id.Null ? "" : $"[{id}]"); internal static string CreateDispatcherTitle(Id id) => CreateLogThreadName(DispatcherTitle, id); } /// Provides a function to run a receiving loop and asynchronously /// dispatch notifications. /// internal interface IEventDispatcher : IDisposable { /// Initializes the dispatcher. /// The main loop which will be receiving packets. /// The method to call asynchronously when a new /// notification comes in. /// The current connection context. void Init(Action dispatcher, Id id); /// Dispatches the notification. /// void Invoke(LazyNotification lazyNotification); void DoWork(); } internal sealed class ExtraThreadEventDispatcher : IEventDispatcher { private Action dispatcher; private Thread dispatchThread; private readonly ConcurrentQueue eventQueue = new ConcurrentQueue(); private readonly AutoResetEvent eventBlock = new AutoResetEvent(false); private volatile bool run; #pragma warning disable CS8618 // !NRT on Init public ExtraThreadEventDispatcher() { } #pragma warning restore CS8618 public void Init(Action dispatcher, Id id) { run = true; this.dispatcher = dispatcher; dispatchThread = new Thread(() => { Tools.SetLogId(id); DispatchLoop(); }) { Name = EventDispatcherHelper.CreateDispatcherTitle(id) }; dispatchThread.Start(); } public void Invoke(LazyNotification lazyNotification) { eventQueue.Enqueue(lazyNotification); eventBlock.Set(); } private void DispatchLoop() { while (run) { eventBlock.WaitOne(); while (!eventQueue.IsEmpty) { if (eventQueue.TryDequeue(out var lazyNotification)) dispatcher.Invoke(lazyNotification); } } } public void DoWork() { if (Thread.CurrentThread.ManagedThreadId != dispatchThread.ManagedThreadId) return; if (eventQueue.TryDequeue(out var lazyNotification)) dispatcher.Invoke(lazyNotification); } public void Dispose() { run = false; eventBlock.Set(); } } } ================================================ FILE: TSLib/Full/Book/Book.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Linq; using TSLib.Helper; using TSLib.Messages; using SocketAddr = System.String; namespace TSLib.Full.Book { public partial class Connection { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); public Client? Self() => GetClient(OwnClient); public Channel? CurrentChannel() { var self = Self(); if (self is null) return null; return GetChannel(self.Channel); } private void SetServer(Server server) { Server = server; } private Channel? GetChannel(ChannelId id) { if (Channels.TryGetValue(id, out var channel)) return channel; return null; } private void SetChannel(Channel channel, ChannelId id) { channel.Id = id; Channels[id] = channel; } private void RemoveChannel(ChannelId id) { var cur = Channels[id]; Channels.Remove(id); ChannelOrderRemove(id, cur.Order); } private Client? GetClient(ClientId id) { if (Clients.TryGetValue(id, out var client)) return client; return null; } private void SetClient(Client client, ClientId id) { client.Id = id; Clients[id] = client; } private void RemoveClient(ClientId id) { Clients.Remove(id); } private void SetConnectionClientData(ConnectionClientData connectionClientData, ClientId id) { if (!Clients.TryGetValue(id, out var client)) return; client.ConnectionData = connectionClientData; } private void SetServerGroup(ServerGroup serverGroup, ServerGroupId id) { Groups[id] = serverGroup; } private Server GetServer() { return Server; } public void Reset() { Channels.Clear(); Clients.Clear(); Groups.Clear(); OwnClient = ClientId.Null; Server = new Server(); } // Manual post event functions partial void PostClientEnterView(ClientEnterView msg) => SetOwnChannelSubscribed(msg.ClientId); partial void PostClientMoved(ClientMoved msg) => SetOwnChannelSubscribed(msg.ClientId); private void SetOwnChannelSubscribed(ClientId clientId) { if (clientId == OwnClient) { var curChan = CurrentChannel(); if (curChan != null) { curChan.Subscribed = true; } } } // Manual move functions private static (MaxClients?, MaxClients?) MaxClientsCcFun(ChannelCreated msg) => MaxClientsFun(msg.MaxClients, msg.IsMaxClientsUnlimited, msg.MaxFamilyClients, msg.IsMaxFamilyClientsUnlimited, msg.InheritsMaxFamilyClients); private static (MaxClients?, MaxClients?) MaxClientsCeFun(ChannelEdited msg) => MaxClientsFun(msg.MaxClients, msg.IsMaxClientsUnlimited, msg.MaxFamilyClients, msg.IsMaxFamilyClientsUnlimited, msg.InheritsMaxFamilyClients); private static (MaxClients?, MaxClients?) MaxClientsClFun(ChannelList msg) => MaxClientsFun(msg.MaxClients, msg.IsMaxClientsUnlimited, msg.MaxFamilyClients, msg.IsMaxFamilyClientsUnlimited, msg.InheritsMaxFamilyClients); private static (MaxClients?, MaxClients?) MaxClientsFun(int? MaxClients, bool? IsMaxClientsUnlimited, int? MaxFamilyClients, bool? IsMaxFamilyClientsUnlimited, bool? InheritsMaxFamilyClients) { var chn = new MaxClients(); if (IsMaxClientsUnlimited == true) chn.LimitKind = MaxClientsKind.Unlimited; else { chn.LimitKind = MaxClientsKind.Limited; chn.Count = (ushort)Math.Max(Math.Min(ushort.MaxValue, MaxClients ?? ushort.MaxValue), 0); } var fam = new MaxClients(); if (IsMaxFamilyClientsUnlimited == true) fam.LimitKind = MaxClientsKind.Unlimited; else if (InheritsMaxFamilyClients == true) fam.LimitKind = MaxClientsKind.Inherited; else { fam.LimitKind = MaxClientsKind.Limited; fam.Count = (ushort)Math.Max(Math.Min(ushort.MaxValue, MaxFamilyClients ?? ushort.MaxValue), 0); } return (chn, fam); } private static ChannelType ChannelTypeCcFun(ChannelCreated msg) => ChannelTypeFun(msg.IsSemiPermanent, msg.IsPermanent); private static ChannelType ChannelTypeCeFun(ChannelEdited msg) => ChannelTypeFun(msg.IsSemiPermanent, msg.IsPermanent); private static ChannelType ChannelTypeClFun(ChannelList msg) => ChannelTypeFun(msg.IsSemiPermanent, msg.IsPermanent); private static ChannelType ChannelTypeFun(bool? semi, bool? perma) { if (semi == true) return ChannelType.SemiPermanent; else if (perma == true) return ChannelType.Permanent; else return ChannelType.Temporary; } private static string? AwayCevFun(ClientEnterView msg) => AwayFun(msg.IsAway, msg.AwayMessage); private static string? AwayCuFun(ClientUpdated msg) => AwayFun(msg.IsAway, msg.AwayMessage); private static string? AwayFun(bool? away, string? msg) => away switch { true => msg ?? "", _ => null, }; private static TalkPowerRequest? TalkPowerCevFun(ClientEnterView msg) { if (msg.TalkPowerRequestTime != Tools.UnixTimeStart) return new TalkPowerRequest() { Time = msg.TalkPowerRequestTime, Message = msg.TalkPowerRequestMessage ?? "" }; return null; } private static TalkPowerRequest? TalkPowerCuFun(ClientUpdated msg) => TalkPowerFun(msg.TalkPowerRequestTime, msg.TalkPowerRequestMessage); private static TalkPowerRequest? TalkPowerFun(DateTime? time, string? message) { if (time != null && time != Tools.UnixTimeStart) // TODO return new TalkPowerRequest() { Time = time.Value, Message = message ?? "" }; return null; } private static ClientType ClientTypeCevFun(ClientEnterView msg) => msg.ClientType; private ChannelId ChannelOrderCcFun(ChannelCreated msg) { ChannelOrderInsert(msg.ChannelId, msg.Order, msg.ParentId); return msg.Order; } private ChannelId ChannelOrderCmFun(ChannelMoved msg) => ChannelOrderMoveFun(msg.ChannelId, msg.Order, msg.ParentId); private ChannelId? ChannelOrderCeFun(ChannelEdited msg) { if (msg.Order == null) return null; return ChannelOrderMoveFun(msg.ChannelId, msg.Order.Value, msg.ParentId); } private ChannelId ChannelOrderMoveFun(ChannelId id, ChannelId newOrder, ChannelId? parent) { // [ C:4 | O:0 ] // [ C:5 | O:4 ]──┐ // [ C:7 | O:5 ] │ (Up1: O -> 4) // [ <─┘ (Chg: C:5 | O:7) // [ C:8 | O:7 ] (Up2: O -> 5) var cur = Channels[id]; var oldOrder = cur.Order; var newParent = parent ?? cur.Parent; ChannelOrderRemove(id, oldOrder); // Up1 ChannelOrderInsert(id, newOrder, newParent); // Up2 return newOrder; } private void ChannelOrderRemove(ChannelId id, ChannelId oldOrder) { // [ C:7 | O:_ ] // [ C:5 | O:7 ] ─>X // [ C:_ | O:5 ] (Upd: O -> 7) var chan = Channels.Values.FirstOrDefault(x => x.Order == id); if (chan != null) chan.Order = oldOrder; } private void ChannelOrderInsert(ChannelId id, ChannelId newOrder, ChannelId parent) { // [ C:7 | O:_ ] // [ <── (New: C:5 | O:7) // [ C:_ | O:7 ] (Upd: O -> 5) // or // [ C:_ | O:_ ] // ├ [ <── (New: C:5 | O:0) // └ [ C:_ | O:0 ] (Upd: O -> 5) // Multiple channel with Order:0 might exist, // we need to find one with the same parent as the inserted channel var chan = Channels.Values.FirstOrDefault(x => x.Order == newOrder && x.Parent == parent); if (chan != null) chan.Order = id; } private static SocketAddr AddressFun(ClientConnectionInfo msg) => msg.Ip; private void SetClientDataFun(InitServer initServer) { OwnClient = initServer.ClientId; } private bool ChannelSubscribeFun(ChannelSubscribed _) => true; private bool ChannelUnsubscribeFun(ChannelUnsubscribed msg) { var goneClients = Clients.Values.Where(client => client.Channel == msg.ChannelId).ToArray(); foreach (var clid in goneClients) Clients.Remove(clid.Id); return false; } private static bool ReturnFalse(T _) => false; } } ================================================ FILE: TSLib/Full/Book/SpecialTypes.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TSLib.Full.Book { public struct MaxClients { public ushort Count { get; internal set; } public MaxClientsKind LimitKind { get; internal set; } } public enum MaxClientsKind { Unlimited, Inherited, Limited, } public enum ChannelType { Temporary, SemiPermanent, Permanent, } public struct TalkPowerRequest { public DateTime Time { get; internal set; } public string Message { get; internal set; } } } ================================================ FILE: TSLib/Full/GenerationWindow.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TSLib.Full { public sealed class GenerationWindow { public int MappedBaseOffset { get; set; } public uint Generation { get; set; } public int Mod { get; } public int ReceiveWindow { get; } public GenerationWindow(int mod) : this(mod, mod / 2) { } public GenerationWindow(int mod, int windowSize) { Mod = mod; ReceiveWindow = windowSize; } public bool SetAndDrag(int mappedValue) { var inWindow = IsInWindow(mappedValue); if (inWindow) AdvanceToExcluded(mappedValue); return inWindow; } public void Advance(int amount) { if (amount > Mod) throw new Exception("Cannot advance more than one generation"); if (amount < 0) throw new Exception("Cannot advance backwards"); if (amount == 0) return; int newBaseOffset = MappedBaseOffset + amount; if (newBaseOffset >= Mod) { Generation += (uint)(newBaseOffset / Mod); newBaseOffset %= Mod; } MappedBaseOffset = newBaseOffset; } public void AdvanceToExcluded(int mappedValue) { var moveDist = (mappedValue - MappedBaseOffset) + 1; if (moveDist <= 0) return; Advance(moveDist); } public bool IsInWindow(int mappedValue) { int maxOffset = MappedBaseOffset + ReceiveWindow; if (maxOffset < Mod) { return mappedValue >= MappedBaseOffset && mappedValue < maxOffset; } else { return mappedValue >= MappedBaseOffset || mappedValue < maxOffset - Mod; } } public bool IsNextGen(int mappedValue) => MappedBaseOffset > (Mod - ReceiveWindow) && mappedValue < (MappedBaseOffset + ReceiveWindow) - Mod; public uint GetGeneration(int mappedValue) => (uint)(Generation + (IsNextGen(mappedValue) ? 1 : 0)); public int MappedToIndex(int mappedValue) { if (mappedValue >= Mod) throw new ArgumentOutOfRangeException(nameof(mappedValue)); if (IsNextGen(mappedValue)) { // | XX X> | <= The part from BaseOffset to MappedMod is small enough to consider packets with wrapped numbers again // /\ NewValue /\ BaseOffset return (mappedValue + Mod) - MappedBaseOffset; } else { // | X> XX | // /\ BaseOffset /\ NewValue // normal case return mappedValue - MappedBaseOffset; } } public void Reset() { MappedBaseOffset = 0; Generation = 0; } } } ================================================ FILE: TSLib/Full/IdentityData.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Org.BouncyCastle.Math; using Org.BouncyCastle.Math.EC; using System; namespace TSLib.Full { /// Represents the identity of a user. /// To generate new identities use . /// To improve the security level of this identity use . public class IdentityData { private string? publicKeyString; private string? privateKeyString; private string? publicAndPrivateKeyString; /// The public key encoded in base64. public string PublicKeyString => publicKeyString ??= TsCrypt.ExportPublicKey(PublicKey); /// The private key encoded in base64. public string PrivateKeyString => privateKeyString ??= TsCrypt.ExportPrivateKey(PrivateKey); /// The public and private key encoded in base64. public string PublicAndPrivateKeyString => publicAndPrivateKeyString ??= TsCrypt.ExportPublicAndPrivateKey(PublicKey, PrivateKey); /// The public key represented as its cryptographic data structure. public ECPoint PublicKey { get; } /// The private key represented as its cryptographic data structure. public BigInteger PrivateKey { get; } /// A number which is used to determine the security level of this identity. public ulong ValidKeyOffset { get; set; } /// When bruteforcing numbers linearly from 0, the last bruteforced number /// can be stored here to resume from when continuing to search. public ulong LastCheckedKeyOffset { get; set; } private Uid? clientUid; /// The client uid, which can be used in teamspeak for various features. public Uid ClientUid => clientUid ?? (clientUid = (Uid)TsCrypt.GetUidFromPublicKey(PublicKeyString)).Value; public IdentityData(BigInteger privateKey, ECPoint? publicKey = null) { PrivateKey = privateKey ?? throw new ArgumentNullException(nameof(privateKey)); PublicKey = publicKey ?? TsCrypt.RestorePublicFromPrivateKey(privateKey); } } } ================================================ FILE: TSLib/Full/License.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Chaos.NaCl.Ed25519Ref10; using System; using System.Buffers.Binary; using System.Collections.Generic; using TSLib.Helper; namespace TSLib.Full { public class Licenses { public static readonly byte[] LicenseRootKey = { 0xcd, 0x0d, 0xe2, 0xae, 0xd4, 0x63, 0x45, 0x50, 0x9a, 0x7e, 0x3c, 0xfd, 0x8f, 0x68, 0xb3, 0xdc, 0x75, 0x55, 0xb2, 0x9d, 0xcc, 0xec, 0x73, 0xcd, 0x18, 0x75, 0x0f, 0x99, 0x38, 0x12, 0x40, 0x8a }; public List Blocks { get; } = new List(); public static R Parse(ReadOnlySpan data) { if (data.Length < 1) return "License too short"; var version = data[0]; if (version != 1) return "Unsupported version"; // Read licenses var res = new Licenses(); data = data.Slice(1); while (data.Length > 0) { // Read next license var result = LicenseBlock.Parse(data); if (!result.Ok) return result.Error; var (license, len) = result.Value; // TODO Check valid times res.Blocks.Add(license); data = data.Slice(len); } return res; } public byte[] DeriveKey() { var round = LicenseRootKey; //Ed25519.DecodePoint(LicenseRootKey); foreach (var block in Blocks) round = block.DeriveKey(round); return round; } } public abstract class LicenseBlock { private const int MinBlockLen = 42; public abstract ChainBlockType Type { get; } public DateTime NotValidBefore { get; set; } public DateTime NotValidAfter { get; set; } #pragma warning disable CS8618 public byte[] Key { get; set; } public byte[] Hash { get; set; } #pragma warning restore CS8618 public static R<(LicenseBlock block, int read), string> Parse(ReadOnlySpan data) { if (data.Length < MinBlockLen) { return "License too short"; } if (data[0] != 0) { return $"Wrong key kind {data[0]} in license"; } LicenseBlock block; int read; switch (data[33]) { case 0: var result = ReadNullString(data.Slice(46)); if (!result.Ok) return result.Error; var nullStr = result.Value; block = new IntermediateLicenseBlock(nullStr.str); read = 5 + nullStr.read; break; case 2: if (!Enum.IsDefined(typeof(ServerLicenseType), data[42])) return $"Unknown license type {data[42]}"; result = ReadNullString(data.Slice(47)); if (!result.Ok) return result.Error; nullStr = result.Value; block = new ServerLicenseBlock(result.Value.str, (ServerLicenseType)data[42]); read = 6 + nullStr.read; break; case 32: block = new EphemeralLicenseBlock(); read = 0; break; default: return $"Invalid license block type {data[33]}"; } block.NotValidBefore = Tools.UnixTimeStart.AddSeconds(BinaryPrimitives.ReadUInt32BigEndian(data.Slice(34)) + 0x50e22700uL); block.NotValidAfter = Tools.UnixTimeStart.AddSeconds(BinaryPrimitives.ReadUInt32BigEndian(data.Slice(38)) + 0x50e22700uL); if (block.NotValidAfter < block.NotValidBefore) return "License times are invalid"; block.Key = data.Slice(1, 32).ToArray(); var allLen = MinBlockLen + read; var hash = TsCrypt.Hash512It(data[1..allLen].ToArray()); block.Hash = hash.AsSpan(0, 32).ToArray(); return (block, allLen); } private static R<(string str, int read), string> ReadNullString(ReadOnlySpan data) { var termIndex = data.IndexOf((byte)0); if (termIndex >= 0) return (data.Slice(0, termIndex).NewUtf8String(), termIndex); return "Non-null-terminated issuer string"; } /// /// Calculates a new public key by processing an existing one with this license bock. /// The key is calculated as following: new_pub_key = pub_key * hash + parent. /// Where pub_key and parent are public keys, and hash a private key. /// /// The preceeding key (from the previous block or root key). /// The new public key after processing it with this block. public byte[] DeriveKey(ReadOnlySpan parent) { ScalarOperations.sc_clamp(Hash); GroupOperations.ge_frombytes_negate_vartime(out var pubkey, Key); GroupOperations.ge_frombytes_negate_vartime(out var parkey, parent); GroupOperations.ge_scalarmult_vartime(out GroupElementP1P1 res, Hash, pubkey); GroupOperations.ge_p3_to_cached(out var pargrp, parkey); GroupOperations.ge_p1p1_to_p3(out var r, res); GroupOperations.ge_add(out var a, r, pargrp); GroupOperations.ge_p1p1_to_p3(out var r2, a); var final = new byte[32]; GroupOperations.ge_p3_tobytes(final, r2); final[31] ^= 0x80; return final; } } #region BlockTypes public class IntermediateLicenseBlock : LicenseBlock { public override ChainBlockType Type => ChainBlockType.Intermediate; public string Issuer { get; } public IntermediateLicenseBlock(string issuer) { Issuer = issuer; } } public class WebsiteLicenseBlock : LicenseBlock { public override ChainBlockType Type => ChainBlockType.Website; public string Issuer { get; } public WebsiteLicenseBlock(string issuer) { Issuer = issuer; } } public class CodeLicenseBlock : LicenseBlock { public override ChainBlockType Type => ChainBlockType.Code; public string Issuer { get; } public CodeLicenseBlock(string issuer) { Issuer = issuer; } } public class ServerLicenseBlock : LicenseBlock { public override ChainBlockType Type => ChainBlockType.Server; public string Issuer { get; } public ServerLicenseType LicenseType { get; } public ServerLicenseBlock(string issuer, ServerLicenseType licenseType) { Issuer = issuer; LicenseType = licenseType; } } public class EphemeralLicenseBlock : LicenseBlock { public override ChainBlockType Type => ChainBlockType.Ephemeral; } public enum ChainBlockType : byte { Intermediate = 0, Website = 1, Server = 2, Code = 3, // (Not used in license parser) //Token = 4, //LicenseSign = 5, //MyTsIdSign = 6, Ephemeral = 32, } #endregion public enum ServerLicenseType : byte { None = 0, Offline, Sdk, SdkOffline, Npl, Athp, Aal, Default, Gamer, Sponsorship, Commercial, } } ================================================ FILE: TSLib/Full/NetworkStats.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using TSLib.Commands; using TSLib.Helper; namespace TSLib.Full { // TODO include udp/ip header size to get correct values /// Provides connection stats by logging packets. public sealed class NetworkStats { private readonly long[] outPackets = new long[3]; private readonly long[] inPackets = new long[3]; private readonly long[] outBytes = new long[3]; private readonly long[] inBytes = new long[3]; private readonly Queue outBytesTime = new Queue(); private readonly Queue inBytesTime = new Queue(); private readonly Queue pingTimes = new Queue(60); private static readonly TimeSpan TimeSecond = TimeSpan.FromSeconds(1); private static readonly TimeSpan TimeMinute = TimeSpan.FromMinutes(1); private readonly object queueLock = new object(); internal void LogOutPacket(ref Packet packet) { var kind = TypeToKind(packet.PacketType); lock (queueLock) { outPackets[(int)kind]++; outBytes[(int)kind] += packet.Raw.Length; DropOver(outBytesTime, TimeMinute); outBytesTime.Enqueue(new PacketData((ushort)packet.Raw.Length, Tools.Now, kind)); } } internal void LogInPacket(ref Packet packet) { var kind = TypeToKind(packet.PacketType); lock (queueLock) { inPackets[(int)kind]++; inBytes[(int)kind] += packet.Raw.Length; DropOver(inBytesTime, TimeMinute); inBytesTime.Enqueue(new PacketData((ushort)packet.Raw.Length, Tools.Now, kind)); } } public void LogLostPings(int count) { // TODO } public void AddPing(TimeSpan ping) { lock (queueLock) { if (pingTimes.Count >= 60) pingTimes.Dequeue(); pingTimes.Enqueue(ping); } } private static PacketKind TypeToKind(PacketType type) { switch (type) { case PacketType.Voice: case PacketType.VoiceWhisper: return PacketKind.Speech; case PacketType.Command: case PacketType.CommandLow: case PacketType.Ack: case PacketType.AckLow: case PacketType.Init1: return PacketKind.Control; case PacketType.Ping: case PacketType.Pong: return PacketKind.Keepalive; default: throw Tools.UnhandledDefault(type); } } private static void GetWithin(Queue queue, TimeSpan time, out DataCatergory data) { var now = Tools.Now; var nowThresh = now - time; data = new DataCatergory(); foreach (var pack in queue.Reverse()) if (nowThresh <= pack.SendPoint) { switch (pack.Kind) { case PacketKind.Speech: data.Speech += pack.Size; break; case PacketKind.Keepalive: data.Keepalive += pack.Size; break; case PacketKind.Control: data.Control += pack.Size; break; default: throw Tools.UnhandledDefault(pack.Kind); } } else { break; } data.Speech = (long)(data.Speech / time.TotalSeconds); data.Keepalive = (long)(data.Keepalive / time.TotalSeconds); data.Control = (long)(data.Control / time.TotalSeconds); } private static void DropOver(Queue queue, TimeSpan time) { var now = Tools.Now; while (queue.Count > 0 && now - queue.Peek().SendPoint > time) queue.Dequeue(); } public TsCommand GenerateStatusAnswer() { DataCatergory lastSecondIn; DataCatergory lastSecondOut; DataCatergory lastMinuteIn; DataCatergory lastMinuteOut; double lastPing; double deviationPing; lock (queueLock) { GetWithin(inBytesTime, TimeSecond, out lastSecondIn); GetWithin(outBytesTime, TimeSecond, out lastSecondOut); GetWithin(inBytesTime, TimeMinute, out lastMinuteIn); GetWithin(outBytesTime, TimeMinute, out lastMinuteOut); if (pingTimes.Count > 0) { lastPing = pingTimes.Last().TotalMilliseconds; deviationPing = StdDev(pingTimes.Select(ts => ts.TotalMilliseconds)); } else { lastPing = deviationPing = 0; } } return new TsCommand("setconnectioninfo") { { "connection_ping", Math.Round(lastPing, 0) }, { "connection_ping_deviation", deviationPing }, { "connection_packets_sent_speech", outPackets[(int)PacketKind.Speech] }, { "connection_packets_sent_keepalive", outPackets[(int)PacketKind.Keepalive] }, { "connection_packets_sent_control", outPackets[(int)PacketKind.Control] }, { "connection_bytes_sent_speech", outBytes[(int)PacketKind.Speech] }, { "connection_bytes_sent_keepalive", outBytes[(int)PacketKind.Keepalive] }, { "connection_bytes_sent_control", outBytes[(int)PacketKind.Control] }, { "connection_packets_received_speech", inPackets[(int)PacketKind.Speech] }, { "connection_packets_received_keepalive", inPackets[(int)PacketKind.Keepalive] }, { "connection_packets_received_control", inPackets[(int)PacketKind.Control] }, { "connection_bytes_received_speech", inBytes[(int)PacketKind.Speech] }, { "connection_bytes_received_keepalive", inBytes[(int)PacketKind.Keepalive] }, { "connection_bytes_received_control", inBytes[(int)PacketKind.Control] }, { "connection_server2client_packetloss_speech", 42.0000f }, { "connection_server2client_packetloss_keepalive", 1.0000f }, { "connection_server2client_packetloss_control", 0.5000f }, { "connection_server2client_packetloss_total", 0.0000f }, { "connection_bandwidth_sent_last_second_speech", lastSecondOut.Speech }, { "connection_bandwidth_sent_last_second_keepalive", lastSecondOut.Keepalive }, { "connection_bandwidth_sent_last_second_control", lastSecondOut.Control }, { "connection_bandwidth_sent_last_minute_speech", lastMinuteOut.Speech }, { "connection_bandwidth_sent_last_minute_keepalive", lastMinuteOut.Keepalive }, { "connection_bandwidth_sent_last_minute_control", lastMinuteOut.Control }, { "connection_bandwidth_received_last_second_speech", lastSecondIn.Speech }, { "connection_bandwidth_received_last_second_keepalive", lastSecondIn.Keepalive }, { "connection_bandwidth_received_last_second_control", lastSecondIn.Control }, { "connection_bandwidth_received_last_minute_speech", lastMinuteIn.Speech }, { "connection_bandwidth_received_last_minute_keepalive", lastMinuteIn.Keepalive }, { "connection_bandwidth_received_last_minute_control", lastMinuteIn.Control }, }; } private static double StdDev(IEnumerable values) { double avg = values.Average(); double sum = 0; int n = 0; foreach (double val in values) { n++; sum += (val - avg) * (val - avg); } if (n > 1) return Math.Sqrt(sum / (n - 1)); return 0; } public void Reset() { Array.Clear(outPackets, 0, outPackets.Length); Array.Clear(inPackets, 0, inPackets.Length); Array.Clear(outBytes, 0, outBytes.Length); Array.Clear(inBytes, 0, inBytes.Length); lock (queueLock) { outBytesTime.Clear(); inBytesTime.Clear(); pingTimes.Clear(); } } private enum PacketKind : ushort { Speech, Keepalive, Control, } private readonly struct PacketData { public DateTime SendPoint { get; } public ushort Size { get; } public PacketKind Kind { get; } public PacketData(ushort size, DateTime sendPoint, PacketKind kind) { Size = size; SendPoint = sendPoint; Kind = kind; } } struct DataCatergory { public long Speech { get; set; } public long Keepalive { get; set; } public long Control { get; set; } } } } ================================================ FILE: TSLib/Full/Packet.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Buffers.Binary; using System.Diagnostics; using System.Runtime.CompilerServices; using TSLib.Helper; namespace TSLib.Full { internal struct Packet { public static bool FromServer { get; } = typeof(TDir) == typeof(S2C); public static int HeaderLength { get; } = typeof(TDir) == typeof(S2C) ? S2C.HeaderLen : C2S.HeaderLen; public PacketType PacketType { get => (PacketType)(PacketTypeFlagged & 0x0F); set => PacketTypeFlagged = (byte)((PacketTypeFlagged & 0xF0) | ((byte)value & 0x0F)); } public PacketFlags PacketFlags { get => (PacketFlags)(PacketTypeFlagged & 0xF0); set => PacketTypeFlagged = (byte)((PacketTypeFlagged & 0x0F) | ((byte)value & 0xF0)); } public byte PacketTypeFlagged { get; set; } public ushort PacketId { get; set; } public uint GenerationId { get; set; } public int Size => Data.Length; public TDir HeaderExt { get; set; } public byte[] Raw { get; private set; } public byte[] Header { get; private set; } public byte[] Data { get; set; } public bool FragmentedFlag { get => (PacketFlags & PacketFlags.Fragmented) != 0; set { if (value) PacketTypeFlagged |= (byte)PacketFlags.Fragmented; else PacketTypeFlagged &= (byte)~PacketFlags.Fragmented; } } public bool NewProtocolFlag { get => (PacketFlags & PacketFlags.Newprotocol) != 0; set { if (value) PacketTypeFlagged |= (byte)PacketFlags.Newprotocol; else PacketTypeFlagged &= (byte)~PacketFlags.Newprotocol; } } public bool CompressedFlag { get => (PacketFlags & PacketFlags.Compressed) != 0; set { if (value) PacketTypeFlagged |= (byte)PacketFlags.Compressed; else PacketTypeFlagged &= (byte)~PacketFlags.Compressed; } } public bool UnencryptedFlag { get => (PacketFlags & PacketFlags.Unencrypted) != 0; set { if (value) PacketTypeFlagged |= (byte)PacketFlags.Unencrypted; else PacketTypeFlagged &= (byte)~PacketFlags.Unencrypted; } } public Packet(ReadOnlySpan data, PacketType packetType, ushort packetId, uint generationId) : this() { Raw = new byte[data.Length + HeaderLength + TsCrypt.MacLen]; Header = new byte[HeaderLength]; Data = data.ToArray(); PacketType = packetType; PacketId = packetId; GenerationId = generationId; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Packet? FromRaw(ReadOnlySpan raw) { if (raw.Length < HeaderLength + TsCrypt.MacLen) return null; var packet = new Packet { Raw = raw.ToArray(), Header = new byte[HeaderLength], }; packet.FromHeader(); return packet; } public override string ToString() { return $"Type: {PacketType}\tFlags: [ " + $"{(FragmentedFlag ? "F" : "_")} {(NewProtocolFlag ? "N" : "_")} " + $"{(CompressedFlag ? "C" : "_")} {(UnencryptedFlag ? "U" : "_")} ]\t" + $"Id: {PacketId}\n" + $" MAC: { (Raw is null ? string.Empty : DebugUtil.DebugToHex(Raw.AsSpan(0, 8))) }\t" + $" Header: { DebugUtil.DebugToHex(Header) }\n" + $" Data: { DebugUtil.DebugToHex(Data) }"; } public void BuildHeader() => BuildHeader(Header); public void BuildHeader(Span into) { // typeof(..) and casts get jitted away, don't worry :) if (typeof(TDir) == typeof(S2C)) { BinaryPrimitives.WriteUInt16BigEndian(into.Slice(0, 2), PacketId); into[2] = PacketTypeFlagged; } else if (typeof(TDir) == typeof(C2S)) { var self = (C2S)(object)HeaderExt!; BinaryPrimitives.WriteUInt16BigEndian(into.Slice(0, 2), PacketId); BinaryPrimitives.WriteUInt16BigEndian(into.Slice(2, 2), self.ClientId); into[4] = PacketTypeFlagged; } else { Trace.Fail("Invalid associated Packet Data"); } #if DEBUG into.CopyTo(Header.AsSpan()); #endif } public void FromHeader() { // typeof(..) and casts get jitted away, don't worry :) var rawSpan = Raw.AsSpan(); if (typeof(TDir) == typeof(S2C)) { PacketId = BinaryPrimitives.ReadUInt16BigEndian(rawSpan.Slice(TsCrypt.MacLen)); PacketTypeFlagged = Raw[TsCrypt.MacLen + 2]; } else if (typeof(TDir) == typeof(C2S)) { var ext = new C2S(); PacketId = BinaryPrimitives.ReadUInt16BigEndian(rawSpan.Slice(TsCrypt.MacLen)); ext.ClientId = BinaryPrimitives.ReadUInt16BigEndian(rawSpan.Slice(TsCrypt.MacLen + 2)); PacketTypeFlagged = Raw[TsCrypt.MacLen + 4]; HeaderExt = (TDir)(object)ext; } else { Trace.Fail("Invalid associated Packet Data"); } } } internal class ResendPacket { public /*readonly*/ Packet Packet; public DateTime FirstSendTime { get; set; } public DateTime LastSendTime { get; set; } public ResendPacket(Packet packet) { Packet = packet; var now = Tools.Now; FirstSendTime = now; LastSendTime = now; } public override string ToString() => $"RS(first:{FirstSendTime},last:{LastSendTime}) => {Packet}"; } internal struct C2S { public const int HeaderLen = 5; public ushort ClientId { get; set; } } internal struct S2C { public const int HeaderLen = 3; } } ================================================ FILE: TSLib/Full/PacketHandler.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using NLog; using System; using System.Buffers.Binary; using System.Collections.Generic; using System.Diagnostics; using System.Net; using System.Net.Sockets; using System.Threading; using TSLib.Helper; using static TSLib.Full.PacketHandlerConst; namespace TSLib.Full { internal sealed class PacketHandler { private static readonly int OutHeaderSize = TsCrypt.MacLen + Packet.HeaderLength; private static readonly int MaxOutContentSize = MaxOutPacketSize - OutHeaderSize; // Timout calculations /// The SmoothedRoundTripTime holds the smoothed average time /// it takes for a packet to get ack'd. private TimeSpan smoothedRtt; /// Holds the smoothed rtt variation. private TimeSpan smoothedRttVar; /// Holds the current RetransmissionTimeOut, which determines the timespan until /// a packet is considered to be lost. private TimeSpan currentRto; private readonly Stopwatch pingTimer = new Stopwatch(); private readonly Stopwatch lastMessageTimer = new Stopwatch(); private ushort lastSentPingId; private ushort lastReceivedPingId; // Out Packets private readonly ushort[] packetCounter; private readonly uint[] generationCounter; private ResendPacket? initPacketCheck; private readonly Dictionary> packetAckManager = new Dictionary>(); // In Packets private readonly GenerationWindow receiveWindowVoice; private readonly GenerationWindow receiveWindowVoiceWhisper; private readonly RingQueue> receiveQueueCommand; private readonly RingQueue> receiveQueueCommandLow; // ==== private readonly object sendLoopLock = new object(); private readonly TsCrypt tsCrypt; private Socket? socket; private Timer? resendTimer; private DateTime pingCheck; private int pingCheckRunning; // bool private readonly Id id; // Log id public NetworkStats NetworkStats { get; } public ClientId ClientId { get; set; } private IPEndPoint? remoteAddress; private int closed; // bool public PacketEvent? PacketEvent; public Action? StopEvent; public PacketHandler(TsCrypt ts3Crypt, Id id) { receiveQueueCommand = new RingQueue>(ReceivePacketWindowSize, ushort.MaxValue + 1); receiveQueueCommandLow = new RingQueue>(ReceivePacketWindowSize, ushort.MaxValue + 1); receiveWindowVoice = new GenerationWindow(ushort.MaxValue + 1); receiveWindowVoiceWhisper = new GenerationWindow(ushort.MaxValue + 1); NetworkStats = new NetworkStats(); packetCounter = new ushort[TsCrypt.PacketTypeKinds]; generationCounter = new uint[TsCrypt.PacketTypeKinds]; this.tsCrypt = ts3Crypt; this.id = id; } public E Connect(IPEndPoint address) { if (!Initialize(address, true).GetOk(out var error)) return "Failed to initialize: " + error.Message; // The old client used to send 'clientinitiv' as the first message. // All newer servers still ack it but do not require it anymore. // Therefore there is no use in sending it. // We still have to increase the packet counter as if we had sent // it because the packed-ids the server expects are fixed. IncPacketCounter(PacketType.Command); // Send the actual new init packet. return AddOutgoingPacket(tsCrypt.ProcessInit1(null).Value, PacketType.Init1); } public void Listen(IPEndPoint address) { lock (sendLoopLock) { Initialize(address, false).Unwrap(); // dummy initPacketCheck = new ResendPacket(new Packet(Array.Empty(), 0, 0, 0)) { FirstSendTime = DateTime.MaxValue, LastSendTime = DateTime.MaxValue }; } } private E Initialize(IPEndPoint address, bool connect) { if (address is null) throw new ArgumentNullException(nameof(address)); lock (sendLoopLock) { ClientId = default; closed = 0; smoothedRtt = MaxRetryInterval; smoothedRttVar = TimeSpan.Zero; currentRto = MaxRetryInterval; lastSentPingId = 0; lastReceivedPingId = 0; lastMessageTimer.Restart(); initPacketCheck = null; packetAckManager.Clear(); receiveQueueCommand.Clear(); receiveQueueCommandLow.Clear(); receiveWindowVoice.Reset(); receiveWindowVoiceWhisper.Reset(); Array.Clear(packetCounter, 0, packetCounter.Length); Array.Clear(generationCounter, 0, generationCounter.Length); NetworkStats.Reset(); socket?.Dispose(); try { if (connect) { remoteAddress = address; socket = new Socket(address.AddressFamily, SocketType.Dgram, ProtocolType.Udp); socket.Bind(new IPEndPoint(address.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, 0)); var socketEventArgs = new SocketAsyncEventArgs(); socketEventArgs.SetBuffer(new byte[4096], 0, 4096); socketEventArgs.Completed += FetchPacketEvent; socketEventArgs.UserToken = this; socketEventArgs.RemoteEndPoint = remoteAddress; socket.ReceiveFromAsync(socketEventArgs); } else { remoteAddress = null; socket = new Socket(address.AddressFamily, SocketType.Dgram, ProtocolType.Udp); socket.Bind(address); // TODO init socketevargs stuff } } catch (SocketException ex) { return ex; } pingCheckRunning = 0; pingCheck = Tools.Now; if (resendTimer == null) resendTimer = new Timer((_) => { using (MappedDiagnosticsLogicalContext.SetScoped("BotId", id)) ResendLoop(); }, null, ClockResolution, ClockResolution); return R.Ok; } } public void Stop() => Stop(null); private void Stop(Reason? closeReason) { var wasClosed = Interlocked.Exchange(ref closed, 1); if (wasClosed != 0) return; Log.Debug("Stopping PacketHandler {0}", closeReason); lock (sendLoopLock) { resendTimer?.Dispose(); socket?.Dispose(); PacketEvent = null; } StopEvent?.Invoke(closeReason); } public E AddOutgoingPacket(ReadOnlySpan packet, PacketType packetType, PacketFlags addFlags = PacketFlags.None) { lock (sendLoopLock) { if (closed != 0) return "Connection closed"; if (NeedsSplitting(packet.Length) && packetType != PacketType.VoiceWhisper) { // VoiceWhisper packets are excluded for some reason if (packetType == PacketType.Voice) return "Voice packet too big"; // This happens when a voice packet is bigger than the allowed size var tmpCompress = QuickerLz.Compress(packet, 1); if (tmpCompress.Length < packet.Length) { packet = tmpCompress; addFlags |= PacketFlags.Compressed; } if (NeedsSplitting(packet.Length)) { return AddOutgoingSplitData(packet, packetType, addFlags); } } return SendOutgoingData(packet, packetType, addFlags); } } private E AddOutgoingSplitData(ReadOnlySpan rawData, PacketType packetType, PacketFlags addFlags = PacketFlags.None) { int pos = 0; bool first = true; bool last; // TODO check if "packBuffer.FreeSlots >= packetSplit.Count" do { int blockSize = Math.Min(MaxOutContentSize, rawData.Length - pos); if (blockSize <= 0) break; var flags = PacketFlags.None; last = pos + blockSize == rawData.Length; if (first ^ last) flags |= PacketFlags.Fragmented; if (first) { flags |= addFlags; first = false; } Debug.Assert(!NeedsSplitting(blockSize)); var sendResult = SendOutgoingData(rawData.Slice(pos, blockSize), packetType, flags); if (!sendResult.Ok) return sendResult; pos += blockSize; } while (!last); return R.Ok; } // is always locked on 'sendLoopLock' from a higher call private E SendOutgoingData(ReadOnlySpan data, PacketType packetType, PacketFlags flags = PacketFlags.None) { var ids = GetPacketCounter(packetType); IncPacketCounter(packetType); var packet = new Packet(data, packetType, ids.Id, ids.Generation) { PacketType = packetType }; if (typeof(TOut) == typeof(C2S)) // TODO: XXX { var meta = (C2S)(object)packet.HeaderExt!; meta.ClientId = ClientId.Value; packet.HeaderExt = (TOut)(object)meta; } packet.PacketFlags |= flags; switch (packet.PacketType) { case PacketType.Voice: case PacketType.VoiceWhisper: packet.PacketFlags |= PacketFlags.Unencrypted; BinaryPrimitives.WriteUInt16BigEndian(packet.Data, packet.PacketId); LogRawVoice.Trace("[O] {0}", packet); break; case PacketType.Command: case PacketType.CommandLow: packet.PacketFlags |= PacketFlags.Newprotocol; var resendPacket = new ResendPacket(packet); packetAckManager.Add(packet.PacketId, resendPacket); LogRaw.Debug("[O] {0}", packet); break; case PacketType.Ping: lastSentPingId = packet.PacketId; packet.PacketFlags |= PacketFlags.Unencrypted; LogRaw.Trace("[O] Ping {0}", packet.PacketId); break; case PacketType.Pong: packet.PacketFlags |= PacketFlags.Unencrypted; LogRaw.Trace("[O] Pong {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data)); break; case PacketType.Ack: LogRaw.Debug("[O] Acking Ack: {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data)); break; case PacketType.AckLow: packet.PacketFlags |= PacketFlags.Unencrypted; LogRaw.Debug("[O] Acking AckLow: {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data)); break; case PacketType.Init1: packet.PacketFlags |= PacketFlags.Unencrypted; initPacketCheck = new ResendPacket(packet); LogRaw.Debug("[O] InitID: {0}", packet.Data[4]); LogRaw.Trace("[O] {0}", packet); break; default: throw Tools.UnhandledDefault(packet.PacketType); } tsCrypt.Encrypt(ref packet); return SendRaw(ref packet); } private (ushort Id, uint Generation) GetPacketCounter(PacketType packetType) => (packetType != PacketType.Init1) ? (packetCounter[(int)packetType], generationCounter[(int)packetType]) : (101, 0); private void IncPacketCounter(PacketType packetType) { unchecked { packetCounter[(int)packetType]++; } if (packetCounter[(int)packetType] == 0) generationCounter[(int)packetType]++; } private static bool NeedsSplitting(int dataSize) => dataSize + OutHeaderSize > MaxOutPacketSize; private static void FetchPacketEvent(object? selfObj, SocketAsyncEventArgs args) { var self = (PacketHandler)args.UserToken; bool isAsync; using (MappedDiagnosticsLogicalContext.SetScoped("BotId", self.id)) { do { if (self.closed != 0) return; if (args.SocketError == SocketError.Success) { self.FetchPackets(args.Buffer.AsSpan(0, args.BytesTransferred)); } else { Log.Debug("Socket error: {@args}", args); if (args.SocketError == SocketError.ConnectionReset) { self.Stop(Reason.SocketError); } } lock (self.sendLoopLock) { if (self.closed != 0) return; Trace.Assert(self.socket != null, nameof(self.socket) + " is null"); try { isAsync = self.socket!.ReceiveFromAsync(args); } catch (Exception ex) { Log.Debug(ex, "Error starting socket receive"); return; } } } while (!isAsync); } } private void FetchPackets(Span buffer) { var optpacket = Packet.FromRaw(buffer); // Invalid packet, ignore if (optpacket is null) { LogRaw.Warn("Dropping invalid packet: {0}", DebugUtil.DebugToHex(buffer)); return; } var packet = optpacket.Value; // DebugToHex is costly and allocates, precheck before logging if (LogRaw.IsTraceEnabled) LogRaw.Trace("[I] Raw {0}", DebugUtil.DebugToHex(packet.Raw)); FindIncommingGenerationId(ref packet); if (!tsCrypt.Decrypt(ref packet)) { LogRaw.Warn("Dropping not decryptable packet: {0}", DebugUtil.DebugToHex(packet.Raw)); return; } lastMessageTimer.Restart(); NetworkStats.LogInPacket(ref packet); bool passPacketToEvent = true; switch (packet.PacketType) { case PacketType.Voice: LogRawVoice.Trace("[I] {0}", packet); passPacketToEvent = ReceiveVoice(ref packet, receiveWindowVoice); break; case PacketType.VoiceWhisper: LogRawVoice.Trace("[I] {0}", packet); passPacketToEvent = ReceiveVoice(ref packet, receiveWindowVoiceWhisper); break; case PacketType.Command: LogRaw.Debug("[I] {0}", packet); passPacketToEvent = ReceiveCommand(ref packet, receiveQueueCommand, PacketType.Ack); break; case PacketType.CommandLow: LogRaw.Debug("[I] {0}", packet); passPacketToEvent = ReceiveCommand(ref packet, receiveQueueCommandLow, PacketType.AckLow); break; case PacketType.Ping: LogRaw.Trace("[I] Ping {0}", packet.PacketId); ReceivePing(ref packet); break; case PacketType.Pong: LogRaw.Trace("[I] Pong {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data)); passPacketToEvent = ReceivePong(ref packet); break; case PacketType.Ack: LogRaw.Debug("[I] Acking: {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data)); passPacketToEvent = ReceiveAck(ref packet); break; case PacketType.AckLow: break; case PacketType.Init1: if (!LogRaw.IsTraceEnabled) LogRaw.Debug("[I] InitID: {0}", packet.Data[0]); if (!LogRaw.IsDebugEnabled) LogRaw.Trace("[I] {0}", packet); passPacketToEvent = ReceiveInitAck(ref packet); break; default: throw Tools.UnhandledDefault(packet.PacketType); } if (passPacketToEvent) PacketEvent?.Invoke(ref packet); } #region Packet checking // These methods are for low level packet processing which the // rather high level TS3FullClient should not worry about. private void FindIncommingGenerationId(ref Packet packet) { GenerationWindow window; switch (packet.PacketType) { case PacketType.Voice: window = receiveWindowVoice; break; case PacketType.VoiceWhisper: window = receiveWindowVoiceWhisper; break; case PacketType.Command: window = receiveQueueCommand.Window; break; case PacketType.CommandLow: window = receiveQueueCommandLow.Window; break; default: return; } packet.GenerationId = window.GetGeneration(packet.PacketId); } private bool ReceiveVoice(ref Packet packet, GenerationWindow window) => window.SetAndDrag(packet.PacketId); private bool ReceiveCommand(ref Packet packet, RingQueue> packetQueue, PacketType ackType) { var setStatus = packetQueue.IsSet(packet.PacketId); // Check if we cannot accept this packet since it doesn't fit into the receive window if (setStatus == ItemSetStatus.OutOfWindowNotSet) return false; SendAck(packet.PacketId, ackType); // Check if we already have this packet and only need to ack it. if (setStatus.HasFlag(ItemSetStatus.Set)) return false; packetQueue.Set(packet.PacketId, packet); while (TryGetCommand(packetQueue, out packet)) PacketEvent?.Invoke(ref packet); return false; } private static bool TryGetCommand(RingQueue> packetQueue, out Packet packet) { if (packetQueue.Count <= 0) { packet = default; return false; } int take = 0; int takeLen = 0; bool hasStart = false; bool hasEnd = false; for (int i = 0; i < packetQueue.Count; i++) { if (packetQueue.TryPeekStart(i, out var peekPacket)) { take++; takeLen += peekPacket.Size; if (peekPacket.FragmentedFlag) { if (!hasStart) { hasStart = true; } else { hasEnd = true; break; } } else { if (!hasStart) { hasStart = true; hasEnd = true; break; } } } else { break; } } if (!hasStart || !hasEnd) { packet = default; return false; } // GET if (!packetQueue.TryDequeue(out packet)) Trace.Fail("Packet in queue got missing (?)"); // MERGE if (take > 1) { var preFinalArray = new byte[takeLen]; // for loop at 0th element int curCopyPos = packet.Size; packet.Data.CopyTo(preFinalArray.AsSpan(0, packet.Size)); for (int i = 1; i < take; i++) { if (!packetQueue.TryDequeue(out var nextPacket)) Trace.Fail("Packet in queue got missing (?)"); nextPacket.Data.CopyTo(preFinalArray.AsSpan(curCopyPos, nextPacket.Size)); curCopyPos += nextPacket.Size; } packet.Data = preFinalArray; } // DECOMPRESS if (packet.CompressedFlag) { try { packet.Data = QuickerLz.Decompress(packet.Data, MaxDecompressedSize); } catch (Exception ex) { LogRaw.Warn(ex, "Got invalid compressed data."); return false; } } return true; } private void SendAck(ushort ackId, PacketType ackType) { Span ackData = stackalloc byte[2]; BinaryPrimitives.WriteUInt16BigEndian(ackData, ackId); Trace.Assert(ackType == PacketType.Ack || ackType == PacketType.AckLow, "Packet type is not an Ack-type"); AddOutgoingPacket(ackData, ackType); } private bool ReceiveAck(ref Packet packet) { if (!BinaryPrimitives.TryReadUInt16BigEndian(packet.Data, out var packetId)) return false; lock (sendLoopLock) { if (packetAckManager.TryGetValue(packetId, out var ackPacket)) { UpdateRto(Tools.Now - ackPacket.LastSendTime); packetAckManager.Remove(packetId); } } return true; } private void SendPing() { pingTimer.Restart(); AddOutgoingPacket(Array.Empty(), PacketType.Ping); } private void ReceivePing(ref Packet packet) { var idDiff = packet.PacketId - lastReceivedPingId; if (idDiff > 1 && idDiff < ReceivePacketWindowSize) NetworkStats.LogLostPings(idDiff - 1); if (idDiff > 0 || idDiff < -ReceivePacketWindowSize) lastReceivedPingId = packet.PacketId; Span pongData = stackalloc byte[2]; BinaryPrimitives.WriteUInt16BigEndian(pongData, packet.PacketId); AddOutgoingPacket(pongData, PacketType.Pong); } private bool ReceivePong(ref Packet packet) { if (!BinaryPrimitives.TryReadUInt16BigEndian(packet.Data, out var answerId)) return false; if (lastSentPingId == answerId) { var rtt = pingTimer.Elapsed; UpdateRto(rtt); NetworkStats.AddPing(rtt); } return true; } public void ReceivedFinalInitAck() { initPacketCheck = null; } private bool ReceiveInitAck(ref Packet packet) { lock (sendLoopLock) { if (initPacketCheck is null) return true; // optional: add random number check from init data var forwardData = tsCrypt.ProcessInit1(packet.Data); if (!forwardData.Ok) { LogRaw.Debug("Error init: {0}", forwardData.Error); return false; } initPacketCheck = null; if (forwardData.Value.Length == 0) // TODO XXX return true; AddOutgoingPacket(forwardData.Value, PacketType.Init1); return true; } } #endregion private void UpdateRto(TimeSpan sampleRtt) { // Timeout calculation (see: https://tools.ietf.org/html/rfc6298) // SRTT_{i+1} = (1-a) * SRTT_i + a * RTT // DevRTT_{i+1} = (1-b) * DevRTT_i + b * | RTT - SRTT_{i+1} | // Timeout_{i+1} = SRTT_{i+1} + max(ClockRes, 4 * DevRTT_{i+1}) if (smoothedRtt < TimeSpan.Zero) smoothedRtt = sampleRtt; else smoothedRtt = TimeSpan.FromTicks((long)((1 - AlphaSmooth) * smoothedRtt.Ticks + AlphaSmooth * sampleRtt.Ticks)); smoothedRttVar = TimeSpan.FromTicks((long)((1 - BetaSmooth) * smoothedRttVar.Ticks + BetaSmooth * Math.Abs(sampleRtt.Ticks - smoothedRtt.Ticks))); currentRto = smoothedRtt + Tools.Max(ClockResolution, TimeSpan.FromTicks(4 * smoothedRttVar.Ticks)); LogRtt.Debug("RTT SRTT:{0} RTTVAR:{1} RTO:{2}", smoothedRtt, smoothedRttVar, currentRto); } /// /// ResendLoop will regularly check if a packet has be acknowleged and trys to send it again /// if the timeout for a packet ran out. /// private void ResendLoop() { var wasRunning = Interlocked.Exchange(ref pingCheckRunning, 1); if (wasRunning != 0) { Log.Warn("Previous resend tick didn't finish"); return; } try { bool close = false; lock (sendLoopLock) { if (closed != 0) return; close = (packetAckManager.Count > 0 && ResendPackets(packetAckManager.Values)) || (initPacketCheck != null && ResendPacket(initPacketCheck)); } if (close) { Stop(Reason.Timeout); return; } var now = Tools.Now; var nextTest = now - pingCheck - PingInterval; // we need to check if CryptoInitComplete because while false packet ids won't be incremented if (nextTest > TimeSpan.Zero && tsCrypt.CryptoInitComplete) { // Check that the last ping is more than PingInterval but not more than // 2*PingInterval away. This might happen for e.g. when the process was // suspended. If it was too long ago, reset the ping tick to now. if (nextTest > PingInterval) pingCheck = now; else pingCheck += PingInterval; SendPing(); } var elapsed = lastMessageTimer.Elapsed; if (elapsed > PacketTimeout) { LogTimeout.Debug("TIMEOUT: Got no ping packet response for {0}", elapsed); Stop(Reason.Timeout); return; } } finally { Interlocked.Exchange(ref pingCheckRunning, 0); } } private bool ResendPackets(IEnumerable> packetList) { foreach (var outgoingPacket in packetList) if (ResendPacket(outgoingPacket)) return true; return false; } private bool ResendPacket(ResendPacket packet) { var now = Tools.Now; // Check if the packet timed out completely if (packet.FirstSendTime < now - PacketTimeout) { LogTimeout.Debug("TIMEOUT: {0}", packet); return true; } // Check if we should retransmit a packet because it probably got lost if (packet.LastSendTime < now - currentRto) { LogTimeout.Debug("RESEND: {0}", packet); currentRto += currentRto; if (currentRto > MaxRetryInterval) currentRto = MaxRetryInterval; packet.LastSendTime = Tools.Now; SendRaw(ref packet.Packet); } return false; } private E SendRaw(ref Packet packet) { Trace.Assert(socket != null, nameof(socket) + " is null"); Trace.Assert(packet.Raw != null, nameof(packet.Raw) + " is null"); Trace.Assert(remoteAddress != null, nameof(remoteAddress) + " is null"); NetworkStats.LogOutPacket(ref packet); // DebugToHex is costly and allocates, precheck before logging if (LogRaw.IsTraceEnabled) LogRaw.Trace("[O] Raw: {0}", DebugUtil.DebugToHex(packet.Raw)); try { var sw = Stopwatch.StartNew(); socket!.SendTo(packet.Raw, packet.Raw.Length, SocketFlags.None, remoteAddress); var elap = sw.ElapsedMilliseconds; if (elap > 100) { LogRaw.Warn("Raw LONG: {0}ms", elap); } return R.Ok; } catch (SocketException ex) { LogRaw.Warn(ex, "Failed to deliver packet (Err:{0})", ex.SocketErrorCode); return "Socket send error"; } } } internal static class PacketHandlerConst { public static readonly Logger Log = LogManager.GetLogger("TSLib.PacketHandler"); public static readonly Logger LogRtt = LogManager.GetLogger("TSLib.PacketHandler.Rtt"); public static readonly Logger LogRaw = LogManager.GetLogger("TSLib.PacketHandler.Raw"); public static readonly Logger LogRawVoice = LogManager.GetLogger("TSLib.PacketHandler.Raw.Voice"); public static readonly Logger LogTimeout = LogManager.GetLogger("TSLib.PacketHandler.Timeout"); /// Elapsed time since first send timestamp until the connection is considered lost. public static readonly TimeSpan PacketTimeout = TimeSpan.FromSeconds(30); /// Smoothing factor for the SmoothedRtt. public const float AlphaSmooth = 0.125f; /// Smoothing factor for the SmoothedRttDev. public const float BetaSmooth = 0.25f; /// The maximum wait time to retransmit a packet. public static readonly TimeSpan MaxRetryInterval = TimeSpan.FromMilliseconds(1000); /// The timeout check loop interval. public static readonly TimeSpan ClockResolution = TimeSpan.FromMilliseconds(100); public static readonly TimeSpan PingInterval = TimeSpan.FromSeconds(1); /// Greatest allowed packet size, including the complete header. public const int MaxOutPacketSize = 500; public const int MaxDecompressedSize = 1024 * 1024; // ServerDefault: 40000 (check original code again) public const int ReceivePacketWindowSize = 128; } internal delegate void PacketEvent(ref Packet packet); } ================================================ FILE: TSLib/Full/PacketType.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TSLib.Full { public enum PacketType : byte { Voice = 0x0, VoiceWhisper = 0x1, Command = 0x2, CommandLow = 0x3, Ping = 0x4, Pong = 0x5, Ack = 0x6, AckLow = 0x7, Init1 = 0x8, } [Flags] public enum PacketFlags : byte { None = 0x0, Fragmented = 0x10, Newprotocol = 0x20, Compressed = 0x40, Unencrypted = 0x80, } } ================================================ FILE: TSLib/Full/QuickerLz.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Buffers.Binary; using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; namespace TSLib.Full { /// An alternative QuickLZ compression implementation for C#. public static class QuickerLz { private const int TableSize = 4096; private const uint SetControl = 0x8000_0000; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int GetCompressedSize(ReadOnlySpan data) => (data[0] & 0x02) != 0 ? BinaryPrimitives.ReadInt32LittleEndian(data.Slice(1)) : data[1]; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int GetDecompressedSize(ReadOnlySpan data) => (data[0] & 0x02) != 0 ? BinaryPrimitives.ReadInt32LittleEndian(data.Slice(5)) : data[2]; [ThreadStatic] private static int[]? hashtable; [ThreadStatic] private static bool[]? hashCounter; [ThreadStatic] private static int[]? cachetable; public static Span Compress(ReadOnlySpan data, int level) { if (level != 1) // && level != 3 throw new ArgumentException("This QuickLZ implementation supports only level 1 compress"); // (and 3) if (data.Length >= int.MaxValue) throw new ArgumentException($"This QuickLZ can only compress up to {int.MaxValue}"); int headerlen = data.Length < 216 ? 3 : 9; var dest = new byte[data.Length + 400]; var destSpan = dest.AsSpan(); int destPos = headerlen + 4; uint control = SetControl; int controlPos = headerlen; int sourcePos = 0; if (level == 1) { int unmatched = 0; if (hashtable is null) hashtable = new int[TableSize]; if (hashCounter is null) hashCounter = new bool[TableSize]; else Array.Clear(hashCounter, 0, TableSize); if (cachetable is null) cachetable = new int[TableSize]; else Array.Clear(cachetable, 0, TableSize); int sourceLimit = data.Length - 10; while (sourcePos < sourceLimit) { if ((control & 1) != 0) { if (sourcePos > data.Length / 2 && destPos > sourcePos - (sourcePos / 32)) { data.CopyTo(destSpan.Slice(headerlen)); destPos = headerlen + data.Length; destSpan = destSpan.Slice(0, destPos); WriteHeader(destSpan, data.Length, level, headerlen, false); return destSpan; } BinaryPrimitives.WriteUInt32LittleEndian(destSpan.Slice(controlPos), (control >> 1) | SetControl); // C controlPos = destPos; destPos += 4; control = SetControl; } var next = Read24(data, sourcePos); var hash = Hash(next); var offset = hashtable[hash]; var chache = cachetable[hash]; cachetable[hash] = next; hashtable[hash] = sourcePos; if (chache == next && hashCounter[hash] && (sourcePos - offset >= 3 || sourcePos == offset + 1 && unmatched >= 3 && sourcePos > 3 && Is6Same(data.Slice(sourcePos - 3)))) { control = (control >> 1) | SetControl; int matchlen = 3; int remainder = Math.Min(data.Length - 4 - sourcePos, 0xFF); while (data[offset + matchlen] == data[sourcePos + matchlen] && matchlen < remainder) matchlen++; if (matchlen < 18) { BinaryPrimitives.WriteUInt16LittleEndian(destSpan.Slice(destPos), (ushort)(hash << 4 | (matchlen - 2))); destPos += 2; } else { Write24(destSpan, destPos, hash << 4 | (matchlen << 16)); destPos += 3; } sourcePos += matchlen; unmatched = 0; } else { unmatched++; hashCounter[hash] = true; dest[destPos++] = data[sourcePos++]; control >>= 1; } } } while (sourcePos < data.Length) { if ((control & 1) != 0) { BinaryPrimitives.WriteUInt32LittleEndian(destSpan.Slice(controlPos), (control >> 1) | SetControl); // C controlPos = destPos; destPos += 4; control = SetControl; } dest[destPos++] = data[sourcePos++]; control >>= 1; } while ((control & 1) == 0) control >>= 1; BinaryPrimitives.WriteUInt32LittleEndian(destSpan.Slice(controlPos), (control >> 1) | SetControl); // C destSpan = destSpan.Slice(0, destPos); WriteHeader(destSpan, data.Length, level, headerlen, true); return destSpan; } public static byte[] Decompress(ReadOnlySpan data, int maxSize) { // Read header byte flags = data[0]; int level = (flags >> 2) & 0b11; if (level != 1) // && level != 3 throw new NotSupportedException("This QuickLZ implementation supports only level 1 decompress"); // (and 3) int headerlen = (flags & 0x02) != 0 ? 9 : 3; int compressedSize = GetCompressedSize(data); int decompressedSize = GetDecompressedSize(data); if (decompressedSize >= maxSize) throw new NotSupportedException("Maximum uncompressed size exceeded"); var dest = new byte[decompressedSize]; if ((flags & 0x01) == 0) { // Uncompressed if (compressedSize - headerlen != decompressedSize) throw new InvalidDataException("Compressed and uncompressed size of uncompressed data do not match"); data.Slice(headerlen).CopyTo(dest.AsSpan(0, decompressedSize)); return dest; } if (level == 1) { uint control = 1; int sourcePos = headerlen; int destPos = 0; int nextHashed = 0; if (hashtable is null) hashtable = new int[TableSize]; Array.Clear(hashtable, 0, TableSize); while (true) { if (control == 1) { control = BinaryPrimitives.ReadUInt32LittleEndian(data.Slice(sourcePos)); sourcePos += 4; } if ((control & 1) != 0) { // Found a reference control >>= 1; byte next = data[sourcePos++]; int hash = (next >> 4) | (data[sourcePos++] << 4); int matchlen = next & 0x0F; if (matchlen != 0) matchlen += 2; else matchlen = data[sourcePos++]; int offset = hashtable[hash]; destPos = CopyBufferBytes(dest, destPos, offset, matchlen); int end = destPos + 1 - matchlen; UpdateHashtable(dest, nextHashed, end); nextHashed = destPos; } else if (destPos >= Math.Max(decompressedSize, 10) - 10) { while (destPos < decompressedSize) { if (control == 1) sourcePos += 4; control >>= 1; dest[destPos++] = data[sourcePos++]; } break; } else { dest[destPos++] = data[sourcePos++]; control >>= 1; int end = Math.Max(destPos - 2, 0); UpdateHashtable(dest, nextHashed, end); nextHashed = Math.Max(nextHashed, end); } } } return dest; } private static void WriteHeader(Span dest, int srcLen, int level, int headerlen, bool compressed) { byte flags; if (compressed) flags = (byte)(0x01 | (level << 2) | 0x40); else flags = (byte)((level << 2) | 0x40); if (headerlen == 3) { // short header dest[0] = flags; dest[1] = (byte)dest.Length; dest[2] = (byte)srcLen; } else if (headerlen == 9) { // long header dest[0] = (byte)(flags | 0x02); BinaryPrimitives.WriteInt32LittleEndian(dest.Slice(1), dest.Length); BinaryPrimitives.WriteInt32LittleEndian(dest.Slice(5), srcLen); } else { Trace.Fail($"Invalid headerlen: {headerlen}"); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void Write24(Span outArr, int outOff, int value) { var sli3 = outArr.Slice(outOff, 3); BinaryPrimitives.WriteUInt16LittleEndian(sli3, unchecked((ushort)value)); sli3[2] = unchecked((byte)(value >> 16)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int Read24(ReadOnlySpan intArr, int inOff) { var sli3 = intArr.Slice(inOff, 3); return unchecked(BinaryPrimitives.ReadUInt16LittleEndian(sli3) | (sli3[2] << 16)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int Hash(int value) => ((value >> 12) ^ value) & 0xfff; [MethodImpl(MethodImplOptions.AggressiveInlining)] private static bool Is6Same(ReadOnlySpan arr) { var sli6 = arr.Slice(0, 6); var i0 = BinaryPrimitives.ReadUInt32LittleEndian(sli6); var u1 = BinaryPrimitives.ReadUInt16LittleEndian(sli6.Slice(4)); return i0 == i0 >> 8 && unchecked((ushort)i0) == u1; } /// Copy [start; start + length) bytes from `data` to the end of `data` [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int CopyBufferBytes(byte[] data, int destPos, int start, int length) { data[destPos + 0] = data[start + 0]; data[destPos + 1] = data[start + 1]; data[destPos + 2] = data[start + 2]; for (int i = 3; i < length; i++) data[destPos + i] = data[start + i]; return destPos + length; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void UpdateHashtable(byte[] dest, int start, int end) { if (start >= end) return; int next = Read24(dest, start); hashtable![Hash(next)] = start; for (int i = start + 1; i < end; i++) { next = (next >> 8) | (dest[i + 2] << 16); hashtable[Hash(next)] = i; } } } } ================================================ FILE: TSLib/Full/RingQueue.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Diagnostics.CodeAnalysis; namespace TSLib.Full { /// Provides a ring queue with packet offset and direct item access functionality. /// Item type public sealed class RingQueue where T : notnull { private const int InitialBufferSize = 16; private int currentStart; private T[] ringBuffer; private bool[] ringBufferSet; public int Count { get; private set; } // = currentLength public int MaxBufferSize { get; } public GenerationWindow Window { get; } public RingQueue(int maxBufferSize, int mod) { if (maxBufferSize >= mod) throw new ArgumentOutOfRangeException(nameof(mod), "Modulo must be bigger than buffer size"); MaxBufferSize = maxBufferSize; var setBufferSize = Math.Min(InitialBufferSize, MaxBufferSize); ringBuffer = new T[setBufferSize]; ringBufferSet = new bool[setBufferSize]; Window = new GenerationWindow(mod, MaxBufferSize); Clear(); } #region mapping ring array to flat [0 - size] array private void BufferSet(int index, T value) { BufferExtend(index); int local = IndexToLocal(index); int newLength = local - currentStart + 1 + (local >= currentStart ? 0 : ringBuffer.Length); Count = Math.Max(Count, newLength); ringBuffer[local] = value; ringBufferSet[local] = true; } private ref T BufferGet(int index) { BufferExtend(index); int local = IndexToLocal(index); return ref ringBuffer[local]; } private bool StateGet(int index) { BufferExtend(index); int local = IndexToLocal(index); return ringBufferSet[local]; } private void BufferPop() { ringBufferSet[currentStart] = false; ringBuffer[currentStart] = default!; currentStart = (currentStart + 1) % ringBuffer.Length; Count--; } private void BufferExtend(int index) { if (index < ringBuffer.Length) return; if (index >= MaxBufferSize) throw new ArgumentOutOfRangeException(nameof(index), "The index does not fit into the maximal buffer size"); int extendTo = index < ringBuffer.Length * 2 ? Math.Min(ringBuffer.Length * 2, MaxBufferSize) : Math.Min(index + ringBuffer.Length, MaxBufferSize); var extRingBuffer = new T[extendTo]; var extRingBufferSet = new bool[extendTo]; Array.Copy(ringBuffer, currentStart, extRingBuffer, 0, ringBuffer.Length - currentStart); Array.Copy(ringBufferSet, currentStart, extRingBufferSet, 0, ringBufferSet.Length - currentStart); Array.Copy(ringBuffer, 0, extRingBuffer, ringBuffer.Length - currentStart, currentStart); Array.Copy(ringBufferSet, 0, extRingBufferSet, ringBufferSet.Length - currentStart, currentStart); currentStart = 0; ringBuffer = extRingBuffer; ringBufferSet = extRingBufferSet; } private int IndexToLocal(int index) => (currentStart + index) % ringBuffer.Length; #endregion public void Set(int mappedValue, T value) { int index = Window.MappedToIndex(mappedValue); if (IsSetIndex(index) != ItemSetStatus.InWindowNotSet) throw new ArgumentOutOfRangeException(nameof(mappedValue), "Object cannot be set."); BufferSet(index, value); } public ItemSetStatus IsSet(int mappedValue) { int index = Window.MappedToIndex(mappedValue); return IsSetIndex(index); } private ItemSetStatus IsSetIndex(int index) { if (index < 0) return ItemSetStatus.OutOfWindowSet; if (index > Count && index < MaxBufferSize) return ItemSetStatus.InWindowNotSet; if (index >= MaxBufferSize) return ItemSetStatus.OutOfWindowNotSet; return StateGet(index) ? ItemSetStatus.InWindowSet : ItemSetStatus.InWindowNotSet; } public bool TryDequeue([MaybeNullWhen(false)] out T value) { if (!TryPeekStart(0, out value)) return false; BufferPop(); Window.Advance(1); return true; } public bool TryPeekStart(int index, [MaybeNullWhen(false)] out T value) { if (index < 0) throw new ArgumentOutOfRangeException(nameof(index)); if (index >= Count || Count <= 0 || !StateGet(index)) { value = default!; return false; } else { value = BufferGet(index); return true; } } public void Clear() { currentStart = 0; Count = 0; Array.Clear(ringBufferSet, 0, ringBufferSet.Length); Window.Reset(); } } // X |OXXOOOOOO| X // | | | | // | | | OutOfWindowNotSet // | | InWindowNotSet // | InWindowSet // OutOfWindowSet [Flags] public enum ItemSetStatus { NotSet = 0b00, Set = 0b01, OutOfWindow = 0b00, InWindow = 0b10, OutOfWindowNotSet = OutOfWindow | NotSet, OutOfWindowSet = OutOfWindow | Set, InWindowNotSet = InWindow | NotSet, InWindowSet = InWindow | Set, } } ================================================ FILE: TSLib/Full/TsCrypt.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Chaos.NaCl.Ed25519Ref10; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.X9; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Modes; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.Math.EC; using Org.BouncyCastle.Security; using System; using System.Buffers.Binary; using System.Diagnostics; using System.Linq; using System.Text; using System.Text.RegularExpressions; using TSLib.Commands; using TSLib.Helper; namespace TSLib.Full { /// Provides all cryptographic functions needed for the low- and high level TeamSpeak protocol usage. public sealed class TsCrypt { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private const string DummyKeyAndNonceString = "c:\\windows\\system\\firewall32.cpl"; private static readonly byte[] DummyKey = Encoding.ASCII.GetBytes(DummyKeyAndNonceString.Substring(0, 16)); private static readonly byte[] DummyIv = Encoding.ASCII.GetBytes(DummyKeyAndNonceString.Substring(16, 16)); private static readonly (byte[], byte[]) DummyKeyAndNonceTuple = (DummyKey, DummyIv); private static readonly byte[] Ts3InitMac = Encoding.ASCII.GetBytes("TS3INIT1"); private const uint InitVersion = 1566914096; // 3.5.0 [Stable] private readonly EaxBlockCipher eaxCipher = new EaxBlockCipher(new AesEngine()); internal const int MacLen = 8; internal const int PacketTypeKinds = 9; internal IdentityData Identity { get; } internal bool CryptoInitComplete { get; private set; } private byte[]? alphaTmp; private byte[]? ivStruct; private readonly byte[] fakeSignature = new byte[MacLen]; private readonly (byte[] key, byte[] nonce, uint generation)?[] cachedKeyNonces = new (byte[], byte[], uint)?[PacketTypeKinds * 2]; public TsCrypt(IdentityData identity) { Reset(); Identity = identity; } internal void Reset() { CryptoInitComplete = false; ivStruct = null; Array.Clear(fakeSignature, 0, fakeSignature.Length); Array.Clear(cachedKeyNonces, 0, cachedKeyNonces.Length); } #region KEY IMPORT/EXPROT /// /// Detects the kind of key and creates an identity from it. /// This method can import 3 kinds of identity keys. /// /// The Teamspeak 3 key as it is stored by the normal client. /// A libtomcrypt public+private key export. (+KeyOffset). /// A TSLib private-only key export. (+KeyOffset). /// /// Keys with "(+KeyOffset)" should add the key offset for the security level in the separate parameter. /// /// The identity string. /// A number which determines the security level of an identity. /// The last brute forced number. Default 0: will take the current keyOffset. /// The identity information. public static R LoadIdentityDynamic(string key, ulong keyOffset = 0, ulong lastCheckedKeyOffset = 0) { var tsIdentity = DeobfuscateAndImportTsIdentity(key); if (tsIdentity.Ok) return tsIdentity.Value; return LoadIdentity(key, keyOffset, lastCheckedKeyOffset); } /// This methods loads a secret identity. /// The key stored in base64, encoded like the libtomcrypt export method of a private key. /// Or the TSLib's shorted private-only key. /// A number which determines the security level of an identity. /// The last brute forced number. Default 0: will take the current keyOffset. /// The identity information. public static R LoadIdentity(string key, ulong keyOffset, ulong lastCheckedKeyOffset = 0) { var asnByteArray = Base64Decode(key); if (asnByteArray is null) return "Invalid identity base64 string"; var importRes = ImportKeyDynamic(asnByteArray); if (!importRes.Ok) return importRes.Error; var (publicKey, privateKey) = importRes.Value; if (privateKey is null) return "Key string did not contain a private key"; return LoadIdentity(publicKey, privateKey, keyOffset, lastCheckedKeyOffset); } private static IdentityData LoadIdentity(ECPoint? publicKey, BigInteger privateKey, ulong keyOffset, ulong lastCheckedKeyOffset) { return new IdentityData(privateKey, publicKey) { ValidKeyOffset = keyOffset, LastCheckedKeyOffset = lastCheckedKeyOffset < keyOffset ? keyOffset : lastCheckedKeyOffset, }; } private static readonly ECKeyGenerationParameters KeyGenParams = new ECKeyGenerationParameters(X9ObjectIdentifiers.Prime256v1, new SecureRandom()); private static R ImportPublicKey(byte[] asnByteArray) { try { var asnKeyData = (DerSequence)Asn1Object.FromByteArray(asnByteArray); var x = ((DerInteger)asnKeyData[2]).Value; var y = ((DerInteger)asnKeyData[3]).Value; var ecPoint = KeyGenParams.DomainParameters.Curve.CreatePoint(x, y); return ecPoint; } catch (Exception) { return "Could not import public key"; } } private static R<(ECPoint? publicKey, BigInteger? privateKey), string> ImportKeyDynamic(byte[] asnByteArray) { BigInteger? privateKey = null; ECPoint? publicKey = null; try { var asnKeyData = (DerSequence)Asn1Object.FromByteArray(asnByteArray); var bitInfo = ((DerBitString)asnKeyData[0]).IntValue; if (bitInfo == 0b0000_0000 || bitInfo == 0b1000_0000) { var x = ((DerInteger)asnKeyData[2]).Value; var y = ((DerInteger)asnKeyData[3]).Value; publicKey = KeyGenParams.DomainParameters.Curve.CreatePoint(x, y); if (bitInfo == 0b1000_0000) { privateKey = ((DerInteger)asnKeyData[4]).Value; } } else if (bitInfo == 0b1100_0000) { privateKey = ((DerInteger)asnKeyData[2]).Value; } } catch (Exception ex) { return $"Could not import identity: {ex.Message}"; } return (publicKey, privateKey); } internal static string ExportPublicKey(ECPoint publicKey) { var dataArray = new DerSequence( new DerBitString(new byte[] { 0b0000_0000 }, 7), new DerInteger(32), new DerInteger(publicKey.AffineXCoord.ToBigInteger()), new DerInteger(publicKey.AffineYCoord.ToBigInteger())).GetDerEncoded(); return Convert.ToBase64String(dataArray); } internal static string ExportPrivateKey(BigInteger privateKey) { var dataArray = new DerSequence( new DerBitString(new byte[] { 0b1100_0000 }, 6), new DerInteger(32), new DerInteger(privateKey)).GetDerEncoded(); return Convert.ToBase64String(dataArray); } internal static string ExportPublicAndPrivateKey(ECPoint publicKey, BigInteger privateKey) { var dataArray = new DerSequence( new DerBitString(new byte[] { 0b1000_0000 }, 7), new DerInteger(32), new DerInteger(publicKey.AffineXCoord.ToBigInteger()), new DerInteger(publicKey.AffineYCoord.ToBigInteger()), new DerInteger(privateKey)).GetDerEncoded(); return Convert.ToBase64String(dataArray); } internal static string GetUidFromPublicKey(string publicKey) { var publicKeyBytes = Encoding.ASCII.GetBytes(publicKey); var hashBytes = Hash1It(publicKeyBytes); return Convert.ToBase64String(hashBytes); } internal static ECPoint RestorePublicFromPrivateKey(BigInteger privateKey) { var curve = ECNamedCurveTable.GetByOid(X9ObjectIdentifiers.Prime256v1); return curve.G.Multiply(privateKey).Normalize(); } private static readonly Regex IdentityRegex = new Regex(@"^(?\d+)V(?[\w\/\+]+={0,2})$", RegexOptions.ECMAScript | RegexOptions.CultureInvariant); private static readonly byte[] TsIdentityObfuscationKey = Encoding.ASCII.GetBytes("b9dfaa7bee6ac57ac7b65f1094a1c155e747327bc2fe5d51c512023fe54a280201004e90ad1daaae1075d53b7d571c30e063b5a62a4a017bb394833aa0983e6e"); public static R DeobfuscateAndImportTsIdentity(string identity) { var match = IdentityRegex.Match(identity); if (!match.Success) return "Identity could not get matched as teamspeak identity"; if (!ulong.TryParse(match.Groups["level"].Value, out var level)) return "Invalid key offset"; var ident = Base64Decode(match.Groups["identity"].Value); if (ident is null) return "Invalid identity base64 string"; if (ident.Length < 20) return "Identity too short"; int nullIdx = ident.AsSpan(20).IndexOf((byte)0); var hash = Hash1It(ident, 20, nullIdx < 0 ? ident.Length - 20 : nullIdx); XorBinary(ident, hash, 20, ident); XorBinary(ident, TsIdentityObfuscationKey, Math.Min(100, ident.Length), ident); if (System.Buffers.Text.Base64.DecodeFromUtf8InPlace(ident, out var length) != System.Buffers.OperationStatus.Done) return "Invalid deobfuscated base64 string"; var importRes = ImportKeyDynamic(ident.AsSpan(0, length).ToArray()); if (!importRes.Ok) return importRes.Error; var (publicKey, privateKey) = importRes.Value; if (privateKey is null) return "Key string did not contain a private key"; return LoadIdentity(publicKey, privateKey, level, level); } #endregion #region TS3INIT1 / CRYPTO INIT /// Calculates and initializes all required variables for the secure communication. /// The alpha key from clientinit encoded in base64. /// The beta key from clientinit encoded in base64. /// The omega key from clientinit encoded in base64. internal E CryptoInit(string alpha, string beta, string omega) { var alphaBytes = Base64Decode(alpha); if (alphaBytes is null) return "alphaBytes parameter is invalid"; var betaBytes = Base64Decode(beta); if (betaBytes is null) return "betaBytes parameter is invalid"; var omegaBytes = Base64Decode(omega); if (omegaBytes is null) return "omegaBytes parameter is invalid"; var serverPublicKey = ImportPublicKey(omegaBytes); if (!serverPublicKey.Ok) return "server public key is invalid"; byte[] sharedKey = GetSharedSecret(serverPublicKey.Value); return SetSharedSecret(alphaBytes, betaBytes, sharedKey); } /// Calculates a shared secred with ECDH from the client private and server public key. /// The public key of the server. /// Returns a 32 byte shared secret. private byte[] GetSharedSecret(ECPoint publicKeyPoint) { ECPoint p = publicKeyPoint.Multiply(Identity.PrivateKey).Normalize(); byte[] keyArr = p.AffineXCoord.ToBigInteger().ToByteArray(); if (keyArr.Length == 32) return Hash1It(keyArr); if (keyArr.Length > 32) return Hash1It(keyArr, keyArr.Length - 32, 32); // else keyArr.Length < 32 var keyArrExt = new byte[32]; Array.Copy(keyArr, 0, keyArrExt, 32 - keyArr.Length, keyArr.Length); return Hash1It(keyArrExt); } /// Initializes all required variables for the secure communication. /// The alpha key from clientinit. /// The beta key from clientinit. /// The omega key from clientinit. private E SetSharedSecret(ReadOnlySpan alpha, ReadOnlySpan beta, ReadOnlySpan sharedKey) { if (beta.Length != 10 && beta.Length != 54) return $"Invalid beta size ({beta.Length})"; // prepares the ivstruct consisting of 2 random byte chains of 10/10 or 10/54 bytes which both sides agreed on ivStruct = new byte[10 + beta.Length]; // applying hashes to get the required values for ts XorBinary(sharedKey, alpha, alpha.Length, ivStruct); XorBinary(sharedKey.Slice(10), beta, beta.Length, ivStruct.AsSpan(10)); // creating a dummy signature which will be used on packets which dont use a real encryption signature (like plain voice) var buffer2 = Hash1It(ivStruct, 0, ivStruct.Length); Array.Copy(buffer2, 0, fakeSignature, 0, 8); alphaTmp = null; CryptoInitComplete = true; return R.Ok; } internal E CryptoInit2(string license, string omega, string proof, string beta, byte[] privateKey) { var licenseBytes = Base64Decode(license); if (licenseBytes is null) return "license parameter is invalid"; var omegaBytes = Base64Decode(omega); if (omegaBytes is null) return "omega parameter is invalid"; var proofBytes = Base64Decode(proof); if (proofBytes is null) return "proof parameter is invalid"; var betaBytes = Base64Decode(beta); if (betaBytes is null) return "beta parameter is invalid"; var serverPublicKey = ImportPublicKey(omegaBytes); if (!serverPublicKey.Ok) return "server public key is invalid"; // Verify that our connection isn't tampered with if (!VerifySign(serverPublicKey.Value, licenseBytes, proofBytes)) return "The init proof is not valid. Your connection might be tampered with or the server is an idiot."; var sw = Stopwatch.StartNew(); var licenseChainR = Licenses.Parse(licenseBytes); if (!licenseChainR.Ok) return licenseChainR.Error; Log.Debug("Parsed license successfully in {0:F3}ms", sw.Elapsed.TotalMilliseconds); var licenseChain = licenseChainR.Value; sw.Restart(); var key = licenseChain.DeriveKey(); Log.Debug("Processed license successfully in {0:F3}ms", sw.Elapsed.TotalMilliseconds); sw.Restart(); var keyArr = GetSharedSecret2(key, privateKey); Log.Debug("Calculated shared secret in {0:F3}ms", sw.Elapsed.TotalMilliseconds); return SetSharedSecret(alphaTmp, betaBytes, keyArr); } private static byte[] GetSharedSecret2(ReadOnlySpan publicKey, ReadOnlySpan privateKey) { Span privateKeyCpy = stackalloc byte[32]; privateKey.CopyTo(privateKeyCpy); privateKeyCpy[31] &= 0x7F; GroupOperations.ge_frombytes_negate_vartime(out var pub1, publicKey); GroupOperations.ge_scalarmult_vartime(out GroupElementP2 mul, privateKeyCpy, pub1); Span sharedTmp = stackalloc byte[32]; GroupOperations.ge_tobytes(sharedTmp, mul); sharedTmp[31] ^= 0x80; var bytes = new byte[64]; Chaos.NaCl.Sha512.Hash(sharedTmp, bytes); return bytes; } internal R ProcessInit1(byte[]? data) { const int versionLen = 4; const int initTypeLen = 1; const string packetInvalid = "Invalid Init1 packet"; const string packetTooShort = packetInvalid + " (too short)"; const string packetInvalidStep = packetInvalid + " (invalid step)"; const string packetInvalidLength = packetInvalid + " (invalid length)"; int type; byte[] sendData; if (data != null) { if (Packet.FromServer) { if (data.Length < initTypeLen) return packetTooShort; type = data[0]; if (type != 1 && type != 3 && type != 0x7F) return packetInvalidStep; } else { if (data.Length < versionLen + initTypeLen) return packetTooShort; type = data[4]; if (type != 0 && type != 2 && type != 4) return packetInvalidStep; } } else type = -1; if (data == null || type == 0x7F) { // 0x7F: Some strange servers do this // the normal client responds by starting again sendData = new byte[versionLen + initTypeLen + 4 + 4 + 8]; BinaryPrimitives.WriteUInt32BigEndian(sendData.AsSpan(0), InitVersion); // initVersion sendData[versionLen] = 0x00; // initType BinaryPrimitives.WriteUInt32BigEndian(sendData.AsSpan(versionLen + initTypeLen), Tools.UnixNow); // 4byte timestamp BinaryPrimitives.WriteInt32BigEndian(sendData.AsSpan(versionLen + initTypeLen + 4), Tools.Random.Next()); // 4byte random return sendData; } switch (type) { case 0: if (data.Length != 21) return packetInvalidLength; sendData = new byte[initTypeLen + 16 + 4]; sendData[0] = 0x01; // initType BinaryPrimitives.WriteUInt32BigEndian(sendData.AsSpan(initTypeLen + 16), BinaryPrimitives.ReadUInt32LittleEndian(data.AsSpan(versionLen + initTypeLen + 4))); return sendData; case 1: switch (data.Length) { case 21: sendData = new byte[versionLen + initTypeLen + 16 + 4]; BinaryPrimitives.WriteUInt32BigEndian(sendData.AsSpan(0), InitVersion); // initVersion sendData[versionLen] = 0x02; // initType Array.Copy(data, initTypeLen, sendData, versionLen + initTypeLen, 20); return sendData; case 5: var errorNum = BinaryPrimitives.ReadUInt32BigEndian(data.AsSpan(initTypeLen)); if (Enum.IsDefined(typeof(TsErrorCode), errorNum)) return $"Got Init1(1) error: {(TsErrorCode)errorNum}"; return $"Got Init1(1) undefined error code: {errorNum}"; default: return packetInvalidLength; } case 2: if (data.Length != versionLen + initTypeLen + 16 + 4) return packetInvalidLength; sendData = new byte[initTypeLen + 64 + 64 + 4 + 100]; sendData[0] = 0x03; // initType sendData[initTypeLen + 64 - 1] = 1; // dummy x to 1 sendData[initTypeLen + 64 + 64 - 1] = 1; // dummy n to 1 BinaryPrimitives.WriteInt32BigEndian(sendData.AsSpan(initTypeLen + 64 + 64), 1); // dummy level to 1 return sendData; case 3: if (data.Length != initTypeLen + 64 + 64 + 4 + 100) return packetInvalidLength; alphaTmp = new byte[10]; Tools.Random.NextBytes(alphaTmp); var alpha = Convert.ToBase64String(alphaTmp); string initAdd = TsCommand.BuildToString("clientinitiv", new ICommandPart[] { new CommandParameter("alpha", alpha), new CommandParameter("omega", Identity.PublicKeyString), new CommandParameter("ot", 1), new CommandParameter("ip", string.Empty) }); var textBytes = Tools.Utf8Encoder.GetBytes(initAdd); // Prepare solution int level = BinaryPrimitives.ReadInt32BigEndian(data.AsSpan(initTypeLen + 128)); var y = SolveRsaChallange(data, initTypeLen, level); if (!y.Ok) return y.Error; // Copy bytes for this result: [Version..., InitType..., data..., y..., text...] sendData = new byte[versionLen + initTypeLen + 64 + 64 + 4 + 100 + 64 + textBytes.Length]; // Copy initVersion BinaryPrimitives.WriteUInt32BigEndian(sendData.AsSpan(0), InitVersion); // Write InitType sendData[versionLen] = 0x04; // Copy data Array.Copy(data, initTypeLen, sendData, versionLen + initTypeLen, 232); // Copy y Array.Copy(y.Value, 0, sendData, versionLen + initTypeLen + 232 + (64 - y.Value.Length), y.Value.Length); // Copy text Array.Copy(textBytes, 0, sendData, versionLen + initTypeLen + 232 + 64, textBytes.Length); return sendData; case 4: if (data.Length < versionLen + initTypeLen + 64 + 64 + 4 + 100 + 64) return packetTooShort; // TODO check result return Array.Empty(); default: return $"Got invalid Init1({type}) packet id"; } } /// This method calculates x ^ (2^level) % n = y which is the solution to the server RSA puzzle. /// The data array, containing x=[0,63] and n=[64,127], each unsigned, as a BigInteger bytearray. /// The offset of x and n in the data array. /// The exponent to x. /// The y value, unsigned, as a BigInteger bytearray. private static R SolveRsaChallange(byte[] data, int offset, int level) { if (level < 0 || level > 1_000_000) return "RSA challange level is not within an acceptable range"; // x is the base, n is the modulus. var x = new BigInteger(1, data, 00 + offset, 64); var n = new BigInteger(1, data, 64 + offset, 64); return x.ModPow(BigInteger.Two.Pow(level), n).ToByteArrayUnsigned(); } internal static (byte[] publicKey, byte[] privateKey) GenerateTemporaryKey() { var privateKey = new byte[32]; using (var rng = System.Security.Cryptography.RandomNumberGenerator.Create()) rng.GetBytes(privateKey); ScalarOperations.sc_clamp(privateKey); GroupOperations.ge_scalarmult_base(out var A, privateKey); var publicKey = new byte[32]; GroupOperations.ge_p3_tobytes(publicKey, A); return (publicKey, privateKey); } #endregion #region ENCRYPTION/DECRYPTION internal void Encrypt(ref Packet packet) { if (packet.PacketType == PacketType.Init1) { FakeEncrypt(ref packet, Ts3InitMac); return; } if (packet.UnencryptedFlag) { FakeEncrypt(ref packet, fakeSignature); return; } var (key, nonce) = GetKeyNonce(Packet.FromServer, packet.PacketId, packet.GenerationId, packet.PacketType, !CryptoInitComplete); packet.BuildHeader(); ICipherParameters ivAndKey = new AeadParameters(new KeyParameter(key), 8 * MacLen, nonce, packet.Header); byte[] result; int len; lock (eaxCipher) { eaxCipher.Init(true, ivAndKey); result = new byte[eaxCipher.GetOutputSize(packet.Size)]; try { len = eaxCipher.ProcessBytes(packet.Data, 0, packet.Size, result, 0); len += eaxCipher.DoFinal(result, len); } catch (Exception ex) { Log.Error(ex, "Internal encryption error."); throw; } } // result consists of [Data..., Mac...] // to build the final TS/libtomcrypt we need to copy it into another order // len is Data.Length + Mac.Length // //packet.Raw = new byte[Packet.HeaderLength + len]; // Copy the Mac from [Data..., Mac...] to [Mac..., Header..., Data...] Array.Copy(result, len - MacLen, packet.Raw, 0, MacLen); // Copy the Header from packet.Header to [Mac..., Header..., Data...] Array.Copy(packet.Header, 0, packet.Raw, MacLen, Packet.HeaderLength); // Copy the Data from [Data..., Mac...] to [Mac..., Header..., Data...] Array.Copy(result, 0, packet.Raw, MacLen + Packet.HeaderLength, len - MacLen); // Raw is now [Mac..., Header..., Data...] } private static void FakeEncrypt(ref Packet packet, byte[] mac) { // //packet.Raw = new byte[packet.Data.Length + MacLen + Packet.HeaderLength]; // Copy the Mac from [Mac...] to [Mac..., Header..., Data...] Array.Copy(mac, 0, packet.Raw, 0, MacLen); // Copy the Header from packet.Header to [Mac..., Header..., Data...] packet.BuildHeader(packet.Raw.AsSpan(MacLen, Packet.HeaderLength)); // Copy the Data from packet.Data to [Mac..., Header..., Data...] Array.Copy(packet.Data, 0, packet.Raw, MacLen + Packet.HeaderLength, packet.Data.Length); // Raw is now [Mac..., Header..., Data...] } internal bool Decrypt(ref Packet packet) { if (packet.PacketType == PacketType.Init1) return FakeDecrypt(ref packet, Ts3InitMac); if (packet.UnencryptedFlag) return FakeDecrypt(ref packet, fakeSignature); var decryptResult = DecryptData(ref packet, !CryptoInitComplete); if (decryptResult) return true; // This is a hacky workaround for a special ack: // We send these two packets simultaneously: // - [Id:1] clientek (dummy-encrypted) // - [Id:2] clientinit (session-encrypted) // We get an ack for each with the same encryption scheme. // We can't know for sure which ack comes first and therefore // whether the dummy or session key should be used. // In case we actually picked the wrong key, try it again // with the dummy key. if (packet.PacketType == PacketType.Ack && packet.PacketId <= 2) { Log.Debug("Using shady ack workaround."); return DecryptData(ref packet, true); } else { return false; } } private bool DecryptData(ref Packet packet, bool dummyEncryption) { Array.Copy(packet.Raw, MacLen, packet.Header, 0, Packet.HeaderLength); var (key, nonce) = GetKeyNonce(Packet.FromServer, packet.PacketId, packet.GenerationId, packet.PacketType, dummyEncryption); int dataLen = packet.Raw.Length - (MacLen + Packet.HeaderLength); ICipherParameters ivAndKey = new AeadParameters(new KeyParameter(key), 8 * MacLen, nonce, packet.Header); try { byte[] result; lock (eaxCipher) { eaxCipher.Init(false, ivAndKey); result = new byte[eaxCipher.GetOutputSize(dataLen + MacLen)]; int len = eaxCipher.ProcessBytes(packet.Raw, MacLen + Packet.HeaderLength, dataLen, result, 0); len += eaxCipher.ProcessBytes(packet.Raw, 0, MacLen, result, len); len += eaxCipher.DoFinal(result, len); if (len != dataLen) return false; } packet.Data = result; } catch (Exception) { return false; } return true; } private static bool FakeDecrypt(ref Packet packet, byte[] mac) { if (!CheckEqual(packet.Raw, mac, MacLen)) return false; int dataLen = packet.Raw.Length - (MacLen + Packet.HeaderLength); packet.Data = new byte[dataLen]; Array.Copy(packet.Raw, MacLen + Packet.HeaderLength, packet.Data, 0, dataLen); return true; } /// TS uses a new key and nonce for each packet sent and received. This method generates and caches these. /// True if the packet is from server to client, false for client to server. /// The id of the packet, host order. /// Each time the packetId reaches 65535 the next packet will go on with 0 and the generationId will be increased by 1. /// The packetType. /// A tuple of (key, nonce) private (byte[] key, byte[] nonce) GetKeyNonce(bool fromServer, ushort packetId, uint generationId, PacketType packetType, bool dummyEncryption) { if (dummyEncryption) return DummyKeyAndNonceTuple; // only the lower 4 bits are used for the real packetType var packetTypeRaw = (byte)packetType; int cacheIndex = packetTypeRaw * (fromServer ? 1 : 2); var cacheValue = cachedKeyNonces[cacheIndex]; if (cacheValue is null || cacheValue.Value.generation != generationId) { // this part of the key/nonce is fixed by the message direction and packetType var tmpToHash = new byte[ivStruct!.Length == 20 ? 26 : 70]; tmpToHash[0] = fromServer ? (byte)0x30 : (byte)0x31; tmpToHash[1] = packetTypeRaw; BinaryPrimitives.WriteUInt32BigEndian(tmpToHash.AsSpan(2), generationId); Array.Copy(ivStruct, 0, tmpToHash, 6, ivStruct.Length); var result = Hash256It(tmpToHash).AsSpan(); cacheValue = (result.Slice(0, 16).ToArray(), result.Slice(16, 16).ToArray(), generationId); cachedKeyNonces[cacheIndex] = cacheValue; } var key = new byte[16]; var nonce = new byte[16]; Array.Copy(cacheValue.Value.key, 0, key, 0, 16); Array.Copy(cacheValue.Value.nonce, 0, nonce, 0, 16); // finally the first two bytes get xor'd with the packet id key[0] ^= unchecked((byte)(packetId >> 8)); key[1] ^= unchecked((byte)(packetId >> 0)); return (key, nonce); } #endregion #region CRYPT HELPER private static bool CheckEqual(ReadOnlySpan a1, ReadOnlySpan a2, int len) { if (a1.Length < len || a2.Length < len) throw new ArgumentOutOfRangeException(); int res = 0; for (int i = 0; i < len; i++) res |= a1[i] ^ a2[i]; return res == 0; } private static void XorBinary(ReadOnlySpan a, ReadOnlySpan b, int len, Span outBuf) { if (a.Length < len || b.Length < len || outBuf.Length < len) throw new ArgumentException(); for (int i = 0; i < len; i++) outBuf[i] = (byte)(a[i] ^ b[i]); } private static readonly System.Security.Cryptography.SHA1Managed Sha1Hash = new System.Security.Cryptography.SHA1Managed(); private static readonly System.Security.Cryptography.SHA256Managed Sha256Hash = new System.Security.Cryptography.SHA256Managed(); private static readonly System.Security.Cryptography.SHA512Managed Sha512Hash = new System.Security.Cryptography.SHA512Managed(); internal static byte[] Hash1It(byte[] data, int offset = 0, int len = 0) => HashItInternal(Sha1Hash, data, offset, len); internal static byte[] Hash256It(byte[] data, int offset = 0, int len = 0) => HashItInternal(Sha256Hash, data, offset, len); internal static byte[] Hash512It(byte[] data, int offset = 0, int len = 0) => HashItInternal(Sha512Hash, data, offset, len); private static byte[] HashItInternal(System.Security.Cryptography.HashAlgorithm hashAlgo, byte[] data, int offset = 0, int len = 0) { lock (hashAlgo) { return hashAlgo.ComputeHash(data, offset, len == 0 ? data.Length - offset : len); } } /// /// Hashes a password like TeamSpeak. /// The hash works like this: base64(sha1(password)) /// /// The password to hash. /// The hashed password. public static string HashPassword(string password) { if (string.IsNullOrEmpty(password)) return string.Empty; var bytes = Tools.Utf8Encoder.GetBytes(password); var hashed = Hash1It(bytes); return Convert.ToBase64String(hashed); } public static byte[] Sign(BigInteger privateKey, byte[] data) { var signer = SignerUtilities.GetSigner(X9ObjectIdentifiers.ECDsaWithSha256); var signKey = new ECPrivateKeyParameters(privateKey, KeyGenParams.DomainParameters); signer.Init(true, signKey); signer.BlockUpdate(data, 0, data.Length); return signer.GenerateSignature(); } public static bool VerifySign(ECPoint publicKey, byte[] data, byte[] proof) { var signer = SignerUtilities.GetSigner(X9ObjectIdentifiers.ECDsaWithSha256); var signKey = new ECPublicKeyParameters(publicKey, KeyGenParams.DomainParameters); signer.Init(false, signKey); signer.BlockUpdate(data, 0, data.Length); return signer.VerifySignature(proof); } private static readonly byte[] TsVersionSignPublicKey = Convert.FromBase64String("UrN1jX0dBE1vulTNLCoYwrVpfITyo+NBuq/twbf9hLw="); public static bool EdCheck(TsVersionSigned sign) { var ver = Encoding.ASCII.GetBytes(sign.Platform + sign.Version); var signArr = Base64Decode(sign.Sign); if (signArr is null) return false; return Chaos.NaCl.Ed25519.Verify(signArr, ver, TsVersionSignPublicKey); } public static void VersionSelfCheck() { var versions = typeof(TsVersionSigned).GetProperties().Where(prop => prop.PropertyType == typeof(TsVersionSigned)); foreach (var ver in versions) { var verObj = (TsVersionSigned)ver.GetValue(null)!; if (!EdCheck(verObj)) throw new Exception($"Version is invalid: {verObj}"); } } internal static byte[]? Base64Decode(string str) { try { return Convert.FromBase64String(str); } catch (FormatException) { return null; } } #endregion #region IDENTITY & SECURITY LEVEL /// Equals ulong.MaxValue.ToString().Length private const int MaxUlongStringLen = 20; /// Tries to improve the security level of the provided identity to the new level. /// The algorithm takes approximately 2^toLevel milliseconds to calculate; so be careful! /// This method can be canceled anytime since progress which is not enough for the next level /// will be saved in continuously. /// The identity to improve. /// The targeted level. public static void ImproveSecurity(IdentityData identity, int toLevel) { var hashBuffer = new byte[identity.PublicKeyString.Length + MaxUlongStringLen]; var pubKeyBytes = Encoding.ASCII.GetBytes(identity.PublicKeyString); Array.Copy(pubKeyBytes, 0, hashBuffer, 0, pubKeyBytes.Length); identity.LastCheckedKeyOffset = Math.Max(identity.ValidKeyOffset, identity.LastCheckedKeyOffset); int best = GetSecurityLevel(hashBuffer, pubKeyBytes.Length, identity.ValidKeyOffset); while (true) { if (best >= toLevel) return; int curr = GetSecurityLevel(hashBuffer, pubKeyBytes.Length, identity.LastCheckedKeyOffset); if (curr > best) { identity.ValidKeyOffset = identity.LastCheckedKeyOffset; best = curr; } identity.LastCheckedKeyOffset++; } } public static int GetSecurityLevel(IdentityData identity) { var hashBuffer = new byte[identity.PublicKeyString.Length + MaxUlongStringLen]; var pubKeyBytes = Encoding.ASCII.GetBytes(identity.PublicKeyString); Array.Copy(pubKeyBytes, 0, hashBuffer, 0, pubKeyBytes.Length); return GetSecurityLevel(hashBuffer, pubKeyBytes.Length, identity.ValidKeyOffset); } /// Creates a new TeamSpeak3 identity. /// Minimum security level this identity will have. /// The identity information. public static IdentityData GenerateNewIdentity(int securityLevel = 8) { var ecp = ECNamedCurveTable.GetByName("prime256v1"); var domainParams = new ECDomainParameters(ecp.Curve, ecp.G, ecp.N, ecp.H, ecp.GetSeed()); var keyGenParams = new ECKeyGenerationParameters(domainParams, new SecureRandom()); var generator = new ECKeyPairGenerator(); generator.Init(keyGenParams); var keyPair = generator.GenerateKeyPair(); var privateKey = (ECPrivateKeyParameters)keyPair.Private; var publicKey = (ECPublicKeyParameters)keyPair.Public; var identity = LoadIdentity(publicKey.Q.Normalize(), privateKey.D, 0, 0); ImproveSecurity(identity, securityLevel); return identity; } private static int GetSecurityLevel(byte[] hashBuffer, int pubKeyLen, ulong offset) { var numBuffer = new byte[MaxUlongStringLen]; int numLen = 0; do { numBuffer[numLen] = (byte)('0' + (offset % 10)); offset /= 10; numLen++; } while (offset > 0); for (int i = 0; i < numLen; i++) hashBuffer[pubKeyLen + i] = numBuffer[numLen - (i + 1)]; byte[] outHash = Hash1It(hashBuffer, 0, pubKeyLen + numLen); return GetLeadingZeroBits(outHash); } private static int GetLeadingZeroBits(byte[] data) { // TODO dnc 3.0 sse ? int curr = 0; int i; for (i = 0; i < data.Length; i++) if (data[i] == 0) curr += 8; else break; if (i < data.Length) for (int bit = 0; bit < 8; bit++) if ((data[i] & (1 << bit)) == 0) curr++; else break; return curr; } #endregion } } ================================================ FILE: TSLib/Full/TsFullClient.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Buffers.Binary; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using TSLib.Audio; using TSLib.Commands; using TSLib.Full.Book; using TSLib.Helper; using TSLib.Messages; using TSLib.Scheduler; using CmdR = System.Threading.Tasks.Task>; namespace TSLib.Full { /// Creates a full TeamSpeak3 client with voice capabilities. public sealed partial class TsFullClient : TsBaseFunctions, IAudioActiveProducer, IAudioPassiveConsumer { private readonly AsyncMessageProcessor msgProc; private readonly DedicatedTaskScheduler scheduler; private readonly bool isOwnScheduler; private uint returnCode; private ConnectionContext? context; public override ClientType ClientType => ClientType.Full; /// The client id given to this connection by the server. public ClientId ClientId => context?.PacketHandler.ClientId ?? ClientId.Null; /// The disonnect message when leaving. public string QuitMessage { get; set; } = "Disconnected"; /// The used to connect. public TsVersionSigned? VersionSign => context?.ConnectionDataFull.VersionSign; /// The used to connect. public IdentityData? Identity => context?.ConnectionDataFull.Identity; /// /// Status overview: /// /// Disconnected: /// ! PacketHandler is not initalized, context == null /// -> Connect() => Connecting /// /// Connecting: /// -> Init/Crypto-Error => Disconnected /// -> Timeout => Disconnected /// -> Final Init => Connected /// /// Connected: /// -> Timeout => Disconnected /// -> Kick/Leave => Disconnecting /// /// Disconnecting: /// -> Timeout => Disconnected /// -> Final Ack => Disconnected /// /// /// private TsClientStatus status; public override bool Connected => status == TsClientStatus.Connected; public override bool Connecting => status == TsClientStatus.Connecting; protected override Deserializer Deserializer => msgProc.Deserializer; public Connection Book { get; } = new Connection(); public override event EventHandler? OnDisconnected; public event EventHandler? OnErrorEvent; /// Creates a new client. A client can manage one connection to a server. /// The message processing method for incomming notifications. /// See for further information about each type. public TsFullClient(DedicatedTaskScheduler? scheduler = null) { status = TsClientStatus.Disconnected; msgProc = new AsyncMessageProcessor(MessageHelper.GetToClientNotificationType); this.scheduler = scheduler ?? new DedicatedTaskScheduler(Id.Null); this.isOwnScheduler = scheduler is null; } /// Tries to connect to a server. /// Set the connection information properties as needed. /// For further details about each setting see the respective property documentation in /// When some required values are not set or invalid. /// When the connection could not be established. public override async CmdR Connect(ConnectionData conData) { scheduler.VerifyOwnThread(); if (!(conData is ConnectionDataFull conDataFull)) throw new ArgumentException($"Use the {nameof(ConnectionDataFull)} derivative to connect with the full client.", nameof(conData)); if (conDataFull.Identity is null) throw new ArgumentNullException(nameof(conDataFull.Identity)); if (conDataFull.VersionSign is null) throw new ArgumentNullException(nameof(conDataFull.VersionSign)); await Disconnect(); remoteAddress = await TsDnsResolver.TryResolve(conData.Address); if (remoteAddress is null) return CommandError.Custom("Could not read or resolve address."); ConnectionData = conData; ServerConstants = TsConst.Default; Book.Reset(); returnCode = 0; var ctx = new ConnectionContext(conDataFull); context = ctx; ctx.PacketHandler.PacketEvent = (ref Packet packet) => { if (status == TsClientStatus.Disconnected) return; PacketEvent(ctx, ref packet); }; ctx.PacketHandler.StopEvent = (closeReason) => { _ = scheduler.Invoke(() => { ctx.ExitReason ??= closeReason; ChangeState(ctx, TsClientStatus.Disconnected); }); }; ChangeState(ctx, TsClientStatus.Connecting); if (!ctx.PacketHandler.Connect(remoteAddress).GetOk(out var error)) { ChangeState(ctx, TsClientStatus.Disconnected); return CommandError.Custom(error); } return await ctx.ConnectEvent.Task; // TODO check error state } /// /// Disconnects from the current server and closes the connection. /// Does nothing if the client is not connected. /// public override async Task Disconnect() { scheduler.VerifyOwnThread(); var ctx = context; if (ctx is null) return; // TODO: Consider if it is better when in connecting state to wait for connect completion then disconnect if (status == TsClientStatus.Connected) { await ClientDisconnect(Reason.LeftServer, QuitMessage); ChangeState(ctx, TsClientStatus.Disconnecting); } else { ChangeState(ctx, TsClientStatus.Disconnected); } await ctx.DisconnectEvent.Task; } private void ChangeState(ConnectionContext ctx, TsClientStatus setStatus, CommandError? error = null) { scheduler.VerifyOwnThread(); if (ctx != context) Log.Debug("Stray disconnect from old packethandler"); Log.Debug("ChangeState {0} -> {1} (error:{2})", status, setStatus, error?.ErrorFormat() ?? "none"); switch ((status, setStatus)) { case (TsClientStatus.Disconnected, TsClientStatus.Disconnected): // Already disconnected, do nothing break; case (TsClientStatus.Disconnected, TsClientStatus.Connecting): status = TsClientStatus.Connecting; break; case (TsClientStatus.Connecting, TsClientStatus.Connected): status = TsClientStatus.Connected; ctx.ConnectEvent.SetResult(R.Ok); break; case (TsClientStatus.Connecting, TsClientStatus.Disconnected): case (TsClientStatus.Connected, TsClientStatus.Disconnected): case (TsClientStatus.Disconnecting, TsClientStatus.Disconnected): status = TsClientStatus.Disconnected; ctx.PacketHandler.Stop(); msgProc.DropQueue(); var statusBefore = status; context = null; if (statusBefore == TsClientStatus.Connecting) ctx.ConnectEvent.SetResult(error ?? CommandError.ConnectionClosed); // TODO: Set exception maybe ? ctx.DisconnectEvent.SetResult(null); OnDisconnected?.Invoke(this, new DisconnectEventArgs(ctx.ExitReason ?? Reason.LeftServer, error)); break; case (TsClientStatus.Connected, TsClientStatus.Disconnecting): status = TsClientStatus.Disconnecting; break; default: Trace.Fail($"Invalid transition change from {status} to {setStatus}"); break; } } private void PacketEvent(ConnectionContext ctx, ref Packet packet) { switch (packet.PacketType) { case PacketType.Command: case PacketType.CommandLow: var data = packet.Data; if (Log.IsDebugEnabled) Log.Debug("[I] {0}", Tools.Utf8Encoder.GetString(packet.Data)); _ = scheduler.Invoke(() => { if (ctx != context) Log.Debug("Stray packet from old packethandler"); var result = msgProc.PushMessage(data); if (result != null) InvokeEvent(result.Value); }); break; case PacketType.Voice: case PacketType.VoiceWhisper: OutStream?.Write(packet.Data, new Meta { In = new MetaIn { Whisper = packet.PacketType == PacketType.VoiceWhisper } }); break; case PacketType.Init1: // Init error if (packet.Data.Length == 5 && packet.Data[0] == 1) { var errorNum = BinaryPrimitives.ReadUInt32LittleEndian(packet.Data.AsSpan(1)); if (Enum.IsDefined(typeof(TsErrorCode), errorNum)) Log.Info("Got init error: {0}", (TsErrorCode)errorNum); else Log.Warn("Got undefined init error: {0}", errorNum); _ = scheduler.Invoke(() => ChangeState(ctx, TsClientStatus.Disconnected)); } break; } } // Local event processing async partial void ProcessEachInitIvExpand(InitIvExpand initIvExpand) { var ctx = context; if (ctx is null) throw new InvalidOperationException("context should be set"); ctx.PacketHandler.ReceivedFinalInitAck(); var result = ctx.TsCrypt.CryptoInit(initIvExpand.Alpha, initIvExpand.Beta, initIvExpand.Omega); if (!result) { ChangeState(ctx, TsClientStatus.Disconnected, CommandError.Custom($"Failed to calculate shared secret: {result.Error}")); return; } await DefaultClientInit(ctx); } async partial void ProcessEachInitIvExpand2(InitIvExpand2 initIvExpand2) { var ctx = context; if (ctx is null) throw new InvalidOperationException("context should be set"); ctx.PacketHandler.ReceivedFinalInitAck(); var (publicKey, privateKey) = TsCrypt.GenerateTemporaryKey(); var ekBase64 = Convert.ToBase64String(publicKey); var toSign = new byte[86]; Array.Copy(publicKey, 0, toSign, 0, 32); var beta = Convert.FromBase64String(initIvExpand2.Beta); Array.Copy(beta, 0, toSign, 32, 54); var sign = TsCrypt.Sign(ctx.ConnectionDataFull.Identity.PrivateKey, toSign); var proof = Convert.ToBase64String(sign); await ClientEk(ekBase64, proof); var result = ctx.TsCrypt.CryptoInit2(initIvExpand2.License, initIvExpand2.Omega, initIvExpand2.Proof, initIvExpand2.Beta, privateKey); if (!result) { ChangeState(ctx, TsClientStatus.Disconnected, CommandError.Custom($"Failed to calculate shared secret: {result.Error}")); return; } await DefaultClientInit(ctx); } partial void ProcessEachInitServer(InitServer initServer) { var ctx = context; if (ctx is null) throw new InvalidOperationException("context should be set"); ctx.PacketHandler.ClientId = initServer.ClientId; var serverVersion = TsVersion.TryParse(initServer.ServerVersion, initServer.ServerPlatform); if (serverVersion != null) ServerConstants = TsConst.GetByServerBuildNum(serverVersion.Build); ChangeState(ctx, TsClientStatus.Connected); } async partial void ProcessEachPluginCommand(PluginCommand cmd) { if (cmd.Name == "cliententerview" && cmd.Data == "version") await SendPluginCommand("cliententerview", "TAB", PluginTargetMode.Server); } partial void ProcessEachCommandError(CommandError error) { var ctx = context; if (ctx is null) throw new InvalidOperationException("context should be set"); if (status == TsClientStatus.Connecting) ChangeState(ctx, TsClientStatus.Disconnected, error); else OnErrorEvent?.Invoke(this, error); } partial void ProcessEachClientLeftView(ClientLeftView clientLeftView) { var ctx = context; if (ctx is null) throw new InvalidOperationException("context should be set"); if (clientLeftView.ClientId == ctx.PacketHandler.ClientId) { ctx.ExitReason = clientLeftView.Reason; ChangeState(ctx, TsClientStatus.Disconnected); } } async partial void ProcessEachChannelListFinished(ChannelListFinished _) { await ChannelSubscribeAll(); await PermissionList(); } async partial void ProcessEachClientConnectionInfoUpdateRequest(ClientConnectionInfoUpdateRequest _) { if (context is null) throw new InvalidOperationException("context should be set"); await SendNoResponsed(context.PacketHandler.NetworkStats.GenerateStatusAnswer()); } partial void ProcessPermList(PermList[] permList) { var buildPermissions = new List(permList.Length + 1) { TsPermission.undefined }; foreach (var perm in permList) { if (!string.IsNullOrEmpty(perm.PermissionName)) { if (Enum.TryParse(perm.PermissionName, out var tsPerm)) buildPermissions.Add(tsPerm); else buildPermissions.Add(TsPermission.undefined); } } Deserializer.PermissionTransform = new TablePermissionTransform(buildPermissions.ToArray()); } private Task DefaultClientInit(ConnectionContext context) { var cdf = context.ConnectionDataFull; return ClientInit( cdf.Username, true, true, cdf.DefaultChannel, cdf.DefaultChannelPassword.HashedPassword, cdf.ServerPassword.HashedPassword, string.Empty, string.Empty, string.Empty, cdf.Identity.ClientUid.ToString(), cdf.VersionSign, cdf.Identity.ValidKeyOffset); } // *** /// /// Sends a command without expecting a 'error' return code. /// NOTE: Do not use this method unless you are sure the ts3 command fits the criteria. /// /// The command to send. public Task SendNoResponsed(TsCommand command) { return SendVoid(command.ExpectsResponse(false)); } /// /// Sends a command to the server. Commands look exactly like query commands and mostly also behave identically. /// NOTE: Do not expect all commands to work exactly like in the query documentation. /// /// The type to deserialize the response to. Use for unknow response data. /// The command to send. /// NOTE: By default does the command expect an answer from the server. Set to false /// if the client hangs after a special command ( will return a generic error instead). /// Returns R(OK) with an enumeration of the deserialized and split up in objects data. /// Or R(ERR) with the returned error if no response is expected. public override async Task> Send(TsCommand com) { using var wb = new WaitBlock(msgProc.Deserializer); var result = SendCommandBase(wb, com); if (!result.Ok) return result.Error; if (com.ExpectResponse) return await wb.WaitForMessageAsync(); else // This might not be the nicest way to return in this case // but we don't know what the response is, so this acceptable. return CommandError.NoResult; } public override async Task> SendHybrid(TsCommand com, NotificationType type) { var notification = await SendNotifyCommand(com, type); return notification.UnwrapNotification(); } public async Task> SendNotifyCommand(TsCommand com, params NotificationType[] dependsOn) { if (!com.ExpectResponse) throw new ArgumentException("A special command must take a response"); using var wb = new WaitBlock(msgProc.Deserializer, dependsOn); var result = SendCommandBase(wb, com); if (!result.Ok) return result.Error; return await wb.WaitForNotificationAsync(); } private E SendCommandBase(WaitBlock wb, TsCommand com) { scheduler.VerifyOwnThread(); if (status != TsClientStatus.Connecting && status != TsClientStatus.Connected) return CommandError.ConnectionClosed; if (context is null) throw new InvalidOperationException("context should be set"); if (com.ExpectResponse) { var responseNumber = unchecked(++returnCode); var retCodeParameter = new CommandParameter("return_code", responseNumber); com.Add(retCodeParameter); msgProc.EnqueueRequest(retCodeParameter.Value, wb); } var message = com.ToString(); Log.Debug("[O] {0}", message); byte[] data = Tools.Utf8Encoder.GetBytes(message); var sendResult = context.PacketHandler.AddOutgoingPacket(data, PacketType.Command); if (!sendResult) Log.Debug("packetHandler couldn't send packet: {0}", sendResult.Error); return R.Ok; } /// Release all resources. Does not wait for a normal disconnect. Await Disconnect for this instead. public override void Dispose() { context?.PacketHandler.Stop(); if (isOwnScheduler && scheduler is IDisposable disp) disp.Dispose(); } #region Audio /// Receive voice packets. public IAudioPassiveConsumer? OutStream { get; set; } /// When voice data can be sent. // TODO may set to false if no talk power, etc. public bool Active => true; /// Send voice data. /// The encoded audio buffer. /// The metadata where to send the packet. public void Write(Span data, Meta? meta) { if (meta?.Out is null || meta.Out.SendMode == TargetSendMode.None || !meta.Codec.HasValue || meta.Codec.Value == Codec.Raw) return; switch (meta.Out.SendMode) { case TargetSendMode.None: break; case TargetSendMode.Voice: SendAudio(data, meta.Codec.Value); break; case TargetSendMode.Whisper: SendAudioWhisper(data, meta.Codec.Value, meta.Out.ChannelIds!, meta.Out.ClientIds!); break; case TargetSendMode.WhisperGroup: SendAudioGroupWhisper(data, meta.Codec.Value, meta.Out.GroupWhisperType, meta.Out.GroupWhisperTarget, meta.Out.TargetId); break; default: throw Tools.UnhandledDefault(meta.Out.SendMode); } } #endregion #region FULLCLIENT SPECIFIC COMMANDS public CmdR ChangeIsChannelCommander(bool isChannelCommander) => SendVoid(new TsCommand("clientupdate") { { "client_is_channel_commander", isChannelCommander }, }); public CmdR ChangeDescription(string newDescription) => ChangeDescription(newDescription, ClientId); public CmdR RequestTalkPower(string? message = null) => SendVoid(new TsCommand("clientupdate") { { "client_talk_request", true }, { "client_talk_request_msg", message }, }); public CmdR CancelTalkPowerRequest() => SendVoid(new TsCommand("clientupdate") { { "client_talk_request", false }, }); public Task ClientEk(string ek, string proof) => SendNoResponsed(new TsCommand("clientek") { { "ek", ek }, { "proof", proof }, }); public Task ClientInit(string nickname, bool inputHardware, bool outputHardware, string defaultChannel, string defaultChannelPassword, string serverPassword, string metaData, string nicknamePhonetic, string defaultToken, string hwid, TsVersionSigned versionSign, ulong keyOffset) => SendNoResponsed(new TsCommand("clientinit") { { "client_nickname", nickname }, { "client_version", versionSign.Version }, { "client_platform", versionSign.Platform }, { "client_input_hardware", inputHardware }, { "client_output_hardware", outputHardware }, { "client_default_channel", defaultChannel }, { "client_default_channel_password", defaultChannelPassword }, // base64(sha1(pass)) { "client_server_password", serverPassword }, // base64(sha1(pass)) { "client_meta_data", metaData }, { "client_version_sign", versionSign.Sign }, { "client_key_offset", keyOffset }, { "client_nickname_phonetic", nicknamePhonetic }, { "client_default_token", defaultToken }, { "hwid", hwid }, }); public Task ClientDisconnect(Reason reason, string reasonMsg) => SendNoResponsed(new TsCommand("clientdisconnect") { { "reasonid", (int)reason }, { "reasonmsg", reasonMsg } }); public CmdR ChannelSubscribeAll() => SendVoid(new TsCommand("channelsubscribeall")); public CmdR ChannelUnsubscribeAll() => SendVoid(new TsCommand("channelunsubscribeall")); public Task PokeClient(string message, ClientId clientId) => SendNoResponsed(new TsCommand("clientpoke") { { "clid", clientId }, { "msg", message }, }); public void SendAudio(in ReadOnlySpan data, Codec codec) { var ctx = context; if (ctx is null) return; // [X,X,Y,DATA] // > X is a ushort in H2N order of an own audio packet counter // it seems it can be the same as the packet counter so we will let the packethandler do it. // > Y is the codec byte (see Enum) Span tmpBuffer = stackalloc byte[data.Length + 3]; tmpBuffer[2] = (byte)codec; data.CopyTo(tmpBuffer.Slice(3)); ctx.PacketHandler.AddOutgoingPacket(tmpBuffer, PacketType.Voice); } public void SendAudioWhisper(in ReadOnlySpan data, Codec codec, IReadOnlyList channelIds, IReadOnlyList clientIds) { var ctx = context; if (ctx is null) return; // [X,X,Y,N,M,(U,U,U,U,U,U,U,U)*,(T,T)*,DATA] // > X is a ushort in H2N order of an own audio packet counter // it seems it can be the same as the packet counter so we will let the packethandler do it. // > Y is the codec byte (see Enum) // > N is a byte, the count of ChannelIds to send to // > M is a byte, the count of ClientIds to send to // > U is a ulong in H2N order of each targeted channelId, (U...U) is repeated N times // > T is a ushort in H2N order of each targeted clientId, (T...T) is repeated M times int offset = 2 + 1 + 2 + channelIds.Count * 8 + clientIds.Count * 2; Span tmpBuffer = stackalloc byte[data.Length + offset]; tmpBuffer[2] = (byte)codec; tmpBuffer[3] = (byte)channelIds.Count; tmpBuffer[4] = (byte)clientIds.Count; for (int i = 0; i < channelIds.Count; i++) BinaryPrimitives.WriteUInt64BigEndian(tmpBuffer.Slice(5 + (i * 8)), channelIds[i].Value); for (int i = 0; i < clientIds.Count; i++) BinaryPrimitives.WriteUInt16BigEndian(tmpBuffer.Slice(5 + channelIds.Count * 8 + (i * 2)), clientIds[i].Value); data.CopyTo(tmpBuffer.Slice(offset)); ctx.PacketHandler.AddOutgoingPacket(tmpBuffer, PacketType.VoiceWhisper); } public void SendAudioGroupWhisper(in ReadOnlySpan data, Codec codec, GroupWhisperType type, GroupWhisperTarget target, ulong targetId = 0) { var ctx = context; if (ctx is null) return; // [X,X,Y,N,M,U,U,U,U,U,U,U,U,DATA] // > X is a ushort in H2N order of an own audio packet counter // it seems it can be the same as the packet counter so we will let the packethandler do it. // > Y is the codec byte (see Enum) // > N is a byte, specifying the GroupWhisperType // > M is a byte, specifying the GroupWhisperTarget // > U is a ulong in H2N order for the targeted channelId or groupId (0 if not applicable) Span tmpBuffer = stackalloc byte[data.Length + 13]; tmpBuffer[2] = (byte)codec; tmpBuffer[3] = (byte)type; tmpBuffer[4] = (byte)target; BinaryPrimitives.WriteUInt64BigEndian(tmpBuffer.Slice(5), targetId); data.CopyTo(tmpBuffer.Slice(13)); ctx.PacketHandler.AddOutgoingPacket(tmpBuffer, PacketType.VoiceWhisper, PacketFlags.Newprotocol); } public async Task> GetClientConnectionInfo(ClientId clientId) { var result = await SendNotifyCommand(new TsCommand("getconnectioninfo") { { "clid", clientId } }, NotificationType.ClientConnectionInfo); if (!result.Ok) return result.Error; return result.Value.Notifications .Cast() .Where(x => x.ClientId == clientId) .MapToSingle(); } public async Task> GetClientVariables(ushort clientId) => await SendNotifyCommand(new TsCommand("clientgetvariables") { { "clid", clientId } }, NotificationType.ClientUpdated).MapToSingle(); public Task> GetServerVariables() => SendNotifyCommand(new TsCommand("servergetvariables"), NotificationType.ServerUpdated).MapToSingle(); public CmdR SendPluginCommand(string name, string data, PluginTargetMode targetmode) => SendVoid(new TsCommand("plugincmd") { { "name", name }, { "data", data }, { "targetmode", (int)targetmode }, }); // Splitted base commands public override async Task> ChannelCreate(string name, string? namePhonetic = null, string? topic = null, string? description = null, string? password = null, Codec? codec = null, int? codecQuality = null, int? codecLatencyFactor = null, bool? codecEncrypted = null, int? maxClients = null, int? maxFamilyClients = null, bool? maxClientsUnlimited = null, bool? maxFamilyClientsUnlimited = null, bool? maxFamilyClientsInherited = null, ChannelId? order = null, ChannelId? parent = null, ChannelType? type = null, TimeSpan? deleteDelay = null, int? neededTalkPower = null) { var result = await SendNotifyCommand(ChannelOp("channelcreate", null, name, namePhonetic, topic, description, password, codec, codecQuality, codecLatencyFactor, codecEncrypted, maxClients, maxFamilyClients, maxClientsUnlimited, maxFamilyClientsUnlimited, maxFamilyClientsInherited, order, parent, type, deleteDelay, neededTalkPower), NotificationType.ChannelCreated); return result.UnwrapNotification() .MapToSingle() .WrapInterface(); } public override async Task> ServerGroupAdd(string name, GroupType? type = null) { var result = await SendNotifyCommand(new TsCommand("servergroupadd") { { "name", name }, { "type", (int?)type } }, NotificationType.ServerGroupList); if (!result.Ok) return result.Error; return result.Value.Notifications .Cast() .Where(x => x.Name == name) .Take(1) .Select(x => new ServerGroupAddResponse() { ServerGroupId = x.ServerGroupId }) .MapToSingle(); } public override async Task> FileTransferInitUpload(ChannelId channelId, string path, string channelPassword, ushort clientTransferId, long fileSize, bool overwrite, bool resume) { var result = await SendNotifyCommand(new TsCommand("ftinitupload") { { "cid", channelId }, { "name", path }, { "cpw", channelPassword }, { "clientftfid", clientTransferId }, { "size", fileSize }, { "overwrite", overwrite }, { "resume", resume } }, NotificationType.FileUpload, NotificationType.FileTransferStatus); if (!result.Ok) return result.Error; if (result.Value.NotifyType == NotificationType.FileUpload) return result.MapToSingle(); else { var ftresult = result.MapToSingle(); if (!ftresult) return ftresult.Error; return new CommandError() { Id = ftresult.Value.Status, Message = ftresult.Value.Message }; } } public override async Task> FileTransferInitDownload(ChannelId channelId, string path, string channelPassword, ushort clientTransferId, long seek) { var result = await SendNotifyCommand(new TsCommand("ftinitdownload") { { "cid", channelId }, { "name", path }, { "cpw", channelPassword }, { "clientftfid", clientTransferId }, { "seekpos", seek } }, NotificationType.FileDownload, NotificationType.FileTransferStatus); if (!result.Ok) return result.Error; if (result.Value.NotifyType == NotificationType.FileDownload) return result.MapToSingle(); else { var ftresult = result.MapToSingle(); if (!ftresult) return ftresult.Error; return new CommandError() { Id = ftresult.Value.Status, Message = ftresult.Value.Message }; } } #endregion private enum TsClientStatus { Disconnected, Disconnecting, Connected, Connecting, } } internal class ConnectionContext { public Reason? ExitReason { get; set; } public TsCrypt TsCrypt { get; } public PacketHandler PacketHandler { get; set; } public ConnectionDataFull ConnectionDataFull { get; set; } public TaskCompletionSource> ConnectEvent { get; } public TaskCompletionSource DisconnectEvent { get; } public ConnectionContext(ConnectionDataFull connectionDataFull) { // Note: TCS.SetResult can continue to run the code of the 'await TSC.Task' // somewhere else synchronously. // While the TsFullClient class is designed to be resistend to problems regarding // intermediate state changes with such call, we still add the runasync Task // option for a more consistent processing order and better predictable behaviour. ConnectEvent = new TaskCompletionSource>(TaskCreationOptions.RunContinuationsAsynchronously); DisconnectEvent = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); TsCrypt = new TsCrypt(connectionDataFull.Identity); PacketHandler = new PacketHandler(TsCrypt, connectionDataFull.LogId); ConnectionDataFull = connectionDataFull; } } } ================================================ FILE: TSLib/Full/TsFullClient.gen.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // using System; using TSLib.Helper; using TSLib.Messages; #nullable enable namespace TSLib.Full { partial class TsFullClient { public event NotifyEventHandler? OnBanList; public event EventHandler? OnEachBanList; public override event NotifyEventHandler? OnChannelChanged; public override event EventHandler? OnEachChannelChanged; public event NotifyEventHandler? OnChannelClientPermList; public event EventHandler? OnEachChannelClientPermList; public override event NotifyEventHandler? OnChannelCreated; public override event EventHandler? OnEachChannelCreated; public override event NotifyEventHandler? OnChannelDeleted; public override event EventHandler? OnEachChannelDeleted; public event NotifyEventHandler? OnChannelDescriptionChanged; public event EventHandler? OnEachChannelDescriptionChanged; public override event NotifyEventHandler? OnChannelEdited; public override event EventHandler? OnEachChannelEdited; public event NotifyEventHandler? OnChannelGroupClientList; public event EventHandler? OnEachChannelGroupClientList; public event NotifyEventHandler? OnChannelGroupList; public event EventHandler? OnEachChannelGroupList; public event NotifyEventHandler? OnChannelGroupPermList; public event EventHandler? OnEachChannelGroupPermList; public event NotifyEventHandler? OnChannelList; public event EventHandler? OnEachChannelList; public event NotifyEventHandler? OnChannelListFinished; public event EventHandler? OnEachChannelListFinished; public override event NotifyEventHandler? OnChannelMoved; public override event EventHandler? OnEachChannelMoved; public override event NotifyEventHandler? OnChannelPasswordChanged; public override event EventHandler? OnEachChannelPasswordChanged; public event NotifyEventHandler? OnChannelPermissionHints; public event EventHandler? OnEachChannelPermissionHints; public event NotifyEventHandler? OnChannelPermList; public event EventHandler? OnEachChannelPermList; public event NotifyEventHandler? OnChannelSubscribed; public event EventHandler? OnEachChannelSubscribed; public event NotifyEventHandler? OnChannelUnsubscribed; public event EventHandler? OnEachChannelUnsubscribed; public event NotifyEventHandler? OnClientChannelGroupChanged; public event EventHandler? OnEachClientChannelGroupChanged; public event NotifyEventHandler? OnClientChatClosed; public event EventHandler? OnEachClientChatClosed; public event NotifyEventHandler? OnClientChatComposing; public event EventHandler? OnEachClientChatComposing; public event NotifyEventHandler? OnClientConnectionInfo; public event EventHandler? OnEachClientConnectionInfo; public event NotifyEventHandler? OnClientConnectionInfoUpdateRequest; public event EventHandler? OnEachClientConnectionInfoUpdateRequest; public event NotifyEventHandler? OnClientDbFind; public event EventHandler? OnEachClientDbFind; public event NotifyEventHandler? OnClientDbIdFromUid; public event EventHandler? OnEachClientDbIdFromUid; public event NotifyEventHandler? OnClientDbList; public event EventHandler? OnEachClientDbList; public override event NotifyEventHandler? OnClientEnterView; public override event EventHandler? OnEachClientEnterView; public event NotifyEventHandler? OnClientIds; public event EventHandler? OnEachClientIds; public override event NotifyEventHandler? OnClientLeftView; public override event EventHandler? OnEachClientLeftView; public override event NotifyEventHandler? OnClientMoved; public override event EventHandler? OnEachClientMoved; public event NotifyEventHandler? OnClientNameFromDbId; public event EventHandler? OnEachClientNameFromDbId; public event NotifyEventHandler? OnClientNameFromUid; public event EventHandler? OnEachClientNameFromUid; public event NotifyEventHandler? OnClientNeededPermissions; public event EventHandler? OnEachClientNeededPermissions; public event NotifyEventHandler? OnClientPermissionHints; public event EventHandler? OnEachClientPermissionHints; public event NotifyEventHandler? OnClientPermList; public event EventHandler? OnEachClientPermList; public event NotifyEventHandler? OnClientPoke; public event EventHandler? OnEachClientPoke; public event NotifyEventHandler? OnClientServerGroupAdded; public event EventHandler? OnEachClientServerGroupAdded; public event NotifyEventHandler? OnClientServerGroupRemoved; public event EventHandler? OnEachClientServerGroupRemoved; public event NotifyEventHandler? OnClientSetServerQueryLogin; public event EventHandler? OnEachClientSetServerQueryLogin; public event NotifyEventHandler? OnClientUidFromClid; public event EventHandler? OnEachClientUidFromClid; public event NotifyEventHandler? OnClientUpdated; public event EventHandler? OnEachClientUpdated; public event NotifyEventHandler? OnCommandError; public event EventHandler? OnEachCommandError; public event NotifyEventHandler? OnComplainList; public event EventHandler? OnEachComplainList; public event NotifyEventHandler? OnFileDownload; public event EventHandler? OnEachFileDownload; public event NotifyEventHandler? OnFileInfo; public event EventHandler? OnEachFileInfo; public event NotifyEventHandler? OnFileList; public event EventHandler? OnEachFileList; public event NotifyEventHandler? OnFileListFinished; public event EventHandler? OnEachFileListFinished; public event NotifyEventHandler? OnFileTransfer; public event EventHandler? OnEachFileTransfer; public event NotifyEventHandler? OnFileTransferStatus; public event EventHandler? OnEachFileTransferStatus; public event NotifyEventHandler? OnFileUpload; public event EventHandler? OnEachFileUpload; public event NotifyEventHandler? OnInitIvExpand; public event EventHandler? OnEachInitIvExpand; public event NotifyEventHandler? OnInitIvExpand2; public event EventHandler? OnEachInitIvExpand2; public event NotifyEventHandler? OnInitServer; public event EventHandler? OnEachInitServer; public event NotifyEventHandler? OnOfflineMessage; public event EventHandler? OnEachOfflineMessage; public event NotifyEventHandler? OnOfflineMessageList; public event EventHandler? OnEachOfflineMessageList; public event NotifyEventHandler? OnPermFind; public event EventHandler? OnEachPermFind; public event NotifyEventHandler? OnPermList; public event EventHandler? OnEachPermList; public event NotifyEventHandler? OnPermOverview; public event EventHandler? OnEachPermOverview; public event NotifyEventHandler? OnPluginCommand; public event EventHandler? OnEachPluginCommand; public event NotifyEventHandler? OnServerConnectionInfo; public event EventHandler? OnEachServerConnectionInfo; public override event NotifyEventHandler? OnServerEdited; public override event EventHandler? OnEachServerEdited; public event NotifyEventHandler? OnServerGroupClientList; public event EventHandler? OnEachServerGroupClientList; public event NotifyEventHandler? OnServerGroupList; public event EventHandler? OnEachServerGroupList; public event NotifyEventHandler? OnServerGroupPermList; public event EventHandler? OnEachServerGroupPermList; public event NotifyEventHandler? OnServerGroupsByClientId; public event EventHandler? OnEachServerGroupsByClientId; public event NotifyEventHandler? OnServerLog; public event EventHandler? OnEachServerLog; public event NotifyEventHandler? OnServerTempPasswordList; public event EventHandler? OnEachServerTempPasswordList; public event NotifyEventHandler? OnServerUpdated; public event EventHandler? OnEachServerUpdated; public override event NotifyEventHandler? OnTextMessage; public override event EventHandler? OnEachTextMessage; public event NotifyEventHandler? OnTokenAdd; public event EventHandler? OnEachTokenAdd; public event NotifyEventHandler? OnTokenList; public event EventHandler? OnEachTokenList; public override event NotifyEventHandler? OnTokenUsed; public override event EventHandler? OnEachTokenUsed; private void InvokeEvent(LazyNotification lazyNotification) { var ntf = lazyNotification.Notifications; switch (lazyNotification.NotifyType) { case NotificationType.BanList: { var ntfc = (BanList[])ntf; ProcessBanList(ntfc); OnBanList?.Invoke(this, ntfc); var ev = OnEachBanList; var book = Book; foreach(var that in ntfc) { ProcessEachBanList(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelChanged: { var ntfc = (ChannelChanged[])ntf; ProcessChannelChanged(ntfc); OnChannelChanged?.Invoke(this, ntfc); var ev = OnEachChannelChanged; var book = Book; foreach(var that in ntfc) { ProcessEachChannelChanged(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelClientPermList: { var ntfc = (ChannelClientPermList[])ntf; ProcessChannelClientPermList(ntfc); OnChannelClientPermList?.Invoke(this, ntfc); var ev = OnEachChannelClientPermList; var book = Book; foreach(var that in ntfc) { ProcessEachChannelClientPermList(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelCreated: { var ntfc = (ChannelCreated[])ntf; ProcessChannelCreated(ntfc); OnChannelCreated?.Invoke(this, ntfc); var ev = OnEachChannelCreated; var book = Book; foreach(var that in ntfc) { book?.UpdateChannelCreated(that); ProcessEachChannelCreated(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelDeleted: { var ntfc = (ChannelDeleted[])ntf; ProcessChannelDeleted(ntfc); OnChannelDeleted?.Invoke(this, ntfc); var ev = OnEachChannelDeleted; var book = Book; foreach(var that in ntfc) { book?.UpdateChannelDeleted(that); ProcessEachChannelDeleted(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelDescriptionChanged: { var ntfc = (ChannelDescriptionChanged[])ntf; ProcessChannelDescriptionChanged(ntfc); OnChannelDescriptionChanged?.Invoke(this, ntfc); var ev = OnEachChannelDescriptionChanged; var book = Book; foreach(var that in ntfc) { ProcessEachChannelDescriptionChanged(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelEdited: { var ntfc = (ChannelEdited[])ntf; ProcessChannelEdited(ntfc); OnChannelEdited?.Invoke(this, ntfc); var ev = OnEachChannelEdited; var book = Book; foreach(var that in ntfc) { book?.UpdateChannelEdited(that); ProcessEachChannelEdited(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelGroupClientList: { var ntfc = (ChannelGroupClientList[])ntf; ProcessChannelGroupClientList(ntfc); OnChannelGroupClientList?.Invoke(this, ntfc); var ev = OnEachChannelGroupClientList; var book = Book; foreach(var that in ntfc) { ProcessEachChannelGroupClientList(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelGroupList: { var ntfc = (ChannelGroupList[])ntf; ProcessChannelGroupList(ntfc); OnChannelGroupList?.Invoke(this, ntfc); var ev = OnEachChannelGroupList; var book = Book; foreach(var that in ntfc) { ProcessEachChannelGroupList(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelGroupPermList: { var ntfc = (ChannelGroupPermList[])ntf; ProcessChannelGroupPermList(ntfc); OnChannelGroupPermList?.Invoke(this, ntfc); var ev = OnEachChannelGroupPermList; var book = Book; foreach(var that in ntfc) { ProcessEachChannelGroupPermList(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelList: { var ntfc = (ChannelList[])ntf; ProcessChannelList(ntfc); OnChannelList?.Invoke(this, ntfc); var ev = OnEachChannelList; var book = Book; foreach(var that in ntfc) { book?.UpdateChannelList(that); ProcessEachChannelList(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelListFinished: { var ntfc = (ChannelListFinished[])ntf; ProcessChannelListFinished(ntfc); OnChannelListFinished?.Invoke(this, ntfc); var ev = OnEachChannelListFinished; var book = Book; foreach(var that in ntfc) { ProcessEachChannelListFinished(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelMoved: { var ntfc = (ChannelMoved[])ntf; ProcessChannelMoved(ntfc); OnChannelMoved?.Invoke(this, ntfc); var ev = OnEachChannelMoved; var book = Book; foreach(var that in ntfc) { book?.UpdateChannelMoved(that); ProcessEachChannelMoved(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelPasswordChanged: { var ntfc = (ChannelPasswordChanged[])ntf; ProcessChannelPasswordChanged(ntfc); OnChannelPasswordChanged?.Invoke(this, ntfc); var ev = OnEachChannelPasswordChanged; var book = Book; foreach(var that in ntfc) { ProcessEachChannelPasswordChanged(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelPermissionHints: { var ntfc = (ChannelPermissionHints[])ntf; ProcessChannelPermissionHints(ntfc); OnChannelPermissionHints?.Invoke(this, ntfc); var ev = OnEachChannelPermissionHints; var book = Book; foreach(var that in ntfc) { book?.UpdateChannelPermissionHints(that); ProcessEachChannelPermissionHints(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelPermList: { var ntfc = (ChannelPermList[])ntf; ProcessChannelPermList(ntfc); OnChannelPermList?.Invoke(this, ntfc); var ev = OnEachChannelPermList; var book = Book; foreach(var that in ntfc) { ProcessEachChannelPermList(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelSubscribed: { var ntfc = (ChannelSubscribed[])ntf; ProcessChannelSubscribed(ntfc); OnChannelSubscribed?.Invoke(this, ntfc); var ev = OnEachChannelSubscribed; var book = Book; foreach(var that in ntfc) { book?.UpdateChannelSubscribed(that); ProcessEachChannelSubscribed(that); ev?.Invoke(this, that); } break; } case NotificationType.ChannelUnsubscribed: { var ntfc = (ChannelUnsubscribed[])ntf; ProcessChannelUnsubscribed(ntfc); OnChannelUnsubscribed?.Invoke(this, ntfc); var ev = OnEachChannelUnsubscribed; var book = Book; foreach(var that in ntfc) { book?.UpdateChannelUnsubscribed(that); ProcessEachChannelUnsubscribed(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientChannelGroupChanged: { var ntfc = (ClientChannelGroupChanged[])ntf; ProcessClientChannelGroupChanged(ntfc); OnClientChannelGroupChanged?.Invoke(this, ntfc); var ev = OnEachClientChannelGroupChanged; var book = Book; foreach(var that in ntfc) { book?.UpdateClientChannelGroupChanged(that); ProcessEachClientChannelGroupChanged(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientChatClosed: { var ntfc = (ClientChatClosed[])ntf; ProcessClientChatClosed(ntfc); OnClientChatClosed?.Invoke(this, ntfc); var ev = OnEachClientChatClosed; var book = Book; foreach(var that in ntfc) { ProcessEachClientChatClosed(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientChatComposing: { var ntfc = (ClientChatComposing[])ntf; ProcessClientChatComposing(ntfc); OnClientChatComposing?.Invoke(this, ntfc); var ev = OnEachClientChatComposing; var book = Book; foreach(var that in ntfc) { ProcessEachClientChatComposing(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientConnectionInfo: { var ntfc = (ClientConnectionInfo[])ntf; ProcessClientConnectionInfo(ntfc); OnClientConnectionInfo?.Invoke(this, ntfc); var ev = OnEachClientConnectionInfo; var book = Book; foreach(var that in ntfc) { book?.UpdateClientConnectionInfo(that); ProcessEachClientConnectionInfo(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientConnectionInfoUpdateRequest: { var ntfc = (ClientConnectionInfoUpdateRequest[])ntf; ProcessClientConnectionInfoUpdateRequest(ntfc); OnClientConnectionInfoUpdateRequest?.Invoke(this, ntfc); var ev = OnEachClientConnectionInfoUpdateRequest; var book = Book; foreach(var that in ntfc) { ProcessEachClientConnectionInfoUpdateRequest(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientDbFind: { var ntfc = (ClientDbFind[])ntf; ProcessClientDbFind(ntfc); OnClientDbFind?.Invoke(this, ntfc); var ev = OnEachClientDbFind; var book = Book; foreach(var that in ntfc) { ProcessEachClientDbFind(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientDbIdFromUid: { var ntfc = (ClientDbIdFromUid[])ntf; ProcessClientDbIdFromUid(ntfc); OnClientDbIdFromUid?.Invoke(this, ntfc); var ev = OnEachClientDbIdFromUid; var book = Book; foreach(var that in ntfc) { ProcessEachClientDbIdFromUid(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientDbList: { var ntfc = (ClientDbList[])ntf; ProcessClientDbList(ntfc); OnClientDbList?.Invoke(this, ntfc); var ev = OnEachClientDbList; var book = Book; foreach(var that in ntfc) { ProcessEachClientDbList(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientEnterView: { var ntfc = (ClientEnterView[])ntf; ProcessClientEnterView(ntfc); OnClientEnterView?.Invoke(this, ntfc); var ev = OnEachClientEnterView; var book = Book; foreach(var that in ntfc) { book?.UpdateClientEnterView(that); ProcessEachClientEnterView(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientIds: { var ntfc = (ClientIds[])ntf; ProcessClientIds(ntfc); OnClientIds?.Invoke(this, ntfc); var ev = OnEachClientIds; var book = Book; foreach(var that in ntfc) { ProcessEachClientIds(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientLeftView: { var ntfc = (ClientLeftView[])ntf; ProcessClientLeftView(ntfc); OnClientLeftView?.Invoke(this, ntfc); var ev = OnEachClientLeftView; var book = Book; foreach(var that in ntfc) { book?.UpdateClientLeftView(that); ProcessEachClientLeftView(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientMoved: { var ntfc = (ClientMoved[])ntf; ProcessClientMoved(ntfc); OnClientMoved?.Invoke(this, ntfc); var ev = OnEachClientMoved; var book = Book; foreach(var that in ntfc) { book?.UpdateClientMoved(that); ProcessEachClientMoved(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientNameFromDbId: { var ntfc = (ClientNameFromDbId[])ntf; ProcessClientNameFromDbId(ntfc); OnClientNameFromDbId?.Invoke(this, ntfc); var ev = OnEachClientNameFromDbId; var book = Book; foreach(var that in ntfc) { ProcessEachClientNameFromDbId(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientNameFromUid: { var ntfc = (ClientNameFromUid[])ntf; ProcessClientNameFromUid(ntfc); OnClientNameFromUid?.Invoke(this, ntfc); var ev = OnEachClientNameFromUid; var book = Book; foreach(var that in ntfc) { ProcessEachClientNameFromUid(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientNeededPermissions: { var ntfc = (ClientNeededPermissions[])ntf; ProcessClientNeededPermissions(ntfc); OnClientNeededPermissions?.Invoke(this, ntfc); var ev = OnEachClientNeededPermissions; var book = Book; foreach(var that in ntfc) { ProcessEachClientNeededPermissions(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientPermissionHints: { var ntfc = (ClientPermissionHints[])ntf; ProcessClientPermissionHints(ntfc); OnClientPermissionHints?.Invoke(this, ntfc); var ev = OnEachClientPermissionHints; var book = Book; foreach(var that in ntfc) { book?.UpdateClientPermissionHints(that); ProcessEachClientPermissionHints(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientPermList: { var ntfc = (ClientPermList[])ntf; ProcessClientPermList(ntfc); OnClientPermList?.Invoke(this, ntfc); var ev = OnEachClientPermList; var book = Book; foreach(var that in ntfc) { ProcessEachClientPermList(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientPoke: { var ntfc = (ClientPoke[])ntf; ProcessClientPoke(ntfc); OnClientPoke?.Invoke(this, ntfc); var ev = OnEachClientPoke; var book = Book; foreach(var that in ntfc) { ProcessEachClientPoke(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientServerGroupAdded: { var ntfc = (ClientServerGroupAdded[])ntf; ProcessClientServerGroupAdded(ntfc); OnClientServerGroupAdded?.Invoke(this, ntfc); var ev = OnEachClientServerGroupAdded; var book = Book; foreach(var that in ntfc) { book?.UpdateClientServerGroupAdded(that); ProcessEachClientServerGroupAdded(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientServerGroupRemoved: { var ntfc = (ClientServerGroupRemoved[])ntf; ProcessClientServerGroupRemoved(ntfc); OnClientServerGroupRemoved?.Invoke(this, ntfc); var ev = OnEachClientServerGroupRemoved; var book = Book; foreach(var that in ntfc) { book?.UpdateClientServerGroupRemoved(that); ProcessEachClientServerGroupRemoved(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientSetServerQueryLogin: { var ntfc = (ClientSetServerQueryLogin[])ntf; ProcessClientSetServerQueryLogin(ntfc); OnClientSetServerQueryLogin?.Invoke(this, ntfc); var ev = OnEachClientSetServerQueryLogin; var book = Book; foreach(var that in ntfc) { ProcessEachClientSetServerQueryLogin(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientUidFromClid: { var ntfc = (ClientUidFromClid[])ntf; ProcessClientUidFromClid(ntfc); OnClientUidFromClid?.Invoke(this, ntfc); var ev = OnEachClientUidFromClid; var book = Book; foreach(var that in ntfc) { ProcessEachClientUidFromClid(that); ev?.Invoke(this, that); } break; } case NotificationType.ClientUpdated: { var ntfc = (ClientUpdated[])ntf; ProcessClientUpdated(ntfc); OnClientUpdated?.Invoke(this, ntfc); var ev = OnEachClientUpdated; var book = Book; foreach(var that in ntfc) { book?.UpdateClientUpdated(that); ProcessEachClientUpdated(that); ev?.Invoke(this, that); } break; } case NotificationType.CommandError: { var ntfc = (CommandError[])ntf; ProcessCommandError(ntfc); OnCommandError?.Invoke(this, ntfc); var ev = OnEachCommandError; var book = Book; foreach(var that in ntfc) { ProcessEachCommandError(that); ev?.Invoke(this, that); } break; } case NotificationType.ComplainList: { var ntfc = (ComplainList[])ntf; ProcessComplainList(ntfc); OnComplainList?.Invoke(this, ntfc); var ev = OnEachComplainList; var book = Book; foreach(var that in ntfc) { ProcessEachComplainList(that); ev?.Invoke(this, that); } break; } case NotificationType.FileDownload: { var ntfc = (FileDownload[])ntf; ProcessFileDownload(ntfc); OnFileDownload?.Invoke(this, ntfc); var ev = OnEachFileDownload; var book = Book; foreach(var that in ntfc) { ProcessEachFileDownload(that); ev?.Invoke(this, that); } break; } case NotificationType.FileInfo: { var ntfc = (FileInfo[])ntf; ProcessFileInfo(ntfc); OnFileInfo?.Invoke(this, ntfc); var ev = OnEachFileInfo; var book = Book; foreach(var that in ntfc) { ProcessEachFileInfo(that); ev?.Invoke(this, that); } break; } case NotificationType.FileList: { var ntfc = (FileList[])ntf; ProcessFileList(ntfc); OnFileList?.Invoke(this, ntfc); var ev = OnEachFileList; var book = Book; foreach(var that in ntfc) { ProcessEachFileList(that); ev?.Invoke(this, that); } break; } case NotificationType.FileListFinished: { var ntfc = (FileListFinished[])ntf; ProcessFileListFinished(ntfc); OnFileListFinished?.Invoke(this, ntfc); var ev = OnEachFileListFinished; var book = Book; foreach(var that in ntfc) { ProcessEachFileListFinished(that); ev?.Invoke(this, that); } break; } case NotificationType.FileTransfer: { var ntfc = (FileTransfer[])ntf; ProcessFileTransfer(ntfc); OnFileTransfer?.Invoke(this, ntfc); var ev = OnEachFileTransfer; var book = Book; foreach(var that in ntfc) { ProcessEachFileTransfer(that); ev?.Invoke(this, that); } break; } case NotificationType.FileTransferStatus: { var ntfc = (FileTransferStatus[])ntf; ProcessFileTransferStatus(ntfc); OnFileTransferStatus?.Invoke(this, ntfc); var ev = OnEachFileTransferStatus; var book = Book; foreach(var that in ntfc) { ProcessEachFileTransferStatus(that); ev?.Invoke(this, that); } break; } case NotificationType.FileUpload: { var ntfc = (FileUpload[])ntf; ProcessFileUpload(ntfc); OnFileUpload?.Invoke(this, ntfc); var ev = OnEachFileUpload; var book = Book; foreach(var that in ntfc) { ProcessEachFileUpload(that); ev?.Invoke(this, that); } break; } case NotificationType.InitIvExpand: { var ntfc = (InitIvExpand[])ntf; ProcessInitIvExpand(ntfc); OnInitIvExpand?.Invoke(this, ntfc); var ev = OnEachInitIvExpand; var book = Book; foreach(var that in ntfc) { ProcessEachInitIvExpand(that); ev?.Invoke(this, that); } break; } case NotificationType.InitIvExpand2: { var ntfc = (InitIvExpand2[])ntf; ProcessInitIvExpand2(ntfc); OnInitIvExpand2?.Invoke(this, ntfc); var ev = OnEachInitIvExpand2; var book = Book; foreach(var that in ntfc) { ProcessEachInitIvExpand2(that); ev?.Invoke(this, that); } break; } case NotificationType.InitServer: { var ntfc = (InitServer[])ntf; ProcessInitServer(ntfc); OnInitServer?.Invoke(this, ntfc); var ev = OnEachInitServer; var book = Book; foreach(var that in ntfc) { book?.UpdateInitServer(that); ProcessEachInitServer(that); ev?.Invoke(this, that); } break; } case NotificationType.OfflineMessage: { var ntfc = (OfflineMessage[])ntf; ProcessOfflineMessage(ntfc); OnOfflineMessage?.Invoke(this, ntfc); var ev = OnEachOfflineMessage; var book = Book; foreach(var that in ntfc) { ProcessEachOfflineMessage(that); ev?.Invoke(this, that); } break; } case NotificationType.OfflineMessageList: { var ntfc = (OfflineMessageList[])ntf; ProcessOfflineMessageList(ntfc); OnOfflineMessageList?.Invoke(this, ntfc); var ev = OnEachOfflineMessageList; var book = Book; foreach(var that in ntfc) { ProcessEachOfflineMessageList(that); ev?.Invoke(this, that); } break; } case NotificationType.PermFind: { var ntfc = (PermFind[])ntf; ProcessPermFind(ntfc); OnPermFind?.Invoke(this, ntfc); var ev = OnEachPermFind; var book = Book; foreach(var that in ntfc) { ProcessEachPermFind(that); ev?.Invoke(this, that); } break; } case NotificationType.PermList: { var ntfc = (PermList[])ntf; ProcessPermList(ntfc); OnPermList?.Invoke(this, ntfc); var ev = OnEachPermList; var book = Book; foreach(var that in ntfc) { ProcessEachPermList(that); ev?.Invoke(this, that); } break; } case NotificationType.PermOverview: { var ntfc = (PermOverview[])ntf; ProcessPermOverview(ntfc); OnPermOverview?.Invoke(this, ntfc); var ev = OnEachPermOverview; var book = Book; foreach(var that in ntfc) { ProcessEachPermOverview(that); ev?.Invoke(this, that); } break; } case NotificationType.PluginCommand: { var ntfc = (PluginCommand[])ntf; ProcessPluginCommand(ntfc); OnPluginCommand?.Invoke(this, ntfc); var ev = OnEachPluginCommand; var book = Book; foreach(var that in ntfc) { ProcessEachPluginCommand(that); ev?.Invoke(this, that); } break; } case NotificationType.ServerConnectionInfo: { var ntfc = (ServerConnectionInfo[])ntf; ProcessServerConnectionInfo(ntfc); OnServerConnectionInfo?.Invoke(this, ntfc); var ev = OnEachServerConnectionInfo; var book = Book; foreach(var that in ntfc) { ProcessEachServerConnectionInfo(that); ev?.Invoke(this, that); } break; } case NotificationType.ServerEdited: { var ntfc = (ServerEdited[])ntf; ProcessServerEdited(ntfc); OnServerEdited?.Invoke(this, ntfc); var ev = OnEachServerEdited; var book = Book; foreach(var that in ntfc) { book?.UpdateServerEdited(that); ProcessEachServerEdited(that); ev?.Invoke(this, that); } break; } case NotificationType.ServerGroupClientList: { var ntfc = (ServerGroupClientList[])ntf; ProcessServerGroupClientList(ntfc); OnServerGroupClientList?.Invoke(this, ntfc); var ev = OnEachServerGroupClientList; var book = Book; foreach(var that in ntfc) { ProcessEachServerGroupClientList(that); ev?.Invoke(this, that); } break; } case NotificationType.ServerGroupList: { var ntfc = (ServerGroupList[])ntf; ProcessServerGroupList(ntfc); OnServerGroupList?.Invoke(this, ntfc); var ev = OnEachServerGroupList; var book = Book; foreach(var that in ntfc) { book?.UpdateServerGroupList(that); ProcessEachServerGroupList(that); ev?.Invoke(this, that); } break; } case NotificationType.ServerGroupPermList: { var ntfc = (ServerGroupPermList[])ntf; ProcessServerGroupPermList(ntfc); OnServerGroupPermList?.Invoke(this, ntfc); var ev = OnEachServerGroupPermList; var book = Book; foreach(var that in ntfc) { ProcessEachServerGroupPermList(that); ev?.Invoke(this, that); } break; } case NotificationType.ServerGroupsByClientId: { var ntfc = (ServerGroupsByClientId[])ntf; ProcessServerGroupsByClientId(ntfc); OnServerGroupsByClientId?.Invoke(this, ntfc); var ev = OnEachServerGroupsByClientId; var book = Book; foreach(var that in ntfc) { ProcessEachServerGroupsByClientId(that); ev?.Invoke(this, that); } break; } case NotificationType.ServerLog: { var ntfc = (ServerLog[])ntf; ProcessServerLog(ntfc); OnServerLog?.Invoke(this, ntfc); var ev = OnEachServerLog; var book = Book; foreach(var that in ntfc) { ProcessEachServerLog(that); ev?.Invoke(this, that); } break; } case NotificationType.ServerTempPasswordList: { var ntfc = (ServerTempPasswordList[])ntf; ProcessServerTempPasswordList(ntfc); OnServerTempPasswordList?.Invoke(this, ntfc); var ev = OnEachServerTempPasswordList; var book = Book; foreach(var that in ntfc) { ProcessEachServerTempPasswordList(that); ev?.Invoke(this, that); } break; } case NotificationType.ServerUpdated: { var ntfc = (ServerUpdated[])ntf; ProcessServerUpdated(ntfc); OnServerUpdated?.Invoke(this, ntfc); var ev = OnEachServerUpdated; var book = Book; foreach(var that in ntfc) { ProcessEachServerUpdated(that); ev?.Invoke(this, that); } break; } case NotificationType.TextMessage: { var ntfc = (TextMessage[])ntf; ProcessTextMessage(ntfc); OnTextMessage?.Invoke(this, ntfc); var ev = OnEachTextMessage; var book = Book; foreach(var that in ntfc) { ProcessEachTextMessage(that); ev?.Invoke(this, that); } break; } case NotificationType.TokenAdd: { var ntfc = (TokenAdd[])ntf; ProcessTokenAdd(ntfc); OnTokenAdd?.Invoke(this, ntfc); var ev = OnEachTokenAdd; var book = Book; foreach(var that in ntfc) { ProcessEachTokenAdd(that); ev?.Invoke(this, that); } break; } case NotificationType.TokenList: { var ntfc = (TokenList[])ntf; ProcessTokenList(ntfc); OnTokenList?.Invoke(this, ntfc); var ev = OnEachTokenList; var book = Book; foreach(var that in ntfc) { ProcessEachTokenList(that); ev?.Invoke(this, that); } break; } case NotificationType.TokenUsed: { var ntfc = (TokenUsed[])ntf; ProcessTokenUsed(ntfc); OnTokenUsed?.Invoke(this, ntfc); var ev = OnEachTokenUsed; var book = Book; foreach(var that in ntfc) { ProcessEachTokenUsed(that); ev?.Invoke(this, that); } break; } case NotificationType.Unknown: default: throw Tools.UnhandledDefault(lazyNotification.NotifyType); } } partial void ProcessBanList(BanList[] notifies); partial void ProcessEachBanList(BanList notifies); partial void ProcessChannelChanged(ChannelChanged[] notifies); partial void ProcessEachChannelChanged(ChannelChanged notifies); partial void ProcessChannelClientPermList(ChannelClientPermList[] notifies); partial void ProcessEachChannelClientPermList(ChannelClientPermList notifies); partial void ProcessChannelCreated(ChannelCreated[] notifies); partial void ProcessEachChannelCreated(ChannelCreated notifies); partial void ProcessChannelDeleted(ChannelDeleted[] notifies); partial void ProcessEachChannelDeleted(ChannelDeleted notifies); partial void ProcessChannelDescriptionChanged(ChannelDescriptionChanged[] notifies); partial void ProcessEachChannelDescriptionChanged(ChannelDescriptionChanged notifies); partial void ProcessChannelEdited(ChannelEdited[] notifies); partial void ProcessEachChannelEdited(ChannelEdited notifies); partial void ProcessChannelGroupClientList(ChannelGroupClientList[] notifies); partial void ProcessEachChannelGroupClientList(ChannelGroupClientList notifies); partial void ProcessChannelGroupList(ChannelGroupList[] notifies); partial void ProcessEachChannelGroupList(ChannelGroupList notifies); partial void ProcessChannelGroupPermList(ChannelGroupPermList[] notifies); partial void ProcessEachChannelGroupPermList(ChannelGroupPermList notifies); partial void ProcessChannelList(ChannelList[] notifies); partial void ProcessEachChannelList(ChannelList notifies); partial void ProcessChannelListFinished(ChannelListFinished[] notifies); partial void ProcessEachChannelListFinished(ChannelListFinished notifies); partial void ProcessChannelMoved(ChannelMoved[] notifies); partial void ProcessEachChannelMoved(ChannelMoved notifies); partial void ProcessChannelPasswordChanged(ChannelPasswordChanged[] notifies); partial void ProcessEachChannelPasswordChanged(ChannelPasswordChanged notifies); partial void ProcessChannelPermissionHints(ChannelPermissionHints[] notifies); partial void ProcessEachChannelPermissionHints(ChannelPermissionHints notifies); partial void ProcessChannelPermList(ChannelPermList[] notifies); partial void ProcessEachChannelPermList(ChannelPermList notifies); partial void ProcessChannelSubscribed(ChannelSubscribed[] notifies); partial void ProcessEachChannelSubscribed(ChannelSubscribed notifies); partial void ProcessChannelUnsubscribed(ChannelUnsubscribed[] notifies); partial void ProcessEachChannelUnsubscribed(ChannelUnsubscribed notifies); partial void ProcessClientChannelGroupChanged(ClientChannelGroupChanged[] notifies); partial void ProcessEachClientChannelGroupChanged(ClientChannelGroupChanged notifies); partial void ProcessClientChatClosed(ClientChatClosed[] notifies); partial void ProcessEachClientChatClosed(ClientChatClosed notifies); partial void ProcessClientChatComposing(ClientChatComposing[] notifies); partial void ProcessEachClientChatComposing(ClientChatComposing notifies); partial void ProcessClientConnectionInfo(ClientConnectionInfo[] notifies); partial void ProcessEachClientConnectionInfo(ClientConnectionInfo notifies); partial void ProcessClientConnectionInfoUpdateRequest(ClientConnectionInfoUpdateRequest[] notifies); partial void ProcessEachClientConnectionInfoUpdateRequest(ClientConnectionInfoUpdateRequest notifies); partial void ProcessClientDbFind(ClientDbFind[] notifies); partial void ProcessEachClientDbFind(ClientDbFind notifies); partial void ProcessClientDbIdFromUid(ClientDbIdFromUid[] notifies); partial void ProcessEachClientDbIdFromUid(ClientDbIdFromUid notifies); partial void ProcessClientDbList(ClientDbList[] notifies); partial void ProcessEachClientDbList(ClientDbList notifies); partial void ProcessClientEnterView(ClientEnterView[] notifies); partial void ProcessEachClientEnterView(ClientEnterView notifies); partial void ProcessClientIds(ClientIds[] notifies); partial void ProcessEachClientIds(ClientIds notifies); partial void ProcessClientLeftView(ClientLeftView[] notifies); partial void ProcessEachClientLeftView(ClientLeftView notifies); partial void ProcessClientMoved(ClientMoved[] notifies); partial void ProcessEachClientMoved(ClientMoved notifies); partial void ProcessClientNameFromDbId(ClientNameFromDbId[] notifies); partial void ProcessEachClientNameFromDbId(ClientNameFromDbId notifies); partial void ProcessClientNameFromUid(ClientNameFromUid[] notifies); partial void ProcessEachClientNameFromUid(ClientNameFromUid notifies); partial void ProcessClientNeededPermissions(ClientNeededPermissions[] notifies); partial void ProcessEachClientNeededPermissions(ClientNeededPermissions notifies); partial void ProcessClientPermissionHints(ClientPermissionHints[] notifies); partial void ProcessEachClientPermissionHints(ClientPermissionHints notifies); partial void ProcessClientPermList(ClientPermList[] notifies); partial void ProcessEachClientPermList(ClientPermList notifies); partial void ProcessClientPoke(ClientPoke[] notifies); partial void ProcessEachClientPoke(ClientPoke notifies); partial void ProcessClientServerGroupAdded(ClientServerGroupAdded[] notifies); partial void ProcessEachClientServerGroupAdded(ClientServerGroupAdded notifies); partial void ProcessClientServerGroupRemoved(ClientServerGroupRemoved[] notifies); partial void ProcessEachClientServerGroupRemoved(ClientServerGroupRemoved notifies); partial void ProcessClientSetServerQueryLogin(ClientSetServerQueryLogin[] notifies); partial void ProcessEachClientSetServerQueryLogin(ClientSetServerQueryLogin notifies); partial void ProcessClientUidFromClid(ClientUidFromClid[] notifies); partial void ProcessEachClientUidFromClid(ClientUidFromClid notifies); partial void ProcessClientUpdated(ClientUpdated[] notifies); partial void ProcessEachClientUpdated(ClientUpdated notifies); partial void ProcessCommandError(CommandError[] notifies); partial void ProcessEachCommandError(CommandError notifies); partial void ProcessComplainList(ComplainList[] notifies); partial void ProcessEachComplainList(ComplainList notifies); partial void ProcessFileDownload(FileDownload[] notifies); partial void ProcessEachFileDownload(FileDownload notifies); partial void ProcessFileInfo(FileInfo[] notifies); partial void ProcessEachFileInfo(FileInfo notifies); partial void ProcessFileList(FileList[] notifies); partial void ProcessEachFileList(FileList notifies); partial void ProcessFileListFinished(FileListFinished[] notifies); partial void ProcessEachFileListFinished(FileListFinished notifies); partial void ProcessFileTransfer(FileTransfer[] notifies); partial void ProcessEachFileTransfer(FileTransfer notifies); partial void ProcessFileTransferStatus(FileTransferStatus[] notifies); partial void ProcessEachFileTransferStatus(FileTransferStatus notifies); partial void ProcessFileUpload(FileUpload[] notifies); partial void ProcessEachFileUpload(FileUpload notifies); partial void ProcessInitIvExpand(InitIvExpand[] notifies); partial void ProcessEachInitIvExpand(InitIvExpand notifies); partial void ProcessInitIvExpand2(InitIvExpand2[] notifies); partial void ProcessEachInitIvExpand2(InitIvExpand2 notifies); partial void ProcessInitServer(InitServer[] notifies); partial void ProcessEachInitServer(InitServer notifies); partial void ProcessOfflineMessage(OfflineMessage[] notifies); partial void ProcessEachOfflineMessage(OfflineMessage notifies); partial void ProcessOfflineMessageList(OfflineMessageList[] notifies); partial void ProcessEachOfflineMessageList(OfflineMessageList notifies); partial void ProcessPermFind(PermFind[] notifies); partial void ProcessEachPermFind(PermFind notifies); partial void ProcessPermList(PermList[] notifies); partial void ProcessEachPermList(PermList notifies); partial void ProcessPermOverview(PermOverview[] notifies); partial void ProcessEachPermOverview(PermOverview notifies); partial void ProcessPluginCommand(PluginCommand[] notifies); partial void ProcessEachPluginCommand(PluginCommand notifies); partial void ProcessServerConnectionInfo(ServerConnectionInfo[] notifies); partial void ProcessEachServerConnectionInfo(ServerConnectionInfo notifies); partial void ProcessServerEdited(ServerEdited[] notifies); partial void ProcessEachServerEdited(ServerEdited notifies); partial void ProcessServerGroupClientList(ServerGroupClientList[] notifies); partial void ProcessEachServerGroupClientList(ServerGroupClientList notifies); partial void ProcessServerGroupList(ServerGroupList[] notifies); partial void ProcessEachServerGroupList(ServerGroupList notifies); partial void ProcessServerGroupPermList(ServerGroupPermList[] notifies); partial void ProcessEachServerGroupPermList(ServerGroupPermList notifies); partial void ProcessServerGroupsByClientId(ServerGroupsByClientId[] notifies); partial void ProcessEachServerGroupsByClientId(ServerGroupsByClientId notifies); partial void ProcessServerLog(ServerLog[] notifies); partial void ProcessEachServerLog(ServerLog notifies); partial void ProcessServerTempPasswordList(ServerTempPasswordList[] notifies); partial void ProcessEachServerTempPasswordList(ServerTempPasswordList notifies); partial void ProcessServerUpdated(ServerUpdated[] notifies); partial void ProcessEachServerUpdated(ServerUpdated notifies); partial void ProcessTextMessage(TextMessage[] notifies); partial void ProcessEachTextMessage(TextMessage notifies); partial void ProcessTokenAdd(TokenAdd[] notifies); partial void ProcessEachTokenAdd(TokenAdd notifies); partial void ProcessTokenList(TokenList[] notifies); partial void ProcessEachTokenList(TokenList notifies); partial void ProcessTokenUsed(TokenUsed[] notifies); partial void ProcessEachTokenUsed(TokenUsed notifies); } } ================================================ FILE: TSLib/Full/TsFullClient.gen.tt ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // <#@ template debug="true" hostSpecific="true" language="C#" #> <#@ include file="../Generated/M2BParser.ttinclude" once="true" #> <#@ include file="../Generated/MessageParser.ttinclude" once="true" #> <#@ include file="../Generated/BookParser.ttinclude" once="true" #> <#@ include file="../Generated/NotificationUtil.ttinclude" once="true" #> <#@ output extension=".cs" #> <#@ import namespace="System.Collections.Generic" #> using System; using TSLib.Helper; using TSLib.Messages; #nullable enable namespace TSLib.Full { partial class TsFullClient { <# var genbook = BookDeclarations.Parse(Host.ResolvePath("../Declarations/Book.toml")); var genmsg = Messages.Parse(Host.ResolvePath("../Declarations/Messages.toml")); var genm2b = M2BDeclarations.Parse(Host.ResolvePath("../Declarations/MessagesToBook.toml"), genmsg, genbook); GenNtfyDecls(OnlyS2C(genmsg.NotifiesSorted)); #> private void InvokeEvent(LazyNotification lazyNotification) { var ntf = lazyNotification.Notifications; switch (lazyNotification.NotifyType) { <# foreach(var ntfy in OnlyS2C(genmsg.NotifiesSorted)) { #> case NotificationType.<#= ntfy.name #>: { var ntfc = (<#=ntfy.name #>[])ntf; Process<#= ntfy.name #>(ntfc); On<#= ntfy.name #>?.Invoke(this, ntfc); var ev = OnEach<#= ntfy.name #>; var book = Book; foreach(var that in ntfc) {<# var bookitem = genm2b.rule.FirstOrDefault(x => x.from == ntfy.name); if(bookitem != null) { #> book?.Update<#= ntfy.name #>(that);<# } #> ProcessEach<#= ntfy.name #>(that); ev?.Invoke(this, that); } break; } <# } #> case NotificationType.Unknown: default: throw Tools.UnhandledDefault(lazyNotification.NotifyType); } } <# PushIndent("\t\t"); foreach(var ntfy in OnlyS2C(genmsg.NotifiesSorted)) { WriteLine($"partial void Process{ntfy.name}({ntfy.name}[] notifies);"); WriteLine($"partial void ProcessEach{ntfy.name}({ntfy.name} notifies);"); } #> } } ================================================ FILE: TSLib/Generated/Book.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // using System.Collections.Generic; #pragma warning disable CS8019 // Ignore unused imports using i8 = System.SByte; using u8 = System.Byte; using i16 = System.Int16; using u16 = System.UInt16; using i32 = System.Int32; using u32 = System.UInt32; using i64 = System.Int64; using u64 = System.UInt64; using f32 = System.Single; using f64 = System.Double; using str = System.String; using DateTime = System.DateTime; using Duration = System.TimeSpan; using DurationSeconds = System.TimeSpan; using DurationMilliseconds = System.TimeSpan; using SocketAddr = System.String; using IpAddr = System.String; using Ts3ErrorCode = TSLib.TsErrorCode; using Ts3Permission = TSLib.TsPermission; using IconHash = System.Int32; using ConnectionId = System.UInt32; using EccKeyPubP256 = TSLib.Uid; #pragma warning restore CS8019 #nullable enable namespace TSLib.Full.Book { public sealed partial class ServerGroup { #pragma warning disable CS8618 public ServerGroup() #pragma warning restore CS8618 { } public GroupType GroupType { get; set; } public IconHash IconId { get; set; } public ServerGroupId Id { get; internal set; } public bool IsPermanent { get; set; } public str Name { get; set; } public GroupNamingMode NamingMode { get; set; } public i32 NeededMemberAddPower { get; set; } public i32? NeededMemberRemovePower { get; set; } public i32 NeededModifyPower { get; set; } public i32 SortId { get; set; } } public sealed partial class File { #pragma warning disable CS8618 public File() #pragma warning restore CS8618 { } public bool IsFile { get; set; } public DateTime LastChanged { get; set; } public str Path { get; set; } public i64 Size { get; set; } } public sealed partial class OptionalChannelData { #pragma warning disable CS8618 public OptionalChannelData() #pragma warning restore CS8618 { } public str Description { get; set; } } public sealed partial class Channel { #pragma warning disable CS8618 public Channel() #pragma warning restore CS8618 { } public ChannelType ChannelType { get; set; } public Codec? Codec { get; set; } public i32? CodecLatencyFactor { get; set; } public u8? CodecQuality { get; set; } public Duration? DeleteDelay { get; set; } public bool ForcedSilence { get; internal set; } public bool? HasPassword { get; set; } public IconHash? IconId { get; set; } public ChannelId Id { get; internal set; } public bool? IsDefault { get; set; } public bool? IsPrivate { get; set; } public bool? IsUnencrypted { get; set; } public MaxClients? MaxClients { get; set; } public MaxClients? MaxFamilyClients { get; set; } public str Name { get; set; } public i32? NeededTalkPower { get; set; } public OptionalChannelData? OptionalData { get; internal set; } public ChannelId Order { get; set; } public ChannelId Parent { get; set; } public ChannelPermissionHint? PermissionHints { get; set; } public str? PhoneticName { get; set; } public bool Subscribed { get; set; } public str? Topic { get; set; } } public sealed partial class OptionalClientData { #pragma warning disable CS8618 public OptionalClientData() #pragma warning restore CS8618 { } public DateTime Created { get; internal set; } public DateTime LastConnected { get; internal set; } public str? LoginName { get; internal set; } public u64 MonthBytesDownloaded { get; internal set; } public u64 MonthBytesUploaded { get; internal set; } public str Platform { get; set; } public u64 TotalBytesDownloaded { get; internal set; } public u64 TotalBytesUploaded { get; internal set; } public u32 TotalConnection { get; internal set; } public str Version { get; set; } public str VersionSign { get; set; } } public sealed partial class ConnectionClientData { #pragma warning disable CS8618 public ConnectionClientData() #pragma warning restore CS8618 { } public u64 BandwidthReceivedLastMinuteControl { get; internal set; } public u64 BandwidthReceivedLastMinuteKeepalive { get; internal set; } public u64 BandwidthReceivedLastMinuteSpeech { get; internal set; } public u64 BandwidthReceivedLastSecondControl { get; internal set; } public u64 BandwidthReceivedLastSecondKeepalive { get; internal set; } public u64 BandwidthReceivedLastSecondSpeech { get; internal set; } public u64 BandwidthSentLastMinuteControl { get; internal set; } public u64 BandwidthSentLastMinuteKeepalive { get; internal set; } public u64 BandwidthSentLastMinuteSpeech { get; internal set; } public u64 BandwidthSentLastSecondControl { get; internal set; } public u64 BandwidthSentLastSecondKeepalive { get; internal set; } public u64 BandwidthSentLastSecondSpeech { get; internal set; } public u64 BytesReceivedControl { get; internal set; } public u64 BytesReceivedKeepalive { get; internal set; } public u64 BytesReceivedSpeech { get; internal set; } public u64 BytesSentControl { get; internal set; } public u64 BytesSentKeepalive { get; internal set; } public u64 BytesSentSpeech { get; internal set; } public SocketAddr? ClientAddress { get; internal set; } public f32 ClientToServerPacketlossControl { get; internal set; } public f32 ClientToServerPacketlossKeepalive { get; internal set; } public f32 ClientToServerPacketlossSpeech { get; internal set; } public f32 ClientToServerPacketlossTotal { get; internal set; } public Duration ConnectedTime { get; internal set; } public u64 FiletransferBandwidthReceived { get; internal set; } public u64 FiletransferBandwidthSent { get; internal set; } public Duration IdleTime { get; internal set; } public u64 PacketsReceivedControl { get; internal set; } public u64 PacketsReceivedKeepalive { get; internal set; } public u64 PacketsReceivedSpeech { get; internal set; } public u64 PacketsSentControl { get; internal set; } public u64 PacketsSentKeepalive { get; internal set; } public u64 PacketsSentSpeech { get; internal set; } public Duration Ping { get; internal set; } public Duration PingDeviation { get; internal set; } public f32 ServerToClientPacketlossControl { get; internal set; } public f32 ServerToClientPacketlossKeepalive { get; internal set; } public f32 ServerToClientPacketlossSpeech { get; internal set; } public f32 ServerToClientPacketlossTotal { get; internal set; } } public sealed partial class Client { #pragma warning disable CS8618 public Client() #pragma warning restore CS8618 { ServerGroups = new HashSet(); } public str AvatarHash { get; internal set; } public str? AwayMessage { get; set; } public str Badges { get; set; } public ChannelId Channel { get; set; } public ChannelGroupId ChannelGroup { get; set; } public ClientType ClientType { get; internal set; } public ConnectionClientData? ConnectionData { get; internal set; } public str CountryCode { get; internal set; } public ClientDbId DatabaseId { get; internal set; } public str Description { get; set; } public IconHash IconId { get; internal set; } public ClientId Id { get; internal set; } public ChannelId InheritedChannelGroupFromChannel { get; internal set; } public bool InputHardwareEnabled { get; set; } public bool InputMuted { get; set; } public bool IsChannelCommander { get; set; } public bool IsPrioritySpeaker { get; set; } public bool IsRecording { get; set; } public str Metadata { get; set; } public str Name { get; set; } public i32 NeededServerqueryViewPower { get; internal set; } public OptionalClientData? OptionalData { get; internal set; } public bool OutputHardwareEnabled { get; set; } public bool OutputMuted { get; set; } public bool OutputOnlyMuted { get; set; } public ClientPermissionHint? PermissionHints { get; set; } public str PhoneticName { get; set; } public HashSet ServerGroups { get; set; } public i32 TalkPower { get; internal set; } public bool TalkPowerGranted { get; set; } public TalkPowerRequest? TalkPowerRequest { get; internal set; } public Uid? Uid { get; internal set; } public u32 UnreadMessages { get; internal set; } } public sealed partial class OptionalServerData { #pragma warning disable CS8618 public OptionalServerData() #pragma warning restore CS8618 { } public u32 AntifloodPointsNeededCommandBlock { get; set; } public u32 AntifloodPointsTickReduce { get; set; } public bool Autostart { get; set; } public u64 ChannelCount { get; internal set; } public u16 ClientCount { get; internal set; } public u32 ComplainAutobanCount { get; set; } public Duration ComplainAutobanTime { get; set; } public Duration ComplainRemoveTime { get; set; } public u32 ConnectionCount { get; internal set; } public ChannelGroupId DefaultChannelAdminGroup { get; set; } public u64 DownloadQuota { get; set; } public bool HasPassword { get; internal set; } public bool LogChannel { get; set; } public bool LogClient { get; set; } public bool LogFiletransfer { get; set; } public bool LogPermissions { get; set; } public bool LogQuery { get; set; } public bool LogServer { get; set; } public str MachineId { get; internal set; } public u64 MaxDownloadTotalBandwith { get; set; } public u64 MaxUploadTotalBandwith { get; set; } public DateTime MinAndroidVersion { get; internal set; } public u16 MinClientsForceSilence { get; set; } public DateTime MinClientVersion { get; internal set; } public DateTime MinIosVersion { get; internal set; } public u64 MonthBytesDownloaded { get; internal set; } public u64 MonthBytesUploaded { get; internal set; } public u8 NeededIdentitySecurityLevel { get; set; } public u16 Port { get; internal set; } public u32 QueryCount { get; internal set; } public u32 QueryOnlineCount { get; internal set; } public u16 ReservedSlots { get; set; } public u64 TotalBytesDownloaded { get; internal set; } public u64 TotalBytesUploaded { get; internal set; } public f32 TotalPacketlossControl { get; internal set; } public f32 TotalPacketlossKeepalive { get; internal set; } public f32 TotalPacketlossSpeech { get; internal set; } public f32 TotalPacketlossTotal { get; internal set; } public Duration TotalPing { get; internal set; } public u64 UploadQuota { get; set; } public Duration Uptime { get; internal set; } public bool WeblistEnabled { get; set; } } public sealed partial class ConnectionServerData { #pragma warning disable CS8618 public ConnectionServerData() #pragma warning restore CS8618 { } public u64 BandwidthReceivedLastMinuteTotal { get; internal set; } public u64 BandwidthReceivedLastSecondTotal { get; internal set; } public u64 BandwidthSentLastMinuteTotal { get; internal set; } public u64 BandwidthSentLastSecondTotal { get; internal set; } public u64 BytesReceivedTotal { get; internal set; } public u64 BytesSentTotal { get; internal set; } public Duration ConnectedTime { get; internal set; } public u64 FiletransferBandwidthReceived { get; internal set; } public u64 FiletransferBandwidthSent { get; internal set; } public u64 FiletransferBytesReceivedTotal { get; internal set; } public u64 FiletransferBytesSentTotal { get; internal set; } public f32 PacketlossTotal { get; internal set; } public u64 PacketsReceivedTotal { get; internal set; } public u64 PacketsSentTotal { get; internal set; } public Duration Ping { get; internal set; } } public sealed partial class Server { #pragma warning disable CS8618 public Server() #pragma warning restore CS8618 { Ips = new HashSet(); } public bool AskForPrivilegekey { get; internal set; } public CodecEncryptionMode CodecEncryptionMode { get; set; } public ConnectionServerData? ConnectionData { get; internal set; } public DateTime Created { get; internal set; } public ChannelGroupId DefaultChannelGroup { get; set; } public ServerGroupId DefaultServerGroup { get; set; } public Duration HostbannerGfxInterval { get; set; } public str HostbannerGfxUrl { get; set; } public HostBannerMode HostbannerMode { get; set; } public str HostbannerUrl { get; set; } public str HostbuttonGfxUrl { get; set; } public str HostbuttonTooltip { get; set; } public str HostbuttonUrl { get; set; } public str Hostmessage { get; set; } public HostMessageMode HostmessageMode { get; set; } public IconHash IconId { get; internal set; } public HashSet Ips { get; internal set; } public LicenseType License { get; internal set; } public u16 MaxClients { get; internal set; } public str Name { get; internal set; } public str Nickname { get; internal set; } public OptionalServerData? OptionalData { get; internal set; } public str PhoneticName { get; set; } public str Platform { get; internal set; } public f32 PrioritySpeakerDimmModificator { get; set; } public u16 ProtocolVersion { get; internal set; } public EccKeyPubP256 PublicKey { get; internal set; } public Duration TempChannelDefaultDeleteDelay { get; set; } public str Version { get; internal set; } public u64 VirtualServerId { get; internal set; } public str WelcomeMessage { get; internal set; } } public sealed partial class Connection { #pragma warning disable CS8618 public Connection() #pragma warning restore CS8618 { Clients = new Dictionary(); Channels = new Dictionary(); Groups = new Dictionary(); } public Dictionary Channels { get; internal set; } public Dictionary Clients { get; internal set; } public Dictionary Groups { get; internal set; } public ClientId OwnClient { get; internal set; } public Server Server { get; internal set; } } } ================================================ FILE: TSLib/Generated/Book.tt ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // <#@ template debug="true" hostSpecific="true" language="C#" #> <#@ include file="BookParser.ttinclude" once="true" #> <#@ output extension=".cs" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> using System.Collections.Generic; <#= ConversionSet #> #nullable enable namespace TSLib.Full.Book { <# var gen = BookDeclarations.Parse(Host.ResolvePath("../Declarations/Book.toml")); foreach (var struc in gen.@struct) { #> public sealed partial class <#= struc.name #> { #pragma warning disable CS8618 public <#= struc.name #>() #pragma warning restore CS8618 { <# ClearIndent(); PushIndent("\t\t\t"); foreach(var prop in struc.properties) { switch(prop.mod) { case "array": WriteLine($"{prop.name} = new HashSet<{prop.type}>();"); break; case "map": WriteLine($"{prop.name} = new Dictionary<{prop.key},{prop.type}>();"); break; } } #> } <# foreach(var prop in struc.properties.OrderBy(x => x.name)) { if (!prop.get.Value && !prop.set.Value) continue; #> public <# switch(prop.mod) { case "array": Write($"HashSet<{prop.type}>"); break; case "map": Write($"Dictionary<{prop.key},{prop.type}>"); break; default: Write($"{prop.type}{(prop.opt == true ? "?" : "")}"); break; } #> <#= prop.name #> { <#= prop.get.Value?"":"internal " #>get; <#= prop.set.Value?"":"internal " #>set; }<# } #> } <# } #> } ================================================ FILE: TSLib/Generated/BookParser.ttinclude ================================================ <#@ include file="Util.ttinclude" once="true" #> <#+ public class BookDeclarations { public static BookDeclarations Parse(string file) { var toml = Nett.Toml.ReadFile(file); // transfer all optional get/set confs foreach (var struc in toml.@struct) { foreach (var prop in struc.properties) { prop.get ??= struc.accessor.get; prop.set ??= struc.accessor.set; } } return toml; } public Struct[] @struct { get; set; } public class Struct { public string name { get; set; } public Id[] id { get; set; } public string doc { get; set; } public Accessor accessor { get; set; } public Property[] properties { get; set; } } public class Id { public string @struct { get; set; } public string prop { get; set; } } public class Accessor { public bool get { get; set; } public bool set { get; set; } } public class Property { public string name { get; set; } public string type { get; set; } public bool? get { get; set; } public bool? set { get; set; } public bool? opt { get; set; } public string mod { get; set; } public string key { get; set; } } } #> ================================================ FILE: TSLib/Generated/ErrorParser.ttinclude ================================================ <#@ assembly name="System.Core" #> <#@ assembly name="Microsoft.VisualBasic" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="Microsoft.VisualBasic.FileIO" #> <# List ParseErrors() { string declFilePath = Host.ResolvePath("../Declarations/Errors.csv"); var data = new List(); using (TextFieldParser parser = new TextFieldParser(declFilePath)) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); while (!parser.EndOfData) { var line = parser.ReadFields(); data.Add(new GenError { Doc = line[1], Name = line[0], Value = line[2] }); } } data.RemoveAt(0); return data; } #><#+ class GenError { public string Doc { get; set; } public string Name { get; set; } public string Value { get; set; } } #> ================================================ FILE: TSLib/Generated/M2B.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // using TSLib.Messages; #pragma warning disable CS8019 // Ignore unused imports using i8 = System.SByte; using u8 = System.Byte; using i16 = System.Int16; using u16 = System.UInt16; using i32 = System.Int32; using u32 = System.UInt32; using i64 = System.Int64; using u64 = System.UInt64; using f32 = System.Single; using f64 = System.Double; using str = System.String; using DateTime = System.DateTime; using Duration = System.TimeSpan; using DurationSeconds = System.TimeSpan; using DurationMilliseconds = System.TimeSpan; using SocketAddr = System.String; using IpAddr = System.String; using Ts3ErrorCode = TSLib.TsErrorCode; using Ts3Permission = TSLib.TsPermission; using IconHash = System.Int32; using ConnectionId = System.UInt32; using EccKeyPubP256 = TSLib.Uid; #pragma warning restore CS8019 namespace TSLib.Full.Book { public partial class Connection { #pragma warning disable IDE0017, CS0472 // Ignore "Object initialization can be simplified", "Something with == and null..." public void UpdateInitServer(InitServer msg) { var obj = new Server(); SetClientDataFun(msg); { var tmpv = msg.AskForPrivilegekey; if (tmpv != null) obj.AskForPrivilegekey = (bool)tmpv; } { var tmpv = msg.CodecEncryptionMode; if (tmpv != null) obj.CodecEncryptionMode = (CodecEncryptionMode)tmpv; } { var tmpv = msg.ServerCreated; if (tmpv != null) obj.Created = (DateTime)tmpv; } { var tmpv = msg.DefaultChannelGroup; if (tmpv != null) obj.DefaultChannelGroup = (ChannelGroupId)tmpv; } { var tmpv = msg.DefaultServerGroup; if (tmpv != null) obj.DefaultServerGroup = (ServerGroupId)tmpv; } { var tmpv = msg.HostbannerGfxInterval; if (tmpv != null) obj.HostbannerGfxInterval = (Duration)tmpv; } { var tmpv = msg.HostbannerGfxUrl; if (tmpv != null) obj.HostbannerGfxUrl = (str)tmpv; } { var tmpv = msg.HostbannerMode; if (tmpv != null) obj.HostbannerMode = (HostBannerMode)tmpv; } { var tmpv = msg.HostbannerUrl; if (tmpv != null) obj.HostbannerUrl = (str)tmpv; } { var tmpv = msg.HostbuttonGfxUrl; if (tmpv != null) obj.HostbuttonGfxUrl = (str)tmpv; } { var tmpv = msg.HostbuttonTooltip; if (tmpv != null) obj.HostbuttonTooltip = (str)tmpv; } { var tmpv = msg.HostbuttonUrl; if (tmpv != null) obj.HostbuttonUrl = (str)tmpv; } { var tmpv = msg.Hostmessage; if (tmpv != null) obj.Hostmessage = (str)tmpv; } { var tmpv = msg.HostmessageMode; if (tmpv != null) obj.HostmessageMode = (HostMessageMode)tmpv; } { var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; } { var tmpa = msg.ServerIp; if (tmpa != null) { obj.Ips.Clear(); obj.Ips.UnionWith(tmpa); } } { var tmpv = msg.MaxClients; if (tmpv != null) obj.MaxClients = (u16)tmpv; } { var tmpv = msg.ServerName; if (tmpv != null) obj.Name = (str)tmpv; } { var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; } { var tmpv = msg.Nickname; if (tmpv != null) obj.Nickname = (str)tmpv; } { var tmpv = msg.ServerPhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; } { var tmpv = msg.PhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; } { var tmpv = msg.ServerPlatform; if (tmpv != null) obj.Platform = (str)tmpv; } { var tmpv = msg.PrioritySpeakerDimmModificator; if (tmpv != null) obj.PrioritySpeakerDimmModificator = (f32)tmpv; } { var tmpv = msg.ProtocolVersion; if (tmpv != null) obj.ProtocolVersion = (u16)tmpv; } { var tmpv = msg.TempChannelDefaultDeleteDelay; if (tmpv != null) obj.TempChannelDefaultDeleteDelay = (Duration)tmpv; } { var tmpv = msg.ServerVersion; if (tmpv != null) obj.Version = (str)tmpv; } { var tmpv = msg.VirtualServerId; if (tmpv != null) obj.VirtualServerId = (u64)tmpv; } { var tmpv = msg.WelcomeMessage; if (tmpv != null) obj.WelcomeMessage = (str)tmpv; } SetServer(obj); PostInitServer(msg); } partial void PostInitServer(InitServer msg); public void UpdateChannelCreated(ChannelCreated msg) { var obj = new Channel(); { var tmp = MaxClientsCcFun(msg); { var tmpv = tmp.Item1; if (tmpv != null) obj.MaxClients = (MaxClients)tmpv; } { var tmpv = tmp.Item2; if (tmpv != null) obj.MaxFamilyClients = (MaxClients)tmpv; } } { var tmpv = ChannelTypeCcFun(msg); if (tmpv != null) obj.ChannelType = (ChannelType)tmpv; } { var tmpv = ReturnFalse(msg); if (tmpv != null) obj.ForcedSilence = (bool)tmpv; } obj.IsPrivate = null; { var tmpv = ReturnFalse(msg); if (tmpv != null) obj.Subscribed = (bool)tmpv; } obj.PermissionHints = null; obj.OptionalData = null; { var tmpv = ChannelOrderCcFun(msg); if (tmpv != null) obj.Order = (ChannelId)tmpv; } { var tmpv = msg.Codec; if (tmpv != null) obj.Codec = (Codec)tmpv; } { var tmpv = msg.CodecLatencyFactor; if (tmpv != null) obj.CodecLatencyFactor = (i32)tmpv; } { var tmpv = msg.CodecQuality; if (tmpv != null) obj.CodecQuality = (u8)tmpv; } { var tmpv = msg.DeleteDelay; if (tmpv != null) obj.DeleteDelay = (Duration)tmpv; } { var tmpv = msg.HasPassword; if (tmpv != null) obj.HasPassword = (bool)tmpv; } { var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; } { var tmpv = msg.IsDefault; if (tmpv != null) obj.IsDefault = (bool)tmpv; } { var tmpv = msg.IsUnencrypted; if (tmpv != null) obj.IsUnencrypted = (bool)tmpv; } { var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; } { var tmpv = msg.NeededTalkPower; if (tmpv != null) obj.NeededTalkPower = (i32)tmpv; } { var tmpv = msg.ParentId; if (tmpv != null) obj.Parent = (ChannelId)tmpv; } { var tmpv = msg.PhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; } { var tmpv = msg.Topic; if (tmpv != null) obj.Topic = (str)tmpv; } SetChannel(obj, msg.ChannelId); PostChannelCreated(msg); } partial void PostChannelCreated(ChannelCreated msg); public void UpdateChannelDeleted(ChannelDeleted msg) { RemoveChannel(msg.ChannelId); PostChannelDeleted(msg); } partial void PostChannelDeleted(ChannelDeleted msg); public void UpdateChannelEdited(ChannelEdited msg) { var obj = GetChannel(msg.ChannelId); if (obj == null) { Log.Warn("Internal Book protocol error. Update 'ChannelEdited' has no local object ({$msg})", msg); return; } { var tmp = MaxClientsCeFun(msg); { var tmpv = tmp.Item1; if (tmpv != null) obj.MaxClients = (MaxClients)tmpv; } { var tmpv = tmp.Item2; if (tmpv != null) obj.MaxFamilyClients = (MaxClients)tmpv; } } { var tmpv = ChannelTypeCeFun(msg); if (tmpv != null) obj.ChannelType = (ChannelType)tmpv; } { var tmpv = ChannelOrderCeFun(msg); if (tmpv != null) obj.Order = (ChannelId)tmpv; } { var tmpv = msg.Codec; if (tmpv != null) obj.Codec = (Codec)tmpv; } { var tmpv = msg.CodecLatencyFactor; if (tmpv != null) obj.CodecLatencyFactor = (i32)tmpv; } { var tmpv = msg.CodecQuality; if (tmpv != null) obj.CodecQuality = (u8)tmpv; } { var tmpv = msg.DeleteDelay; if (tmpv != null) obj.DeleteDelay = (Duration)tmpv; } { var tmpv = msg.HasPassword; if (tmpv != null) obj.HasPassword = (bool)tmpv; } { var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; } { var tmpv = msg.IsDefault; if (tmpv != null) obj.IsDefault = (bool)tmpv; } { var tmpv = msg.IsUnencrypted; if (tmpv != null) obj.IsUnencrypted = (bool)tmpv; } { var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; } { var tmpv = msg.NeededTalkPower; if (tmpv != null) obj.NeededTalkPower = (i32)tmpv; } { var tmpv = msg.PhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; } { var tmpv = msg.Topic; if (tmpv != null) obj.Topic = (str)tmpv; } PostChannelEdited(msg); } partial void PostChannelEdited(ChannelEdited msg); public void UpdateChannelList(ChannelList msg) { var obj = new Channel(); { var tmp = MaxClientsClFun(msg); { var tmpv = tmp.Item1; if (tmpv != null) obj.MaxClients = (MaxClients)tmpv; } { var tmpv = tmp.Item2; if (tmpv != null) obj.MaxFamilyClients = (MaxClients)tmpv; } } { var tmpv = ChannelTypeClFun(msg); if (tmpv != null) obj.ChannelType = (ChannelType)tmpv; } { var tmpv = ReturnFalse(msg); if (tmpv != null) obj.Subscribed = (bool)tmpv; } obj.PermissionHints = null; obj.OptionalData = null; { var tmpv = msg.Codec; if (tmpv != null) obj.Codec = (Codec)tmpv; } { var tmpv = msg.CodecLatencyFactor; if (tmpv != null) obj.CodecLatencyFactor = (i32)tmpv; } { var tmpv = msg.CodecQuality; if (tmpv != null) obj.CodecQuality = (u8)tmpv; } { var tmpv = msg.DeleteDelay; if (tmpv != null) obj.DeleteDelay = (Duration)tmpv; } { var tmpv = msg.ForcedSilence; if (tmpv != null) obj.ForcedSilence = (bool)tmpv; } { var tmpv = msg.HasPassword; if (tmpv != null) obj.HasPassword = (bool)tmpv; } { var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; } { var tmpv = msg.IsDefault; if (tmpv != null) obj.IsDefault = (bool)tmpv; } { var tmpv = msg.IsPrivate; if (tmpv != null) obj.IsPrivate = (bool)tmpv; } { var tmpv = msg.IsUnencrypted; if (tmpv != null) obj.IsUnencrypted = (bool)tmpv; } { var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; } { var tmpv = msg.NeededTalkPower; if (tmpv != null) obj.NeededTalkPower = (i32)tmpv; } { var tmpv = msg.Order; if (tmpv != null) obj.Order = (ChannelId)tmpv; } { var tmpv = msg.ParentId; if (tmpv != null) obj.Parent = (ChannelId)tmpv; } { var tmpv = msg.PhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; } { var tmpv = msg.Topic; if (tmpv != null) obj.Topic = (str)tmpv; } SetChannel(obj, msg.ChannelId); PostChannelList(msg); } partial void PostChannelList(ChannelList msg); public void UpdateChannelMoved(ChannelMoved msg) { var obj = GetChannel(msg.ChannelId); if (obj == null) { Log.Warn("Internal Book protocol error. Update 'ChannelMoved' has no local object ({$msg})", msg); return; } { var tmpv = ChannelOrderCmFun(msg); if (tmpv != null) obj.Order = (ChannelId)tmpv; } { var tmpv = msg.ParentId; if (tmpv != null) obj.Parent = (ChannelId)tmpv; } PostChannelMoved(msg); } partial void PostChannelMoved(ChannelMoved msg); public void UpdateChannelSubscribed(ChannelSubscribed msg) { var obj = GetChannel(msg.ChannelId); if (obj == null) { Log.Warn("Internal Book protocol error. Update 'ChannelSubscribed' has no local object ({$msg})", msg); return; } { var tmpv = ChannelSubscribeFun(msg); if (tmpv != null) obj.Subscribed = (bool)tmpv; } PostChannelSubscribed(msg); } partial void PostChannelSubscribed(ChannelSubscribed msg); public void UpdateChannelUnsubscribed(ChannelUnsubscribed msg) { var obj = GetChannel(msg.ChannelId); if (obj == null) { Log.Warn("Internal Book protocol error. Update 'ChannelUnsubscribed' has no local object ({$msg})", msg); return; } { var tmpv = ChannelUnsubscribeFun(msg); if (tmpv != null) obj.Subscribed = (bool)tmpv; } PostChannelUnsubscribed(msg); } partial void PostChannelUnsubscribed(ChannelUnsubscribed msg); public void UpdateClientChannelGroupChanged(ClientChannelGroupChanged msg) { var obj = GetClient(msg.ClientId); if (obj == null) { Log.Warn("Internal Book protocol error. Update 'ClientChannelGroupChanged' has no local object ({$msg})", msg); return; } { var tmpv = msg.ChannelGroup; if (tmpv != null) obj.ChannelGroup = (ChannelGroupId)tmpv; } PostClientChannelGroupChanged(msg); } partial void PostClientChannelGroupChanged(ClientChannelGroupChanged msg); public void UpdateClientEnterView(ClientEnterView msg) { var obj = new Client(); { var tmpv = AwayCevFun(msg); if (tmpv != null) obj.AwayMessage = (str)tmpv; } { var tmpv = ClientTypeCevFun(msg); if (tmpv != null) obj.ClientType = (ClientType)tmpv; } { var tmpv = TalkPowerCevFun(msg); if (tmpv != null) obj.TalkPowerRequest = (TalkPowerRequest)tmpv; } obj.PermissionHints = null; obj.OptionalData = null; obj.ConnectionData = null; { var tmpv = msg.AvatarHash; if (tmpv != null) obj.AvatarHash = (str)tmpv; } { var tmpv = msg.Badges; if (tmpv != null) obj.Badges = (str)tmpv; } { var tmpv = msg.TargetChannelId; if (tmpv != null) obj.Channel = (ChannelId)tmpv; } { var tmpv = msg.ChannelGroup; if (tmpv != null) obj.ChannelGroup = (ChannelGroupId)tmpv; } { var tmpv = msg.CountryCode; if (tmpv != null) obj.CountryCode = (str)tmpv; } { var tmpv = msg.DatabaseId; if (tmpv != null) obj.DatabaseId = (ClientDbId)tmpv; } { var tmpv = msg.Description; if (tmpv != null) obj.Description = (str)tmpv; } { var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; } { var tmpv = msg.InheritedChannelGroupFromChannel; if (tmpv != null) obj.InheritedChannelGroupFromChannel = (ChannelId)tmpv; } { var tmpv = msg.InputHardwareEnabled; if (tmpv != null) obj.InputHardwareEnabled = (bool)tmpv; } { var tmpv = msg.InputMuted; if (tmpv != null) obj.InputMuted = (bool)tmpv; } { var tmpv = msg.IsChannelCommander; if (tmpv != null) obj.IsChannelCommander = (bool)tmpv; } { var tmpv = msg.IsPrioritySpeaker; if (tmpv != null) obj.IsPrioritySpeaker = (bool)tmpv; } { var tmpv = msg.IsRecording; if (tmpv != null) obj.IsRecording = (bool)tmpv; } { var tmpv = msg.Metadata; if (tmpv != null) obj.Metadata = (str)tmpv; } { var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; } { var tmpv = msg.NeededServerqueryViewPower; if (tmpv != null) obj.NeededServerqueryViewPower = (i32)tmpv; } { var tmpv = msg.OutputHardwareEnabled; if (tmpv != null) obj.OutputHardwareEnabled = (bool)tmpv; } { var tmpv = msg.OutputMuted; if (tmpv != null) obj.OutputMuted = (bool)tmpv; } { var tmpv = msg.OutputOnlyMuted; if (tmpv != null) obj.OutputOnlyMuted = (bool)tmpv; } { var tmpv = msg.PhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; } { var tmpa = msg.ServerGroups; if (tmpa != null) { obj.ServerGroups.Clear(); obj.ServerGroups.UnionWith(tmpa); } } { var tmpv = msg.TalkPower; if (tmpv != null) obj.TalkPower = (i32)tmpv; } { var tmpv = msg.TalkPowerGranted; if (tmpv != null) obj.TalkPowerGranted = (bool)tmpv; } { var tmpv = msg.Uid; if (tmpv != null) obj.Uid = (Uid)tmpv; } { var tmpv = msg.UnreadMessages; if (tmpv != null) obj.UnreadMessages = (u32)tmpv; } SetClient(obj, msg.ClientId); PostClientEnterView(msg); } partial void PostClientEnterView(ClientEnterView msg); public void UpdateClientLeftView(ClientLeftView msg) { RemoveClient(msg.ClientId); PostClientLeftView(msg); } partial void PostClientLeftView(ClientLeftView msg); public void UpdateClientMoved(ClientMoved msg) { var obj = GetClient(msg.ClientId); if (obj == null) { Log.Warn("Internal Book protocol error. Update 'ClientMoved' has no local object ({$msg})", msg); return; } { var tmpv = msg.TargetChannelId; if (tmpv != null) obj.Channel = (ChannelId)tmpv; } PostClientMoved(msg); } partial void PostClientMoved(ClientMoved msg); public void UpdateClientConnectionInfo(ClientConnectionInfo msg) { var obj = new ConnectionClientData(); { var tmpv = AddressFun(msg); if (tmpv != null) obj.ClientAddress = (SocketAddr)tmpv; } { var tmpv = msg.BandwidthReceivedLastMinuteControl; if (tmpv != null) obj.BandwidthReceivedLastMinuteControl = (u64)tmpv; } { var tmpv = msg.BandwidthReceivedLastMinuteKeepalive; if (tmpv != null) obj.BandwidthReceivedLastMinuteKeepalive = (u64)tmpv; } { var tmpv = msg.BandwidthReceivedLastMinuteSpeech; if (tmpv != null) obj.BandwidthReceivedLastMinuteSpeech = (u64)tmpv; } { var tmpv = msg.BandwidthReceivedLastSecondControl; if (tmpv != null) obj.BandwidthReceivedLastSecondControl = (u64)tmpv; } { var tmpv = msg.BandwidthReceivedLastSecondKeepalive; if (tmpv != null) obj.BandwidthReceivedLastSecondKeepalive = (u64)tmpv; } { var tmpv = msg.BandwidthReceivedLastSecondSpeech; if (tmpv != null) obj.BandwidthReceivedLastSecondSpeech = (u64)tmpv; } { var tmpv = msg.BandwidthSentLastMinuteControl; if (tmpv != null) obj.BandwidthSentLastMinuteControl = (u64)tmpv; } { var tmpv = msg.BandwidthSentLastMinuteKeepalive; if (tmpv != null) obj.BandwidthSentLastMinuteKeepalive = (u64)tmpv; } { var tmpv = msg.BandwidthSentLastMinuteSpeech; if (tmpv != null) obj.BandwidthSentLastMinuteSpeech = (u64)tmpv; } { var tmpv = msg.BandwidthSentLastSecondControl; if (tmpv != null) obj.BandwidthSentLastSecondControl = (u64)tmpv; } { var tmpv = msg.BandwidthSentLastSecondKeepalive; if (tmpv != null) obj.BandwidthSentLastSecondKeepalive = (u64)tmpv; } { var tmpv = msg.BandwidthSentLastSecondSpeech; if (tmpv != null) obj.BandwidthSentLastSecondSpeech = (u64)tmpv; } { var tmpv = msg.BytesReceivedControl; if (tmpv != null) obj.BytesReceivedControl = (u64)tmpv; } { var tmpv = msg.BytesReceivedKeepalive; if (tmpv != null) obj.BytesReceivedKeepalive = (u64)tmpv; } { var tmpv = msg.BytesReceivedSpeech; if (tmpv != null) obj.BytesReceivedSpeech = (u64)tmpv; } { var tmpv = msg.BytesSentControl; if (tmpv != null) obj.BytesSentControl = (u64)tmpv; } { var tmpv = msg.BytesSentKeepalive; if (tmpv != null) obj.BytesSentKeepalive = (u64)tmpv; } { var tmpv = msg.BytesSentSpeech; if (tmpv != null) obj.BytesSentSpeech = (u64)tmpv; } { var tmpv = msg.ClientToServerPacketlossControl; if (tmpv != null) obj.ClientToServerPacketlossControl = (f32)tmpv; } { var tmpv = msg.ClientToServerPacketlossKeepalive; if (tmpv != null) obj.ClientToServerPacketlossKeepalive = (f32)tmpv; } { var tmpv = msg.ClientToServerPacketlossSpeech; if (tmpv != null) obj.ClientToServerPacketlossSpeech = (f32)tmpv; } { var tmpv = msg.ClientToServerPacketlossTotal; if (tmpv != null) obj.ClientToServerPacketlossTotal = (f32)tmpv; } { var tmpv = msg.ConnectedTime; if (tmpv != null) obj.ConnectedTime = (Duration)tmpv; } { var tmpv = msg.FiletransferBandwidthReceived; if (tmpv != null) obj.FiletransferBandwidthReceived = (u64)tmpv; } { var tmpv = msg.FiletransferBandwidthSent; if (tmpv != null) obj.FiletransferBandwidthSent = (u64)tmpv; } { var tmpv = msg.IdleTime; if (tmpv != null) obj.IdleTime = (Duration)tmpv; } { var tmpv = msg.PacketsReceivedControl; if (tmpv != null) obj.PacketsReceivedControl = (u64)tmpv; } { var tmpv = msg.PacketsReceivedKeepalive; if (tmpv != null) obj.PacketsReceivedKeepalive = (u64)tmpv; } { var tmpv = msg.PacketsReceivedSpeech; if (tmpv != null) obj.PacketsReceivedSpeech = (u64)tmpv; } { var tmpv = msg.PacketsSentControl; if (tmpv != null) obj.PacketsSentControl = (u64)tmpv; } { var tmpv = msg.PacketsSentKeepalive; if (tmpv != null) obj.PacketsSentKeepalive = (u64)tmpv; } { var tmpv = msg.PacketsSentSpeech; if (tmpv != null) obj.PacketsSentSpeech = (u64)tmpv; } { var tmpv = msg.Ping; if (tmpv != null) obj.Ping = (Duration)tmpv; } { var tmpv = msg.PingDeviation; if (tmpv != null) obj.PingDeviation = (Duration)tmpv; } { var tmpv = msg.ServerToClientPacketlossControl; if (tmpv != null) obj.ServerToClientPacketlossControl = (f32)tmpv; } { var tmpv = msg.ServerToClientPacketlossKeepalive; if (tmpv != null) obj.ServerToClientPacketlossKeepalive = (f32)tmpv; } { var tmpv = msg.ServerToClientPacketlossSpeech; if (tmpv != null) obj.ServerToClientPacketlossSpeech = (f32)tmpv; } { var tmpv = msg.ServerToClientPacketlossTotal; if (tmpv != null) obj.ServerToClientPacketlossTotal = (f32)tmpv; } SetConnectionClientData(obj, msg.ClientId); PostClientConnectionInfo(msg); } partial void PostClientConnectionInfo(ClientConnectionInfo msg); public void UpdateClientServerGroupAdded(ClientServerGroupAdded msg) { var obj = GetClient(msg.ClientId); if (obj == null) { Log.Warn("Internal Book protocol error. Update 'ClientServerGroupAdded' has no local object ({$msg})", msg); return; } obj.ServerGroups.Add(msg.ServerGroupId); PostClientServerGroupAdded(msg); } partial void PostClientServerGroupAdded(ClientServerGroupAdded msg); public void UpdateClientServerGroupRemoved(ClientServerGroupRemoved msg) { var obj = GetClient(msg.ClientId); if (obj == null) { Log.Warn("Internal Book protocol error. Update 'ClientServerGroupRemoved' has no local object ({$msg})", msg); return; } obj.ServerGroups.Remove(msg.ServerGroupId); PostClientServerGroupRemoved(msg); } partial void PostClientServerGroupRemoved(ClientServerGroupRemoved msg); public void UpdateClientUpdated(ClientUpdated msg) { var obj = GetClient(msg.ClientId); if (obj == null) { Log.Warn("Internal Book protocol error. Update 'ClientUpdated' has no local object ({$msg})", msg); return; } { var tmpv = AwayCuFun(msg); if (tmpv != null) obj.AwayMessage = (str)tmpv; } { var tmpv = TalkPowerCuFun(msg); if (tmpv != null) obj.TalkPowerRequest = (TalkPowerRequest)tmpv; } { var tmpv = msg.AvatarHash; if (tmpv != null) obj.AvatarHash = (str)tmpv; } { var tmpv = msg.Badges; if (tmpv != null) obj.Badges = (str)tmpv; } { var tmpv = msg.Description; if (tmpv != null) obj.Description = (str)tmpv; } { var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; } { var tmpv = msg.InputHardwareEnabled; if (tmpv != null) obj.InputHardwareEnabled = (bool)tmpv; } { var tmpv = msg.InputMuted; if (tmpv != null) obj.InputMuted = (bool)tmpv; } { var tmpv = msg.IsChannelCommander; if (tmpv != null) obj.IsChannelCommander = (bool)tmpv; } { var tmpv = msg.IsPrioritySpeaker; if (tmpv != null) obj.IsPrioritySpeaker = (bool)tmpv; } { var tmpv = msg.IsRecording; if (tmpv != null) obj.IsRecording = (bool)tmpv; } { var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; } { var tmpv = msg.OutputHardwareEnabled; if (tmpv != null) obj.OutputHardwareEnabled = (bool)tmpv; } { var tmpv = msg.OutputMuted; if (tmpv != null) obj.OutputMuted = (bool)tmpv; } { var tmpv = msg.PhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; } { var tmpa = msg.ServerGroups; if (tmpa != null) { obj.ServerGroups.Clear(); obj.ServerGroups.UnionWith(tmpa); } } { var tmpv = msg.TalkPower; if (tmpv != null) obj.TalkPower = (i32)tmpv; } { var tmpv = msg.TalkPowerGranted; if (tmpv != null) obj.TalkPowerGranted = (bool)tmpv; } { var tmpv = msg.UnreadMessages; if (tmpv != null) obj.UnreadMessages = (u32)tmpv; } PostClientUpdated(msg); } partial void PostClientUpdated(ClientUpdated msg); public void UpdateServerGroupList(ServerGroupList msg) { var obj = new ServerGroup(); { var tmpv = msg.GroupType; if (tmpv != null) obj.GroupType = (GroupType)tmpv; } { var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; } { var tmpv = msg.IsPermanent; if (tmpv != null) obj.IsPermanent = (bool)tmpv; } { var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; } { var tmpv = msg.NamingMode; if (tmpv != null) obj.NamingMode = (GroupNamingMode)tmpv; } { var tmpv = msg.NeededMemberAddPower; if (tmpv != null) obj.NeededMemberAddPower = (i32)tmpv; } { var tmpv = msg.NeededMemberRemovePower; if (tmpv != null) obj.NeededMemberRemovePower = (i32)tmpv; } { var tmpv = msg.NeededModifyPower; if (tmpv != null) obj.NeededModifyPower = (i32)tmpv; } { var tmpv = msg.SortId; if (tmpv != null) obj.SortId = (i32)tmpv; } SetServerGroup(obj, msg.ServerGroupId); PostServerGroupList(msg); } partial void PostServerGroupList(ServerGroupList msg); public void UpdateServerEdited(ServerEdited msg) { var obj = GetServer(); if (obj == null) { Log.Warn("Internal Book protocol error. Update 'ServerEdited' has no local object ({$msg})", msg); return; } { var tmpv = msg.CodecEncryptionMode; if (tmpv != null) obj.CodecEncryptionMode = (CodecEncryptionMode)tmpv; } { var tmpv = msg.DefaultChannelGroup; if (tmpv != null) obj.DefaultChannelGroup = (ChannelGroupId)tmpv; } { var tmpv = msg.DefaultServerGroup; if (tmpv != null) obj.DefaultServerGroup = (ServerGroupId)tmpv; } { var tmpv = msg.HostbannerGfxInterval; if (tmpv != null) obj.HostbannerGfxInterval = (Duration)tmpv; } { var tmpv = msg.HostbannerGfxUrl; if (tmpv != null) obj.HostbannerGfxUrl = (str)tmpv; } { var tmpv = msg.HostbannerMode; if (tmpv != null) obj.HostbannerMode = (HostBannerMode)tmpv; } { var tmpv = msg.HostbannerUrl; if (tmpv != null) obj.HostbannerUrl = (str)tmpv; } { var tmpv = msg.HostbuttonGfxUrl; if (tmpv != null) obj.HostbuttonGfxUrl = (str)tmpv; } { var tmpv = msg.HostbuttonTooltip; if (tmpv != null) obj.HostbuttonTooltip = (str)tmpv; } { var tmpv = msg.HostbuttonUrl; if (tmpv != null) obj.HostbuttonUrl = (str)tmpv; } { var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; } { var tmpv = msg.Nickname; if (tmpv != null) obj.Nickname = (str)tmpv; } { var tmpv = msg.PrioritySpeakerDimmModificator; if (tmpv != null) obj.PrioritySpeakerDimmModificator = (f32)tmpv; } { var tmpv = msg.TempChannelDefaultDeleteDelay; if (tmpv != null) obj.TempChannelDefaultDeleteDelay = (Duration)tmpv; } PostServerEdited(msg); } partial void PostServerEdited(ServerEdited msg); public void UpdateChannelPermissionHints(ChannelPermissionHints msg) { var obj = GetChannel(msg.ChannelId); if (obj == null) { Log.Warn("Internal Book protocol error. Update 'ChannelPermissionHints' has no local object ({$msg})", msg); return; } { var tmpv = msg.Flags; if (tmpv != null) obj.PermissionHints = (ChannelPermissionHint)tmpv; } PostChannelPermissionHints(msg); } partial void PostChannelPermissionHints(ChannelPermissionHints msg); public void UpdateClientPermissionHints(ClientPermissionHints msg) { var obj = GetClient(msg.ClientId); if (obj == null) { Log.Warn("Internal Book protocol error. Update 'ClientPermissionHints' has no local object ({$msg})", msg); return; } { var tmpv = msg.Flags; if (tmpv != null) obj.PermissionHints = (ClientPermissionHint)tmpv; } PostClientPermissionHints(msg); } partial void PostClientPermissionHints(ClientPermissionHints msg); #pragma warning restore IDE0017, CS0472 } } ================================================ FILE: TSLib/Generated/M2B.tt ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // <#@ template debug="true" hostSpecific="true" language="C#" #> <#@ include file="M2BParser.ttinclude" once="true" #> <#@ include file="MessageParser.ttinclude" once="true" #> <#@ include file="BookParser.ttinclude" once="true" #> <#@ output extension=".cs" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <# var genbook = BookDeclarations.Parse(Host.ResolvePath("../Declarations/Book.toml")); var genmsg = Messages.Parse(Host.ResolvePath("../Declarations/Messages.toml")); var genm2b = M2BDeclarations.Parse(Host.ResolvePath("../Declarations/MessagesToBook.toml"), genmsg, genbook); #> using TSLib.Messages; <#= ConversionSet #> namespace TSLib.Full.Book { public partial class Connection { #pragma warning disable IDE0017, CS0472 // Ignore "Object initialization can be simplified", "Something with == and null..." <# foreach (var rule in genm2b.rule) { var msg = genmsg.NotifiesSorted.First(x => x.name == rule.from); var bookItem = genbook.@struct.First(x => x.name == rule.to); #> public void Update<#= msg.name #>(<#= msg.name #> msg) { <# var idStr = string.Join(", ", rule.id.Select(x => $"msg.{x}")); ClearIndent(); PushIndent("\t\t\t"); switch (rule.operation) { case "add": case "update": if (rule.operation == "add") WriteLine($"var obj = new {rule.to}();"); else WriteLine($@"var obj = Get{rule.to}({idStr}); if (obj == null) {{ Log.Warn(""Internal Book protocol error. Update '{msg.name}' has no local object ({{$msg}})"", msg); return; }}"); foreach (var prop in rule.properties.OrderBy(x => x.to)) { void WriteMove(string from, string to) { var bookProp = bookItem.properties.FirstOrDefault(x => x.name == to); if(bookProp is null) { Warn($"No property found: '{to}'"); return; } if (prop.operation is null) { if (bookProp.mod is null) { if (from == "null") WriteLine($"obj.{to} = null;"); else WriteLine($"{{ var tmpv = {from}; if (tmpv != null) obj.{to} = ({bookProp.type})tmpv; }}"); } else if (bookProp.mod == "array") { //WriteLine($"obj.{to}.Add({from});"); if (prop.operation == "add") WriteLine($"{{ var tmpa = {from}; if (tmpa != null) obj.{to}.UnionWith(tmpa); }}"); else WriteLine($"{{ var tmpa = {from}; if (tmpa != null) {{ obj.{to}.Clear(); obj.{to}.UnionWith(tmpa); }} }}"); } else { throw new Exception("Unknown mod type: " + bookProp.mod); } } else if (prop.operation == "add") { // Currently hacky; Better check: // [update:single->single] // [add/remove/update:single->array] // [update:array->array] WriteLine($"obj.{to}.Add({from});"); } else if (prop.operation == "remove") { // Same here WriteLine($"obj.{to}.Remove({from});"); } else throw new Exception("Unknown operation: " + prop.operation); } if (prop.from != null) { WriteMove($"msg.{prop.from}", prop.to); } else { /* function */ if (prop.function == "ReturnNone") WriteMove($"null", prop.tolist[0]); else if (prop.function == "VoidFun") { /* Do Nothing */ } else if(prop.tolist.Length == 0) WriteLine($"{prop.function}(msg);"); else if (prop.tolist.Length == 1) WriteMove($"{prop.function}(msg)", prop.tolist[0]); else { WriteLine("{"); WriteLine($"var tmp = {prop.function}(msg);", prop.to); for (int i = 0; i < prop.tolist.Length; i++) WriteMove($"tmp.Item{(i + 1)}", prop.tolist[i]); WriteLine("}"); } } } if (rule.operation == "add") { WriteLine($"Set{rule.to}(obj{(string.IsNullOrEmpty(idStr) ? "" : (", " + idStr))});"); } break; case "remove":#> Remove<#=rule.to#>(<#=idStr#>);<# break; } #> Post<#= msg.name #>(msg); } partial void Post<#= msg.name #>(<#= msg.name #> msg); <# } #> #pragma warning restore IDE0017, CS0472 } } ================================================ FILE: TSLib/Generated/M2BParser.ttinclude ================================================ <#@ include file="Util.ttinclude" once="true" #> <#+ public class M2BDeclarations { public static M2BDeclarations Parse(string file, Messages msgs, BookDeclarations book) { var toml = Nett.Toml.ReadFile(file); foreach (var rule in toml.rule) { rule.properties ??= new List(); // Add implicit move operations var msg = msgs.GetOrderedMsg().First(x => x.name == rule.from); var msgProps = msg.attributes.Select(x => msgs.GetField(x).fld); var bookItem = book.@struct.First(x => x.name == rule.to); var funcResults = new HashSet(rule.properties.Where(x => x.tolist != null).SelectMany(x => x.tolist)); foreach (var prop in msgProps) { if (funcResults.Contains(prop.pretty)) continue; if (bookItem.properties.Any(x => x.name == prop.pretty)) { // chek already exists rule.properties.Add(new M2BPropMove { from = prop.pretty, to = prop.pretty, }); } } } return toml; } public M2BRule[] rule { get; set; } public class M2BRule { public string from { get; set; } public string[] id { get; set; } public string to { get; set; } public string operation { get; set; } public List properties { get; set; } } public class M2BPropMove { public string from { get; set; } public string to { get; set; } public string function { get; set; } public string[] tolist { get; set; } public string operation { get; set; } } } #> ================================================ FILE: TSLib/Generated/MessageParser.ttinclude ================================================ <#@ assembly name="System.Core" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Collections.Generic" #> <#@ include file="Util.ttinclude" once="true" #> <#+ public static IEnumerable OnlyS2C(IEnumerable enu) => enu.Where(x => x.s2c.Value); public class Messages { public static Messages Parse(string file) { var toml = Nett.Toml.ReadFile(file); // transfer all optional get/set confs /*foreach (var struc in toml.@struct) { foreach (var prop in struc.properties) { prop.get ??= struc.accessor.get; prop.set ??= struc.accessor.set; } }*/ return toml; } public IEnumerable GetOrderedMsg() { foreach(var (grp, msg) in msg_group.SelectMany(group => group.msg.Select(msg => (group:group, msg:msg))).OrderBy(x => x.msg.name)) { // transfer all default confs msg.s2c ??= grp.@default.s2c; msg.c2s ??= grp.@default.c2s; msg.response ??= grp.@default.response; msg.low ??= grp.@default.low; msg.np ??= grp.@default.np; yield return msg; } } public IEnumerable NotifiesSorted => GetOrderedMsg().Where(x => x.notify != null); public (Field fld, bool optional) GetField(string name) { var ret = (fld:fields.FirstOrDefault(x => x.map == name.Trim('?')), optional:name.EndsWith("?")); if(ret.fld == null) throw new Exception($"Field declaration for \"{name}\" not found"); return ret; } public Field[] fields { get; set; } public MsgGroup[] msg_group { get; set; } public class Field { public string map { get; set; } public string ts { get; set; } public string pretty { get; set; } public string type { get; set; } public string mod { get; set; } public string doc { get; set; } public bool isArray => mod == "array"; public string TypeFin(bool optional) { string ltype; switch(type) { case "PermissionId": ltype = "Ts3Permission"; break; default: ltype = type; break; } return ltype + (isArray ? "[]" : "") + (optional ? "?" : ""); } } public class MsgGroup { public Default @default { get; set; } public Msg[] msg { get; set; } } public class Default { public bool s2c { get; set; } public bool c2s { get; set; } public bool response { get; set; } public bool low { get; set; } public bool np { get; set; } } public class Msg { public string name { get; set; } public string notify { get; set; } public string[] attributes { get; set; } public bool? s2c { get; set; } public bool? c2s { get; set; } public bool? response { get; set; } public bool? low { get; set; } public bool? np { get; set; } } } #> ================================================ FILE: TSLib/Generated/Messages.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // using System; using System.Collections.Generic; using System.Buffers.Text; using TSLib.Commands; using TSLib.Helper; #pragma warning disable CS8019 // Ignore unused imports using i8 = System.SByte; using u8 = System.Byte; using i16 = System.Int16; using u16 = System.UInt16; using i32 = System.Int32; using u32 = System.UInt32; using i64 = System.Int64; using u64 = System.UInt64; using f32 = System.Single; using f64 = System.Double; using str = System.String; using DateTime = System.DateTime; using Duration = System.TimeSpan; using DurationSeconds = System.TimeSpan; using DurationMilliseconds = System.TimeSpan; using SocketAddr = System.String; using IpAddr = System.String; using Ts3ErrorCode = TSLib.TsErrorCode; using Ts3Permission = TSLib.TsPermission; using IconHash = System.Int32; using ConnectionId = System.UInt32; using EccKeyPubP256 = TSLib.Uid; #pragma warning restore CS8019 #nullable enable namespace TSLib.Messages { public sealed partial class BanAdd : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.BanAdd; public str? BanReason { get; set; } public IpAddr? Ip { get; set; } public str? Name { get; set; } public DurationSeconds? Time { get; set; } public Uid? Uid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "banreason": BanReason = (str)TsString.Unescape(value); break; case "ip": Ip = (IpAddr)TsString.Unescape(value); break; case "name": Name = (str)TsString.Unescape(value); break; case "time": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Time = TimeSpan.FromSeconds(oval); } break; case "uid": Uid = (Uid)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (BanAdd[])to; foreach (var fld in flds) { switch(fld) { case "banreason": foreach(var toi in toc) { toi.BanReason = BanReason; } break; case "ip": foreach(var toi in toc) { toi.Ip = Ip; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "time": foreach(var toi in toc) { toi.Time = Time; } break; case "uid": foreach(var toi in toc) { toi.Uid = Uid; } break; } } } } public sealed partial class BanClient : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.BanClient; public str? BanReason { get; set; } public ClientId ClientId { get; set; } public DurationSeconds? Time { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "banreason": BanReason = (str)TsString.Unescape(value); break; case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "time": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Time = TimeSpan.FromSeconds(oval); } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (BanClient[])to; foreach (var fld in flds) { switch(fld) { case "banreason": foreach(var toi in toc) { toi.BanReason = BanReason; } break; case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "time": foreach(var toi in toc) { toi.Time = Time; } break; } } } } public sealed partial class BanDel : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.BanDel; public u32 BanId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "banid": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) BanId = (u32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (BanDel[])to; foreach (var fld in flds) { switch(fld) { case "banid": foreach(var toi in toc) { toi.BanId = BanId; } break; } } } } public sealed partial class BanDelAll : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.BanDelAll; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class BanList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.BanList; public string? ReturnCode { get; set; } public u32 BanId { get; set; } public DateTime Created { get; set; } public DurationSeconds Duration { get; set; } public u32 Enforcements { get; set; } public ClientDbId InvokerDatabaseId { get; set; } public str InvokerName { get; set; } public Uid? InvokerUid { get; set; } public IpAddr Ip { get; set; } public str LastNickname { get; set; } public str? MyTsId { get; set; } public str Name { get; set; } public str Reason { get; set; } public Uid Uid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "banid": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) BanId = (u32)oval; } break; case "created": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Created = Tools.FromUnix(oval); } break; case "duration": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Duration = TimeSpan.FromSeconds(oval); } break; case "enforcements": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Enforcements = (u32)oval; } break; case "invokercldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) InvokerDatabaseId = (ClientDbId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; case "ip": Ip = (IpAddr)TsString.Unescape(value); break; case "lastnickname": LastNickname = (str)TsString.Unescape(value); break; case "mytsid": MyTsId = (str)TsString.Unescape(value); break; case "name": Name = (str)TsString.Unescape(value); break; case "reason": Reason = (str)TsString.Unescape(value); break; case "uid": Uid = (Uid)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (BanList[])to; foreach (var fld in flds) { switch(fld) { case "banid": foreach(var toi in toc) { toi.BanId = BanId; } break; case "created": foreach(var toi in toc) { toi.Created = Created; } break; case "duration": foreach(var toi in toc) { toi.Duration = Duration; } break; case "enforcements": foreach(var toi in toc) { toi.Enforcements = Enforcements; } break; case "invokercldbid": foreach(var toi in toc) { toi.InvokerDatabaseId = InvokerDatabaseId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; case "ip": foreach(var toi in toc) { toi.Ip = Ip; } break; case "lastnickname": foreach(var toi in toc) { toi.LastNickname = LastNickname; } break; case "mytsid": foreach(var toi in toc) { toi.MyTsId = MyTsId; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "reason": foreach(var toi in toc) { toi.Reason = Reason; } break; case "uid": foreach(var toi in toc) { toi.Uid = Uid; } break; } } } } public sealed partial class BanListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.BanListRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class BindingList : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.BindingList; public str? Subsystem { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "subsystem": Subsystem = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (BindingList[])to; foreach (var fld in flds) { switch(fld) { case "subsystem": foreach(var toi in toc) { toi.Subsystem = Subsystem; } break; } } } } public sealed partial class ChannelAddPerm : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelAddPerm; public ChannelId ChannelId { get; set; } public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } public i32 PermissionValue { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; case "permvalue": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelAddPerm[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; case "permvalue": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break; } } } } public sealed partial class ChannelChanged : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelChanged; public ChannelId ChannelId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelChanged[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; } } } } public sealed partial class ChannelClientAddPerm : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelClientAddPerm; public ChannelId ChannelId { get; set; } public ClientDbId ClientDbId { get; set; } public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } public i32 PermissionValue { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; case "permvalue": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelClientAddPerm[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; case "permvalue": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break; } } } } public sealed partial class ChannelClientDelPerm : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelClientDelPerm; public ChannelId ChannelId { get; set; } public ClientDbId ClientDbId { get; set; } public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelClientDelPerm[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; } } } } public sealed partial class ChannelClientPermList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelClientPermList; public string? ReturnCode { get; set; } public ChannelId ChannelId { get; set; } public ClientDbId ClientDbId { get; set; } public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } public bool PermissionNegated { get; set; } public bool PermissionSkip { get; set; } public i32 PermissionValue { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permnegated": PermissionNegated = value.Length > 0 && value[0] != '0'; break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; case "permskip": PermissionSkip = value.Length > 0 && value[0] != '0'; break; case "permvalue": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelClientPermList[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permnegated": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; case "permskip": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break; case "permvalue": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break; } } } } public sealed partial class ChannelClientPermListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelClientPermListRequest; public ChannelId ChannelId { get; set; } public ClientDbId ClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelClientPermListRequest[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; } } } } public sealed partial class ChannelCreate : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelCreate; public Codec? Codec { get; set; } public u8? CodecQuality { get; set; } public DurationSeconds? DeleteDelay { get; set; } public str? Description { get; set; } public bool? HasPassword { get; set; } public bool? InheritsMaxFamilyClients { get; set; } public bool? IsDefault { get; set; } public bool? IsMaxClientsUnlimited { get; set; } public bool? IsMaxFamilyClientsUnlimited { get; set; } public bool? IsPermanent { get; set; } public bool? IsSemiPermanent { get; set; } public bool? IsUnencrypted { get; set; } public i32? MaxClients { get; set; } public i32? MaxFamilyClients { get; set; } public str Name { get; set; } public ChannelId? Order { get; set; } public ChannelId? ParentId { get; set; } public str? Password { get; set; } public str? PhoneticName { get; set; } public str? Topic { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "channel_codec": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break; case "channel_codec_is_unencrypted": IsUnencrypted = value.Length > 0 && value[0] != '0'; break; case "channel_codec_quality": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break; case "channel_delete_delay": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DeleteDelay = TimeSpan.FromSeconds(oval); } break; case "channel_description": Description = (str)TsString.Unescape(value); break; case "channel_flag_default": IsDefault = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxclients_unlimited": IsMaxClientsUnlimited = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxfamilyclients_inherited": InheritsMaxFamilyClients = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxfamilyclients_unlimited": IsMaxFamilyClientsUnlimited = value.Length > 0 && value[0] != '0'; break; case "channel_flag_password": HasPassword = value.Length > 0 && value[0] != '0'; break; case "channel_flag_permanent": IsPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_flag_semi_permanent": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_maxclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break; case "channel_maxfamilyclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break; case "channel_name": Name = (str)TsString.Unescape(value); break; case "channel_name_phonetic": PhoneticName = (str)TsString.Unescape(value); break; case "channel_order": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break; case "channel_password": Password = (str)TsString.Unescape(value); break; case "channel_topic": Topic = (str)TsString.Unescape(value); break; case "cpid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelCreate[])to; foreach (var fld in flds) { switch(fld) { case "channel_codec": foreach(var toi in toc) { toi.Codec = Codec; } break; case "channel_codec_is_unencrypted": foreach(var toi in toc) { toi.IsUnencrypted = IsUnencrypted; } break; case "channel_codec_quality": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break; case "channel_delete_delay": foreach(var toi in toc) { toi.DeleteDelay = DeleteDelay; } break; case "channel_description": foreach(var toi in toc) { toi.Description = Description; } break; case "channel_flag_default": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break; case "channel_flag_maxclients_unlimited": foreach(var toi in toc) { toi.IsMaxClientsUnlimited = IsMaxClientsUnlimited; } break; case "channel_flag_maxfamilyclients_inherited": foreach(var toi in toc) { toi.InheritsMaxFamilyClients = InheritsMaxFamilyClients; } break; case "channel_flag_maxfamilyclients_unlimited": foreach(var toi in toc) { toi.IsMaxFamilyClientsUnlimited = IsMaxFamilyClientsUnlimited; } break; case "channel_flag_password": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break; case "channel_flag_permanent": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break; case "channel_flag_semi_permanent": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break; case "channel_maxclients": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break; case "channel_maxfamilyclients": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break; case "channel_name": foreach(var toi in toc) { toi.Name = Name; } break; case "channel_name_phonetic": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break; case "channel_order": foreach(var toi in toc) { toi.Order = Order; } break; case "channel_password": foreach(var toi in toc) { toi.Password = Password; } break; case "channel_topic": foreach(var toi in toc) { toi.Topic = Topic; } break; case "cpid": foreach(var toi in toc) { toi.ParentId = ParentId; } break; } } } } public sealed partial class ChannelCreated : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelCreated; public string? ReturnCode { get; set; } public ChannelId ChannelId { get; set; } public Codec? Codec { get; set; } public i32? CodecLatencyFactor { get; set; } public u8? CodecQuality { get; set; } public DurationSeconds? DeleteDelay { get; set; } public bool? HasPassword { get; set; } public IconHash? IconId { get; set; } public bool? InheritsMaxFamilyClients { get; set; } public ClientId InvokerId { get; set; } public str InvokerName { get; set; } public Uid? InvokerUid { get; set; } public bool? IsDefault { get; set; } public bool? IsMaxClientsUnlimited { get; set; } public bool IsMaxFamilyClientsUnlimited { get; set; } public bool? IsPermanent { get; set; } public bool? IsSemiPermanent { get; set; } public bool? IsUnencrypted { get; set; } public i32? MaxClients { get; set; } public i32? MaxFamilyClients { get; set; } public str Name { get; set; } public i32? NeededTalkPower { get; set; } public ChannelId Order { get; set; } public ChannelId ParentId { get; set; } public str? PhoneticName { get; set; } public str? Topic { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "channel_codec": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break; case "channel_codec_is_unencrypted": IsUnencrypted = value.Length > 0 && value[0] != '0'; break; case "channel_codec_latency_factor": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecLatencyFactor = (i32)oval; } break; case "channel_codec_quality": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break; case "channel_delete_delay": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DeleteDelay = TimeSpan.FromSeconds(oval); } break; case "channel_flag_default": IsDefault = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxclients_unlimited": IsMaxClientsUnlimited = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxfamilyclients_inherited": InheritsMaxFamilyClients = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxfamilyclients_unlimited": IsMaxFamilyClientsUnlimited = value.Length > 0 && value[0] != '0'; break; case "channel_flag_password": HasPassword = value.Length > 0 && value[0] != '0'; break; case "channel_flag_permanent": IsPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_flag_semi_permanent": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_icon_id": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "channel_maxclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break; case "channel_maxfamilyclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break; case "channel_name": Name = (str)TsString.Unescape(value); break; case "channel_name_phonetic": PhoneticName = (str)TsString.Unescape(value); break; case "channel_needed_talk_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededTalkPower = (i32)oval; } break; case "channel_order": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break; case "channel_topic": Topic = (str)TsString.Unescape(value); break; case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cpid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break; case "invokerid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelCreated[])to; foreach (var fld in flds) { switch(fld) { case "channel_codec": foreach(var toi in toc) { toi.Codec = Codec; } break; case "channel_codec_is_unencrypted": foreach(var toi in toc) { toi.IsUnencrypted = IsUnencrypted; } break; case "channel_codec_latency_factor": foreach(var toi in toc) { toi.CodecLatencyFactor = CodecLatencyFactor; } break; case "channel_codec_quality": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break; case "channel_delete_delay": foreach(var toi in toc) { toi.DeleteDelay = DeleteDelay; } break; case "channel_flag_default": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break; case "channel_flag_maxclients_unlimited": foreach(var toi in toc) { toi.IsMaxClientsUnlimited = IsMaxClientsUnlimited; } break; case "channel_flag_maxfamilyclients_inherited": foreach(var toi in toc) { toi.InheritsMaxFamilyClients = InheritsMaxFamilyClients; } break; case "channel_flag_maxfamilyclients_unlimited": foreach(var toi in toc) { toi.IsMaxFamilyClientsUnlimited = IsMaxFamilyClientsUnlimited; } break; case "channel_flag_password": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break; case "channel_flag_permanent": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break; case "channel_flag_semi_permanent": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break; case "channel_icon_id": foreach(var toi in toc) { toi.IconId = IconId; } break; case "channel_maxclients": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break; case "channel_maxfamilyclients": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break; case "channel_name": foreach(var toi in toc) { toi.Name = Name; } break; case "channel_name_phonetic": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break; case "channel_needed_talk_power": foreach(var toi in toc) { toi.NeededTalkPower = NeededTalkPower; } break; case "channel_order": foreach(var toi in toc) { toi.Order = Order; } break; case "channel_topic": foreach(var toi in toc) { toi.Topic = Topic; } break; case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cpid": foreach(var toi in toc) { toi.ParentId = ParentId; } break; case "invokerid": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; } } } } public sealed partial class ChannelCreateResponse : IResponse { #pragma warning disable CS8618 public string? ReturnCode { get; set; } public ChannelId ChannelId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelCreateResponse[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; } } } } public sealed partial class ChannelDelete : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelDelete; public ChannelId ChannelId { get; set; } public bool Force { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "force": Force = value.Length > 0 && value[0] != '0'; break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelDelete[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "force": foreach(var toi in toc) { toi.Force = Force; } break; } } } } public sealed partial class ChannelDeleted : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelDeleted; public string? ReturnCode { get; set; } public ChannelId ChannelId { get; set; } public ClientId InvokerId { get; set; } public str InvokerName { get; set; } public Uid? InvokerUid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "invokerid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelDeleted[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "invokerid": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; } } } } public sealed partial class ChannelDelPerm : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelDelPerm; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ChannelDescriptionChanged : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelDescriptionChanged; public ChannelId ChannelId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelDescriptionChanged[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; } } } } public sealed partial class ChannelDescriptionRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelDescriptionRequest; public ChannelId ChannelId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelDescriptionRequest[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; } } } } public sealed partial class ChannelEdit : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelEdit; public ChannelId ChannelId { get; set; } public Codec? Codec { get; set; } public i32? CodecLatencyFactor { get; set; } public u8? CodecQuality { get; set; } public DurationSeconds? DeleteDelay { get; set; } public str? Description { get; set; } public bool? HasPassword { get; set; } public IconHash? IconId { get; set; } public bool? InheritsMaxFamilyClients { get; set; } public bool? IsDefault { get; set; } public bool? IsMaxClientsUnlimited { get; set; } public bool? IsMaxFamilyClientsUnlimited { get; set; } public bool? IsPermanent { get; set; } public bool? IsSemiPermanent { get; set; } public bool? IsUnencrypted { get; set; } public i32? MaxClients { get; set; } public i32? MaxFamilyClients { get; set; } public str? Name { get; set; } public i32? NeededTalkPower { get; set; } public ChannelId? Order { get; set; } public ChannelId? ParentId { get; set; } public str? PhoneticName { get; set; } public str? Topic { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "channel_codec": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break; case "channel_codec_is_unencrypted": IsUnencrypted = value.Length > 0 && value[0] != '0'; break; case "channel_codec_latency_factor": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecLatencyFactor = (i32)oval; } break; case "channel_codec_quality": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break; case "channel_delete_delay": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DeleteDelay = TimeSpan.FromSeconds(oval); } break; case "channel_description": Description = (str)TsString.Unescape(value); break; case "channel_flag_default": IsDefault = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxclients_unlimited": IsMaxClientsUnlimited = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxfamilyclients_inherited": InheritsMaxFamilyClients = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxfamilyclients_unlimited": IsMaxFamilyClientsUnlimited = value.Length > 0 && value[0] != '0'; break; case "channel_flag_password": HasPassword = value.Length > 0 && value[0] != '0'; break; case "channel_flag_permanent": IsPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_flag_semi_permanent": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_icon_id": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "channel_maxclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break; case "channel_maxfamilyclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break; case "channel_name": Name = (str)TsString.Unescape(value); break; case "channel_name_phonetic": PhoneticName = (str)TsString.Unescape(value); break; case "channel_needed_talk_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededTalkPower = (i32)oval; } break; case "channel_order": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break; case "channel_topic": Topic = (str)TsString.Unescape(value); break; case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cpid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelEdit[])to; foreach (var fld in flds) { switch(fld) { case "channel_codec": foreach(var toi in toc) { toi.Codec = Codec; } break; case "channel_codec_is_unencrypted": foreach(var toi in toc) { toi.IsUnencrypted = IsUnencrypted; } break; case "channel_codec_latency_factor": foreach(var toi in toc) { toi.CodecLatencyFactor = CodecLatencyFactor; } break; case "channel_codec_quality": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break; case "channel_delete_delay": foreach(var toi in toc) { toi.DeleteDelay = DeleteDelay; } break; case "channel_description": foreach(var toi in toc) { toi.Description = Description; } break; case "channel_flag_default": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break; case "channel_flag_maxclients_unlimited": foreach(var toi in toc) { toi.IsMaxClientsUnlimited = IsMaxClientsUnlimited; } break; case "channel_flag_maxfamilyclients_inherited": foreach(var toi in toc) { toi.InheritsMaxFamilyClients = InheritsMaxFamilyClients; } break; case "channel_flag_maxfamilyclients_unlimited": foreach(var toi in toc) { toi.IsMaxFamilyClientsUnlimited = IsMaxFamilyClientsUnlimited; } break; case "channel_flag_password": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break; case "channel_flag_permanent": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break; case "channel_flag_semi_permanent": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break; case "channel_icon_id": foreach(var toi in toc) { toi.IconId = IconId; } break; case "channel_maxclients": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break; case "channel_maxfamilyclients": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break; case "channel_name": foreach(var toi in toc) { toi.Name = Name; } break; case "channel_name_phonetic": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break; case "channel_needed_talk_power": foreach(var toi in toc) { toi.NeededTalkPower = NeededTalkPower; } break; case "channel_order": foreach(var toi in toc) { toi.Order = Order; } break; case "channel_topic": foreach(var toi in toc) { toi.Topic = Topic; } break; case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cpid": foreach(var toi in toc) { toi.ParentId = ParentId; } break; } } } } public sealed partial class ChannelEdited : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelEdited; public string? ReturnCode { get; set; } public ChannelId ChannelId { get; set; } public Codec? Codec { get; set; } public i32? CodecLatencyFactor { get; set; } public u8? CodecQuality { get; set; } public DurationSeconds? DeleteDelay { get; set; } public str? Description { get; set; } public bool? HasPassword { get; set; } public IconHash? IconId { get; set; } public bool? InheritsMaxFamilyClients { get; set; } public ClientId? InvokerId { get; set; } public str? InvokerName { get; set; } public Uid? InvokerUid { get; set; } public bool? IsDefault { get; set; } public bool? IsMaxClientsUnlimited { get; set; } public bool? IsMaxFamilyClientsUnlimited { get; set; } public bool? IsPermanent { get; set; } public bool? IsSemiPermanent { get; set; } public bool? IsUnencrypted { get; set; } public i32? MaxClients { get; set; } public i32? MaxFamilyClients { get; set; } public str? Name { get; set; } public i32? NeededTalkPower { get; set; } public ChannelId? Order { get; set; } public ChannelId? ParentId { get; set; } public str? PhoneticName { get; set; } public Reason Reason { get; set; } public str? Topic { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "channel_codec": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break; case "channel_codec_is_unencrypted": IsUnencrypted = value.Length > 0 && value[0] != '0'; break; case "channel_codec_latency_factor": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecLatencyFactor = (i32)oval; } break; case "channel_codec_quality": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break; case "channel_delete_delay": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DeleteDelay = TimeSpan.FromSeconds(oval); } break; case "channel_description": Description = (str)TsString.Unescape(value); break; case "channel_flag_default": IsDefault = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxclients_unlimited": IsMaxClientsUnlimited = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxfamilyclients_inherited": InheritsMaxFamilyClients = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxfamilyclients_unlimited": IsMaxFamilyClientsUnlimited = value.Length > 0 && value[0] != '0'; break; case "channel_flag_password": HasPassword = value.Length > 0 && value[0] != '0'; break; case "channel_flag_permanent": IsPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_flag_semi_permanent": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_icon_id": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "channel_maxclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break; case "channel_maxfamilyclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break; case "channel_name": Name = (str)TsString.Unescape(value); break; case "channel_name_phonetic": PhoneticName = (str)TsString.Unescape(value); break; case "channel_needed_talk_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededTalkPower = (i32)oval; } break; case "channel_order": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break; case "channel_topic": Topic = (str)TsString.Unescape(value); break; case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cpid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break; case "invokerid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; case "reasonid": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelEdited[])to; foreach (var fld in flds) { switch(fld) { case "channel_codec": foreach(var toi in toc) { toi.Codec = Codec; } break; case "channel_codec_is_unencrypted": foreach(var toi in toc) { toi.IsUnencrypted = IsUnencrypted; } break; case "channel_codec_latency_factor": foreach(var toi in toc) { toi.CodecLatencyFactor = CodecLatencyFactor; } break; case "channel_codec_quality": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break; case "channel_delete_delay": foreach(var toi in toc) { toi.DeleteDelay = DeleteDelay; } break; case "channel_description": foreach(var toi in toc) { toi.Description = Description; } break; case "channel_flag_default": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break; case "channel_flag_maxclients_unlimited": foreach(var toi in toc) { toi.IsMaxClientsUnlimited = IsMaxClientsUnlimited; } break; case "channel_flag_maxfamilyclients_inherited": foreach(var toi in toc) { toi.InheritsMaxFamilyClients = InheritsMaxFamilyClients; } break; case "channel_flag_maxfamilyclients_unlimited": foreach(var toi in toc) { toi.IsMaxFamilyClientsUnlimited = IsMaxFamilyClientsUnlimited; } break; case "channel_flag_password": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break; case "channel_flag_permanent": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break; case "channel_flag_semi_permanent": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break; case "channel_icon_id": foreach(var toi in toc) { toi.IconId = IconId; } break; case "channel_maxclients": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break; case "channel_maxfamilyclients": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break; case "channel_name": foreach(var toi in toc) { toi.Name = Name; } break; case "channel_name_phonetic": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break; case "channel_needed_talk_power": foreach(var toi in toc) { toi.NeededTalkPower = NeededTalkPower; } break; case "channel_order": foreach(var toi in toc) { toi.Order = Order; } break; case "channel_topic": foreach(var toi in toc) { toi.Topic = Topic; } break; case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cpid": foreach(var toi in toc) { toi.ParentId = ParentId; } break; case "invokerid": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; case "reasonid": foreach(var toi in toc) { toi.Reason = Reason; } break; } } } } public sealed partial class ChannelFind : IResponse { #pragma warning disable CS8618 public string? ReturnCode { get; set; } public ChannelId ChannelId { get; set; } public str Name { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "channel_name": Name = (str)TsString.Unescape(value); break; case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelFind[])to; foreach (var fld in flds) { switch(fld) { case "channel_name": foreach(var toi in toc) { toi.Name = Name; } break; case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; } } } } public sealed partial class ChannelFindRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelFindRequest; public str Pattern { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "pattern": Pattern = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelFindRequest[])to; foreach (var fld in flds) { switch(fld) { case "pattern": foreach(var toi in toc) { toi.Pattern = Pattern; } break; } } } } public sealed partial class ChannelGroupAdd : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelGroupAdd; public GroupType? GroupType { get; set; } public str Name { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "name": Name = (str)TsString.Unescape(value); break; case "type": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) GroupType = (GroupType)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelGroupAdd[])to; foreach (var fld in flds) { switch(fld) { case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "type": foreach(var toi in toc) { toi.GroupType = GroupType; } break; } } } } public sealed partial class ChannelGroupAddPerm : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelGroupAddPerm; public ChannelGroupId ChannelGroup { get; set; } public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } public i32 PermissionValue { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; case "permvalue": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelGroupAddPerm[])to; foreach (var fld in flds) { switch(fld) { case "cgid": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; case "permvalue": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break; } } } } public sealed partial class ChannelGroupClientList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelGroupClientList; public string? ReturnCode { get; set; } public ChannelGroupId ChannelGroup { get; set; } public ChannelId ChannelId { get; set; } public ClientDbId ClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelGroupClientList[])to; foreach (var fld in flds) { switch(fld) { case "cgid": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; } } } } public sealed partial class ChannelGroupClientListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelGroupClientListRequest; public ChannelGroupId? ChannelGroup { get; set; } public ChannelId? ChannelId { get; set; } public ClientDbId? ClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelGroupClientListRequest[])to; foreach (var fld in flds) { switch(fld) { case "cgid": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; } } } } public sealed partial class ChannelGroupCopy : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelGroupCopy; public GroupType GroupType { get; set; } public str Name { get; set; } public ChannelGroupId SourceChannelGroupId { get; set; } public ChannelGroupId TargetChannelGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "name": Name = (str)TsString.Unescape(value); break; case "scgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) SourceChannelGroupId = (ChannelGroupId)oval; } break; case "tcgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelGroupId = (ChannelGroupId)oval; } break; case "type": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) GroupType = (GroupType)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelGroupCopy[])to; foreach (var fld in flds) { switch(fld) { case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "scgid": foreach(var toi in toc) { toi.SourceChannelGroupId = SourceChannelGroupId; } break; case "tcgid": foreach(var toi in toc) { toi.TargetChannelGroupId = TargetChannelGroupId; } break; case "type": foreach(var toi in toc) { toi.GroupType = GroupType; } break; } } } } public sealed partial class ChannelGroupDel : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelGroupDel; public ChannelGroupId ChannelGroup { get; set; } public bool Force { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; case "force": Force = value.Length > 0 && value[0] != '0'; break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelGroupDel[])to; foreach (var fld in flds) { switch(fld) { case "cgid": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; case "force": foreach(var toi in toc) { toi.Force = Force; } break; } } } } public sealed partial class ChannelGroupDelPerm : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelGroupDelPerm; public ChannelGroupId ChannelGroup { get; set; } public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelGroupDelPerm[])to; foreach (var fld in flds) { switch(fld) { case "cgid": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; } } } } public sealed partial class ChannelGroupList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelGroupList; public string? ReturnCode { get; set; } public ChannelGroupId ChannelGroup { get; set; } public GroupType GroupType { get; set; } public IconHash IconId { get; set; } public bool IsPermanent { get; set; } public str Name { get; set; } public GroupNamingMode NamingMode { get; set; } public i32 NeededMemberAddPower { get; set; } public i32? NeededMemberRemovePower { get; set; } public i32 NeededModifyPower { get; set; } public i32 SortId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; case "iconid": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "n_member_addp": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededMemberAddPower = (i32)oval; } break; case "n_member_removep": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededMemberRemovePower = (i32)oval; } break; case "n_modifyp": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededModifyPower = (i32)oval; } break; case "name": Name = (str)TsString.Unescape(value); break; case "namemode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NamingMode = (GroupNamingMode)oval; } break; case "savedb": IsPermanent = value.Length > 0 && value[0] != '0'; break; case "sortid": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) SortId = (i32)oval; } break; case "type": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) GroupType = (GroupType)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelGroupList[])to; foreach (var fld in flds) { switch(fld) { case "cgid": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; case "iconid": foreach(var toi in toc) { toi.IconId = IconId; } break; case "n_member_addp": foreach(var toi in toc) { toi.NeededMemberAddPower = NeededMemberAddPower; } break; case "n_member_removep": foreach(var toi in toc) { toi.NeededMemberRemovePower = NeededMemberRemovePower; } break; case "n_modifyp": foreach(var toi in toc) { toi.NeededModifyPower = NeededModifyPower; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "namemode": foreach(var toi in toc) { toi.NamingMode = NamingMode; } break; case "savedb": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break; case "sortid": foreach(var toi in toc) { toi.SortId = SortId; } break; case "type": foreach(var toi in toc) { toi.GroupType = GroupType; } break; } } } } public sealed partial class ChannelGroupListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelGroupListRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ChannelGroupPermList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelGroupPermList; public string? ReturnCode { get; set; } public ChannelGroupId ChannelGroup { get; set; } public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } public bool PermissionNegated { get; set; } public bool PermissionSkip { get; set; } public i32 PermissionValue { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permnegated": PermissionNegated = value.Length > 0 && value[0] != '0'; break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; case "permskip": PermissionSkip = value.Length > 0 && value[0] != '0'; break; case "permvalue": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelGroupPermList[])to; foreach (var fld in flds) { switch(fld) { case "cgid": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permnegated": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; case "permskip": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break; case "permvalue": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break; } } } } public sealed partial class ChannelGroupPermListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelGroupPermListRequest; public ChannelGroupId ChannelGroup { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelGroupPermListRequest[])to; foreach (var fld in flds) { switch(fld) { case "cgid": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; } } } } public sealed partial class ChannelGroupRename : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelGroupRename; public ChannelGroupId ChannelGroup { get; set; } public str Name { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; case "name": Name = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelGroupRename[])to; foreach (var fld in flds) { switch(fld) { case "cgid": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; } } } } public sealed partial class ChannelInfoRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelInfoRequest; public ChannelId ChannelId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelInfoRequest[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; } } } } public sealed partial class ChannelInfoResponse : IResponse { #pragma warning disable CS8618 public string? ReturnCode { get; set; } public str? BannerGfxUrl { get; set; } public str BannerMode { get; set; } public Codec Codec { get; set; } public i32 CodecLatencyFactor { get; set; } public u8 CodecQuality { get; set; } public DurationSeconds DeleteDelay { get; set; } public str Description { get; set; } public DurationSeconds DurationEmpty { get; set; } public str FilePath { get; set; } public bool ForcedSilence { get; set; } public bool HasPassword { get; set; } public IconHash IconId { get; set; } public bool InheritsMaxFamilyClients { get; set; } public bool IsDefault { get; set; } public bool IsMaxClientsUnlimited { get; set; } public bool IsMaxFamilyClientsUnlimited { get; set; } public bool IsPermanent { get; set; } public bool IsSemiPermanent { get; set; } public bool IsUnencrypted { get; set; } public i32 MaxClients { get; set; } public i32 MaxFamilyClients { get; set; } public str Name { get; set; } public i32 NeededTalkPower { get; set; } public ChannelId Order { get; set; } public ChannelId ParentChannelId { get; set; } public str? Password { get; set; } public str? PasswordSalt { get; set; } public str? PhoneticName { get; set; } public str Topic { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "channel_banner_gfx_url": BannerGfxUrl = (str)TsString.Unescape(value); break; case "channel_banner_mode": BannerMode = (str)TsString.Unescape(value); break; case "channel_codec": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break; case "channel_codec_is_unencrypted": IsUnencrypted = value.Length > 0 && value[0] != '0'; break; case "channel_codec_latency_factor": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecLatencyFactor = (i32)oval; } break; case "channel_codec_quality": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break; case "channel_delete_delay": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DeleteDelay = TimeSpan.FromSeconds(oval); } break; case "channel_description": Description = (str)TsString.Unescape(value); break; case "channel_filepath": FilePath = (str)TsString.Unescape(value); break; case "channel_flag_default": IsDefault = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxclients_unlimited": IsMaxClientsUnlimited = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxfamilyclients_inherited": InheritsMaxFamilyClients = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxfamilyclients_unlimited": IsMaxFamilyClientsUnlimited = value.Length > 0 && value[0] != '0'; break; case "channel_flag_password": HasPassword = value.Length > 0 && value[0] != '0'; break; case "channel_flag_permanent": IsPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_flag_semi_permanent": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_forced_silence": ForcedSilence = value.Length > 0 && value[0] != '0'; break; case "channel_icon_id": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "channel_maxclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break; case "channel_maxfamilyclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break; case "channel_name": Name = (str)TsString.Unescape(value); break; case "channel_name_phonetic": PhoneticName = (str)TsString.Unescape(value); break; case "channel_needed_talk_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededTalkPower = (i32)oval; } break; case "channel_order": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break; case "channel_password": Password = (str)TsString.Unescape(value); break; case "channel_security_salt": PasswordSalt = (str)TsString.Unescape(value); break; case "channel_topic": Topic = (str)TsString.Unescape(value); break; case "pid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentChannelId = (ChannelId)oval; } break; case "seconds_empty": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DurationEmpty = TimeSpan.FromSeconds(oval); } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelInfoResponse[])to; foreach (var fld in flds) { switch(fld) { case "channel_banner_gfx_url": foreach(var toi in toc) { toi.BannerGfxUrl = BannerGfxUrl; } break; case "channel_banner_mode": foreach(var toi in toc) { toi.BannerMode = BannerMode; } break; case "channel_codec": foreach(var toi in toc) { toi.Codec = Codec; } break; case "channel_codec_is_unencrypted": foreach(var toi in toc) { toi.IsUnencrypted = IsUnencrypted; } break; case "channel_codec_latency_factor": foreach(var toi in toc) { toi.CodecLatencyFactor = CodecLatencyFactor; } break; case "channel_codec_quality": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break; case "channel_delete_delay": foreach(var toi in toc) { toi.DeleteDelay = DeleteDelay; } break; case "channel_description": foreach(var toi in toc) { toi.Description = Description; } break; case "channel_filepath": foreach(var toi in toc) { toi.FilePath = FilePath; } break; case "channel_flag_default": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break; case "channel_flag_maxclients_unlimited": foreach(var toi in toc) { toi.IsMaxClientsUnlimited = IsMaxClientsUnlimited; } break; case "channel_flag_maxfamilyclients_inherited": foreach(var toi in toc) { toi.InheritsMaxFamilyClients = InheritsMaxFamilyClients; } break; case "channel_flag_maxfamilyclients_unlimited": foreach(var toi in toc) { toi.IsMaxFamilyClientsUnlimited = IsMaxFamilyClientsUnlimited; } break; case "channel_flag_password": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break; case "channel_flag_permanent": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break; case "channel_flag_semi_permanent": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break; case "channel_forced_silence": foreach(var toi in toc) { toi.ForcedSilence = ForcedSilence; } break; case "channel_icon_id": foreach(var toi in toc) { toi.IconId = IconId; } break; case "channel_maxclients": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break; case "channel_maxfamilyclients": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break; case "channel_name": foreach(var toi in toc) { toi.Name = Name; } break; case "channel_name_phonetic": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break; case "channel_needed_talk_power": foreach(var toi in toc) { toi.NeededTalkPower = NeededTalkPower; } break; case "channel_order": foreach(var toi in toc) { toi.Order = Order; } break; case "channel_password": foreach(var toi in toc) { toi.Password = Password; } break; case "channel_security_salt": foreach(var toi in toc) { toi.PasswordSalt = PasswordSalt; } break; case "channel_topic": foreach(var toi in toc) { toi.Topic = Topic; } break; case "pid": foreach(var toi in toc) { toi.ParentChannelId = ParentChannelId; } break; case "seconds_empty": foreach(var toi in toc) { toi.DurationEmpty = DurationEmpty; } break; } } } } public sealed partial class ChannelList : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelList; public str? BannerGfxUrl { get; set; } public str? BannerMode { get; set; } public ChannelId ChannelId { get; set; } public Codec Codec { get; set; } public i32 CodecLatencyFactor { get; set; } public u8 CodecQuality { get; set; } public DurationSeconds DeleteDelay { get; set; } public bool ForcedSilence { get; set; } public str? Guid { get; set; } public bool HasPassword { get; set; } public IconHash IconId { get; set; } public bool InheritsMaxFamilyClients { get; set; } public bool IsDefault { get; set; } public bool IsMaxClientsUnlimited { get; set; } public bool IsMaxFamilyClientsUnlimited { get; set; } public bool IsPermanent { get; set; } public bool? IsPrivate { get; set; } public bool IsSemiPermanent { get; set; } public bool IsUnencrypted { get; set; } public i32 MaxClients { get; set; } public i32 MaxFamilyClients { get; set; } public str Name { get; set; } public i32 NeededTalkPower { get; set; } public ChannelId Order { get; set; } public ChannelId ParentId { get; set; } public str PhoneticName { get; set; } public str Topic { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "channel_banner_gfx_url": BannerGfxUrl = (str)TsString.Unescape(value); break; case "channel_banner_mode": BannerMode = (str)TsString.Unescape(value); break; case "channel_codec": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break; case "channel_codec_is_unencrypted": IsUnencrypted = value.Length > 0 && value[0] != '0'; break; case "channel_codec_latency_factor": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecLatencyFactor = (i32)oval; } break; case "channel_codec_quality": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break; case "channel_delete_delay": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DeleteDelay = TimeSpan.FromSeconds(oval); } break; case "channel_flag_default": IsDefault = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxclients_unlimited": IsMaxClientsUnlimited = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxfamilyclients_inherited": InheritsMaxFamilyClients = value.Length > 0 && value[0] != '0'; break; case "channel_flag_maxfamilyclients_unlimited": IsMaxFamilyClientsUnlimited = value.Length > 0 && value[0] != '0'; break; case "channel_flag_password": HasPassword = value.Length > 0 && value[0] != '0'; break; case "channel_flag_permanent": IsPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_flag_private": IsPrivate = value.Length > 0 && value[0] != '0'; break; case "channel_flag_semi_permanent": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_forced_silence": ForcedSilence = value.Length > 0 && value[0] != '0'; break; case "channel_icon_id": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "channel_maxclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break; case "channel_maxfamilyclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break; case "channel_name": Name = (str)TsString.Unescape(value); break; case "channel_name_phonetic": PhoneticName = (str)TsString.Unescape(value); break; case "channel_needed_talk_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededTalkPower = (i32)oval; } break; case "channel_order": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break; case "channel_topic": Topic = (str)TsString.Unescape(value); break; case "channel_unique_identifier": Guid = (str)TsString.Unescape(value); break; case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cpid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelList[])to; foreach (var fld in flds) { switch(fld) { case "channel_banner_gfx_url": foreach(var toi in toc) { toi.BannerGfxUrl = BannerGfxUrl; } break; case "channel_banner_mode": foreach(var toi in toc) { toi.BannerMode = BannerMode; } break; case "channel_codec": foreach(var toi in toc) { toi.Codec = Codec; } break; case "channel_codec_is_unencrypted": foreach(var toi in toc) { toi.IsUnencrypted = IsUnencrypted; } break; case "channel_codec_latency_factor": foreach(var toi in toc) { toi.CodecLatencyFactor = CodecLatencyFactor; } break; case "channel_codec_quality": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break; case "channel_delete_delay": foreach(var toi in toc) { toi.DeleteDelay = DeleteDelay; } break; case "channel_flag_default": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break; case "channel_flag_maxclients_unlimited": foreach(var toi in toc) { toi.IsMaxClientsUnlimited = IsMaxClientsUnlimited; } break; case "channel_flag_maxfamilyclients_inherited": foreach(var toi in toc) { toi.InheritsMaxFamilyClients = InheritsMaxFamilyClients; } break; case "channel_flag_maxfamilyclients_unlimited": foreach(var toi in toc) { toi.IsMaxFamilyClientsUnlimited = IsMaxFamilyClientsUnlimited; } break; case "channel_flag_password": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break; case "channel_flag_permanent": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break; case "channel_flag_private": foreach(var toi in toc) { toi.IsPrivate = IsPrivate; } break; case "channel_flag_semi_permanent": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break; case "channel_forced_silence": foreach(var toi in toc) { toi.ForcedSilence = ForcedSilence; } break; case "channel_icon_id": foreach(var toi in toc) { toi.IconId = IconId; } break; case "channel_maxclients": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break; case "channel_maxfamilyclients": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break; case "channel_name": foreach(var toi in toc) { toi.Name = Name; } break; case "channel_name_phonetic": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break; case "channel_needed_talk_power": foreach(var toi in toc) { toi.NeededTalkPower = NeededTalkPower; } break; case "channel_order": foreach(var toi in toc) { toi.Order = Order; } break; case "channel_topic": foreach(var toi in toc) { toi.Topic = Topic; } break; case "channel_unique_identifier": foreach(var toi in toc) { toi.Guid = Guid; } break; case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cpid": foreach(var toi in toc) { toi.ParentId = ParentId; } break; } } } } public sealed partial class ChannelListFinished : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelListFinished; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ChannelListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelListRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ChannelListResponse : IResponse { #pragma warning disable CS8618 public string? ReturnCode { get; set; } public ChannelId ChannelId { get; set; } public Codec? Codec { get; set; } public u8? CodecQuality { get; set; } public DurationSeconds? DurationEmpty { get; set; } public bool? HasPassword { get; set; } public IconHash? IconId { get; set; } public bool? IsDefault { get; set; } public bool? IsPermanent { get; set; } public bool? IsSemiPermanent { get; set; } public i32? MaxClients { get; set; } public i32? MaxFamilyClients { get; set; } public str Name { get; set; } public i32 NeededSubscribePower { get; set; } public i32? NeededTalkPower { get; set; } public ChannelId Order { get; set; } public ChannelId ParentChannelId { get; set; } public str? Topic { get; set; } public i32 TotalClients { get; set; } public i32? TotalFamilyClients { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "channel_codec": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break; case "channel_codec_quality": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break; case "channel_flag_default": IsDefault = value.Length > 0 && value[0] != '0'; break; case "channel_flag_password": HasPassword = value.Length > 0 && value[0] != '0'; break; case "channel_flag_permanent": IsPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_flag_semi_permanent": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break; case "channel_icon_id": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "channel_maxclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break; case "channel_maxfamilyclients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break; case "channel_name": Name = (str)TsString.Unescape(value); break; case "channel_needed_subscribe_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededSubscribePower = (i32)oval; } break; case "channel_needed_talk_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededTalkPower = (i32)oval; } break; case "channel_order": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break; case "channel_topic": Topic = (str)TsString.Unescape(value); break; case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "pid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentChannelId = (ChannelId)oval; } break; case "seconds_empty": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DurationEmpty = TimeSpan.FromSeconds(oval); } break; case "total_clients": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalClients = (i32)oval; } break; case "total_clients_family": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalFamilyClients = (i32)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelListResponse[])to; foreach (var fld in flds) { switch(fld) { case "channel_codec": foreach(var toi in toc) { toi.Codec = Codec; } break; case "channel_codec_quality": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break; case "channel_flag_default": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break; case "channel_flag_password": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break; case "channel_flag_permanent": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break; case "channel_flag_semi_permanent": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break; case "channel_icon_id": foreach(var toi in toc) { toi.IconId = IconId; } break; case "channel_maxclients": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break; case "channel_maxfamilyclients": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break; case "channel_name": foreach(var toi in toc) { toi.Name = Name; } break; case "channel_needed_subscribe_power": foreach(var toi in toc) { toi.NeededSubscribePower = NeededSubscribePower; } break; case "channel_needed_talk_power": foreach(var toi in toc) { toi.NeededTalkPower = NeededTalkPower; } break; case "channel_order": foreach(var toi in toc) { toi.Order = Order; } break; case "channel_topic": foreach(var toi in toc) { toi.Topic = Topic; } break; case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "pid": foreach(var toi in toc) { toi.ParentChannelId = ParentChannelId; } break; case "seconds_empty": foreach(var toi in toc) { toi.DurationEmpty = DurationEmpty; } break; case "total_clients": foreach(var toi in toc) { toi.TotalClients = TotalClients; } break; case "total_clients_family": foreach(var toi in toc) { toi.TotalFamilyClients = TotalFamilyClients; } break; } } } } public sealed partial class ChannelMove : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelMove; public ChannelId ChannelId { get; set; } public ChannelId? Order { get; set; } public ChannelId ParentId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cpid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break; case "order": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelMove[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cpid": foreach(var toi in toc) { toi.ParentId = ParentId; } break; case "order": foreach(var toi in toc) { toi.Order = Order; } break; } } } } public sealed partial class ChannelMoved : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelMoved; public ChannelId ChannelId { get; set; } public ClientId InvokerId { get; set; } public str InvokerName { get; set; } public Uid? InvokerUid { get; set; } public ChannelId Order { get; set; } public ChannelId ParentId { get; set; } public Reason Reason { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cpid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break; case "invokerid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; case "order": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break; case "reasonid": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelMoved[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cpid": foreach(var toi in toc) { toi.ParentId = ParentId; } break; case "invokerid": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; case "order": foreach(var toi in toc) { toi.Order = Order; } break; case "reasonid": foreach(var toi in toc) { toi.Reason = Reason; } break; } } } } public sealed partial class ChannelPasswordChanged : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelPasswordChanged; public ChannelId ChannelId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelPasswordChanged[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; } } } } public sealed partial class ChannelPermissionHints : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelPermissionHints; public ChannelId ChannelId { get; set; } public ChannelPermissionHint Flags { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "flags": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Flags = (ChannelPermissionHint)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelPermissionHints[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "flags": foreach(var toi in toc) { toi.Flags = Flags; } break; } } } } public sealed partial class ChannelPermList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelPermList; public string? ReturnCode { get; set; } public ChannelId ChannelId { get; set; } public Ts3Permission PermissionId { get; set; } public bool PermissionNegated { get; set; } public bool PermissionSkip { get; set; } public i32 PermissionValue { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permnegated": PermissionNegated = value.Length > 0 && value[0] != '0'; break; case "permskip": PermissionSkip = value.Length > 0 && value[0] != '0'; break; case "permvalue": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelPermList[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permnegated": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break; case "permskip": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break; case "permvalue": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break; } } } } public sealed partial class ChannelPermListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelPermListRequest; public ChannelId ChannelId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelPermListRequest[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; } } } } public sealed partial class ChannelSubscribe : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelSubscribe; public ChannelId ChannelId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelSubscribe[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; } } } } public sealed partial class ChannelSubscribeAll : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelSubscribeAll; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ChannelSubscribed : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelSubscribed; public ChannelId ChannelId { get; set; } public DurationSeconds? EmptySince { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "es": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) EmptySince = TimeSpan.FromSeconds(oval); } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelSubscribed[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "es": foreach(var toi in toc) { toi.EmptySince = EmptySince; } break; } } } } public sealed partial class ChannelUnsubscribe : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelUnsubscribe; public ChannelId ChannelId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelUnsubscribe[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; } } } } public sealed partial class ChannelUnsubscribeAll : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelUnsubscribeAll; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ChannelUnsubscribed : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ChannelUnsubscribed; public ChannelId ChannelId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ChannelUnsubscribed[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; } } } } public sealed partial class ClientAddPerm : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientAddPerm; public ClientDbId ClientDbId { get; set; } public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } public bool PermissionSkip { get; set; } public i32 PermissionValue { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; case "permskip": PermissionSkip = value.Length > 0 && value[0] != '0'; break; case "permvalue": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientAddPerm[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; case "permskip": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break; case "permvalue": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break; } } } } public sealed partial class ClientChannelGroupChanged : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientChannelGroupChanged; public ChannelGroupId ChannelGroup { get; set; } public ChannelGroupId ChannelGroupIndex { get; set; } public ChannelId ChannelId { get; set; } public ClientId ClientId { get; set; } public ClientId InvokerId { get; set; } public str InvokerName { get; set; } public Uid? InvokerUid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cgi": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroupIndex = (ChannelGroupId)oval; } break; case "cgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "invokerid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientChannelGroupChanged[])to; foreach (var fld in flds) { switch(fld) { case "cgi": foreach(var toi in toc) { toi.ChannelGroupIndex = ChannelGroupIndex; } break; case "cgid": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "invokerid": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; } } } } public sealed partial class ClientChatClose : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientChatClose; public ClientId ClientId { get; set; } public Uid ClientUid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientChatClose[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; } } } } public sealed partial class ClientChatClosed : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientChatClosed; public ClientId ClientId { get; set; } public Uid ClientUid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientChatClosed[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; } } } } public sealed partial class ClientChatComposing : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientChatComposing; public ClientId ClientId { get; set; } public Uid ClientUid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientChatComposing[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; } } } } public sealed partial class ClientConnectionInfo : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientConnectionInfo; public u64 BandwidthReceivedLastMinuteControl { get; set; } public u64 BandwidthReceivedLastMinuteKeepalive { get; set; } public u64 BandwidthReceivedLastMinuteSpeech { get; set; } public u64 BandwidthReceivedLastSecondControl { get; set; } public u64 BandwidthReceivedLastSecondKeepalive { get; set; } public u64 BandwidthReceivedLastSecondSpeech { get; set; } public u64 BandwidthSentLastMinuteControl { get; set; } public u64 BandwidthSentLastMinuteKeepalive { get; set; } public u64 BandwidthSentLastMinuteSpeech { get; set; } public u64 BandwidthSentLastSecondControl { get; set; } public u64 BandwidthSentLastSecondKeepalive { get; set; } public u64 BandwidthSentLastSecondSpeech { get; set; } public u64 BytesReceivedControl { get; set; } public u64 BytesReceivedKeepalive { get; set; } public u64 BytesReceivedSpeech { get; set; } public u64 BytesSentControl { get; set; } public u64 BytesSentKeepalive { get; set; } public u64 BytesSentSpeech { get; set; } public ClientId ClientId { get; set; } public f32 ClientToServerPacketlossControl { get; set; } public f32 ClientToServerPacketlossKeepalive { get; set; } public f32 ClientToServerPacketlossSpeech { get; set; } public f32 ClientToServerPacketlossTotal { get; set; } public DurationMilliseconds ConnectedTime { get; set; } public u64 FiletransferBandwidthReceived { get; set; } public u64 FiletransferBandwidthSent { get; set; } public DurationMilliseconds IdleTime { get; set; } public str Ip { get; set; } public u64 PacketsReceivedControl { get; set; } public u64 PacketsReceivedKeepalive { get; set; } public u64 PacketsReceivedSpeech { get; set; } public u64 PacketsSentControl { get; set; } public u64 PacketsSentKeepalive { get; set; } public u64 PacketsSentSpeech { get; set; } public DurationMilliseconds Ping { get; set; } public DurationMilliseconds PingDeviation { get; set; } public u16 Port { get; set; } public f32 ServerToClientPacketlossControl { get; set; } public f32 ServerToClientPacketlossKeepalive { get; set; } public f32 ServerToClientPacketlossSpeech { get; set; } public f32 ServerToClientPacketlossTotal { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "connection_bandwidth_received_last_minute_control": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastMinuteControl = (u64)oval; } break; case "connection_bandwidth_received_last_minute_keepalive": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastMinuteKeepalive = (u64)oval; } break; case "connection_bandwidth_received_last_minute_speech": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastMinuteSpeech = (u64)oval; } break; case "connection_bandwidth_received_last_second_control": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastSecondControl = (u64)oval; } break; case "connection_bandwidth_received_last_second_keepalive": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastSecondKeepalive = (u64)oval; } break; case "connection_bandwidth_received_last_second_speech": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastSecondSpeech = (u64)oval; } break; case "connection_bandwidth_sent_last_minute_control": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastMinuteControl = (u64)oval; } break; case "connection_bandwidth_sent_last_minute_keepalive": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastMinuteKeepalive = (u64)oval; } break; case "connection_bandwidth_sent_last_minute_speech": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastMinuteSpeech = (u64)oval; } break; case "connection_bandwidth_sent_last_second_control": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastSecondControl = (u64)oval; } break; case "connection_bandwidth_sent_last_second_keepalive": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastSecondKeepalive = (u64)oval; } break; case "connection_bandwidth_sent_last_second_speech": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastSecondSpeech = (u64)oval; } break; case "connection_bytes_received_control": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesReceivedControl = (u64)oval; } break; case "connection_bytes_received_keepalive": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesReceivedKeepalive = (u64)oval; } break; case "connection_bytes_received_speech": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesReceivedSpeech = (u64)oval; } break; case "connection_bytes_sent_control": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesSentControl = (u64)oval; } break; case "connection_bytes_sent_keepalive": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesSentKeepalive = (u64)oval; } break; case "connection_bytes_sent_speech": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesSentSpeech = (u64)oval; } break; case "connection_client_ip": Ip = (str)TsString.Unescape(value); break; case "connection_client_port": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) Port = (u16)oval; } break; case "connection_client2server_packetloss_control": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ClientToServerPacketlossControl = (f32)oval; } break; case "connection_client2server_packetloss_keepalive": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ClientToServerPacketlossKeepalive = (f32)oval; } break; case "connection_client2server_packetloss_speech": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ClientToServerPacketlossSpeech = (f32)oval; } break; case "connection_client2server_packetloss_total": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ClientToServerPacketlossTotal = (f32)oval; } break; case "connection_connected_time": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ConnectedTime = TimeSpan.FromMilliseconds(oval); } break; case "connection_filetransfer_bandwidth_received": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBandwidthReceived = (u64)oval; } break; case "connection_filetransfer_bandwidth_sent": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBandwidthSent = (u64)oval; } break; case "connection_idle_time": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) IdleTime = TimeSpan.FromMilliseconds(oval); } break; case "connection_packets_received_control": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsReceivedControl = (u64)oval; } break; case "connection_packets_received_keepalive": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsReceivedKeepalive = (u64)oval; } break; case "connection_packets_received_speech": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsReceivedSpeech = (u64)oval; } break; case "connection_packets_sent_control": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsSentControl = (u64)oval; } break; case "connection_packets_sent_keepalive": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsSentKeepalive = (u64)oval; } break; case "connection_packets_sent_speech": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsSentSpeech = (u64)oval; } break; case "connection_ping": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Ping = TimeSpan.FromMilliseconds(oval); } break; case "connection_ping_deviation": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) PingDeviation = TimeSpan.FromMilliseconds(oval); } break; case "connection_server2client_packetloss_control": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ServerToClientPacketlossControl = (f32)oval; } break; case "connection_server2client_packetloss_keepalive": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ServerToClientPacketlossKeepalive = (f32)oval; } break; case "connection_server2client_packetloss_speech": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ServerToClientPacketlossSpeech = (f32)oval; } break; case "connection_server2client_packetloss_total": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ServerToClientPacketlossTotal = (f32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientConnectionInfo[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "connection_bandwidth_received_last_minute_control": foreach(var toi in toc) { toi.BandwidthReceivedLastMinuteControl = BandwidthReceivedLastMinuteControl; } break; case "connection_bandwidth_received_last_minute_keepalive": foreach(var toi in toc) { toi.BandwidthReceivedLastMinuteKeepalive = BandwidthReceivedLastMinuteKeepalive; } break; case "connection_bandwidth_received_last_minute_speech": foreach(var toi in toc) { toi.BandwidthReceivedLastMinuteSpeech = BandwidthReceivedLastMinuteSpeech; } break; case "connection_bandwidth_received_last_second_control": foreach(var toi in toc) { toi.BandwidthReceivedLastSecondControl = BandwidthReceivedLastSecondControl; } break; case "connection_bandwidth_received_last_second_keepalive": foreach(var toi in toc) { toi.BandwidthReceivedLastSecondKeepalive = BandwidthReceivedLastSecondKeepalive; } break; case "connection_bandwidth_received_last_second_speech": foreach(var toi in toc) { toi.BandwidthReceivedLastSecondSpeech = BandwidthReceivedLastSecondSpeech; } break; case "connection_bandwidth_sent_last_minute_control": foreach(var toi in toc) { toi.BandwidthSentLastMinuteControl = BandwidthSentLastMinuteControl; } break; case "connection_bandwidth_sent_last_minute_keepalive": foreach(var toi in toc) { toi.BandwidthSentLastMinuteKeepalive = BandwidthSentLastMinuteKeepalive; } break; case "connection_bandwidth_sent_last_minute_speech": foreach(var toi in toc) { toi.BandwidthSentLastMinuteSpeech = BandwidthSentLastMinuteSpeech; } break; case "connection_bandwidth_sent_last_second_control": foreach(var toi in toc) { toi.BandwidthSentLastSecondControl = BandwidthSentLastSecondControl; } break; case "connection_bandwidth_sent_last_second_keepalive": foreach(var toi in toc) { toi.BandwidthSentLastSecondKeepalive = BandwidthSentLastSecondKeepalive; } break; case "connection_bandwidth_sent_last_second_speech": foreach(var toi in toc) { toi.BandwidthSentLastSecondSpeech = BandwidthSentLastSecondSpeech; } break; case "connection_bytes_received_control": foreach(var toi in toc) { toi.BytesReceivedControl = BytesReceivedControl; } break; case "connection_bytes_received_keepalive": foreach(var toi in toc) { toi.BytesReceivedKeepalive = BytesReceivedKeepalive; } break; case "connection_bytes_received_speech": foreach(var toi in toc) { toi.BytesReceivedSpeech = BytesReceivedSpeech; } break; case "connection_bytes_sent_control": foreach(var toi in toc) { toi.BytesSentControl = BytesSentControl; } break; case "connection_bytes_sent_keepalive": foreach(var toi in toc) { toi.BytesSentKeepalive = BytesSentKeepalive; } break; case "connection_bytes_sent_speech": foreach(var toi in toc) { toi.BytesSentSpeech = BytesSentSpeech; } break; case "connection_client_ip": foreach(var toi in toc) { toi.Ip = Ip; } break; case "connection_client_port": foreach(var toi in toc) { toi.Port = Port; } break; case "connection_client2server_packetloss_control": foreach(var toi in toc) { toi.ClientToServerPacketlossControl = ClientToServerPacketlossControl; } break; case "connection_client2server_packetloss_keepalive": foreach(var toi in toc) { toi.ClientToServerPacketlossKeepalive = ClientToServerPacketlossKeepalive; } break; case "connection_client2server_packetloss_speech": foreach(var toi in toc) { toi.ClientToServerPacketlossSpeech = ClientToServerPacketlossSpeech; } break; case "connection_client2server_packetloss_total": foreach(var toi in toc) { toi.ClientToServerPacketlossTotal = ClientToServerPacketlossTotal; } break; case "connection_connected_time": foreach(var toi in toc) { toi.ConnectedTime = ConnectedTime; } break; case "connection_filetransfer_bandwidth_received": foreach(var toi in toc) { toi.FiletransferBandwidthReceived = FiletransferBandwidthReceived; } break; case "connection_filetransfer_bandwidth_sent": foreach(var toi in toc) { toi.FiletransferBandwidthSent = FiletransferBandwidthSent; } break; case "connection_idle_time": foreach(var toi in toc) { toi.IdleTime = IdleTime; } break; case "connection_packets_received_control": foreach(var toi in toc) { toi.PacketsReceivedControl = PacketsReceivedControl; } break; case "connection_packets_received_keepalive": foreach(var toi in toc) { toi.PacketsReceivedKeepalive = PacketsReceivedKeepalive; } break; case "connection_packets_received_speech": foreach(var toi in toc) { toi.PacketsReceivedSpeech = PacketsReceivedSpeech; } break; case "connection_packets_sent_control": foreach(var toi in toc) { toi.PacketsSentControl = PacketsSentControl; } break; case "connection_packets_sent_keepalive": foreach(var toi in toc) { toi.PacketsSentKeepalive = PacketsSentKeepalive; } break; case "connection_packets_sent_speech": foreach(var toi in toc) { toi.PacketsSentSpeech = PacketsSentSpeech; } break; case "connection_ping": foreach(var toi in toc) { toi.Ping = Ping; } break; case "connection_ping_deviation": foreach(var toi in toc) { toi.PingDeviation = PingDeviation; } break; case "connection_server2client_packetloss_control": foreach(var toi in toc) { toi.ServerToClientPacketlossControl = ServerToClientPacketlossControl; } break; case "connection_server2client_packetloss_keepalive": foreach(var toi in toc) { toi.ServerToClientPacketlossKeepalive = ServerToClientPacketlossKeepalive; } break; case "connection_server2client_packetloss_speech": foreach(var toi in toc) { toi.ServerToClientPacketlossSpeech = ServerToClientPacketlossSpeech; } break; case "connection_server2client_packetloss_total": foreach(var toi in toc) { toi.ServerToClientPacketlossTotal = ServerToClientPacketlossTotal; } break; } } } } public sealed partial class ClientConnectionInfoRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientConnectionInfoRequest; public ClientId ClientId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientConnectionInfoRequest[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; } } } } public sealed partial class ClientConnectionInfoUpdateRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientConnectionInfoUpdateRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ClientDbDelete : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientDbDelete; public ClientDbId ClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientDbDelete[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; } } } } public sealed partial class ClientDbEdit : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientDbEdit; public ClientDbId ClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientDbEdit[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; } } } } public sealed partial class ClientDbFind : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientDbFind; public string? ReturnCode { get; set; } public ClientDbId ClientDbId { get; set; } public DateTime LastConnected { get; set; } public str Name { get; set; } public i32 TotalConnections { get; set; } public Uid Uid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "client_lastconnected": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) LastConnected = Tools.FromUnix(oval); } break; case "client_nickname": Name = (str)TsString.Unescape(value); break; case "client_totalconnections": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalConnections = (i32)oval; } break; case "client_unique_identifier": Uid = (Uid)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientDbFind[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "client_lastconnected": foreach(var toi in toc) { toi.LastConnected = LastConnected; } break; case "client_nickname": foreach(var toi in toc) { toi.Name = Name; } break; case "client_totalconnections": foreach(var toi in toc) { toi.TotalConnections = TotalConnections; } break; case "client_unique_identifier": foreach(var toi in toc) { toi.Uid = Uid; } break; } } } } public sealed partial class ClientDbFindRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientDbFindRequest; public str Pattern { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "pattern": Pattern = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientDbFindRequest[])to; foreach (var fld in flds) { switch(fld) { case "pattern": foreach(var toi in toc) { toi.Pattern = Pattern; } break; } } } } public sealed partial class ClientDbIdFromUid : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientDbIdFromUid; public string? ReturnCode { get; set; } public ClientDbId ClientDbId { get; set; } public Uid ClientUid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientDbIdFromUid[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; } } } } public sealed partial class ClientDbIdFromUidRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientDbIdFromUidRequest; public Uid ClientUid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientDbIdFromUidRequest[])to; foreach (var fld in flds) { switch(fld) { case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; } } } } public sealed partial class ClientDbInfo : IResponse { #pragma warning disable CS8618 public string? ReturnCode { get; set; } public str AvatarHash { get; set; } public str Base64HashClientUid { get; set; } public ChannelId ChannelId { get; set; } public ClientId ClientId { get; set; } public ClientType ClientType { get; set; } public DateTime CreationDate { get; set; } public ClientDbId DatabaseId { get; set; } public str Description { get; set; } public IconHash IconId { get; set; } public DateTime LastConnected { get; set; } public str LastIp { get; set; } public i64 MonthlyDownloadQuota { get; set; } public i64 MonthlyUploadQuota { get; set; } public str Name { get; set; } public i32 TotalConnections { get; set; } public i64 TotalDownloadQuota { get; set; } public i64 TotalUploadQuota { get; set; } public Uid Uid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "client_base64HashClientUID": Base64HashClientUid = (str)TsString.Unescape(value); break; case "client_created": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) CreationDate = Tools.FromUnix(oval); } break; case "client_database_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DatabaseId = (ClientDbId)oval; } break; case "client_description": Description = (str)TsString.Unescape(value); break; case "client_flag_avatar": AvatarHash = (str)TsString.Unescape(value); break; case "client_icon_id": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "client_lastconnected": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) LastConnected = Tools.FromUnix(oval); } break; case "client_lastip": LastIp = (str)TsString.Unescape(value); break; case "client_month_bytes_downloaded": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) MonthlyDownloadQuota = (i64)oval; } break; case "client_month_bytes_uploaded": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) MonthlyUploadQuota = (i64)oval; } break; case "client_nickname": Name = (str)TsString.Unescape(value); break; case "client_total_bytes_downloaded": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) TotalDownloadQuota = (i64)oval; } break; case "client_total_bytes_uploaded": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) TotalUploadQuota = (i64)oval; } break; case "client_totalconnections": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalConnections = (i32)oval; } break; case "client_type": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) ClientType = (ClientType)oval; } break; case "client_unique_identifier": Uid = (Uid)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientDbInfo[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "client_base64HashClientUID": foreach(var toi in toc) { toi.Base64HashClientUid = Base64HashClientUid; } break; case "client_created": foreach(var toi in toc) { toi.CreationDate = CreationDate; } break; case "client_database_id": foreach(var toi in toc) { toi.DatabaseId = DatabaseId; } break; case "client_description": foreach(var toi in toc) { toi.Description = Description; } break; case "client_flag_avatar": foreach(var toi in toc) { toi.AvatarHash = AvatarHash; } break; case "client_icon_id": foreach(var toi in toc) { toi.IconId = IconId; } break; case "client_lastconnected": foreach(var toi in toc) { toi.LastConnected = LastConnected; } break; case "client_lastip": foreach(var toi in toc) { toi.LastIp = LastIp; } break; case "client_month_bytes_downloaded": foreach(var toi in toc) { toi.MonthlyDownloadQuota = MonthlyDownloadQuota; } break; case "client_month_bytes_uploaded": foreach(var toi in toc) { toi.MonthlyUploadQuota = MonthlyUploadQuota; } break; case "client_nickname": foreach(var toi in toc) { toi.Name = Name; } break; case "client_total_bytes_downloaded": foreach(var toi in toc) { toi.TotalDownloadQuota = TotalDownloadQuota; } break; case "client_total_bytes_uploaded": foreach(var toi in toc) { toi.TotalUploadQuota = TotalUploadQuota; } break; case "client_totalconnections": foreach(var toi in toc) { toi.TotalConnections = TotalConnections; } break; case "client_type": foreach(var toi in toc) { toi.ClientType = ClientType; } break; case "client_unique_identifier": foreach(var toi in toc) { toi.Uid = Uid; } break; } } } } public sealed partial class ClientDbInfoRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientDbInfoRequest; public ClientDbId ClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientDbInfoRequest[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; } } } } public sealed partial class ClientDbList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientDbList; public string? ReturnCode { get; set; } public ClientDbId ClientDbId { get; set; } public DateTime CreationDate { get; set; } public str Description { get; set; } public DateTime LastConnected { get; set; } public str LastIp { get; set; } public str Name { get; set; } public i32 TotalConnections { get; set; } public Uid Uid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "client_created": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) CreationDate = Tools.FromUnix(oval); } break; case "client_description": Description = (str)TsString.Unescape(value); break; case "client_lastconnected": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) LastConnected = Tools.FromUnix(oval); } break; case "client_lastip": LastIp = (str)TsString.Unescape(value); break; case "client_nickname": Name = (str)TsString.Unescape(value); break; case "client_totalconnections": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalConnections = (i32)oval; } break; case "client_unique_identifier": Uid = (Uid)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientDbList[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "client_created": foreach(var toi in toc) { toi.CreationDate = CreationDate; } break; case "client_description": foreach(var toi in toc) { toi.Description = Description; } break; case "client_lastconnected": foreach(var toi in toc) { toi.LastConnected = LastConnected; } break; case "client_lastip": foreach(var toi in toc) { toi.LastIp = LastIp; } break; case "client_nickname": foreach(var toi in toc) { toi.Name = Name; } break; case "client_totalconnections": foreach(var toi in toc) { toi.TotalConnections = TotalConnections; } break; case "client_unique_identifier": foreach(var toi in toc) { toi.Uid = Uid; } break; } } } } public sealed partial class ClientDbListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientDbListRequest; public u32? Limit { get; set; } public u32? Offset { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "duration": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Limit = (u32)oval; } break; case "start": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Offset = (u32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientDbListRequest[])to; foreach (var fld in flds) { switch(fld) { case "duration": foreach(var toi in toc) { toi.Limit = Limit; } break; case "start": foreach(var toi in toc) { toi.Offset = Offset; } break; } } } } public sealed partial class ClientDelPerm : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientDelPerm; public ClientDbId ClientDbId { get; set; } public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientDelPerm[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; } } } } public sealed partial class ClientEdit : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientEdit; public ClientId ClientId { get; set; } public str? Description { get; set; } public bool? TalkPowerGranted { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "client_description": Description = (str)TsString.Unescape(value); break; case "client_is_talker": TalkPowerGranted = value.Length > 0 && value[0] != '0'; break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientEdit[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "client_description": foreach(var toi in toc) { toi.Description = Description; } break; case "client_is_talker": foreach(var toi in toc) { toi.TalkPowerGranted = TalkPowerGranted; } break; } } } } public sealed partial class ClientEnterView : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientEnterView; public str AvatarHash { get; set; } public str AwayMessage { get; set; } public str Badges { get; set; } public ChannelGroupId ChannelGroup { get; set; } public ClientId ClientId { get; set; } public ClientType ClientType { get; set; } public str CountryCode { get; set; } public ClientDbId DatabaseId { get; set; } public str Description { get; set; } public IconHash IconId { get; set; } public ChannelId InheritedChannelGroupFromChannel { get; set; } public bool InputHardwareEnabled { get; set; } public bool InputMuted { get; set; } public str Integrations { get; set; } public ClientId? InvokerId { get; set; } public str? InvokerName { get; set; } public Uid? InvokerUid { get; set; } public bool IsAway { get; set; } public bool IsChannelCommander { get; set; } public bool IsPrioritySpeaker { get; set; } public bool IsRecording { get; set; } public str Metadata { get; set; } public str MyTeamSpeakAvatar { get; set; } public str MyTeamSpeakId { get; set; } public str Name { get; set; } public i32 NeededServerqueryViewPower { get; set; } public bool OutputHardwareEnabled { get; set; } public bool OutputMuted { get; set; } public bool OutputOnlyMuted { get; set; } public str PhoneticName { get; set; } public Reason Reason { get; set; } public ServerGroupId[] ServerGroups { get; set; } public str SignedBadges { get; set; } public ChannelId SourceChannelId { get; set; } public i32 TalkPower { get; set; } public bool TalkPowerGranted { get; set; } public str TalkPowerRequestMessage { get; set; } public DateTime TalkPowerRequestTime { get; set; } public ChannelId TargetChannelId { get; set; } public Uid Uid { get; set; } public u32 UnreadMessages { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cfid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) SourceChannelId = (ChannelId)oval; } break; case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "client_away": IsAway = value.Length > 0 && value[0] != '0'; break; case "client_away_message": AwayMessage = (str)TsString.Unescape(value); break; case "client_badges": Badges = (str)TsString.Unescape(value); break; case "client_channel_group_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; case "client_channel_group_inherited_channel_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) InheritedChannelGroupFromChannel = (ChannelId)oval; } break; case "client_country": CountryCode = (str)TsString.Unescape(value); break; case "client_database_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DatabaseId = (ClientDbId)oval; } break; case "client_description": Description = (str)TsString.Unescape(value); break; case "client_flag_avatar": AvatarHash = (str)TsString.Unescape(value); break; case "client_icon_id": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "client_input_hardware": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_input_muted": InputMuted = value.Length > 0 && value[0] != '0'; break; case "client_integrations": Integrations = (str)TsString.Unescape(value); break; case "client_is_channel_commander": IsChannelCommander = value.Length > 0 && value[0] != '0'; break; case "client_is_priority_speaker": IsPrioritySpeaker = value.Length > 0 && value[0] != '0'; break; case "client_is_recording": IsRecording = value.Length > 0 && value[0] != '0'; break; case "client_is_talker": TalkPowerGranted = value.Length > 0 && value[0] != '0'; break; case "client_meta_data": Metadata = (str)TsString.Unescape(value); break; case "client_myteamspeak_avatar": MyTeamSpeakAvatar = (str)TsString.Unescape(value); break; case "client_myteamspeak_id": MyTeamSpeakId = (str)TsString.Unescape(value); break; case "client_needed_serverquery_view_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededServerqueryViewPower = (i32)oval; } break; case "client_nickname": Name = (str)TsString.Unescape(value); break; case "client_nickname_phonetic": PhoneticName = (str)TsString.Unescape(value); break; case "client_output_hardware": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_output_muted": OutputMuted = value.Length > 0 && value[0] != '0'; break; case "client_outputonly_muted": OutputOnlyMuted = value.Length > 0 && value[0] != '0'; break; case "client_servergroups": { if(value.Length == 0) ServerGroups = Array.Empty(); else { var ss = new SpanSplitter(); ss.First(value, (byte)','); int cnt = 0; for (int i = 0; i < value.Length; i++) if (value[i] == ',') cnt++; ServerGroups = new ServerGroupId[cnt + 1]; for(int i = 0; i < cnt + 1; i++) { { if(Utf8Parser.TryParse(ss.Trim(value), out u64 oval, out _)) ServerGroups[i] = (ServerGroupId)oval; } if (i < cnt) value = ss.Next(value); } } } break; case "client_signed_badges": SignedBadges = (str)TsString.Unescape(value); break; case "client_talk_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TalkPower = (i32)oval; } break; case "client_talk_request": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) TalkPowerRequestTime = Tools.FromUnix(oval); } break; case "client_talk_request_msg": TalkPowerRequestMessage = (str)TsString.Unescape(value); break; case "client_type": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) ClientType = (ClientType)oval; } break; case "client_unique_identifier": Uid = (Uid)TsString.Unescape(value); break; case "client_unread_messages": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) UnreadMessages = (u32)oval; } break; case "ctid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelId = (ChannelId)oval; } break; case "invokerid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; case "reasonid": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientEnterView[])to; foreach (var fld in flds) { switch(fld) { case "cfid": foreach(var toi in toc) { toi.SourceChannelId = SourceChannelId; } break; case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "client_away": foreach(var toi in toc) { toi.IsAway = IsAway; } break; case "client_away_message": foreach(var toi in toc) { toi.AwayMessage = AwayMessage; } break; case "client_badges": foreach(var toi in toc) { toi.Badges = Badges; } break; case "client_channel_group_id": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; case "client_channel_group_inherited_channel_id": foreach(var toi in toc) { toi.InheritedChannelGroupFromChannel = InheritedChannelGroupFromChannel; } break; case "client_country": foreach(var toi in toc) { toi.CountryCode = CountryCode; } break; case "client_database_id": foreach(var toi in toc) { toi.DatabaseId = DatabaseId; } break; case "client_description": foreach(var toi in toc) { toi.Description = Description; } break; case "client_flag_avatar": foreach(var toi in toc) { toi.AvatarHash = AvatarHash; } break; case "client_icon_id": foreach(var toi in toc) { toi.IconId = IconId; } break; case "client_input_hardware": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break; case "client_input_muted": foreach(var toi in toc) { toi.InputMuted = InputMuted; } break; case "client_integrations": foreach(var toi in toc) { toi.Integrations = Integrations; } break; case "client_is_channel_commander": foreach(var toi in toc) { toi.IsChannelCommander = IsChannelCommander; } break; case "client_is_priority_speaker": foreach(var toi in toc) { toi.IsPrioritySpeaker = IsPrioritySpeaker; } break; case "client_is_recording": foreach(var toi in toc) { toi.IsRecording = IsRecording; } break; case "client_is_talker": foreach(var toi in toc) { toi.TalkPowerGranted = TalkPowerGranted; } break; case "client_meta_data": foreach(var toi in toc) { toi.Metadata = Metadata; } break; case "client_myteamspeak_avatar": foreach(var toi in toc) { toi.MyTeamSpeakAvatar = MyTeamSpeakAvatar; } break; case "client_myteamspeak_id": foreach(var toi in toc) { toi.MyTeamSpeakId = MyTeamSpeakId; } break; case "client_needed_serverquery_view_power": foreach(var toi in toc) { toi.NeededServerqueryViewPower = NeededServerqueryViewPower; } break; case "client_nickname": foreach(var toi in toc) { toi.Name = Name; } break; case "client_nickname_phonetic": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break; case "client_output_hardware": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break; case "client_output_muted": foreach(var toi in toc) { toi.OutputMuted = OutputMuted; } break; case "client_outputonly_muted": foreach(var toi in toc) { toi.OutputOnlyMuted = OutputOnlyMuted; } break; case "client_servergroups": foreach(var toi in toc) { toi.ServerGroups = ServerGroups; } break; case "client_signed_badges": foreach(var toi in toc) { toi.SignedBadges = SignedBadges; } break; case "client_talk_power": foreach(var toi in toc) { toi.TalkPower = TalkPower; } break; case "client_talk_request": foreach(var toi in toc) { toi.TalkPowerRequestTime = TalkPowerRequestTime; } break; case "client_talk_request_msg": foreach(var toi in toc) { toi.TalkPowerRequestMessage = TalkPowerRequestMessage; } break; case "client_type": foreach(var toi in toc) { toi.ClientType = ClientType; } break; case "client_unique_identifier": foreach(var toi in toc) { toi.Uid = Uid; } break; case "client_unread_messages": foreach(var toi in toc) { toi.UnreadMessages = UnreadMessages; } break; case "ctid": foreach(var toi in toc) { toi.TargetChannelId = TargetChannelId; } break; case "invokerid": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; case "reasonid": foreach(var toi in toc) { toi.Reason = Reason; } break; } } } } public sealed partial class ClientFindRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientFindRequest; public str Pattern { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "pattern": Pattern = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientFindRequest[])to; foreach (var fld in flds) { switch(fld) { case "pattern": foreach(var toi in toc) { toi.Pattern = Pattern; } break; } } } } public sealed partial class ClientIds : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientIds; public string? ReturnCode { get; set; } public ClientId ClientId { get; set; } public Uid ClientUid { get; set; } public str Name { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; case "name": Name = (str)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientIds[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; } } } } public sealed partial class ClientIdsRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientIdsRequest; public Uid ClientUid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientIdsRequest[])to; foreach (var fld in flds) { switch(fld) { case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; } } } } public sealed partial class ClientInfo : IResponse { #pragma warning disable CS8618 public string? ReturnCode { get; set; } public str AvatarHash { get; set; } public str AwayMessage { get; set; } public str Badges { get; set; } public u64 BandwidthReceivedLastMinuteTotal { get; set; } public u64 BandwidthReceivedLastSecondTotal { get; set; } public u64 BandwidthSentLastMinuteTotal { get; set; } public u64 BandwidthSentLastSecondTotal { get; set; } public str Base64HashClientUid { get; set; } public u64 BytesReceivedTotal { get; set; } public u64 BytesSentTotal { get; set; } public ChannelGroupId ChannelGroup { get; set; } public ChannelId ChannelId { get; set; } public DurationMilliseconds ClientIdleTime { get; set; } public str ClientPlatform { get; set; } public ClientType ClientType { get; set; } public str ClientVersion { get; set; } public str ClientVersionSign { get; set; } public DurationMilliseconds ConnectedTime { get; set; } public str CountryCode { get; set; } public DateTime CreationDate { get; set; } public ClientDbId DatabaseId { get; set; } public str DefaultChannel { get; set; } public str DefaultToken { get; set; } public str Description { get; set; } public u64 FiletransferBandwidthReceived { get; set; } public u64 FiletransferBandwidthSent { get; set; } public IconHash IconId { get; set; } public ChannelId InheritedChannelGroupFromChannel { get; set; } public bool InputHardwareEnabled { get; set; } public bool InputMuted { get; set; } public str? Integrations { get; set; } public str Ip { get; set; } public bool IsAway { get; set; } public bool IsChannelCommander { get; set; } public bool IsPrioritySpeaker { get; set; } public bool IsRecording { get; set; } public DateTime LastConnected { get; set; } public str LoginName { get; set; } public str Metadata { get; set; } public i64 MonthlyDownloadQuota { get; set; } public i64 MonthlyUploadQuota { get; set; } public str? MyTeamSpeakId { get; set; } public str Name { get; set; } public i32 NeededServerqueryViewPower { get; set; } public bool OutputHardwareEnabled { get; set; } public bool OutputMuted { get; set; } public bool OutputOnlyMuted { get; set; } public u64 PacketsReceivedTotal { get; set; } public u64 PacketsSentTotal { get; set; } public str PhoneticName { get; set; } public str SecurityHash { get; set; } public ServerGroupId[] ServerGroups { get; set; } public i32 TalkPower { get; set; } public bool TalkPowerGranted { get; set; } public str TalkPowerRequestMessage { get; set; } public DateTime TalkPowerRequestTime { get; set; } public i32 TotalConnections { get; set; } public i64 TotalDownloadQuota { get; set; } public i64 TotalUploadQuota { get; set; } public Uid Uid { get; set; } public u32 UnreadMessages { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "client_away": IsAway = value.Length > 0 && value[0] != '0'; break; case "client_away_message": AwayMessage = (str)TsString.Unescape(value); break; case "client_badges": Badges = (str)TsString.Unescape(value); break; case "client_base64HashClientUID": Base64HashClientUid = (str)TsString.Unescape(value); break; case "client_channel_group_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; case "client_channel_group_inherited_channel_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) InheritedChannelGroupFromChannel = (ChannelId)oval; } break; case "client_country": CountryCode = (str)TsString.Unescape(value); break; case "client_created": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) CreationDate = Tools.FromUnix(oval); } break; case "client_database_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DatabaseId = (ClientDbId)oval; } break; case "client_default_channel": DefaultChannel = (str)TsString.Unescape(value); break; case "client_default_token": DefaultToken = (str)TsString.Unescape(value); break; case "client_description": Description = (str)TsString.Unescape(value); break; case "client_flag_avatar": AvatarHash = (str)TsString.Unescape(value); break; case "client_icon_id": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "client_idle_time": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ClientIdleTime = TimeSpan.FromMilliseconds(oval); } break; case "client_input_hardware": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_input_muted": InputMuted = value.Length > 0 && value[0] != '0'; break; case "client_integrations": Integrations = (str)TsString.Unescape(value); break; case "client_is_channel_commander": IsChannelCommander = value.Length > 0 && value[0] != '0'; break; case "client_is_priority_speaker": IsPrioritySpeaker = value.Length > 0 && value[0] != '0'; break; case "client_is_recording": IsRecording = value.Length > 0 && value[0] != '0'; break; case "client_is_talker": TalkPowerGranted = value.Length > 0 && value[0] != '0'; break; case "client_lastconnected": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) LastConnected = Tools.FromUnix(oval); } break; case "client_login_name": LoginName = (str)TsString.Unescape(value); break; case "client_meta_data": Metadata = (str)TsString.Unescape(value); break; case "client_month_bytes_downloaded": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) MonthlyDownloadQuota = (i64)oval; } break; case "client_month_bytes_uploaded": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) MonthlyUploadQuota = (i64)oval; } break; case "client_myteamspeak_id": MyTeamSpeakId = (str)TsString.Unescape(value); break; case "client_needed_serverquery_view_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededServerqueryViewPower = (i32)oval; } break; case "client_nickname": Name = (str)TsString.Unescape(value); break; case "client_nickname_phonetic": PhoneticName = (str)TsString.Unescape(value); break; case "client_output_hardware": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_output_muted": OutputMuted = value.Length > 0 && value[0] != '0'; break; case "client_outputonly_muted": OutputOnlyMuted = value.Length > 0 && value[0] != '0'; break; case "client_platform": ClientPlatform = (str)TsString.Unescape(value); break; case "client_security_hash": SecurityHash = (str)TsString.Unescape(value); break; case "client_servergroups": { if(value.Length == 0) ServerGroups = Array.Empty(); else { var ss = new SpanSplitter(); ss.First(value, (byte)','); int cnt = 0; for (int i = 0; i < value.Length; i++) if (value[i] == ',') cnt++; ServerGroups = new ServerGroupId[cnt + 1]; for(int i = 0; i < cnt + 1; i++) { { if(Utf8Parser.TryParse(ss.Trim(value), out u64 oval, out _)) ServerGroups[i] = (ServerGroupId)oval; } if (i < cnt) value = ss.Next(value); } } } break; case "client_talk_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TalkPower = (i32)oval; } break; case "client_talk_request": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) TalkPowerRequestTime = Tools.FromUnix(oval); } break; case "client_talk_request_msg": TalkPowerRequestMessage = (str)TsString.Unescape(value); break; case "client_total_bytes_downloaded": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) TotalDownloadQuota = (i64)oval; } break; case "client_total_bytes_uploaded": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) TotalUploadQuota = (i64)oval; } break; case "client_totalconnections": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalConnections = (i32)oval; } break; case "client_type": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) ClientType = (ClientType)oval; } break; case "client_unique_identifier": Uid = (Uid)TsString.Unescape(value); break; case "client_unread_messages": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) UnreadMessages = (u32)oval; } break; case "client_version": ClientVersion = (str)TsString.Unescape(value); break; case "client_version_sign": ClientVersionSign = (str)TsString.Unescape(value); break; case "connection_bandwidth_received_last_minute_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastMinuteTotal = (u64)oval; } break; case "connection_bandwidth_received_last_second_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastSecondTotal = (u64)oval; } break; case "connection_bandwidth_sent_last_minute_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastMinuteTotal = (u64)oval; } break; case "connection_bandwidth_sent_last_second_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastSecondTotal = (u64)oval; } break; case "connection_bytes_received_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesReceivedTotal = (u64)oval; } break; case "connection_bytes_sent_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesSentTotal = (u64)oval; } break; case "connection_client_ip": Ip = (str)TsString.Unescape(value); break; case "connection_connected_time": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ConnectedTime = TimeSpan.FromMilliseconds(oval); } break; case "connection_filetransfer_bandwidth_received": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBandwidthReceived = (u64)oval; } break; case "connection_filetransfer_bandwidth_sent": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBandwidthSent = (u64)oval; } break; case "connection_packets_received_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsReceivedTotal = (u64)oval; } break; case "connection_packets_sent_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsSentTotal = (u64)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientInfo[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "client_away": foreach(var toi in toc) { toi.IsAway = IsAway; } break; case "client_away_message": foreach(var toi in toc) { toi.AwayMessage = AwayMessage; } break; case "client_badges": foreach(var toi in toc) { toi.Badges = Badges; } break; case "client_base64HashClientUID": foreach(var toi in toc) { toi.Base64HashClientUid = Base64HashClientUid; } break; case "client_channel_group_id": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; case "client_channel_group_inherited_channel_id": foreach(var toi in toc) { toi.InheritedChannelGroupFromChannel = InheritedChannelGroupFromChannel; } break; case "client_country": foreach(var toi in toc) { toi.CountryCode = CountryCode; } break; case "client_created": foreach(var toi in toc) { toi.CreationDate = CreationDate; } break; case "client_database_id": foreach(var toi in toc) { toi.DatabaseId = DatabaseId; } break; case "client_default_channel": foreach(var toi in toc) { toi.DefaultChannel = DefaultChannel; } break; case "client_default_token": foreach(var toi in toc) { toi.DefaultToken = DefaultToken; } break; case "client_description": foreach(var toi in toc) { toi.Description = Description; } break; case "client_flag_avatar": foreach(var toi in toc) { toi.AvatarHash = AvatarHash; } break; case "client_icon_id": foreach(var toi in toc) { toi.IconId = IconId; } break; case "client_idle_time": foreach(var toi in toc) { toi.ClientIdleTime = ClientIdleTime; } break; case "client_input_hardware": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break; case "client_input_muted": foreach(var toi in toc) { toi.InputMuted = InputMuted; } break; case "client_integrations": foreach(var toi in toc) { toi.Integrations = Integrations; } break; case "client_is_channel_commander": foreach(var toi in toc) { toi.IsChannelCommander = IsChannelCommander; } break; case "client_is_priority_speaker": foreach(var toi in toc) { toi.IsPrioritySpeaker = IsPrioritySpeaker; } break; case "client_is_recording": foreach(var toi in toc) { toi.IsRecording = IsRecording; } break; case "client_is_talker": foreach(var toi in toc) { toi.TalkPowerGranted = TalkPowerGranted; } break; case "client_lastconnected": foreach(var toi in toc) { toi.LastConnected = LastConnected; } break; case "client_login_name": foreach(var toi in toc) { toi.LoginName = LoginName; } break; case "client_meta_data": foreach(var toi in toc) { toi.Metadata = Metadata; } break; case "client_month_bytes_downloaded": foreach(var toi in toc) { toi.MonthlyDownloadQuota = MonthlyDownloadQuota; } break; case "client_month_bytes_uploaded": foreach(var toi in toc) { toi.MonthlyUploadQuota = MonthlyUploadQuota; } break; case "client_myteamspeak_id": foreach(var toi in toc) { toi.MyTeamSpeakId = MyTeamSpeakId; } break; case "client_needed_serverquery_view_power": foreach(var toi in toc) { toi.NeededServerqueryViewPower = NeededServerqueryViewPower; } break; case "client_nickname": foreach(var toi in toc) { toi.Name = Name; } break; case "client_nickname_phonetic": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break; case "client_output_hardware": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break; case "client_output_muted": foreach(var toi in toc) { toi.OutputMuted = OutputMuted; } break; case "client_outputonly_muted": foreach(var toi in toc) { toi.OutputOnlyMuted = OutputOnlyMuted; } break; case "client_platform": foreach(var toi in toc) { toi.ClientPlatform = ClientPlatform; } break; case "client_security_hash": foreach(var toi in toc) { toi.SecurityHash = SecurityHash; } break; case "client_servergroups": foreach(var toi in toc) { toi.ServerGroups = ServerGroups; } break; case "client_talk_power": foreach(var toi in toc) { toi.TalkPower = TalkPower; } break; case "client_talk_request": foreach(var toi in toc) { toi.TalkPowerRequestTime = TalkPowerRequestTime; } break; case "client_talk_request_msg": foreach(var toi in toc) { toi.TalkPowerRequestMessage = TalkPowerRequestMessage; } break; case "client_total_bytes_downloaded": foreach(var toi in toc) { toi.TotalDownloadQuota = TotalDownloadQuota; } break; case "client_total_bytes_uploaded": foreach(var toi in toc) { toi.TotalUploadQuota = TotalUploadQuota; } break; case "client_totalconnections": foreach(var toi in toc) { toi.TotalConnections = TotalConnections; } break; case "client_type": foreach(var toi in toc) { toi.ClientType = ClientType; } break; case "client_unique_identifier": foreach(var toi in toc) { toi.Uid = Uid; } break; case "client_unread_messages": foreach(var toi in toc) { toi.UnreadMessages = UnreadMessages; } break; case "client_version": foreach(var toi in toc) { toi.ClientVersion = ClientVersion; } break; case "client_version_sign": foreach(var toi in toc) { toi.ClientVersionSign = ClientVersionSign; } break; case "connection_bandwidth_received_last_minute_total": foreach(var toi in toc) { toi.BandwidthReceivedLastMinuteTotal = BandwidthReceivedLastMinuteTotal; } break; case "connection_bandwidth_received_last_second_total": foreach(var toi in toc) { toi.BandwidthReceivedLastSecondTotal = BandwidthReceivedLastSecondTotal; } break; case "connection_bandwidth_sent_last_minute_total": foreach(var toi in toc) { toi.BandwidthSentLastMinuteTotal = BandwidthSentLastMinuteTotal; } break; case "connection_bandwidth_sent_last_second_total": foreach(var toi in toc) { toi.BandwidthSentLastSecondTotal = BandwidthSentLastSecondTotal; } break; case "connection_bytes_received_total": foreach(var toi in toc) { toi.BytesReceivedTotal = BytesReceivedTotal; } break; case "connection_bytes_sent_total": foreach(var toi in toc) { toi.BytesSentTotal = BytesSentTotal; } break; case "connection_client_ip": foreach(var toi in toc) { toi.Ip = Ip; } break; case "connection_connected_time": foreach(var toi in toc) { toi.ConnectedTime = ConnectedTime; } break; case "connection_filetransfer_bandwidth_received": foreach(var toi in toc) { toi.FiletransferBandwidthReceived = FiletransferBandwidthReceived; } break; case "connection_filetransfer_bandwidth_sent": foreach(var toi in toc) { toi.FiletransferBandwidthSent = FiletransferBandwidthSent; } break; case "connection_packets_received_total": foreach(var toi in toc) { toi.PacketsReceivedTotal = PacketsReceivedTotal; } break; case "connection_packets_sent_total": foreach(var toi in toc) { toi.PacketsSentTotal = PacketsSentTotal; } break; } } } } public sealed partial class ClientInfoRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientInfoRequest; public ClientId ClientId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientInfoRequest[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; } } } } public sealed partial class ClientInit : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientInit; public str? ActiveIntegrationsInfo { get; set; } public str? Badges { get; set; } public u64 ClientKeyOffset { get; set; } public str ClientPlatform { get; set; } public str ClientVersion { get; set; } public str ClientVersionSign { get; set; } public str DefaultChannel { get; set; } public str DefaultChannelPassword { get; set; } public str DefaultToken { get; set; } public str HardwareId { get; set; } public bool InputHardwareEnabled { get; set; } public str? Integrations { get; set; } public str Metadata { get; set; } public str? MyTeamSpeakAvatar { get; set; } public str? MyTeamSpeakId { get; set; } public str Name { get; set; } public bool OutputHardwareEnabled { get; set; } public str Password { get; set; } public str PhoneticName { get; set; } public str? SecurityHash { get; set; } public str? SignedBadges { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "client_active_integrations_info": ActiveIntegrationsInfo = (str)TsString.Unescape(value); break; case "client_badges": Badges = (str)TsString.Unescape(value); break; case "client_default_channel": DefaultChannel = (str)TsString.Unescape(value); break; case "client_default_channel_password": DefaultChannelPassword = (str)TsString.Unescape(value); break; case "client_default_token": DefaultToken = (str)TsString.Unescape(value); break; case "client_input_hardware": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_integrations": Integrations = (str)TsString.Unescape(value); break; case "client_key_offset": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientKeyOffset = (u64)oval; } break; case "client_meta_data": Metadata = (str)TsString.Unescape(value); break; case "client_myteamspeak_avatar": MyTeamSpeakAvatar = (str)TsString.Unescape(value); break; case "client_myteamspeak_id": MyTeamSpeakId = (str)TsString.Unescape(value); break; case "client_nickname": Name = (str)TsString.Unescape(value); break; case "client_nickname_phonetic": PhoneticName = (str)TsString.Unescape(value); break; case "client_output_hardware": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_platform": ClientPlatform = (str)TsString.Unescape(value); break; case "client_security_hash": SecurityHash = (str)TsString.Unescape(value); break; case "client_server_password": Password = (str)TsString.Unescape(value); break; case "client_signed_badges": SignedBadges = (str)TsString.Unescape(value); break; case "client_version": ClientVersion = (str)TsString.Unescape(value); break; case "client_version_sign": ClientVersionSign = (str)TsString.Unescape(value); break; case "hwid": HardwareId = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientInit[])to; foreach (var fld in flds) { switch(fld) { case "client_active_integrations_info": foreach(var toi in toc) { toi.ActiveIntegrationsInfo = ActiveIntegrationsInfo; } break; case "client_badges": foreach(var toi in toc) { toi.Badges = Badges; } break; case "client_default_channel": foreach(var toi in toc) { toi.DefaultChannel = DefaultChannel; } break; case "client_default_channel_password": foreach(var toi in toc) { toi.DefaultChannelPassword = DefaultChannelPassword; } break; case "client_default_token": foreach(var toi in toc) { toi.DefaultToken = DefaultToken; } break; case "client_input_hardware": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break; case "client_integrations": foreach(var toi in toc) { toi.Integrations = Integrations; } break; case "client_key_offset": foreach(var toi in toc) { toi.ClientKeyOffset = ClientKeyOffset; } break; case "client_meta_data": foreach(var toi in toc) { toi.Metadata = Metadata; } break; case "client_myteamspeak_avatar": foreach(var toi in toc) { toi.MyTeamSpeakAvatar = MyTeamSpeakAvatar; } break; case "client_myteamspeak_id": foreach(var toi in toc) { toi.MyTeamSpeakId = MyTeamSpeakId; } break; case "client_nickname": foreach(var toi in toc) { toi.Name = Name; } break; case "client_nickname_phonetic": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break; case "client_output_hardware": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break; case "client_platform": foreach(var toi in toc) { toi.ClientPlatform = ClientPlatform; } break; case "client_security_hash": foreach(var toi in toc) { toi.SecurityHash = SecurityHash; } break; case "client_server_password": foreach(var toi in toc) { toi.Password = Password; } break; case "client_signed_badges": foreach(var toi in toc) { toi.SignedBadges = SignedBadges; } break; case "client_version": foreach(var toi in toc) { toi.ClientVersion = ClientVersion; } break; case "client_version_sign": foreach(var toi in toc) { toi.ClientVersionSign = ClientVersionSign; } break; case "hwid": foreach(var toi in toc) { toi.HardwareId = HardwareId; } break; } } } } public sealed partial class ClientInitIv : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientInitIv; public str Alpha { get; set; } public IpAddr Ip { get; set; } public str Omega { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "alpha": Alpha = (str)TsString.Unescape(value); break; case "ip": Ip = (IpAddr)TsString.Unescape(value); break; case "omega": Omega = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientInitIv[])to; foreach (var fld in flds) { switch(fld) { case "alpha": foreach(var toi in toc) { toi.Alpha = Alpha; } break; case "ip": foreach(var toi in toc) { toi.Ip = Ip; } break; case "omega": foreach(var toi in toc) { toi.Omega = Omega; } break; } } } } public sealed partial class ClientKick : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientKick; public ClientId ClientId { get; set; } public Reason Reason { get; set; } public str? ReasonMessage { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "reasonid": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break; case "reasonmsg": ReasonMessage = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientKick[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "reasonid": foreach(var toi in toc) { toi.Reason = Reason; } break; case "reasonmsg": foreach(var toi in toc) { toi.ReasonMessage = ReasonMessage; } break; } } } } public sealed partial class ClientLeftView : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientLeftView; public DurationSeconds? BanTime { get; set; } public ClientId ClientId { get; set; } public ClientId? InvokerId { get; set; } public str? InvokerName { get; set; } public Uid? InvokerUid { get; set; } public Reason? Reason { get; set; } public str? ReasonMessage { get; set; } public ChannelId SourceChannelId { get; set; } public ChannelId TargetChannelId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "bantime": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) BanTime = TimeSpan.FromSeconds(oval); } break; case "cfid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) SourceChannelId = (ChannelId)oval; } break; case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "ctid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelId = (ChannelId)oval; } break; case "invokerid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; case "reasonid": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break; case "reasonmsg": ReasonMessage = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientLeftView[])to; foreach (var fld in flds) { switch(fld) { case "bantime": foreach(var toi in toc) { toi.BanTime = BanTime; } break; case "cfid": foreach(var toi in toc) { toi.SourceChannelId = SourceChannelId; } break; case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "ctid": foreach(var toi in toc) { toi.TargetChannelId = TargetChannelId; } break; case "invokerid": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; case "reasonid": foreach(var toi in toc) { toi.Reason = Reason; } break; case "reasonmsg": foreach(var toi in toc) { toi.ReasonMessage = ReasonMessage; } break; } } } } public sealed partial class ClientList : IResponse { #pragma warning disable CS8618 public string? ReturnCode { get; set; } public str? AwayMessage { get; set; } public str? Badges { get; set; } public ChannelGroupId? ChannelGroup { get; set; } public ChannelId ChannelId { get; set; } public ClientId ClientId { get; set; } public DurationMilliseconds? ClientIdleTime { get; set; } public str? ClientPlatform { get; set; } public ClientType ClientType { get; set; } public str? ClientVersion { get; set; } public str? CountryCode { get; set; } public DateTime? CreationDate { get; set; } public ClientDbId DatabaseId { get; set; } public ChannelId? InheritedChannelGroupFromChannel { get; set; } public bool? InputHardwareEnabled { get; set; } public bool? InputMuted { get; set; } public str? Ip { get; set; } public bool? IsAway { get; set; } public bool? IsChannelCommander { get; set; } public bool? IsPrioritySpeaker { get; set; } public bool? IsRecording { get; set; } public bool? IsTalking { get; set; } public DateTime? LastConnected { get; set; } public str Name { get; set; } public bool? OutputHardwareEnabled { get; set; } public bool? OutputMuted { get; set; } public ServerGroupId[]? ServerGroups { get; set; } public i32? TalkPower { get; set; } public bool? TalkPowerGranted { get; set; } public Uid? Uid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "client_away": IsAway = value.Length > 0 && value[0] != '0'; break; case "client_away_message": AwayMessage = (str)TsString.Unescape(value); break; case "client_badges": Badges = (str)TsString.Unescape(value); break; case "client_channel_group_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; case "client_channel_group_inherited_channel_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) InheritedChannelGroupFromChannel = (ChannelId)oval; } break; case "client_country": CountryCode = (str)TsString.Unescape(value); break; case "client_created": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) CreationDate = Tools.FromUnix(oval); } break; case "client_database_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DatabaseId = (ClientDbId)oval; } break; case "client_flag_talking": IsTalking = value.Length > 0 && value[0] != '0'; break; case "client_idle_time": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ClientIdleTime = TimeSpan.FromMilliseconds(oval); } break; case "client_input_hardware": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_input_muted": InputMuted = value.Length > 0 && value[0] != '0'; break; case "client_is_channel_commander": IsChannelCommander = value.Length > 0 && value[0] != '0'; break; case "client_is_priority_speaker": IsPrioritySpeaker = value.Length > 0 && value[0] != '0'; break; case "client_is_recording": IsRecording = value.Length > 0 && value[0] != '0'; break; case "client_is_talker": TalkPowerGranted = value.Length > 0 && value[0] != '0'; break; case "client_lastconnected": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) LastConnected = Tools.FromUnix(oval); } break; case "client_nickname": Name = (str)TsString.Unescape(value); break; case "client_output_hardware": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_output_muted": OutputMuted = value.Length > 0 && value[0] != '0'; break; case "client_platform": ClientPlatform = (str)TsString.Unescape(value); break; case "client_servergroups": { if(value.Length == 0) ServerGroups = Array.Empty(); else { var ss = new SpanSplitter(); ss.First(value, (byte)','); int cnt = 0; for (int i = 0; i < value.Length; i++) if (value[i] == ',') cnt++; ServerGroups = new ServerGroupId[cnt + 1]; for(int i = 0; i < cnt + 1; i++) { { if(Utf8Parser.TryParse(ss.Trim(value), out u64 oval, out _)) ServerGroups[i] = (ServerGroupId)oval; } if (i < cnt) value = ss.Next(value); } } } break; case "client_talk_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TalkPower = (i32)oval; } break; case "client_type": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) ClientType = (ClientType)oval; } break; case "client_unique_identifier": Uid = (Uid)TsString.Unescape(value); break; case "client_version": ClientVersion = (str)TsString.Unescape(value); break; case "connection_client_ip": Ip = (str)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientList[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "client_away": foreach(var toi in toc) { toi.IsAway = IsAway; } break; case "client_away_message": foreach(var toi in toc) { toi.AwayMessage = AwayMessage; } break; case "client_badges": foreach(var toi in toc) { toi.Badges = Badges; } break; case "client_channel_group_id": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; case "client_channel_group_inherited_channel_id": foreach(var toi in toc) { toi.InheritedChannelGroupFromChannel = InheritedChannelGroupFromChannel; } break; case "client_country": foreach(var toi in toc) { toi.CountryCode = CountryCode; } break; case "client_created": foreach(var toi in toc) { toi.CreationDate = CreationDate; } break; case "client_database_id": foreach(var toi in toc) { toi.DatabaseId = DatabaseId; } break; case "client_flag_talking": foreach(var toi in toc) { toi.IsTalking = IsTalking; } break; case "client_idle_time": foreach(var toi in toc) { toi.ClientIdleTime = ClientIdleTime; } break; case "client_input_hardware": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break; case "client_input_muted": foreach(var toi in toc) { toi.InputMuted = InputMuted; } break; case "client_is_channel_commander": foreach(var toi in toc) { toi.IsChannelCommander = IsChannelCommander; } break; case "client_is_priority_speaker": foreach(var toi in toc) { toi.IsPrioritySpeaker = IsPrioritySpeaker; } break; case "client_is_recording": foreach(var toi in toc) { toi.IsRecording = IsRecording; } break; case "client_is_talker": foreach(var toi in toc) { toi.TalkPowerGranted = TalkPowerGranted; } break; case "client_lastconnected": foreach(var toi in toc) { toi.LastConnected = LastConnected; } break; case "client_nickname": foreach(var toi in toc) { toi.Name = Name; } break; case "client_output_hardware": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break; case "client_output_muted": foreach(var toi in toc) { toi.OutputMuted = OutputMuted; } break; case "client_platform": foreach(var toi in toc) { toi.ClientPlatform = ClientPlatform; } break; case "client_servergroups": foreach(var toi in toc) { toi.ServerGroups = ServerGroups; } break; case "client_talk_power": foreach(var toi in toc) { toi.TalkPower = TalkPower; } break; case "client_type": foreach(var toi in toc) { toi.ClientType = ClientType; } break; case "client_unique_identifier": foreach(var toi in toc) { toi.Uid = Uid; } break; case "client_version": foreach(var toi in toc) { toi.ClientVersion = ClientVersion; } break; case "connection_client_ip": foreach(var toi in toc) { toi.Ip = Ip; } break; } } } } public sealed partial class ClientListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientListRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ClientMove : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientMove; public ChannelId ChannelId { get; set; } public str? ChannelPassword { get; set; } public ClientId ClientId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "cpw": ChannelPassword = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientMove[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "cpw": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break; } } } } public sealed partial class ClientMoved : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientMoved; public ClientId ClientId { get; set; } public ClientId? InvokerId { get; set; } public str? InvokerName { get; set; } public Uid? InvokerUid { get; set; } public Reason Reason { get; set; } public str? ReasonMessage { get; set; } public ChannelId TargetChannelId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "ctid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelId = (ChannelId)oval; } break; case "invokerid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; case "reasonid": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break; case "reasonmsg": ReasonMessage = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientMoved[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "ctid": foreach(var toi in toc) { toi.TargetChannelId = TargetChannelId; } break; case "invokerid": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; case "reasonid": foreach(var toi in toc) { toi.Reason = Reason; } break; case "reasonmsg": foreach(var toi in toc) { toi.ReasonMessage = ReasonMessage; } break; } } } } public sealed partial class ClientNameFromDbId : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientNameFromDbId; public string? ReturnCode { get; set; } public ClientDbId ClientDbId { get; set; } public Uid ClientUid { get; set; } public str Name { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; case "name": Name = (str)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientNameFromDbId[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; } } } } public sealed partial class ClientNameFromDbIdRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientNameFromDbIdRequest; public ClientDbId ClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientNameFromDbIdRequest[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; } } } } public sealed partial class ClientNameFromUid : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientNameFromUid; public string? ReturnCode { get; set; } public ClientDbId ClientDbId { get; set; } public Uid ClientUid { get; set; } public str Name { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; case "name": Name = (str)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientNameFromUid[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; } } } } public sealed partial class ClientNameFromUidRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientNameFromUidRequest; public Uid ClientUid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientNameFromUidRequest[])to; foreach (var fld in flds) { switch(fld) { case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; } } } } public sealed partial class ClientNeededPermissions : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientNeededPermissions; public Ts3Permission PermissionId { get; set; } public i32? PermissionValue { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permvalue": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientNeededPermissions[])to; foreach (var fld in flds) { switch(fld) { case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permvalue": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break; } } } } public sealed partial class ClientPermissionHints : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientPermissionHints; public ClientId ClientId { get; set; } public ClientPermissionHint Flags { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "flags": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Flags = (ClientPermissionHint)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientPermissionHints[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "flags": foreach(var toi in toc) { toi.Flags = Flags; } break; } } } } public sealed partial class ClientPermList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientPermList; public string? ReturnCode { get; set; } public ClientDbId ClientDbId { get; set; } public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } public bool PermissionNegated { get; set; } public bool PermissionSkip { get; set; } public i32 PermissionValue { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permnegated": PermissionNegated = value.Length > 0 && value[0] != '0'; break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; case "permskip": PermissionSkip = value.Length > 0 && value[0] != '0'; break; case "permvalue": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientPermList[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permnegated": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; case "permskip": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break; case "permvalue": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break; } } } } public sealed partial class ClientPermListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientPermListRequest; public ClientDbId ClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientPermListRequest[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; } } } } public sealed partial class ClientPoke : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientPoke; public ClientId InvokerId { get; set; } public str InvokerName { get; set; } public Uid? InvokerUid { get; set; } public str Message { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "invokerid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; case "msg": Message = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientPoke[])to; foreach (var fld in flds) { switch(fld) { case "invokerid": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; case "msg": foreach(var toi in toc) { toi.Message = Message; } break; } } } } public sealed partial class ClientPokeRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientPokeRequest; public ClientId ClientId { get; set; } public str Message { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "msg": Message = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientPokeRequest[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "msg": foreach(var toi in toc) { toi.Message = Message; } break; } } } } public sealed partial class ClientServerGroupAdded : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientServerGroupAdded; public ClientId ClientId { get; set; } public Uid ClientUid { get; set; } public ClientId InvokerId { get; set; } public str InvokerName { get; set; } public Uid? InvokerUid { get; set; } public str Name { get; set; } public ServerGroupId ServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; case "invokerid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; case "name": Name = (str)TsString.Unescape(value); break; case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientServerGroupAdded[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; case "invokerid": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ClientServerGroupRemoved : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientServerGroupRemoved; public ClientId ClientId { get; set; } public Uid ClientUid { get; set; } public ClientId InvokerId { get; set; } public str InvokerName { get; set; } public Uid? InvokerUid { get; set; } public str Name { get; set; } public ServerGroupId ServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; case "invokerid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; case "name": Name = (str)TsString.Unescape(value); break; case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientServerGroupRemoved[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; case "invokerid": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ClientSetServerQueryLogin : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientSetServerQueryLogin; public string? ReturnCode { get; set; } public str LoginPassword { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "client_login_password": LoginPassword = (str)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientSetServerQueryLogin[])to; foreach (var fld in flds) { switch(fld) { case "client_login_password": foreach(var toi in toc) { toi.LoginPassword = LoginPassword; } break; } } } } public sealed partial class ClientSetServerQueryLoginRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientSetServerQueryLoginRequest; public ClientDbId? ClientDbId { get; set; } public str LoginName { get; set; } public str? LoginPassword { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "client_login_name": LoginName = (str)TsString.Unescape(value); break; case "client_login_password": LoginPassword = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientSetServerQueryLoginRequest[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "client_login_name": foreach(var toi in toc) { toi.LoginName = LoginName; } break; case "client_login_password": foreach(var toi in toc) { toi.LoginPassword = LoginPassword; } break; } } } } public sealed partial class ClientUidFromClid : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientUidFromClid; public string? ReturnCode { get; set; } public ClientId ClientId { get; set; } public Uid ClientUid { get; set; } public str Nickname { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; case "nickname": Nickname = (str)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientUidFromClid[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; case "nickname": foreach(var toi in toc) { toi.Nickname = Nickname; } break; } } } } public sealed partial class ClientUidFromClidRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientUidFromClidRequest; public ClientId ClientId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientUidFromClidRequest[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; } } } } public sealed partial class ClientUpdate : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientUpdate; public str? AvatarHash { get; set; } public str? AwayMessage { get; set; } public str? Badges { get; set; } public bool? InputHardwareEnabled { get; set; } public bool? InputMuted { get; set; } public bool? IsAway { get; set; } public bool? IsChannelCommander { get; set; } public bool? IsRecording { get; set; } public str? Name { get; set; } public bool? OutputHardwareEnabled { get; set; } public bool? OutputMuted { get; set; } public str? PhoneticName { get; set; } public str? TalkPowerRequestMessage { get; set; } public DateTime? TalkPowerRequestTime { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "client_away": IsAway = value.Length > 0 && value[0] != '0'; break; case "client_away_message": AwayMessage = (str)TsString.Unescape(value); break; case "client_badges": Badges = (str)TsString.Unescape(value); break; case "client_flag_avatar": AvatarHash = (str)TsString.Unescape(value); break; case "client_input_hardware": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_input_muted": InputMuted = value.Length > 0 && value[0] != '0'; break; case "client_is_channel_commander": IsChannelCommander = value.Length > 0 && value[0] != '0'; break; case "client_is_recording": IsRecording = value.Length > 0 && value[0] != '0'; break; case "client_nickname": Name = (str)TsString.Unescape(value); break; case "client_nickname_phonetic": PhoneticName = (str)TsString.Unescape(value); break; case "client_output_hardware": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_output_muted": OutputMuted = value.Length > 0 && value[0] != '0'; break; case "client_talk_request": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) TalkPowerRequestTime = Tools.FromUnix(oval); } break; case "client_talk_request_msg": TalkPowerRequestMessage = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientUpdate[])to; foreach (var fld in flds) { switch(fld) { case "client_away": foreach(var toi in toc) { toi.IsAway = IsAway; } break; case "client_away_message": foreach(var toi in toc) { toi.AwayMessage = AwayMessage; } break; case "client_badges": foreach(var toi in toc) { toi.Badges = Badges; } break; case "client_flag_avatar": foreach(var toi in toc) { toi.AvatarHash = AvatarHash; } break; case "client_input_hardware": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break; case "client_input_muted": foreach(var toi in toc) { toi.InputMuted = InputMuted; } break; case "client_is_channel_commander": foreach(var toi in toc) { toi.IsChannelCommander = IsChannelCommander; } break; case "client_is_recording": foreach(var toi in toc) { toi.IsRecording = IsRecording; } break; case "client_nickname": foreach(var toi in toc) { toi.Name = Name; } break; case "client_nickname_phonetic": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break; case "client_output_hardware": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break; case "client_output_muted": foreach(var toi in toc) { toi.OutputMuted = OutputMuted; } break; case "client_talk_request": foreach(var toi in toc) { toi.TalkPowerRequestTime = TalkPowerRequestTime; } break; case "client_talk_request_msg": foreach(var toi in toc) { toi.TalkPowerRequestMessage = TalkPowerRequestMessage; } break; } } } } public sealed partial class ClientUpdated : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientUpdated; public str? AvatarHash { get; set; } public str? AwayMessage { get; set; } public str? Badges { get; set; } public ClientId ClientId { get; set; } public str? ClientPlatform { get; set; } public str? ClientVersion { get; set; } public DateTime? CreationDate { get; set; } public str? Description { get; set; } public IconHash? IconId { get; set; } public bool? InputHardwareEnabled { get; set; } public bool? InputMuted { get; set; } public bool? IsAway { get; set; } public bool? IsChannelCommander { get; set; } public bool? IsPrioritySpeaker { get; set; } public bool? IsRecording { get; set; } public DateTime? LastConnected { get; set; } public str? LoginName { get; set; } public i64? MonthlyDownloadQuota { get; set; } public i64? MonthlyUploadQuota { get; set; } public str? MyTeamSpeakId { get; set; } public str? Name { get; set; } public bool? OutputHardwareEnabled { get; set; } public bool? OutputMuted { get; set; } public str? PhoneticName { get; set; } public ServerGroupId[]? ServerGroups { get; set; } public i32? TalkPower { get; set; } public bool? TalkPowerGranted { get; set; } public str? TalkPowerRequestMessage { get; set; } public DateTime? TalkPowerRequestTime { get; set; } public i32? TotalConnections { get; set; } public i64? TotalDownloadQuota { get; set; } public i64? TotalUploadQuota { get; set; } public u32? UnreadMessages { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "client_away": IsAway = value.Length > 0 && value[0] != '0'; break; case "client_away_message": AwayMessage = (str)TsString.Unescape(value); break; case "client_badges": Badges = (str)TsString.Unescape(value); break; case "client_created": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) CreationDate = Tools.FromUnix(oval); } break; case "client_description": Description = (str)TsString.Unescape(value); break; case "client_flag_avatar": AvatarHash = (str)TsString.Unescape(value); break; case "client_icon_id": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "client_input_hardware": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_input_muted": InputMuted = value.Length > 0 && value[0] != '0'; break; case "client_is_channel_commander": IsChannelCommander = value.Length > 0 && value[0] != '0'; break; case "client_is_priority_speaker": IsPrioritySpeaker = value.Length > 0 && value[0] != '0'; break; case "client_is_recording": IsRecording = value.Length > 0 && value[0] != '0'; break; case "client_is_talker": TalkPowerGranted = value.Length > 0 && value[0] != '0'; break; case "client_lastconnected": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) LastConnected = Tools.FromUnix(oval); } break; case "client_login_name": LoginName = (str)TsString.Unescape(value); break; case "client_month_bytes_downloaded": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) MonthlyDownloadQuota = (i64)oval; } break; case "client_month_bytes_uploaded": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) MonthlyUploadQuota = (i64)oval; } break; case "client_myteamspeak_id": MyTeamSpeakId = (str)TsString.Unescape(value); break; case "client_nickname": Name = (str)TsString.Unescape(value); break; case "client_nickname_phonetic": PhoneticName = (str)TsString.Unescape(value); break; case "client_output_hardware": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_output_muted": OutputMuted = value.Length > 0 && value[0] != '0'; break; case "client_platform": ClientPlatform = (str)TsString.Unescape(value); break; case "client_servergroups": { if(value.Length == 0) ServerGroups = Array.Empty(); else { var ss = new SpanSplitter(); ss.First(value, (byte)','); int cnt = 0; for (int i = 0; i < value.Length; i++) if (value[i] == ',') cnt++; ServerGroups = new ServerGroupId[cnt + 1]; for(int i = 0; i < cnt + 1; i++) { { if(Utf8Parser.TryParse(ss.Trim(value), out u64 oval, out _)) ServerGroups[i] = (ServerGroupId)oval; } if (i < cnt) value = ss.Next(value); } } } break; case "client_talk_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TalkPower = (i32)oval; } break; case "client_talk_request": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) TalkPowerRequestTime = Tools.FromUnix(oval); } break; case "client_talk_request_msg": TalkPowerRequestMessage = (str)TsString.Unescape(value); break; case "client_total_bytes_downloaded": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) TotalDownloadQuota = (i64)oval; } break; case "client_total_bytes_uploaded": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) TotalUploadQuota = (i64)oval; } break; case "client_totalconnections": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalConnections = (i32)oval; } break; case "client_unread_messages": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) UnreadMessages = (u32)oval; } break; case "client_version": ClientVersion = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientUpdated[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "client_away": foreach(var toi in toc) { toi.IsAway = IsAway; } break; case "client_away_message": foreach(var toi in toc) { toi.AwayMessage = AwayMessage; } break; case "client_badges": foreach(var toi in toc) { toi.Badges = Badges; } break; case "client_created": foreach(var toi in toc) { toi.CreationDate = CreationDate; } break; case "client_description": foreach(var toi in toc) { toi.Description = Description; } break; case "client_flag_avatar": foreach(var toi in toc) { toi.AvatarHash = AvatarHash; } break; case "client_icon_id": foreach(var toi in toc) { toi.IconId = IconId; } break; case "client_input_hardware": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break; case "client_input_muted": foreach(var toi in toc) { toi.InputMuted = InputMuted; } break; case "client_is_channel_commander": foreach(var toi in toc) { toi.IsChannelCommander = IsChannelCommander; } break; case "client_is_priority_speaker": foreach(var toi in toc) { toi.IsPrioritySpeaker = IsPrioritySpeaker; } break; case "client_is_recording": foreach(var toi in toc) { toi.IsRecording = IsRecording; } break; case "client_is_talker": foreach(var toi in toc) { toi.TalkPowerGranted = TalkPowerGranted; } break; case "client_lastconnected": foreach(var toi in toc) { toi.LastConnected = LastConnected; } break; case "client_login_name": foreach(var toi in toc) { toi.LoginName = LoginName; } break; case "client_month_bytes_downloaded": foreach(var toi in toc) { toi.MonthlyDownloadQuota = MonthlyDownloadQuota; } break; case "client_month_bytes_uploaded": foreach(var toi in toc) { toi.MonthlyUploadQuota = MonthlyUploadQuota; } break; case "client_myteamspeak_id": foreach(var toi in toc) { toi.MyTeamSpeakId = MyTeamSpeakId; } break; case "client_nickname": foreach(var toi in toc) { toi.Name = Name; } break; case "client_nickname_phonetic": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break; case "client_output_hardware": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break; case "client_output_muted": foreach(var toi in toc) { toi.OutputMuted = OutputMuted; } break; case "client_platform": foreach(var toi in toc) { toi.ClientPlatform = ClientPlatform; } break; case "client_servergroups": foreach(var toi in toc) { toi.ServerGroups = ServerGroups; } break; case "client_talk_power": foreach(var toi in toc) { toi.TalkPower = TalkPower; } break; case "client_talk_request": foreach(var toi in toc) { toi.TalkPowerRequestTime = TalkPowerRequestTime; } break; case "client_talk_request_msg": foreach(var toi in toc) { toi.TalkPowerRequestMessage = TalkPowerRequestMessage; } break; case "client_total_bytes_downloaded": foreach(var toi in toc) { toi.TotalDownloadQuota = TotalDownloadQuota; } break; case "client_total_bytes_uploaded": foreach(var toi in toc) { toi.TotalUploadQuota = TotalUploadQuota; } break; case "client_totalconnections": foreach(var toi in toc) { toi.TotalConnections = TotalConnections; } break; case "client_unread_messages": foreach(var toi in toc) { toi.UnreadMessages = UnreadMessages; } break; case "client_version": foreach(var toi in toc) { toi.ClientVersion = ClientVersion; } break; } } } } public sealed partial class ClientVariablesRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ClientVariablesRequest; public ClientId ClientId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ClientVariablesRequest[])to; foreach (var fld in flds) { switch(fld) { case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; } } } } public sealed partial class CommandError : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.CommandError; public str? ExtraMessage { get; set; } public Ts3ErrorCode Id { get; set; } public str Message { get; set; } public Ts3Permission? MissingPermissionId { get; set; } public str? ReturnCode { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "extra_msg": ExtraMessage = (str)TsString.Unescape(value); break; case "failed_permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) MissingPermissionId = ser.PermissionTransform.GetName(oval); } break; case "id": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Id = (Ts3ErrorCode)oval; } break; case "msg": Message = (str)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (CommandError[])to; foreach (var fld in flds) { switch(fld) { case "extra_msg": foreach(var toi in toc) { toi.ExtraMessage = ExtraMessage; } break; case "failed_permid": foreach(var toi in toc) { toi.MissingPermissionId = MissingPermissionId; } break; case "id": foreach(var toi in toc) { toi.Id = Id; } break; case "msg": foreach(var toi in toc) { toi.Message = Message; } break; case "return_code": foreach(var toi in toc) { toi.ReturnCode = ReturnCode; } break; } } } } public sealed partial class ComplainAdd : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ComplainAdd; public str Message { get; set; } public ClientDbId TargetClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "message": Message = (str)TsString.Unescape(value); break; case "tcldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ComplainAdd[])to; foreach (var fld in flds) { switch(fld) { case "message": foreach(var toi in toc) { toi.Message = Message; } break; case "tcldbid": foreach(var toi in toc) { toi.TargetClientDbId = TargetClientDbId; } break; } } } } public sealed partial class ComplainDel : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ComplainDel; public ClientDbId FromClientDbId { get; set; } public ClientDbId TargetClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "fcldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FromClientDbId = (ClientDbId)oval; } break; case "tcldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ComplainDel[])to; foreach (var fld in flds) { switch(fld) { case "fcldbid": foreach(var toi in toc) { toi.FromClientDbId = FromClientDbId; } break; case "tcldbid": foreach(var toi in toc) { toi.TargetClientDbId = TargetClientDbId; } break; } } } } public sealed partial class ComplainDelAll : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ComplainDelAll; public ClientDbId TargetClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "tcldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ComplainDelAll[])to; foreach (var fld in flds) { switch(fld) { case "tcldbid": foreach(var toi in toc) { toi.TargetClientDbId = TargetClientDbId; } break; } } } } public sealed partial class ComplainList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ComplainList; public string? ReturnCode { get; set; } public ClientDbId FromClientDbId { get; set; } public str FromName { get; set; } public str Message { get; set; } public ClientDbId TargetClientDbId { get; set; } public str TargetName { get; set; } public DateTime Timestamp { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "fcldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FromClientDbId = (ClientDbId)oval; } break; case "fname": FromName = (str)TsString.Unescape(value); break; case "message": Message = (str)TsString.Unescape(value); break; case "tcldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetClientDbId = (ClientDbId)oval; } break; case "timestamp": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Timestamp = Tools.FromUnix(oval); } break; case "tname": TargetName = (str)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ComplainList[])to; foreach (var fld in flds) { switch(fld) { case "fcldbid": foreach(var toi in toc) { toi.FromClientDbId = FromClientDbId; } break; case "fname": foreach(var toi in toc) { toi.FromName = FromName; } break; case "message": foreach(var toi in toc) { toi.Message = Message; } break; case "tcldbid": foreach(var toi in toc) { toi.TargetClientDbId = TargetClientDbId; } break; case "timestamp": foreach(var toi in toc) { toi.Timestamp = Timestamp; } break; case "tname": foreach(var toi in toc) { toi.TargetName = TargetName; } break; } } } } public sealed partial class ComplainListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ComplainListRequest; public ClientDbId? TargetClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "tcldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ComplainListRequest[])to; foreach (var fld in flds) { switch(fld) { case "tcldbid": foreach(var toi in toc) { toi.TargetClientDbId = TargetClientDbId; } break; } } } } public sealed partial class CustomDelete : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.CustomDelete; public ClientDbId ClientDbId { get; set; } public str ExternalIdentity { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "ident": ExternalIdentity = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (CustomDelete[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "ident": foreach(var toi in toc) { toi.ExternalIdentity = ExternalIdentity; } break; } } } } public sealed partial class CustomInfoRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.CustomInfoRequest; public ClientDbId ClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (CustomInfoRequest[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; } } } } public sealed partial class CustomSearch : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.CustomSearch; public str ExternalIdentity { get; set; } public str Pattern { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "ident": ExternalIdentity = (str)TsString.Unescape(value); break; case "pattern": Pattern = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (CustomSearch[])to; foreach (var fld in flds) { switch(fld) { case "ident": foreach(var toi in toc) { toi.ExternalIdentity = ExternalIdentity; } break; case "pattern": foreach(var toi in toc) { toi.Pattern = Pattern; } break; } } } } public sealed partial class CustomSet : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.CustomSet; public ClientDbId ClientDbId { get; set; } public str ExternalIdentity { get; set; } public str Value { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "ident": ExternalIdentity = (str)TsString.Unescape(value); break; case "value": Value = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (CustomSet[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "ident": foreach(var toi in toc) { toi.ExternalIdentity = ExternalIdentity; } break; case "value": foreach(var toi in toc) { toi.Value = Value; } break; } } } } public sealed partial class Disconnect : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.Disconnect; public Reason? Reason { get; set; } public str? ReasonMessage { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "reasonid": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break; case "reasonmsg": ReasonMessage = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (Disconnect[])to; foreach (var fld in flds) { switch(fld) { case "reasonid": foreach(var toi in toc) { toi.Reason = Reason; } break; case "reasonmsg": foreach(var toi in toc) { toi.ReasonMessage = ReasonMessage; } break; } } } } public sealed partial class FileDownload : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FileDownload; public string? ReturnCode { get; set; } public u16 ClientFileTransferId { get; set; } public str FileTransferKey { get; set; } public IpAddr? Ip { get; set; } public u16 Port { get; set; } public u8 Protocol { get; set; } public u16 ServerFileTransferId { get; set; } public u64 Size { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clientftfid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientFileTransferId = (u16)oval; } break; case "ftkey": FileTransferKey = (str)TsString.Unescape(value); break; case "ip": Ip = (IpAddr)TsString.Unescape(value); break; case "port": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) Port = (u16)oval; } break; case "proto": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Protocol = (u8)oval; } break; case "serverftfid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ServerFileTransferId = (u16)oval; } break; case "size": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Size = (u64)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FileDownload[])to; foreach (var fld in flds) { switch(fld) { case "clientftfid": foreach(var toi in toc) { toi.ClientFileTransferId = ClientFileTransferId; } break; case "ftkey": foreach(var toi in toc) { toi.FileTransferKey = FileTransferKey; } break; case "ip": foreach(var toi in toc) { toi.Ip = Ip; } break; case "port": foreach(var toi in toc) { toi.Port = Port; } break; case "proto": foreach(var toi in toc) { toi.Protocol = Protocol; } break; case "serverftfid": foreach(var toi in toc) { toi.ServerFileTransferId = ServerFileTransferId; } break; case "size": foreach(var toi in toc) { toi.Size = Size; } break; } } } } public sealed partial class FileInfo : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FileInfo; public string? ReturnCode { get; set; } public ChannelId ChannelId { get; set; } public DateTime DateTime { get; set; } public str Name { get; set; } public str Path { get; set; } public u64 Size { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "datetime": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) DateTime = Tools.FromUnix(oval); } break; case "name": Name = (str)TsString.Unescape(value); break; case "path": Path = (str)TsString.Unescape(value); break; case "size": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Size = (u64)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FileInfo[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "datetime": foreach(var toi in toc) { toi.DateTime = DateTime; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "path": foreach(var toi in toc) { toi.Path = Path; } break; case "size": foreach(var toi in toc) { toi.Size = Size; } break; } } } } public sealed partial class FileList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FileList; public string? ReturnCode { get; set; } public ChannelId ChannelId { get; set; } public DateTime DateTime { get; set; } public bool IsFile { get; set; } public str Name { get; set; } public str Path { get; set; } public u64 Size { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "datetime": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) DateTime = Tools.FromUnix(oval); } break; case "name": Name = (str)TsString.Unescape(value); break; case "path": Path = (str)TsString.Unescape(value); break; case "size": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Size = (u64)oval; } break; case "type": IsFile = value.Length > 0 && value[0] != '0'; break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FileList[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "datetime": foreach(var toi in toc) { toi.DateTime = DateTime; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "path": foreach(var toi in toc) { toi.Path = Path; } break; case "size": foreach(var toi in toc) { toi.Size = Size; } break; case "type": foreach(var toi in toc) { toi.IsFile = IsFile; } break; } } } } public sealed partial class FileListFinished : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FileListFinished; public ChannelId ChannelId { get; set; } public str Path { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "path": Path = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FileListFinished[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "path": foreach(var toi in toc) { toi.Path = Path; } break; } } } } public sealed partial class FileTransfer : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FileTransfer; public string? ReturnCode { get; set; } public f32 AverageSpeed { get; set; } public u16 ClientFileTransferId { get; set; } public ClientId ClientId { get; set; } public f32 CurrentSpeed { get; set; } public str Name { get; set; } public str Path { get; set; } public DurationSeconds Runtime { get; set; } public u64 Sender { get; set; } public u16 ServerFileTransferId { get; set; } public u64 Size { get; set; } public i64 SizeDone { get; set; } public i32 Status { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "average_speed": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) AverageSpeed = (f32)oval; } break; case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "clientftfid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientFileTransferId = (u16)oval; } break; case "current_speed": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) CurrentSpeed = (f32)oval; } break; case "name": Name = (str)TsString.Unescape(value); break; case "path": Path = (str)TsString.Unescape(value); break; case "runtime": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Runtime = TimeSpan.FromSeconds(oval); } break; case "sender": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Sender = (u64)oval; } break; case "serverftfid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ServerFileTransferId = (u16)oval; } break; case "size": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Size = (u64)oval; } break; case "sizedone": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) SizeDone = (i64)oval; } break; case "status": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Status = (i32)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FileTransfer[])to; foreach (var fld in flds) { switch(fld) { case "average_speed": foreach(var toi in toc) { toi.AverageSpeed = AverageSpeed; } break; case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "clientftfid": foreach(var toi in toc) { toi.ClientFileTransferId = ClientFileTransferId; } break; case "current_speed": foreach(var toi in toc) { toi.CurrentSpeed = CurrentSpeed; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "path": foreach(var toi in toc) { toi.Path = Path; } break; case "runtime": foreach(var toi in toc) { toi.Runtime = Runtime; } break; case "sender": foreach(var toi in toc) { toi.Sender = Sender; } break; case "serverftfid": foreach(var toi in toc) { toi.ServerFileTransferId = ServerFileTransferId; } break; case "size": foreach(var toi in toc) { toi.Size = Size; } break; case "sizedone": foreach(var toi in toc) { toi.SizeDone = SizeDone; } break; case "status": foreach(var toi in toc) { toi.Status = Status; } break; } } } } public sealed partial class FileTransferStatus : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FileTransferStatus; public u16 ClientFileTransferId { get; set; } public str Message { get; set; } public u64 Size { get; set; } public Ts3ErrorCode Status { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clientftfid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientFileTransferId = (u16)oval; } break; case "msg": Message = (str)TsString.Unescape(value); break; case "size": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Size = (u64)oval; } break; case "status": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Status = (Ts3ErrorCode)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FileTransferStatus[])to; foreach (var fld in flds) { switch(fld) { case "clientftfid": foreach(var toi in toc) { toi.ClientFileTransferId = ClientFileTransferId; } break; case "msg": foreach(var toi in toc) { toi.Message = Message; } break; case "size": foreach(var toi in toc) { toi.Size = Size; } break; case "status": foreach(var toi in toc) { toi.Status = Status; } break; } } } } public sealed partial class FileUpload : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FileUpload; public string? ReturnCode { get; set; } public u16 ClientFileTransferId { get; set; } public str FileTransferKey { get; set; } public IpAddr? Ip { get; set; } public u16 Port { get; set; } public u8 Protocol { get; set; } public u64 SeekPosition { get; set; } public u16 ServerFileTransferId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "clientftfid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientFileTransferId = (u16)oval; } break; case "ftkey": FileTransferKey = (str)TsString.Unescape(value); break; case "ip": Ip = (IpAddr)TsString.Unescape(value); break; case "port": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) Port = (u16)oval; } break; case "proto": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Protocol = (u8)oval; } break; case "seekpos": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) SeekPosition = (u64)oval; } break; case "serverftfid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ServerFileTransferId = (u16)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FileUpload[])to; foreach (var fld in flds) { switch(fld) { case "clientftfid": foreach(var toi in toc) { toi.ClientFileTransferId = ClientFileTransferId; } break; case "ftkey": foreach(var toi in toc) { toi.FileTransferKey = FileTransferKey; } break; case "ip": foreach(var toi in toc) { toi.Ip = Ip; } break; case "port": foreach(var toi in toc) { toi.Port = Port; } break; case "proto": foreach(var toi in toc) { toi.Protocol = Protocol; } break; case "seekpos": foreach(var toi in toc) { toi.SeekPosition = SeekPosition; } break; case "serverftfid": foreach(var toi in toc) { toi.ServerFileTransferId = ServerFileTransferId; } break; } } } } public sealed partial class FtCreateDir : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FtCreateDir; public ChannelId ChannelId { get; set; } public str ChannelPassword { get; set; } public str DirectoryName { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cpw": ChannelPassword = (str)TsString.Unescape(value); break; case "dirname": DirectoryName = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FtCreateDir[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cpw": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break; case "dirname": foreach(var toi in toc) { toi.DirectoryName = DirectoryName; } break; } } } } public sealed partial class FtDeleteFile : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FtDeleteFile; public ChannelId ChannelId { get; set; } public str ChannelPassword { get; set; } public str Name { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cpw": ChannelPassword = (str)TsString.Unescape(value); break; case "name": Name = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FtDeleteFile[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cpw": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; } } } } public sealed partial class FtFileInfoRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FtFileInfoRequest; public ChannelId ChannelId { get; set; } public str ChannelPassword { get; set; } public str Name { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cpw": ChannelPassword = (str)TsString.Unescape(value); break; case "name": Name = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FtFileInfoRequest[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cpw": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; } } } } public sealed partial class FtFileListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FtFileListRequest; public ChannelId ChannelId { get; set; } public str ChannelPassword { get; set; } public str Path { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cpw": ChannelPassword = (str)TsString.Unescape(value); break; case "path": Path = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FtFileListRequest[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cpw": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break; case "path": foreach(var toi in toc) { toi.Path = Path; } break; } } } } public sealed partial class FtInitDownload : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FtInitDownload; public ChannelId ChannelId { get; set; } public str ChannelPassword { get; set; } public u16 ClientFileTransferId { get; set; } public str Name { get; set; } public u8 Protocol { get; set; } public u64 SeekPosition { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "clientftfid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientFileTransferId = (u16)oval; } break; case "cpw": ChannelPassword = (str)TsString.Unescape(value); break; case "name": Name = (str)TsString.Unescape(value); break; case "proto": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Protocol = (u8)oval; } break; case "seekpos": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) SeekPosition = (u64)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FtInitDownload[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "clientftfid": foreach(var toi in toc) { toi.ClientFileTransferId = ClientFileTransferId; } break; case "cpw": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "proto": foreach(var toi in toc) { toi.Protocol = Protocol; } break; case "seekpos": foreach(var toi in toc) { toi.SeekPosition = SeekPosition; } break; } } } } public sealed partial class FtInitUpload : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FtInitUpload; public ChannelId ChannelId { get; set; } public str ChannelPassword { get; set; } public u16 ClientFileTransferId { get; set; } public str Name { get; set; } public bool Overwrite { get; set; } public u8 Protocol { get; set; } public bool Resume { get; set; } public u64 Size { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "clientftfid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientFileTransferId = (u16)oval; } break; case "cpw": ChannelPassword = (str)TsString.Unescape(value); break; case "name": Name = (str)TsString.Unescape(value); break; case "overwrite": Overwrite = value.Length > 0 && value[0] != '0'; break; case "proto": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Protocol = (u8)oval; } break; case "resume": Resume = value.Length > 0 && value[0] != '0'; break; case "size": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Size = (u64)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FtInitUpload[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "clientftfid": foreach(var toi in toc) { toi.ClientFileTransferId = ClientFileTransferId; } break; case "cpw": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "overwrite": foreach(var toi in toc) { toi.Overwrite = Overwrite; } break; case "proto": foreach(var toi in toc) { toi.Protocol = Protocol; } break; case "resume": foreach(var toi in toc) { toi.Resume = Resume; } break; case "size": foreach(var toi in toc) { toi.Size = Size; } break; } } } } public sealed partial class FtList : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FtList; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class FtRenameFile : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FtRenameFile; public ChannelId ChannelId { get; set; } public str ChannelPassword { get; set; } public str NewName { get; set; } public str OldName { get; set; } public ChannelId? TargetChannelId { get; set; } public str? TargetChannelPassword { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cpw": ChannelPassword = (str)TsString.Unescape(value); break; case "newname": NewName = (str)TsString.Unescape(value); break; case "oldname": OldName = (str)TsString.Unescape(value); break; case "tcid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelId = (ChannelId)oval; } break; case "tcpw": TargetChannelPassword = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FtRenameFile[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cpw": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break; case "newname": foreach(var toi in toc) { toi.NewName = NewName; } break; case "oldname": foreach(var toi in toc) { toi.OldName = OldName; } break; case "tcid": foreach(var toi in toc) { toi.TargetChannelId = TargetChannelId; } break; case "tcpw": foreach(var toi in toc) { toi.TargetChannelPassword = TargetChannelPassword; } break; } } } } public sealed partial class FtStop : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.FtStop; public bool Delete { get; set; } public u16 ServerFileTransferId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "delete": Delete = value.Length > 0 && value[0] != '0'; break; case "serverftfid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ServerFileTransferId = (u16)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (FtStop[])to; foreach (var fld in flds) { switch(fld) { case "delete": foreach(var toi in toc) { toi.Delete = Delete; } break; case "serverftfid": foreach(var toi in toc) { toi.ServerFileTransferId = ServerFileTransferId; } break; } } } } public sealed partial class GlobalMessage : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.GlobalMessage; public str Message { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "msg": Message = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (GlobalMessage[])to; foreach (var fld in flds) { switch(fld) { case "msg": foreach(var toi in toc) { toi.Message = Message; } break; } } } } public sealed partial class HostInfoRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.HostInfoRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class InitIvExpand : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.InitIvExpand; public str Alpha { get; set; } public str Beta { get; set; } public str Omega { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "alpha": Alpha = (str)TsString.Unescape(value); break; case "beta": Beta = (str)TsString.Unescape(value); break; case "omega": Omega = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (InitIvExpand[])to; foreach (var fld in flds) { switch(fld) { case "alpha": foreach(var toi in toc) { toi.Alpha = Alpha; } break; case "beta": foreach(var toi in toc) { toi.Beta = Beta; } break; case "omega": foreach(var toi in toc) { toi.Omega = Omega; } break; } } } } public sealed partial class InitIvExpand2 : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.InitIvExpand2; public str Beta { get; set; } public str License { get; set; } public str Omega { get; set; } public bool Ot { get; set; } public str Proof { get; set; } public str Tvd { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "beta": Beta = (str)TsString.Unescape(value); break; case "l": License = (str)TsString.Unescape(value); break; case "omega": Omega = (str)TsString.Unescape(value); break; case "ot": Ot = value.Length > 0 && value[0] != '0'; break; case "proof": Proof = (str)TsString.Unescape(value); break; case "tvd": Tvd = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (InitIvExpand2[])to; foreach (var fld in flds) { switch(fld) { case "beta": foreach(var toi in toc) { toi.Beta = Beta; } break; case "l": foreach(var toi in toc) { toi.License = License; } break; case "omega": foreach(var toi in toc) { toi.Omega = Omega; } break; case "ot": foreach(var toi in toc) { toi.Ot = Ot; } break; case "proof": foreach(var toi in toc) { toi.Proof = Proof; } break; case "tvd": foreach(var toi in toc) { toi.Tvd = Tvd; } break; } } } } public sealed partial class InitServer : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.InitServer; public str ActiveIntegrationsInfo { get; set; } public bool AskForPrivilegekey { get; set; } public str AwayMessage { get; set; } public str Badges { get; set; } public ClientId ClientId { get; set; } public u64 ClientKeyOffset { get; set; } public str ClientName { get; set; } public str ClientPlatform { get; set; } public str ClientVersion { get; set; } public str ClientVersionSign { get; set; } public CodecEncryptionMode CodecEncryptionMode { get; set; } public str DefaultChannel { get; set; } public ChannelGroupId DefaultChannelGroup { get; set; } public str DefaultChannelPassword { get; set; } public ServerGroupId DefaultServerGroup { get; set; } public str DefaultToken { get; set; } public DurationSeconds HostbannerGfxInterval { get; set; } public str HostbannerGfxUrl { get; set; } public HostBannerMode HostbannerMode { get; set; } public str HostbannerUrl { get; set; } public str HostbuttonGfxUrl { get; set; } public str HostbuttonTooltip { get; set; } public str HostbuttonUrl { get; set; } public str Hostmessage { get; set; } public HostMessageMode HostmessageMode { get; set; } public IconHash IconId { get; set; } public bool InputHardwareEnabled { get; set; } public bool InputMuted { get; set; } public str Integrations { get; set; } public bool IsAway { get; set; } public LicenseType? LicenseType { get; set; } public u16 MaxClients { get; set; } public str Metadata { get; set; } public str MyTeamSpeakAvatar { get; set; } public str MyTeamSpeakId { get; set; } public str Name { get; set; } public i32 NeededServerqueryViewPower { get; set; } public str Nickname { get; set; } public bool OutputHardwareEnabled { get; set; } public bool OutputMuted { get; set; } public bool OutputOnlyMuted { get; set; } public str Password { get; set; } public str PhoneticName { get; set; } public f32 PrioritySpeakerDimmModificator { get; set; } public u16 ProtocolVersion { get; set; } public str SecurityHash { get; set; } public DateTime ServerCreated { get; set; } public IpAddr[] ServerIp { get; set; } public str ServerName { get; set; } public str ServerPhoneticName { get; set; } public str ServerPlatform { get; set; } public str ServerVersion { get; set; } public str SignedBadges { get; set; } public i32 TalkPower { get; set; } public DurationSeconds TempChannelDefaultDeleteDelay { get; set; } public u64 VirtualServerId { get; set; } public str WelcomeMessage { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "aclid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "acn": ClientName = (str)TsString.Unescape(value); break; case "client_active_integrations_info": ActiveIntegrationsInfo = (str)TsString.Unescape(value); break; case "client_away": IsAway = value.Length > 0 && value[0] != '0'; break; case "client_away_message": AwayMessage = (str)TsString.Unescape(value); break; case "client_badges": Badges = (str)TsString.Unescape(value); break; case "client_default_channel": DefaultChannel = (str)TsString.Unescape(value); break; case "client_default_channel_password": DefaultChannelPassword = (str)TsString.Unescape(value); break; case "client_default_token": DefaultToken = (str)TsString.Unescape(value); break; case "client_input_hardware": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_input_muted": InputMuted = value.Length > 0 && value[0] != '0'; break; case "client_integrations": Integrations = (str)TsString.Unescape(value); break; case "client_key_offset": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientKeyOffset = (u64)oval; } break; case "client_meta_data": Metadata = (str)TsString.Unescape(value); break; case "client_myteamspeak_avatar": MyTeamSpeakAvatar = (str)TsString.Unescape(value); break; case "client_myteamspeak_id": MyTeamSpeakId = (str)TsString.Unescape(value); break; case "client_needed_serverquery_view_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededServerqueryViewPower = (i32)oval; } break; case "client_nickname": Name = (str)TsString.Unescape(value); break; case "client_nickname_phonetic": PhoneticName = (str)TsString.Unescape(value); break; case "client_output_hardware": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break; case "client_output_muted": OutputMuted = value.Length > 0 && value[0] != '0'; break; case "client_outputonly_muted": OutputOnlyMuted = value.Length > 0 && value[0] != '0'; break; case "client_platform": ClientPlatform = (str)TsString.Unescape(value); break; case "client_security_hash": SecurityHash = (str)TsString.Unescape(value); break; case "client_server_password": Password = (str)TsString.Unescape(value); break; case "client_signed_badges": SignedBadges = (str)TsString.Unescape(value); break; case "client_talk_power": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TalkPower = (i32)oval; } break; case "client_version": ClientVersion = (str)TsString.Unescape(value); break; case "client_version_sign": ClientVersionSign = (str)TsString.Unescape(value); break; case "lt": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) LicenseType = (LicenseType)oval; } break; case "pv": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ProtocolVersion = (u16)oval; } break; case "virtualserver_ask_for_privilegekey": AskForPrivilegekey = value.Length > 0 && value[0] != '0'; break; case "virtualserver_channel_temp_delete_delay_default": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) TempChannelDefaultDeleteDelay = TimeSpan.FromSeconds(oval); } break; case "virtualserver_codec_encryption_mode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecEncryptionMode = (CodecEncryptionMode)oval; } break; case "virtualserver_created": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerCreated = Tools.FromUnix(oval); } break; case "virtualserver_default_channel_group": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultChannelGroup = (ChannelGroupId)oval; } break; case "virtualserver_default_server_group": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultServerGroup = (ServerGroupId)oval; } break; case "virtualserver_hostbanner_gfx_interval": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) HostbannerGfxInterval = TimeSpan.FromSeconds(oval); } break; case "virtualserver_hostbanner_gfx_url": HostbannerGfxUrl = (str)TsString.Unescape(value); break; case "virtualserver_hostbanner_mode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) HostbannerMode = (HostBannerMode)oval; } break; case "virtualserver_hostbanner_url": HostbannerUrl = (str)TsString.Unescape(value); break; case "virtualserver_hostbutton_gfx_url": HostbuttonGfxUrl = (str)TsString.Unescape(value); break; case "virtualserver_hostbutton_tooltip": HostbuttonTooltip = (str)TsString.Unescape(value); break; case "virtualserver_hostbutton_url": HostbuttonUrl = (str)TsString.Unescape(value); break; case "virtualserver_hostmessage": Hostmessage = (str)TsString.Unescape(value); break; case "virtualserver_hostmessage_mode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) HostmessageMode = (HostMessageMode)oval; } break; case "virtualserver_icon_id": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "virtualserver_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) VirtualServerId = (u64)oval; } break; case "virtualserver_ip": { if(value.Length == 0) ServerIp = Array.Empty(); else { var ss = new SpanSplitter(); ss.First(value, (byte)','); int cnt = 0; for (int i = 0; i < value.Length; i++) if (value[i] == ',') cnt++; ServerIp = new IpAddr[cnt + 1]; for(int i = 0; i < cnt + 1; i++) { ServerIp[i] = (IpAddr)TsString.Unescape(ss.Trim(value)); if (i < cnt) value = ss.Next(value); } } } break; case "virtualserver_maxclients": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) MaxClients = (u16)oval; } break; case "virtualserver_name": ServerName = (str)TsString.Unescape(value); break; case "virtualserver_name_phonetic": ServerPhoneticName = (str)TsString.Unescape(value); break; case "virtualserver_nickname": Nickname = (str)TsString.Unescape(value); break; case "virtualserver_platform": ServerPlatform = (str)TsString.Unescape(value); break; case "virtualserver_priority_speaker_dimm_modificator": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PrioritySpeakerDimmModificator = (f32)oval; } break; case "virtualserver_version": ServerVersion = (str)TsString.Unescape(value); break; case "virtualserver_welcomemessage": WelcomeMessage = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (InitServer[])to; foreach (var fld in flds) { switch(fld) { case "aclid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "acn": foreach(var toi in toc) { toi.ClientName = ClientName; } break; case "client_active_integrations_info": foreach(var toi in toc) { toi.ActiveIntegrationsInfo = ActiveIntegrationsInfo; } break; case "client_away": foreach(var toi in toc) { toi.IsAway = IsAway; } break; case "client_away_message": foreach(var toi in toc) { toi.AwayMessage = AwayMessage; } break; case "client_badges": foreach(var toi in toc) { toi.Badges = Badges; } break; case "client_default_channel": foreach(var toi in toc) { toi.DefaultChannel = DefaultChannel; } break; case "client_default_channel_password": foreach(var toi in toc) { toi.DefaultChannelPassword = DefaultChannelPassword; } break; case "client_default_token": foreach(var toi in toc) { toi.DefaultToken = DefaultToken; } break; case "client_input_hardware": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break; case "client_input_muted": foreach(var toi in toc) { toi.InputMuted = InputMuted; } break; case "client_integrations": foreach(var toi in toc) { toi.Integrations = Integrations; } break; case "client_key_offset": foreach(var toi in toc) { toi.ClientKeyOffset = ClientKeyOffset; } break; case "client_meta_data": foreach(var toi in toc) { toi.Metadata = Metadata; } break; case "client_myteamspeak_avatar": foreach(var toi in toc) { toi.MyTeamSpeakAvatar = MyTeamSpeakAvatar; } break; case "client_myteamspeak_id": foreach(var toi in toc) { toi.MyTeamSpeakId = MyTeamSpeakId; } break; case "client_needed_serverquery_view_power": foreach(var toi in toc) { toi.NeededServerqueryViewPower = NeededServerqueryViewPower; } break; case "client_nickname": foreach(var toi in toc) { toi.Name = Name; } break; case "client_nickname_phonetic": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break; case "client_output_hardware": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break; case "client_output_muted": foreach(var toi in toc) { toi.OutputMuted = OutputMuted; } break; case "client_outputonly_muted": foreach(var toi in toc) { toi.OutputOnlyMuted = OutputOnlyMuted; } break; case "client_platform": foreach(var toi in toc) { toi.ClientPlatform = ClientPlatform; } break; case "client_security_hash": foreach(var toi in toc) { toi.SecurityHash = SecurityHash; } break; case "client_server_password": foreach(var toi in toc) { toi.Password = Password; } break; case "client_signed_badges": foreach(var toi in toc) { toi.SignedBadges = SignedBadges; } break; case "client_talk_power": foreach(var toi in toc) { toi.TalkPower = TalkPower; } break; case "client_version": foreach(var toi in toc) { toi.ClientVersion = ClientVersion; } break; case "client_version_sign": foreach(var toi in toc) { toi.ClientVersionSign = ClientVersionSign; } break; case "lt": foreach(var toi in toc) { toi.LicenseType = LicenseType; } break; case "pv": foreach(var toi in toc) { toi.ProtocolVersion = ProtocolVersion; } break; case "virtualserver_ask_for_privilegekey": foreach(var toi in toc) { toi.AskForPrivilegekey = AskForPrivilegekey; } break; case "virtualserver_channel_temp_delete_delay_default": foreach(var toi in toc) { toi.TempChannelDefaultDeleteDelay = TempChannelDefaultDeleteDelay; } break; case "virtualserver_codec_encryption_mode": foreach(var toi in toc) { toi.CodecEncryptionMode = CodecEncryptionMode; } break; case "virtualserver_created": foreach(var toi in toc) { toi.ServerCreated = ServerCreated; } break; case "virtualserver_default_channel_group": foreach(var toi in toc) { toi.DefaultChannelGroup = DefaultChannelGroup; } break; case "virtualserver_default_server_group": foreach(var toi in toc) { toi.DefaultServerGroup = DefaultServerGroup; } break; case "virtualserver_hostbanner_gfx_interval": foreach(var toi in toc) { toi.HostbannerGfxInterval = HostbannerGfxInterval; } break; case "virtualserver_hostbanner_gfx_url": foreach(var toi in toc) { toi.HostbannerGfxUrl = HostbannerGfxUrl; } break; case "virtualserver_hostbanner_mode": foreach(var toi in toc) { toi.HostbannerMode = HostbannerMode; } break; case "virtualserver_hostbanner_url": foreach(var toi in toc) { toi.HostbannerUrl = HostbannerUrl; } break; case "virtualserver_hostbutton_gfx_url": foreach(var toi in toc) { toi.HostbuttonGfxUrl = HostbuttonGfxUrl; } break; case "virtualserver_hostbutton_tooltip": foreach(var toi in toc) { toi.HostbuttonTooltip = HostbuttonTooltip; } break; case "virtualserver_hostbutton_url": foreach(var toi in toc) { toi.HostbuttonUrl = HostbuttonUrl; } break; case "virtualserver_hostmessage": foreach(var toi in toc) { toi.Hostmessage = Hostmessage; } break; case "virtualserver_hostmessage_mode": foreach(var toi in toc) { toi.HostmessageMode = HostmessageMode; } break; case "virtualserver_icon_id": foreach(var toi in toc) { toi.IconId = IconId; } break; case "virtualserver_id": foreach(var toi in toc) { toi.VirtualServerId = VirtualServerId; } break; case "virtualserver_ip": foreach(var toi in toc) { toi.ServerIp = ServerIp; } break; case "virtualserver_maxclients": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break; case "virtualserver_name": foreach(var toi in toc) { toi.ServerName = ServerName; } break; case "virtualserver_name_phonetic": foreach(var toi in toc) { toi.ServerPhoneticName = ServerPhoneticName; } break; case "virtualserver_nickname": foreach(var toi in toc) { toi.Nickname = Nickname; } break; case "virtualserver_platform": foreach(var toi in toc) { toi.ServerPlatform = ServerPlatform; } break; case "virtualserver_priority_speaker_dimm_modificator": foreach(var toi in toc) { toi.PrioritySpeakerDimmModificator = PrioritySpeakerDimmModificator; } break; case "virtualserver_version": foreach(var toi in toc) { toi.ServerVersion = ServerVersion; } break; case "virtualserver_welcomemessage": foreach(var toi in toc) { toi.WelcomeMessage = WelcomeMessage; } break; } } } } public sealed partial class InstanceEdit : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.InstanceEdit; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class InstanceInfo : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.InstanceInfo; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class LogAdd : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.LogAdd; public LogLevel LogLevel { get; set; } public str LogMessage { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "loglevel": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) LogLevel = (LogLevel)oval; } break; case "logmsg": LogMessage = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (LogAdd[])to; foreach (var fld in flds) { switch(fld) { case "loglevel": foreach(var toi in toc) { toi.LogLevel = LogLevel; } break; case "logmsg": foreach(var toi in toc) { toi.LogMessage = LogMessage; } break; } } } } public sealed partial class Login : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.Login; public str LoginName { get; set; } public str LoginPassword { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "client_login_name": LoginName = (str)TsString.Unescape(value); break; case "client_login_password": LoginPassword = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (Login[])to; foreach (var fld in flds) { switch(fld) { case "client_login_name": foreach(var toi in toc) { toi.LoginName = LoginName; } break; case "client_login_password": foreach(var toi in toc) { toi.LoginPassword = LoginPassword; } break; } } } } public sealed partial class Logout : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.Logout; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class LogView : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.LogView; public bool? InstanceLog { get; set; } public u32? Lines { get; set; } public u64? Offset { get; set; } public bool? Reverse { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "begin_pos": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Offset = (u64)oval; } break; case "instance": InstanceLog = value.Length > 0 && value[0] != '0'; break; case "lines": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Lines = (u32)oval; } break; case "reverse": Reverse = value.Length > 0 && value[0] != '0'; break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (LogView[])to; foreach (var fld in flds) { switch(fld) { case "begin_pos": foreach(var toi in toc) { toi.Offset = Offset; } break; case "instance": foreach(var toi in toc) { toi.InstanceLog = InstanceLog; } break; case "lines": foreach(var toi in toc) { toi.Lines = Lines; } break; case "reverse": foreach(var toi in toc) { toi.Reverse = Reverse; } break; } } } } public sealed partial class OfflineMessage : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.OfflineMessage; public string? ReturnCode { get; set; } public Uid ClientUid { get; set; } public str Message { get; set; } public u32 MessageId { get; set; } public str Subject { get; set; } public DateTime Timestamp { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; case "message": Message = (str)TsString.Unescape(value); break; case "msgid": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MessageId = (u32)oval; } break; case "subject": Subject = (str)TsString.Unescape(value); break; case "timestamp": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Timestamp = Tools.FromUnix(oval); } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (OfflineMessage[])to; foreach (var fld in flds) { switch(fld) { case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; case "message": foreach(var toi in toc) { toi.Message = Message; } break; case "msgid": foreach(var toi in toc) { toi.MessageId = MessageId; } break; case "subject": foreach(var toi in toc) { toi.Subject = Subject; } break; case "timestamp": foreach(var toi in toc) { toi.Timestamp = Timestamp; } break; } } } } public sealed partial class OfflineMessageAdd : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.OfflineMessageAdd; public Uid ClientUid { get; set; } public str Message { get; set; } public str Subject { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; case "message": Message = (str)TsString.Unescape(value); break; case "subject": Subject = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (OfflineMessageAdd[])to; foreach (var fld in flds) { switch(fld) { case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; case "message": foreach(var toi in toc) { toi.Message = Message; } break; case "subject": foreach(var toi in toc) { toi.Subject = Subject; } break; } } } } public sealed partial class OfflineMessageDel : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.OfflineMessageDel; public u32 MessageId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "msgid": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MessageId = (u32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (OfflineMessageDel[])to; foreach (var fld in flds) { switch(fld) { case "msgid": foreach(var toi in toc) { toi.MessageId = MessageId; } break; } } } } public sealed partial class OfflineMessageGet : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.OfflineMessageGet; public u32 MessageId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "msgid": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MessageId = (u32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (OfflineMessageGet[])to; foreach (var fld in flds) { switch(fld) { case "msgid": foreach(var toi in toc) { toi.MessageId = MessageId; } break; } } } } public sealed partial class OfflineMessageList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.OfflineMessageList; public string? ReturnCode { get; set; } public Uid ClientUid { get; set; } public bool IsRead { get; set; } public u32 MessageId { get; set; } public str Subject { get; set; } public DateTime Timestamp { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; case "flag_read": IsRead = value.Length > 0 && value[0] != '0'; break; case "msgid": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MessageId = (u32)oval; } break; case "subject": Subject = (str)TsString.Unescape(value); break; case "timestamp": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Timestamp = Tools.FromUnix(oval); } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (OfflineMessageList[])to; foreach (var fld in flds) { switch(fld) { case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; case "flag_read": foreach(var toi in toc) { toi.IsRead = IsRead; } break; case "msgid": foreach(var toi in toc) { toi.MessageId = MessageId; } break; case "subject": foreach(var toi in toc) { toi.Subject = Subject; } break; case "timestamp": foreach(var toi in toc) { toi.Timestamp = Timestamp; } break; } } } } public sealed partial class OfflineMessageListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.OfflineMessageListRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class OfflineMessageUpdateFlag : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.OfflineMessageUpdateFlag; public bool IsRead { get; set; } public u32 MessageId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "flag": IsRead = value.Length > 0 && value[0] != '0'; break; case "msgid": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MessageId = (u32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (OfflineMessageUpdateFlag[])to; foreach (var fld in flds) { switch(fld) { case "flag": foreach(var toi in toc) { toi.IsRead = IsRead; } break; case "msgid": foreach(var toi in toc) { toi.MessageId = MessageId; } break; } } } } public sealed partial class PermFind : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PermFind; public string? ReturnCode { get; set; } public u64 Id1 { get; set; } public u64 Id2 { get; set; } public Ts3Permission PermissionId { get; set; } public PermissionType PermissionType { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "id1": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Id1 = (u64)oval; } break; case "id2": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Id2 = (u64)oval; } break; case "p": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "t": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionType = (PermissionType)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (PermFind[])to; foreach (var fld in flds) { switch(fld) { case "id1": foreach(var toi in toc) { toi.Id1 = Id1; } break; case "id2": foreach(var toi in toc) { toi.Id2 = Id2; } break; case "p": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "t": foreach(var toi in toc) { toi.PermissionType = PermissionType; } break; } } } } public sealed partial class PermFindRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PermFindRequest; public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (PermFindRequest[])to; foreach (var fld in flds) { switch(fld) { case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; } } } } public sealed partial class PermIdByNameRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PermIdByNameRequest; public str PermissionNameId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (PermIdByNameRequest[])to; foreach (var fld in flds) { switch(fld) { case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; } } } } public sealed partial class PermList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PermList; public string? ReturnCode { get; set; } public Ts3Permission GroupIdEnd { get; set; } public str PermissionDescription { get; set; } public Ts3Permission PermissionId { get; set; } public str PermissionName { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "group_id_end": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) GroupIdEnd = ser.PermissionTransform.GetName(oval); } break; case "permdesc": PermissionDescription = (str)TsString.Unescape(value); break; case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permname": PermissionName = (str)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (PermList[])to; foreach (var fld in flds) { switch(fld) { case "group_id_end": foreach(var toi in toc) { toi.GroupIdEnd = GroupIdEnd; } break; case "permdesc": foreach(var toi in toc) { toi.PermissionDescription = PermissionDescription; } break; case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permname": foreach(var toi in toc) { toi.PermissionName = PermissionName; } break; } } } } public sealed partial class PermListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PermListRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class PermOverview : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PermOverview; public string? ReturnCode { get; set; } public ChannelId ChannelId { get; set; } public ClientDbId ClientDbId { get; set; } public u64 Id1 { get; set; } public u64 Id2 { get; set; } public Ts3Permission PermissionId { get; set; } public bool PermissionNegated { get; set; } public bool PermissionSkip { get; set; } public PermissionType PermissionType { get; set; } public i32 PermissionValue { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "id1": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Id1 = (u64)oval; } break; case "id2": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Id2 = (u64)oval; } break; case "n": PermissionNegated = value.Length > 0 && value[0] != '0'; break; case "p": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "s": PermissionSkip = value.Length > 0 && value[0] != '0'; break; case "t": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionType = (PermissionType)oval; } break; case "v": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (PermOverview[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "id1": foreach(var toi in toc) { toi.Id1 = Id1; } break; case "id2": foreach(var toi in toc) { toi.Id2 = Id2; } break; case "n": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break; case "p": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "s": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break; case "t": foreach(var toi in toc) { toi.PermissionType = PermissionType; } break; case "v": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break; } } } } public sealed partial class PermOverviewRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PermOverviewRequest; public ChannelId ChannelId { get; set; } public ClientDbId ClientDbId { get; set; } public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (PermOverviewRequest[])to; foreach (var fld in flds) { switch(fld) { case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; } } } } public sealed partial class PermRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PermRequest; public Ts3Permission PermissionId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (PermRequest[])to; foreach (var fld in flds) { switch(fld) { case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; } } } } public sealed partial class PermReset : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PermReset; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class PluginCommand : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PluginCommand; public str Data { get; set; } public str Name { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "data": Data = (str)TsString.Unescape(value); break; case "name": Name = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (PluginCommand[])to; foreach (var fld in flds) { switch(fld) { case "data": foreach(var toi in toc) { toi.Data = Data; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; } } } } public sealed partial class PluginCommandRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PluginCommandRequest; public str Data { get; set; } public str Name { get; set; } public PluginTargetMode Target { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "data": Data = (str)TsString.Unescape(value); break; case "name": Name = (str)TsString.Unescape(value); break; case "targetmode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Target = (PluginTargetMode)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (PluginCommandRequest[])to; foreach (var fld in flds) { switch(fld) { case "data": foreach(var toi in toc) { toi.Data = Data; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "targetmode": foreach(var toi in toc) { toi.Target = Target; } break; } } } } public sealed partial class PrivilegeKeyAddRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PrivilegeKeyAddRequest; public str? TokenCustomSet { get; set; } public str? TokenDescription { get; set; } public u64 TokenId1 { get; set; } public ChannelId TokenId2 { get; set; } public TokenType TokenType { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "tokencustomset": TokenCustomSet = (str)TsString.Unescape(value); break; case "tokendescription": TokenDescription = (str)TsString.Unescape(value); break; case "tokenid1": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TokenId1 = (u64)oval; } break; case "tokenid2": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TokenId2 = (ChannelId)oval; } break; case "tokentype": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TokenType = (TokenType)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (PrivilegeKeyAddRequest[])to; foreach (var fld in flds) { switch(fld) { case "tokencustomset": foreach(var toi in toc) { toi.TokenCustomSet = TokenCustomSet; } break; case "tokendescription": foreach(var toi in toc) { toi.TokenDescription = TokenDescription; } break; case "tokenid1": foreach(var toi in toc) { toi.TokenId1 = TokenId1; } break; case "tokenid2": foreach(var toi in toc) { toi.TokenId2 = TokenId2; } break; case "tokentype": foreach(var toi in toc) { toi.TokenType = TokenType; } break; } } } } public sealed partial class PrivilegeKeyDelete : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PrivilegeKeyDelete; public str Token { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "token": Token = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (PrivilegeKeyDelete[])to; foreach (var fld in flds) { switch(fld) { case "token": foreach(var toi in toc) { toi.Token = Token; } break; } } } } public sealed partial class PrivilegeKeyListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PrivilegeKeyListRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class PrivilegeKeyUse : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.PrivilegeKeyUse; public str Token { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "token": Token = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (PrivilegeKeyUse[])to; foreach (var fld in flds) { switch(fld) { case "token": foreach(var toi in toc) { toi.Token = Token; } break; } } } } public sealed partial class Quit : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.Quit; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class SendTextMessage : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.SendTextMessage; public str Message { get; set; } public TextMessageTargetMode Target { get; set; } public ClientId? TargetClientId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "msg": Message = (str)TsString.Unescape(value); break; case "target": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) TargetClientId = (ClientId)oval; } break; case "targetmode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Target = (TextMessageTargetMode)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (SendTextMessage[])to; foreach (var fld in flds) { switch(fld) { case "msg": foreach(var toi in toc) { toi.Message = Message; } break; case "target": foreach(var toi in toc) { toi.TargetClientId = TargetClientId; } break; case "targetmode": foreach(var toi in toc) { toi.Target = Target; } break; } } } } public sealed partial class ServerConnectionInfo : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerConnectionInfo; public string? ReturnCode { get; set; } public u64 BandwidthReceivedLastMinuteTotal { get; set; } public u64 BandwidthReceivedLastSecondTotal { get; set; } public u64 BandwidthSentLastMinuteTotal { get; set; } public u64 BandwidthSentLastSecondTotal { get; set; } public u64 BytesReceivedTotal { get; set; } public u64 BytesSentTotal { get; set; } public DurationMilliseconds ConnectedTime { get; set; } public u64 FiletransferBandwidthReceived { get; set; } public u64 FiletransferBandwidthSent { get; set; } public u64 FiletransferBytesReceivedTotal { get; set; } public u64 FiletransferBytesSentTotal { get; set; } public f32 PacketlossTotal { get; set; } public u64 PacketsReceivedTotal { get; set; } public u64 PacketsSentTotal { get; set; } public DurationMilliseconds Ping { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "connection_bandwidth_received_last_minute_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastMinuteTotal = (u64)oval; } break; case "connection_bandwidth_received_last_second_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastSecondTotal = (u64)oval; } break; case "connection_bandwidth_sent_last_minute_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastMinuteTotal = (u64)oval; } break; case "connection_bandwidth_sent_last_second_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastSecondTotal = (u64)oval; } break; case "connection_bytes_received_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesReceivedTotal = (u64)oval; } break; case "connection_bytes_sent_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesSentTotal = (u64)oval; } break; case "connection_connected_time": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ConnectedTime = TimeSpan.FromMilliseconds(oval); } break; case "connection_filetransfer_bandwidth_received": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBandwidthReceived = (u64)oval; } break; case "connection_filetransfer_bandwidth_sent": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBandwidthSent = (u64)oval; } break; case "connection_filetransfer_bytes_received_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBytesReceivedTotal = (u64)oval; } break; case "connection_filetransfer_bytes_sent_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBytesSentTotal = (u64)oval; } break; case "connection_packetloss_total": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PacketlossTotal = (f32)oval; } break; case "connection_packets_received_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsReceivedTotal = (u64)oval; } break; case "connection_packets_sent_total": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsSentTotal = (u64)oval; } break; case "connection_ping": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Ping = TimeSpan.FromMilliseconds(oval); } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerConnectionInfo[])to; foreach (var fld in flds) { switch(fld) { case "connection_bandwidth_received_last_minute_total": foreach(var toi in toc) { toi.BandwidthReceivedLastMinuteTotal = BandwidthReceivedLastMinuteTotal; } break; case "connection_bandwidth_received_last_second_total": foreach(var toi in toc) { toi.BandwidthReceivedLastSecondTotal = BandwidthReceivedLastSecondTotal; } break; case "connection_bandwidth_sent_last_minute_total": foreach(var toi in toc) { toi.BandwidthSentLastMinuteTotal = BandwidthSentLastMinuteTotal; } break; case "connection_bandwidth_sent_last_second_total": foreach(var toi in toc) { toi.BandwidthSentLastSecondTotal = BandwidthSentLastSecondTotal; } break; case "connection_bytes_received_total": foreach(var toi in toc) { toi.BytesReceivedTotal = BytesReceivedTotal; } break; case "connection_bytes_sent_total": foreach(var toi in toc) { toi.BytesSentTotal = BytesSentTotal; } break; case "connection_connected_time": foreach(var toi in toc) { toi.ConnectedTime = ConnectedTime; } break; case "connection_filetransfer_bandwidth_received": foreach(var toi in toc) { toi.FiletransferBandwidthReceived = FiletransferBandwidthReceived; } break; case "connection_filetransfer_bandwidth_sent": foreach(var toi in toc) { toi.FiletransferBandwidthSent = FiletransferBandwidthSent; } break; case "connection_filetransfer_bytes_received_total": foreach(var toi in toc) { toi.FiletransferBytesReceivedTotal = FiletransferBytesReceivedTotal; } break; case "connection_filetransfer_bytes_sent_total": foreach(var toi in toc) { toi.FiletransferBytesSentTotal = FiletransferBytesSentTotal; } break; case "connection_packetloss_total": foreach(var toi in toc) { toi.PacketlossTotal = PacketlossTotal; } break; case "connection_packets_received_total": foreach(var toi in toc) { toi.PacketsReceivedTotal = PacketsReceivedTotal; } break; case "connection_packets_sent_total": foreach(var toi in toc) { toi.PacketsSentTotal = PacketsSentTotal; } break; case "connection_ping": foreach(var toi in toc) { toi.Ping = Ping; } break; } } } } public sealed partial class ServerConnectionInfoRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerConnectionInfoRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ServerCreate : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerCreate; public str ServerName { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "virtualserver_name": ServerName = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerCreate[])to; foreach (var fld in flds) { switch(fld) { case "virtualserver_name": foreach(var toi in toc) { toi.ServerName = ServerName; } break; } } } } public sealed partial class ServerDelete : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerDelete; public u32 ServerId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "sid": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerId = (u32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerDelete[])to; foreach (var fld in flds) { switch(fld) { case "sid": foreach(var toi in toc) { toi.ServerId = ServerId; } break; } } } } public sealed partial class ServerEdit : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerEdit; public u32? AntifloodPointsTickReduce { get; set; } public u32? AntifloodPointsToCommandBlock { get; set; } public u32? AntifloodPointsToIpBlock { get; set; } public CodecEncryptionMode? CodecEncryptionMode { get; set; } public u32? ComplainAutobanCount { get; set; } public DurationSeconds? ComplainAutobanTime { get; set; } public DurationSeconds? ComplainRemoveTime { get; set; } public ChannelGroupId? DefaultChannelAdminGroup { get; set; } public ChannelGroupId? DefaultChannelGroup { get; set; } public ServerGroupId? DefaultServerGroup { get; set; } public u64? DownloadQuota { get; set; } public DurationSeconds? HostbannerGfxInterval { get; set; } public str? HostbannerGfxUrl { get; set; } public HostBannerMode? HostbannerMode { get; set; } public str? HostbannerUrl { get; set; } public str? HostbuttonGfxUrl { get; set; } public str? HostbuttonTooltip { get; set; } public str? HostbuttonUrl { get; set; } public str? Hostmessage { get; set; } public HostMessageMode? HostmessageMode { get; set; } public IconHash? IconId { get; set; } public u8? IdentitySecurityLevel { get; set; } public bool? LogChannel { get; set; } public bool? LogClient { get; set; } public bool? LogFileTransfer { get; set; } public bool? LogPermissions { get; set; } public bool? LogQuery { get; set; } public bool? LogServer { get; set; } public u16? MaxClients { get; set; } public u64? MaxDownloadTotalBandwidth { get; set; } public u64? MaxUploadTotalBandwidth { get; set; } public u32? MinClientsInChannelBeforeForcedSilence { get; set; } public str? Nickname { get; set; } public f32? PrioritySpeakerDimmModificator { get; set; } public u16? ReservedSlots { get; set; } public u32 ServerId { get; set; } public str? ServerName { get; set; } public str? ServerPassword { get; set; } public str? ServerPhoneticName { get; set; } public DurationSeconds? TempChannelDefaultDeleteDelay { get; set; } public u64? UploadQuota { get; set; } public bool? WeblistEnabled { get; set; } public str? WelcomeMessage { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "sid": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerId = (u32)oval; } break; case "virtualserver_antiflood_points_needed_command_block": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsToCommandBlock = (u32)oval; } break; case "virtualserver_antiflood_points_needed_ip_block": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsToIpBlock = (u32)oval; } break; case "virtualserver_antiflood_points_tick_reduce": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsTickReduce = (u32)oval; } break; case "virtualserver_channel_temp_delete_delay_default": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) TempChannelDefaultDeleteDelay = TimeSpan.FromSeconds(oval); } break; case "virtualserver_codec_encryption_mode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecEncryptionMode = (CodecEncryptionMode)oval; } break; case "virtualserver_complain_autoban_count": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ComplainAutobanCount = (u32)oval; } break; case "virtualserver_complain_autoban_time": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ComplainAutobanTime = TimeSpan.FromSeconds(oval); } break; case "virtualserver_complain_remove_time": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ComplainRemoveTime = TimeSpan.FromSeconds(oval); } break; case "virtualserver_default_channel_admin_group": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultChannelAdminGroup = (ChannelGroupId)oval; } break; case "virtualserver_default_channel_group": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultChannelGroup = (ChannelGroupId)oval; } break; case "virtualserver_default_server_group": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultServerGroup = (ServerGroupId)oval; } break; case "virtualserver_download_quota": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DownloadQuota = (u64)oval; } break; case "virtualserver_hostbanner_gfx_interval": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) HostbannerGfxInterval = TimeSpan.FromSeconds(oval); } break; case "virtualserver_hostbanner_gfx_url": HostbannerGfxUrl = (str)TsString.Unescape(value); break; case "virtualserver_hostbanner_mode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) HostbannerMode = (HostBannerMode)oval; } break; case "virtualserver_hostbanner_url": HostbannerUrl = (str)TsString.Unescape(value); break; case "virtualserver_hostbutton_gfx_url": HostbuttonGfxUrl = (str)TsString.Unescape(value); break; case "virtualserver_hostbutton_tooltip": HostbuttonTooltip = (str)TsString.Unescape(value); break; case "virtualserver_hostbutton_url": HostbuttonUrl = (str)TsString.Unescape(value); break; case "virtualserver_hostmessage": Hostmessage = (str)TsString.Unescape(value); break; case "virtualserver_hostmessage_mode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) HostmessageMode = (HostMessageMode)oval; } break; case "virtualserver_icon_id": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "virtualserver_log_channel": LogChannel = value.Length > 0 && value[0] != '0'; break; case "virtualserver_log_client": LogClient = value.Length > 0 && value[0] != '0'; break; case "virtualserver_log_filetransfer": LogFileTransfer = value.Length > 0 && value[0] != '0'; break; case "virtualserver_log_permissions": LogPermissions = value.Length > 0 && value[0] != '0'; break; case "virtualserver_log_query": LogQuery = value.Length > 0 && value[0] != '0'; break; case "virtualserver_log_server": LogServer = value.Length > 0 && value[0] != '0'; break; case "virtualserver_max_download_total_bandwidth": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) MaxDownloadTotalBandwidth = (u64)oval; } break; case "virtualserver_max_upload_total_bandwidth": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) MaxUploadTotalBandwidth = (u64)oval; } break; case "virtualserver_maxclients": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) MaxClients = (u16)oval; } break; case "virtualserver_min_clients_in_channel_before_forced_silence": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MinClientsInChannelBeforeForcedSilence = (u32)oval; } break; case "virtualserver_name": ServerName = (str)TsString.Unescape(value); break; case "virtualserver_name_phonetic": ServerPhoneticName = (str)TsString.Unescape(value); break; case "virtualserver_needed_identity_security_level": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) IdentitySecurityLevel = (u8)oval; } break; case "virtualserver_nickname": Nickname = (str)TsString.Unescape(value); break; case "virtualserver_password": ServerPassword = (str)TsString.Unescape(value); break; case "virtualserver_priority_speaker_dimm_modificator": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PrioritySpeakerDimmModificator = (f32)oval; } break; case "virtualserver_reserved_slots": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ReservedSlots = (u16)oval; } break; case "virtualserver_upload_quota": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) UploadQuota = (u64)oval; } break; case "virtualserver_weblist_enabled": WeblistEnabled = value.Length > 0 && value[0] != '0'; break; case "virtualserver_welcomemessage": WelcomeMessage = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerEdit[])to; foreach (var fld in flds) { switch(fld) { case "sid": foreach(var toi in toc) { toi.ServerId = ServerId; } break; case "virtualserver_antiflood_points_needed_command_block": foreach(var toi in toc) { toi.AntifloodPointsToCommandBlock = AntifloodPointsToCommandBlock; } break; case "virtualserver_antiflood_points_needed_ip_block": foreach(var toi in toc) { toi.AntifloodPointsToIpBlock = AntifloodPointsToIpBlock; } break; case "virtualserver_antiflood_points_tick_reduce": foreach(var toi in toc) { toi.AntifloodPointsTickReduce = AntifloodPointsTickReduce; } break; case "virtualserver_channel_temp_delete_delay_default": foreach(var toi in toc) { toi.TempChannelDefaultDeleteDelay = TempChannelDefaultDeleteDelay; } break; case "virtualserver_codec_encryption_mode": foreach(var toi in toc) { toi.CodecEncryptionMode = CodecEncryptionMode; } break; case "virtualserver_complain_autoban_count": foreach(var toi in toc) { toi.ComplainAutobanCount = ComplainAutobanCount; } break; case "virtualserver_complain_autoban_time": foreach(var toi in toc) { toi.ComplainAutobanTime = ComplainAutobanTime; } break; case "virtualserver_complain_remove_time": foreach(var toi in toc) { toi.ComplainRemoveTime = ComplainRemoveTime; } break; case "virtualserver_default_channel_admin_group": foreach(var toi in toc) { toi.DefaultChannelAdminGroup = DefaultChannelAdminGroup; } break; case "virtualserver_default_channel_group": foreach(var toi in toc) { toi.DefaultChannelGroup = DefaultChannelGroup; } break; case "virtualserver_default_server_group": foreach(var toi in toc) { toi.DefaultServerGroup = DefaultServerGroup; } break; case "virtualserver_download_quota": foreach(var toi in toc) { toi.DownloadQuota = DownloadQuota; } break; case "virtualserver_hostbanner_gfx_interval": foreach(var toi in toc) { toi.HostbannerGfxInterval = HostbannerGfxInterval; } break; case "virtualserver_hostbanner_gfx_url": foreach(var toi in toc) { toi.HostbannerGfxUrl = HostbannerGfxUrl; } break; case "virtualserver_hostbanner_mode": foreach(var toi in toc) { toi.HostbannerMode = HostbannerMode; } break; case "virtualserver_hostbanner_url": foreach(var toi in toc) { toi.HostbannerUrl = HostbannerUrl; } break; case "virtualserver_hostbutton_gfx_url": foreach(var toi in toc) { toi.HostbuttonGfxUrl = HostbuttonGfxUrl; } break; case "virtualserver_hostbutton_tooltip": foreach(var toi in toc) { toi.HostbuttonTooltip = HostbuttonTooltip; } break; case "virtualserver_hostbutton_url": foreach(var toi in toc) { toi.HostbuttonUrl = HostbuttonUrl; } break; case "virtualserver_hostmessage": foreach(var toi in toc) { toi.Hostmessage = Hostmessage; } break; case "virtualserver_hostmessage_mode": foreach(var toi in toc) { toi.HostmessageMode = HostmessageMode; } break; case "virtualserver_icon_id": foreach(var toi in toc) { toi.IconId = IconId; } break; case "virtualserver_log_channel": foreach(var toi in toc) { toi.LogChannel = LogChannel; } break; case "virtualserver_log_client": foreach(var toi in toc) { toi.LogClient = LogClient; } break; case "virtualserver_log_filetransfer": foreach(var toi in toc) { toi.LogFileTransfer = LogFileTransfer; } break; case "virtualserver_log_permissions": foreach(var toi in toc) { toi.LogPermissions = LogPermissions; } break; case "virtualserver_log_query": foreach(var toi in toc) { toi.LogQuery = LogQuery; } break; case "virtualserver_log_server": foreach(var toi in toc) { toi.LogServer = LogServer; } break; case "virtualserver_max_download_total_bandwidth": foreach(var toi in toc) { toi.MaxDownloadTotalBandwidth = MaxDownloadTotalBandwidth; } break; case "virtualserver_max_upload_total_bandwidth": foreach(var toi in toc) { toi.MaxUploadTotalBandwidth = MaxUploadTotalBandwidth; } break; case "virtualserver_maxclients": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break; case "virtualserver_min_clients_in_channel_before_forced_silence": foreach(var toi in toc) { toi.MinClientsInChannelBeforeForcedSilence = MinClientsInChannelBeforeForcedSilence; } break; case "virtualserver_name": foreach(var toi in toc) { toi.ServerName = ServerName; } break; case "virtualserver_name_phonetic": foreach(var toi in toc) { toi.ServerPhoneticName = ServerPhoneticName; } break; case "virtualserver_needed_identity_security_level": foreach(var toi in toc) { toi.IdentitySecurityLevel = IdentitySecurityLevel; } break; case "virtualserver_nickname": foreach(var toi in toc) { toi.Nickname = Nickname; } break; case "virtualserver_password": foreach(var toi in toc) { toi.ServerPassword = ServerPassword; } break; case "virtualserver_priority_speaker_dimm_modificator": foreach(var toi in toc) { toi.PrioritySpeakerDimmModificator = PrioritySpeakerDimmModificator; } break; case "virtualserver_reserved_slots": foreach(var toi in toc) { toi.ReservedSlots = ReservedSlots; } break; case "virtualserver_upload_quota": foreach(var toi in toc) { toi.UploadQuota = UploadQuota; } break; case "virtualserver_weblist_enabled": foreach(var toi in toc) { toi.WeblistEnabled = WeblistEnabled; } break; case "virtualserver_welcomemessage": foreach(var toi in toc) { toi.WelcomeMessage = WelcomeMessage; } break; } } } } public sealed partial class ServerEdited : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerEdited; public CodecEncryptionMode? CodecEncryptionMode { get; set; } public ChannelGroupId? DefaultChannelGroup { get; set; } public ServerGroupId? DefaultServerGroup { get; set; } public DurationSeconds? HostbannerGfxInterval { get; set; } public str? HostbannerGfxUrl { get; set; } public HostBannerMode? HostbannerMode { get; set; } public str? HostbannerUrl { get; set; } public str? HostbuttonGfxUrl { get; set; } public str? HostbuttonTooltip { get; set; } public str? HostbuttonUrl { get; set; } public IconHash? IconId { get; set; } public ClientId InvokerId { get; set; } public str InvokerName { get; set; } public Uid? InvokerUid { get; set; } public str? Nickname { get; set; } public f32? PrioritySpeakerDimmModificator { get; set; } public Reason Reason { get; set; } public str? ServerName { get; set; } public str? ServerPhoneticName { get; set; } public DurationSeconds? TempChannelDefaultDeleteDelay { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "invokerid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; case "reasonid": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break; case "virtualserver_channel_temp_delete_delay_default": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) TempChannelDefaultDeleteDelay = TimeSpan.FromSeconds(oval); } break; case "virtualserver_codec_encryption_mode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecEncryptionMode = (CodecEncryptionMode)oval; } break; case "virtualserver_default_channel_group": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultChannelGroup = (ChannelGroupId)oval; } break; case "virtualserver_default_server_group": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultServerGroup = (ServerGroupId)oval; } break; case "virtualserver_hostbanner_gfx_interval": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) HostbannerGfxInterval = TimeSpan.FromSeconds(oval); } break; case "virtualserver_hostbanner_gfx_url": HostbannerGfxUrl = (str)TsString.Unescape(value); break; case "virtualserver_hostbanner_mode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) HostbannerMode = (HostBannerMode)oval; } break; case "virtualserver_hostbanner_url": HostbannerUrl = (str)TsString.Unescape(value); break; case "virtualserver_hostbutton_gfx_url": HostbuttonGfxUrl = (str)TsString.Unescape(value); break; case "virtualserver_hostbutton_tooltip": HostbuttonTooltip = (str)TsString.Unescape(value); break; case "virtualserver_hostbutton_url": HostbuttonUrl = (str)TsString.Unescape(value); break; case "virtualserver_icon_id": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "virtualserver_name": ServerName = (str)TsString.Unescape(value); break; case "virtualserver_name_phonetic": ServerPhoneticName = (str)TsString.Unescape(value); break; case "virtualserver_nickname": Nickname = (str)TsString.Unescape(value); break; case "virtualserver_priority_speaker_dimm_modificator": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PrioritySpeakerDimmModificator = (f32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerEdited[])to; foreach (var fld in flds) { switch(fld) { case "invokerid": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; case "reasonid": foreach(var toi in toc) { toi.Reason = Reason; } break; case "virtualserver_channel_temp_delete_delay_default": foreach(var toi in toc) { toi.TempChannelDefaultDeleteDelay = TempChannelDefaultDeleteDelay; } break; case "virtualserver_codec_encryption_mode": foreach(var toi in toc) { toi.CodecEncryptionMode = CodecEncryptionMode; } break; case "virtualserver_default_channel_group": foreach(var toi in toc) { toi.DefaultChannelGroup = DefaultChannelGroup; } break; case "virtualserver_default_server_group": foreach(var toi in toc) { toi.DefaultServerGroup = DefaultServerGroup; } break; case "virtualserver_hostbanner_gfx_interval": foreach(var toi in toc) { toi.HostbannerGfxInterval = HostbannerGfxInterval; } break; case "virtualserver_hostbanner_gfx_url": foreach(var toi in toc) { toi.HostbannerGfxUrl = HostbannerGfxUrl; } break; case "virtualserver_hostbanner_mode": foreach(var toi in toc) { toi.HostbannerMode = HostbannerMode; } break; case "virtualserver_hostbanner_url": foreach(var toi in toc) { toi.HostbannerUrl = HostbannerUrl; } break; case "virtualserver_hostbutton_gfx_url": foreach(var toi in toc) { toi.HostbuttonGfxUrl = HostbuttonGfxUrl; } break; case "virtualserver_hostbutton_tooltip": foreach(var toi in toc) { toi.HostbuttonTooltip = HostbuttonTooltip; } break; case "virtualserver_hostbutton_url": foreach(var toi in toc) { toi.HostbuttonUrl = HostbuttonUrl; } break; case "virtualserver_icon_id": foreach(var toi in toc) { toi.IconId = IconId; } break; case "virtualserver_name": foreach(var toi in toc) { toi.ServerName = ServerName; } break; case "virtualserver_name_phonetic": foreach(var toi in toc) { toi.ServerPhoneticName = ServerPhoneticName; } break; case "virtualserver_nickname": foreach(var toi in toc) { toi.Nickname = Nickname; } break; case "virtualserver_priority_speaker_dimm_modificator": foreach(var toi in toc) { toi.PrioritySpeakerDimmModificator = PrioritySpeakerDimmModificator; } break; } } } } public sealed partial class ServerGroupAdd : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupAdd; public GroupType? GroupType { get; set; } public str Name { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "name": Name = (str)TsString.Unescape(value); break; case "type": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) GroupType = (GroupType)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupAdd[])to; foreach (var fld in flds) { switch(fld) { case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "type": foreach(var toi in toc) { toi.GroupType = GroupType; } break; } } } } public sealed partial class ServerGroupAddClient : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupAddClient; public ClientDbId ClientDbId { get; set; } public ServerGroupId ServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupAddClient[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ServerGroupAddPerm : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupAddPerm; public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } public bool PermissionNegated { get; set; } public bool PermissionSkip { get; set; } public i32 PermissionValue { get; set; } public ServerGroupId ServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permnegated": PermissionNegated = value.Length > 0 && value[0] != '0'; break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; case "permskip": PermissionSkip = value.Length > 0 && value[0] != '0'; break; case "permvalue": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break; case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupAddPerm[])to; foreach (var fld in flds) { switch(fld) { case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permnegated": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; case "permskip": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break; case "permvalue": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break; case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ServerGroupAddResponse : IResponse { #pragma warning disable CS8618 public string? ReturnCode { get; set; } public ServerGroupId ServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupAddResponse[])to; foreach (var fld in flds) { switch(fld) { case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ServerGroupAutoAddPerm : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupAutoAddPerm; public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } public bool PermissionNegated { get; set; } public bool PermissionSkip { get; set; } public i32 PermissionValue { get; set; } public u32 ServerGroupType { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permnegated": PermissionNegated = value.Length > 0 && value[0] != '0'; break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; case "permskip": PermissionSkip = value.Length > 0 && value[0] != '0'; break; case "permvalue": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break; case "sgtype": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerGroupType = (u32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupAutoAddPerm[])to; foreach (var fld in flds) { switch(fld) { case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permnegated": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; case "permskip": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break; case "permvalue": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break; case "sgtype": foreach(var toi in toc) { toi.ServerGroupType = ServerGroupType; } break; } } } } public sealed partial class ServerGroupAutoDelPerm : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupAutoDelPerm; public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } public u32 ServerGroupType { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; case "sgtype": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerGroupType = (u32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupAutoDelPerm[])to; foreach (var fld in flds) { switch(fld) { case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; case "sgtype": foreach(var toi in toc) { toi.ServerGroupType = ServerGroupType; } break; } } } } public sealed partial class ServerGroupClientList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupClientList; public string? ReturnCode { get; set; } public ClientDbId ClientDbId { get; set; } public str? Name { get; set; } public ServerGroupId ServerGroupId { get; set; } public Uid? Uid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "client_nickname": Name = (str)TsString.Unescape(value); break; case "client_unique_identifier": Uid = (Uid)TsString.Unescape(value); break; case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupClientList[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "client_nickname": foreach(var toi in toc) { toi.Name = Name; } break; case "client_unique_identifier": foreach(var toi in toc) { toi.Uid = Uid; } break; case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ServerGroupClientListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupClientListRequest; public ServerGroupId ServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupClientListRequest[])to; foreach (var fld in flds) { switch(fld) { case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ServerGroupCopy : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupCopy; public GroupType GroupType { get; set; } public str Name { get; set; } public ServerGroupId SourceServerGroupId { get; set; } public ServerGroupId TargetServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "name": Name = (str)TsString.Unescape(value); break; case "ssgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) SourceServerGroupId = (ServerGroupId)oval; } break; case "tsgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetServerGroupId = (ServerGroupId)oval; } break; case "type": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) GroupType = (GroupType)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupCopy[])to; foreach (var fld in flds) { switch(fld) { case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "ssgid": foreach(var toi in toc) { toi.SourceServerGroupId = SourceServerGroupId; } break; case "tsgid": foreach(var toi in toc) { toi.TargetServerGroupId = TargetServerGroupId; } break; case "type": foreach(var toi in toc) { toi.GroupType = GroupType; } break; } } } } public sealed partial class ServerGroupDel : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupDel; public bool Force { get; set; } public ServerGroupId ServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "force": Force = value.Length > 0 && value[0] != '0'; break; case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupDel[])to; foreach (var fld in flds) { switch(fld) { case "force": foreach(var toi in toc) { toi.Force = Force; } break; case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ServerGroupDelClient : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupDelClient; public ClientDbId ClientDbId { get; set; } public ServerGroupId ServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupDelClient[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ServerGroupDelPerm : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupDelPerm; public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } public ServerGroupId ServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupDelPerm[])to; foreach (var fld in flds) { switch(fld) { case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ServerGroupList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupList; public string? ReturnCode { get; set; } public GroupType GroupType { get; set; } public IconHash IconId { get; set; } public bool IsPermanent { get; set; } public str Name { get; set; } public GroupNamingMode NamingMode { get; set; } public i32 NeededMemberAddPower { get; set; } public i32? NeededMemberRemovePower { get; set; } public i32 NeededModifyPower { get; set; } public ServerGroupId ServerGroupId { get; set; } public i32 SortId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "iconid": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break; case "n_member_addp": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededMemberAddPower = (i32)oval; } break; case "n_member_removep": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededMemberRemovePower = (i32)oval; } break; case "n_modifyp": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededModifyPower = (i32)oval; } break; case "name": Name = (str)TsString.Unescape(value); break; case "namemode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NamingMode = (GroupNamingMode)oval; } break; case "savedb": IsPermanent = value.Length > 0 && value[0] != '0'; break; case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; case "sortid": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) SortId = (i32)oval; } break; case "type": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) GroupType = (GroupType)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupList[])to; foreach (var fld in flds) { switch(fld) { case "iconid": foreach(var toi in toc) { toi.IconId = IconId; } break; case "n_member_addp": foreach(var toi in toc) { toi.NeededMemberAddPower = NeededMemberAddPower; } break; case "n_member_removep": foreach(var toi in toc) { toi.NeededMemberRemovePower = NeededMemberRemovePower; } break; case "n_modifyp": foreach(var toi in toc) { toi.NeededModifyPower = NeededModifyPower; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "namemode": foreach(var toi in toc) { toi.NamingMode = NamingMode; } break; case "savedb": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break; case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; case "sortid": foreach(var toi in toc) { toi.SortId = SortId; } break; case "type": foreach(var toi in toc) { toi.GroupType = GroupType; } break; } } } } public sealed partial class ServerGroupListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupListRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ServerGroupPermList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupPermList; public string? ReturnCode { get; set; } public Ts3Permission? PermissionId { get; set; } public str? PermissionNameId { get; set; } public bool PermissionNegated { get; set; } public bool PermissionSkip { get; set; } public i32 PermissionValue { get; set; } public ServerGroupId ServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "permid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break; case "permnegated": PermissionNegated = value.Length > 0 && value[0] != '0'; break; case "permsid": PermissionNameId = (str)TsString.Unescape(value); break; case "permskip": PermissionSkip = value.Length > 0 && value[0] != '0'; break; case "permvalue": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break; case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupPermList[])to; foreach (var fld in flds) { switch(fld) { case "permid": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break; case "permnegated": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break; case "permsid": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break; case "permskip": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break; case "permvalue": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break; case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ServerGroupPermListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupPermListRequest; public ServerGroupId ServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupPermListRequest[])to; foreach (var fld in flds) { switch(fld) { case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ServerGroupRename : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupRename; public str Name { get; set; } public ServerGroupId ServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "name": Name = (str)TsString.Unescape(value); break; case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupRename[])to; foreach (var fld in flds) { switch(fld) { case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ServerGroupsByClientId : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupsByClientId; public string? ReturnCode { get; set; } public ClientDbId ClientDbId { get; set; } public str Name { get; set; } public ServerGroupId ServerGroupId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "name": Name = (str)TsString.Unescape(value); break; case "sgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupsByClientId[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "name": foreach(var toi in toc) { toi.Name = Name; } break; case "sgid": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break; } } } } public sealed partial class ServerGroupsByClientIdRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerGroupsByClientIdRequest; public ClientDbId ClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerGroupsByClientIdRequest[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; } } } } public sealed partial class ServerIdGetByPort : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerIdGetByPort; public u16 VirtualServerPort { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "virtualserver_port": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) VirtualServerPort = (u16)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerIdGetByPort[])to; foreach (var fld in flds) { switch(fld) { case "virtualserver_port": foreach(var toi in toc) { toi.VirtualServerPort = VirtualServerPort; } break; } } } } public sealed partial class ServerInfo : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerInfo; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ServerListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerListRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ServerListResponse : IResponse { #pragma warning disable CS8618 public string? ReturnCode { get; set; } public bool? Autostart { get; set; } public u16? ClientsOnline { get; set; } public str? MachineId { get; set; } public u16? MaxClients { get; set; } public u16? QueriesOnline { get; set; } public str? ServerName { get; set; } public DurationSeconds? Uptime { get; set; } public u64 VirtualServerId { get; set; } public u16 VirtualServerPort { get; set; } public str VirtualServerStatus { get; set; } public Uid? VirtualServerUid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "virtualserver_autostart": Autostart = value.Length > 0 && value[0] != '0'; break; case "virtualserver_clientsonline": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientsOnline = (u16)oval; } break; case "virtualserver_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) VirtualServerId = (u64)oval; } break; case "virtualserver_machine_id": MachineId = (str)TsString.Unescape(value); break; case "virtualserver_maxclients": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) MaxClients = (u16)oval; } break; case "virtualserver_name": ServerName = (str)TsString.Unescape(value); break; case "virtualserver_port": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) VirtualServerPort = (u16)oval; } break; case "virtualserver_queryclientsonline": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) QueriesOnline = (u16)oval; } break; case "virtualserver_status": VirtualServerStatus = (str)TsString.Unescape(value); break; case "virtualserver_unique_identifier": VirtualServerUid = (Uid)TsString.Unescape(value); break; case "virtualserver_uptime": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Uptime = TimeSpan.FromSeconds(oval); } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerListResponse[])to; foreach (var fld in flds) { switch(fld) { case "virtualserver_autostart": foreach(var toi in toc) { toi.Autostart = Autostart; } break; case "virtualserver_clientsonline": foreach(var toi in toc) { toi.ClientsOnline = ClientsOnline; } break; case "virtualserver_id": foreach(var toi in toc) { toi.VirtualServerId = VirtualServerId; } break; case "virtualserver_machine_id": foreach(var toi in toc) { toi.MachineId = MachineId; } break; case "virtualserver_maxclients": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break; case "virtualserver_name": foreach(var toi in toc) { toi.ServerName = ServerName; } break; case "virtualserver_port": foreach(var toi in toc) { toi.VirtualServerPort = VirtualServerPort; } break; case "virtualserver_queryclientsonline": foreach(var toi in toc) { toi.QueriesOnline = QueriesOnline; } break; case "virtualserver_status": foreach(var toi in toc) { toi.VirtualServerStatus = VirtualServerStatus; } break; case "virtualserver_unique_identifier": foreach(var toi in toc) { toi.VirtualServerUid = VirtualServerUid; } break; case "virtualserver_uptime": foreach(var toi in toc) { toi.Uptime = Uptime; } break; } } } } public sealed partial class ServerLog : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerLog; public string? ReturnCode { get; set; } public u64 FileSize { get; set; } public u64 LastOffset { get; set; } public str License { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "file_size": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FileSize = (u64)oval; } break; case "l": License = (str)TsString.Unescape(value); break; case "last_pos": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) LastOffset = (u64)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerLog[])to; foreach (var fld in flds) { switch(fld) { case "file_size": foreach(var toi in toc) { toi.FileSize = FileSize; } break; case "l": foreach(var toi in toc) { toi.License = License; } break; case "last_pos": foreach(var toi in toc) { toi.LastOffset = LastOffset; } break; } } } } public sealed partial class ServerNotifyRegister : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerNotifyRegister; public str EventType { get; set; } public ChannelId? Id { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "event": EventType = (str)TsString.Unescape(value); break; case "id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Id = (ChannelId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerNotifyRegister[])to; foreach (var fld in flds) { switch(fld) { case "event": foreach(var toi in toc) { toi.EventType = EventType; } break; case "id": foreach(var toi in toc) { toi.Id = Id; } break; } } } } public sealed partial class ServerNotifyUnregister : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerNotifyUnregister; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ServerProcessStop : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerProcessStop; public str? ReasonMessage { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "reasonmsg": ReasonMessage = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerProcessStop[])to; foreach (var fld in flds) { switch(fld) { case "reasonmsg": foreach(var toi in toc) { toi.ReasonMessage = ReasonMessage; } break; } } } } public sealed partial class ServerSnapshotCreate : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerSnapshotCreate; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ServerSnapshotDeploy : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerSnapshotDeploy; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ServerStart : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerStart; public u32 ServerId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "sid": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerId = (u32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerStart[])to; foreach (var fld in flds) { switch(fld) { case "sid": foreach(var toi in toc) { toi.ServerId = ServerId; } break; } } } } public sealed partial class ServerStop : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerStop; public str? ReasonMessage { get; set; } public u32 ServerId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "reasonmsg": ReasonMessage = (str)TsString.Unescape(value); break; case "sid": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerId = (u32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerStop[])to; foreach (var fld in flds) { switch(fld) { case "reasonmsg": foreach(var toi in toc) { toi.ReasonMessage = ReasonMessage; } break; case "sid": foreach(var toi in toc) { toi.ServerId = ServerId; } break; } } } } public sealed partial class ServerTempPasswordAdd : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerTempPasswordAdd; public str Description { get; set; } public DurationSeconds Duration { get; set; } public str Password { get; set; } public ChannelId TargetChannelId { get; set; } public str TargetChannelPassword { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "desc": Description = (str)TsString.Unescape(value); break; case "duration": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Duration = TimeSpan.FromSeconds(oval); } break; case "pw": Password = (str)TsString.Unescape(value); break; case "tcid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelId = (ChannelId)oval; } break; case "tcpw": TargetChannelPassword = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerTempPasswordAdd[])to; foreach (var fld in flds) { switch(fld) { case "desc": foreach(var toi in toc) { toi.Description = Description; } break; case "duration": foreach(var toi in toc) { toi.Duration = Duration; } break; case "pw": foreach(var toi in toc) { toi.Password = Password; } break; case "tcid": foreach(var toi in toc) { toi.TargetChannelId = TargetChannelId; } break; case "tcpw": foreach(var toi in toc) { toi.TargetChannelPassword = TargetChannelPassword; } break; } } } } public sealed partial class ServerTempPasswordDel : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerTempPasswordDel; public str Password { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "pw": Password = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerTempPasswordDel[])to; foreach (var fld in flds) { switch(fld) { case "pw": foreach(var toi in toc) { toi.Password = Password; } break; } } } } public sealed partial class ServerTempPasswordList : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerTempPasswordList; public str Description { get; set; } public DateTime End { get; set; } public str Nickname { get; set; } public str PasswordClear { get; set; } public DateTime Start { get; set; } public ChannelId TargetChannelId { get; set; } public str TargetChannelPassword { get; set; } public Uid Uid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "desc": Description = (str)TsString.Unescape(value); break; case "end": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) End = Tools.FromUnix(oval); } break; case "nickname": Nickname = (str)TsString.Unescape(value); break; case "pw_clear": PasswordClear = (str)TsString.Unescape(value); break; case "start": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Start = Tools.FromUnix(oval); } break; case "tcid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelId = (ChannelId)oval; } break; case "tcpw": TargetChannelPassword = (str)TsString.Unescape(value); break; case "uid": Uid = (Uid)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerTempPasswordList[])to; foreach (var fld in flds) { switch(fld) { case "desc": foreach(var toi in toc) { toi.Description = Description; } break; case "end": foreach(var toi in toc) { toi.End = End; } break; case "nickname": foreach(var toi in toc) { toi.Nickname = Nickname; } break; case "pw_clear": foreach(var toi in toc) { toi.PasswordClear = PasswordClear; } break; case "start": foreach(var toi in toc) { toi.Start = Start; } break; case "tcid": foreach(var toi in toc) { toi.TargetChannelId = TargetChannelId; } break; case "tcpw": foreach(var toi in toc) { toi.TargetChannelPassword = TargetChannelPassword; } break; case "uid": foreach(var toi in toc) { toi.Uid = Uid; } break; } } } } public sealed partial class ServerTempPasswordListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerTempPasswordListRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class ServerUpdated : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerUpdated; public u32 AntifloodPointsTickReduce { get; set; } public u32 AntifloodPointsToCommandBlock { get; set; } public u32 AntifloodPointsToIpBlock { get; set; } public u32 AntifloodPointsToPluginBlock { get; set; } public bool Autostart { get; set; } public u64 BytesDownloadedMonth { get; set; } public u64 BytesDownloadedTotal { get; set; } public u64 BytesUploadedMonth { get; set; } public u64 BytesUploadedTotal { get; set; } public u64 ChannelsOnline { get; set; } public u64 ClientConnections { get; set; } public u16 ClientsOnline { get; set; } public u32 ComplainAutobanCount { get; set; } public DurationSeconds ComplainAutobanTime { get; set; } public DurationSeconds ComplainRemoveTime { get; set; } public ChannelGroupId DefaultChannelAdminGroup { get; set; } public u64 DownloadQuota { get; set; } public bool HasPassword { get; set; } public str Hostmessage { get; set; } public HostMessageMode HostmessageMode { get; set; } public u8 IdentitySecurityLevel { get; set; } public bool LogChannel { get; set; } public bool LogClient { get; set; } public bool LogFileTransfer { get; set; } public bool LogPermissions { get; set; } public bool LogQuery { get; set; } public bool LogServer { get; set; } public str MachineId { get; set; } public u16 MaxClients { get; set; } public u64 MaxDownloadTotalBandwidth { get; set; } public u64 MaxUploadTotalBandwidth { get; set; } public u32 MinAndroidVersion { get; set; } public u32 MinClientsInChannelBeforeForcedSilence { get; set; } public u32 MinClientVersion { get; set; } public u32 MinIosVersion { get; set; } public f32 PacketlossTotal { get; set; } public f32 PacketlossTotalControl { get; set; } public f32 PacketlossTotalKeepalive { get; set; } public f32 PacketlossTotalSpeech { get; set; } public f32 PingTotal { get; set; } public u16 QueriesOnline { get; set; } public u64 QueryConnections { get; set; } public u16 ReservedSlots { get; set; } public u64 UploadQuota { get; set; } public DurationSeconds Uptime { get; set; } public u16 VirtualServerPort { get; set; } public bool WeblistEnabled { get; set; } public str WelcomeMessage { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "virtualserver_antiflood_points_needed_command_block": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsToCommandBlock = (u32)oval; } break; case "virtualserver_antiflood_points_needed_ip_block": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsToIpBlock = (u32)oval; } break; case "virtualserver_antiflood_points_needed_plugin_block": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsToPluginBlock = (u32)oval; } break; case "virtualserver_antiflood_points_tick_reduce": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsTickReduce = (u32)oval; } break; case "virtualserver_autostart": Autostart = value.Length > 0 && value[0] != '0'; break; case "virtualserver_channelsonline": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelsOnline = (u64)oval; } break; case "virtualserver_client_connections": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientConnections = (u64)oval; } break; case "virtualserver_clientsonline": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientsOnline = (u16)oval; } break; case "virtualserver_complain_autoban_count": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ComplainAutobanCount = (u32)oval; } break; case "virtualserver_complain_autoban_time": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ComplainAutobanTime = TimeSpan.FromSeconds(oval); } break; case "virtualserver_complain_remove_time": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ComplainRemoveTime = TimeSpan.FromSeconds(oval); } break; case "virtualserver_default_channel_admin_group": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultChannelAdminGroup = (ChannelGroupId)oval; } break; case "virtualserver_download_quota": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DownloadQuota = (u64)oval; } break; case "virtualserver_flag_password": HasPassword = value.Length > 0 && value[0] != '0'; break; case "virtualserver_hostmessage": Hostmessage = (str)TsString.Unescape(value); break; case "virtualserver_hostmessage_mode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) HostmessageMode = (HostMessageMode)oval; } break; case "virtualserver_log_channel": LogChannel = value.Length > 0 && value[0] != '0'; break; case "virtualserver_log_client": LogClient = value.Length > 0 && value[0] != '0'; break; case "virtualserver_log_filetransfer": LogFileTransfer = value.Length > 0 && value[0] != '0'; break; case "virtualserver_log_permissions": LogPermissions = value.Length > 0 && value[0] != '0'; break; case "virtualserver_log_query": LogQuery = value.Length > 0 && value[0] != '0'; break; case "virtualserver_log_server": LogServer = value.Length > 0 && value[0] != '0'; break; case "virtualserver_machine_id": MachineId = (str)TsString.Unescape(value); break; case "virtualserver_max_download_total_bandwidth": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) MaxDownloadTotalBandwidth = (u64)oval; } break; case "virtualserver_max_upload_total_bandwidth": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) MaxUploadTotalBandwidth = (u64)oval; } break; case "virtualserver_maxclients": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) MaxClients = (u16)oval; } break; case "virtualserver_min_android_version": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MinAndroidVersion = (u32)oval; } break; case "virtualserver_min_client_version": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MinClientVersion = (u32)oval; } break; case "virtualserver_min_clients_in_channel_before_forced_silence": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MinClientsInChannelBeforeForcedSilence = (u32)oval; } break; case "virtualserver_min_ios_version": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MinIosVersion = (u32)oval; } break; case "virtualserver_month_bytes_downloaded": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesDownloadedMonth = (u64)oval; } break; case "virtualserver_month_bytes_uploaded": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesUploadedMonth = (u64)oval; } break; case "virtualserver_needed_identity_security_level": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) IdentitySecurityLevel = (u8)oval; } break; case "virtualserver_port": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) VirtualServerPort = (u16)oval; } break; case "virtualserver_query_client_connections": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) QueryConnections = (u64)oval; } break; case "virtualserver_queryclientsonline": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) QueriesOnline = (u16)oval; } break; case "virtualserver_reserved_slots": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ReservedSlots = (u16)oval; } break; case "virtualserver_total_bytes_downloaded": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesDownloadedTotal = (u64)oval; } break; case "virtualserver_total_bytes_uploaded": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesUploadedTotal = (u64)oval; } break; case "virtualserver_total_packetloss_control": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PacketlossTotalControl = (f32)oval; } break; case "virtualserver_total_packetloss_keepalive": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PacketlossTotalKeepalive = (f32)oval; } break; case "virtualserver_total_packetloss_speech": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PacketlossTotalSpeech = (f32)oval; } break; case "virtualserver_total_packetloss_total": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PacketlossTotal = (f32)oval; } break; case "virtualserver_total_ping": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PingTotal = (f32)oval; } break; case "virtualserver_upload_quota": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) UploadQuota = (u64)oval; } break; case "virtualserver_uptime": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Uptime = TimeSpan.FromSeconds(oval); } break; case "virtualserver_weblist_enabled": WeblistEnabled = value.Length > 0 && value[0] != '0'; break; case "virtualserver_welcomemessage": WelcomeMessage = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (ServerUpdated[])to; foreach (var fld in flds) { switch(fld) { case "virtualserver_antiflood_points_needed_command_block": foreach(var toi in toc) { toi.AntifloodPointsToCommandBlock = AntifloodPointsToCommandBlock; } break; case "virtualserver_antiflood_points_needed_ip_block": foreach(var toi in toc) { toi.AntifloodPointsToIpBlock = AntifloodPointsToIpBlock; } break; case "virtualserver_antiflood_points_needed_plugin_block": foreach(var toi in toc) { toi.AntifloodPointsToPluginBlock = AntifloodPointsToPluginBlock; } break; case "virtualserver_antiflood_points_tick_reduce": foreach(var toi in toc) { toi.AntifloodPointsTickReduce = AntifloodPointsTickReduce; } break; case "virtualserver_autostart": foreach(var toi in toc) { toi.Autostart = Autostart; } break; case "virtualserver_channelsonline": foreach(var toi in toc) { toi.ChannelsOnline = ChannelsOnline; } break; case "virtualserver_client_connections": foreach(var toi in toc) { toi.ClientConnections = ClientConnections; } break; case "virtualserver_clientsonline": foreach(var toi in toc) { toi.ClientsOnline = ClientsOnline; } break; case "virtualserver_complain_autoban_count": foreach(var toi in toc) { toi.ComplainAutobanCount = ComplainAutobanCount; } break; case "virtualserver_complain_autoban_time": foreach(var toi in toc) { toi.ComplainAutobanTime = ComplainAutobanTime; } break; case "virtualserver_complain_remove_time": foreach(var toi in toc) { toi.ComplainRemoveTime = ComplainRemoveTime; } break; case "virtualserver_default_channel_admin_group": foreach(var toi in toc) { toi.DefaultChannelAdminGroup = DefaultChannelAdminGroup; } break; case "virtualserver_download_quota": foreach(var toi in toc) { toi.DownloadQuota = DownloadQuota; } break; case "virtualserver_flag_password": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break; case "virtualserver_hostmessage": foreach(var toi in toc) { toi.Hostmessage = Hostmessage; } break; case "virtualserver_hostmessage_mode": foreach(var toi in toc) { toi.HostmessageMode = HostmessageMode; } break; case "virtualserver_log_channel": foreach(var toi in toc) { toi.LogChannel = LogChannel; } break; case "virtualserver_log_client": foreach(var toi in toc) { toi.LogClient = LogClient; } break; case "virtualserver_log_filetransfer": foreach(var toi in toc) { toi.LogFileTransfer = LogFileTransfer; } break; case "virtualserver_log_permissions": foreach(var toi in toc) { toi.LogPermissions = LogPermissions; } break; case "virtualserver_log_query": foreach(var toi in toc) { toi.LogQuery = LogQuery; } break; case "virtualserver_log_server": foreach(var toi in toc) { toi.LogServer = LogServer; } break; case "virtualserver_machine_id": foreach(var toi in toc) { toi.MachineId = MachineId; } break; case "virtualserver_max_download_total_bandwidth": foreach(var toi in toc) { toi.MaxDownloadTotalBandwidth = MaxDownloadTotalBandwidth; } break; case "virtualserver_max_upload_total_bandwidth": foreach(var toi in toc) { toi.MaxUploadTotalBandwidth = MaxUploadTotalBandwidth; } break; case "virtualserver_maxclients": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break; case "virtualserver_min_android_version": foreach(var toi in toc) { toi.MinAndroidVersion = MinAndroidVersion; } break; case "virtualserver_min_client_version": foreach(var toi in toc) { toi.MinClientVersion = MinClientVersion; } break; case "virtualserver_min_clients_in_channel_before_forced_silence": foreach(var toi in toc) { toi.MinClientsInChannelBeforeForcedSilence = MinClientsInChannelBeforeForcedSilence; } break; case "virtualserver_min_ios_version": foreach(var toi in toc) { toi.MinIosVersion = MinIosVersion; } break; case "virtualserver_month_bytes_downloaded": foreach(var toi in toc) { toi.BytesDownloadedMonth = BytesDownloadedMonth; } break; case "virtualserver_month_bytes_uploaded": foreach(var toi in toc) { toi.BytesUploadedMonth = BytesUploadedMonth; } break; case "virtualserver_needed_identity_security_level": foreach(var toi in toc) { toi.IdentitySecurityLevel = IdentitySecurityLevel; } break; case "virtualserver_port": foreach(var toi in toc) { toi.VirtualServerPort = VirtualServerPort; } break; case "virtualserver_query_client_connections": foreach(var toi in toc) { toi.QueryConnections = QueryConnections; } break; case "virtualserver_queryclientsonline": foreach(var toi in toc) { toi.QueriesOnline = QueriesOnline; } break; case "virtualserver_reserved_slots": foreach(var toi in toc) { toi.ReservedSlots = ReservedSlots; } break; case "virtualserver_total_bytes_downloaded": foreach(var toi in toc) { toi.BytesDownloadedTotal = BytesDownloadedTotal; } break; case "virtualserver_total_bytes_uploaded": foreach(var toi in toc) { toi.BytesUploadedTotal = BytesUploadedTotal; } break; case "virtualserver_total_packetloss_control": foreach(var toi in toc) { toi.PacketlossTotalControl = PacketlossTotalControl; } break; case "virtualserver_total_packetloss_keepalive": foreach(var toi in toc) { toi.PacketlossTotalKeepalive = PacketlossTotalKeepalive; } break; case "virtualserver_total_packetloss_speech": foreach(var toi in toc) { toi.PacketlossTotalSpeech = PacketlossTotalSpeech; } break; case "virtualserver_total_packetloss_total": foreach(var toi in toc) { toi.PacketlossTotal = PacketlossTotal; } break; case "virtualserver_total_ping": foreach(var toi in toc) { toi.PingTotal = PingTotal; } break; case "virtualserver_upload_quota": foreach(var toi in toc) { toi.UploadQuota = UploadQuota; } break; case "virtualserver_uptime": foreach(var toi in toc) { toi.Uptime = Uptime; } break; case "virtualserver_weblist_enabled": foreach(var toi in toc) { toi.WeblistEnabled = WeblistEnabled; } break; case "virtualserver_welcomemessage": foreach(var toi in toc) { toi.WelcomeMessage = WelcomeMessage; } break; } } } } public sealed partial class ServerVariablesRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.ServerVariablesRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class SetClientChannelGroup : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.SetClientChannelGroup; public ChannelGroupId ChannelGroup { get; set; } public ChannelId ChannelId { get; set; } public ClientDbId ClientDbId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cgid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break; case "cid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (SetClientChannelGroup[])to; foreach (var fld in flds) { switch(fld) { case "cgid": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break; case "cid": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; } } } } public sealed partial class TextMessage : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.TextMessage; public string? ReturnCode { get; set; } public ClientId InvokerId { get; set; } public str InvokerName { get; set; } public Uid? InvokerUid { get; set; } public str Message { get; set; } public TextMessageTargetMode Target { get; set; } public ClientId? TargetClientId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "invokerid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break; case "invokername": InvokerName = (str)TsString.Unescape(value); break; case "invokeruid": InvokerUid = (Uid)TsString.Unescape(value); break; case "msg": Message = (str)TsString.Unescape(value); break; case "target": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) TargetClientId = (ClientId)oval; } break; case "targetmode": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Target = (TextMessageTargetMode)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (TextMessage[])to; foreach (var fld in flds) { switch(fld) { case "invokerid": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break; case "invokername": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break; case "invokeruid": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break; case "msg": foreach(var toi in toc) { toi.Message = Message; } break; case "target": foreach(var toi in toc) { toi.TargetClientId = TargetClientId; } break; case "targetmode": foreach(var toi in toc) { toi.Target = Target; } break; } } } } public sealed partial class TokenAdd : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.TokenAdd; public string? ReturnCode { get; set; } public str Token { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "token": Token = (str)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (TokenAdd[])to; foreach (var fld in flds) { switch(fld) { case "token": foreach(var toi in toc) { toi.Token = Token; } break; } } } } public sealed partial class TokenAddRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.TokenAddRequest; public str? TokenCustomSet { get; set; } public str? TokenDescription { get; set; } public u64 TokenId1 { get; set; } public ChannelId TokenId2 { get; set; } public TokenType TokenType { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "tokencustomset": TokenCustomSet = (str)TsString.Unescape(value); break; case "tokendescription": TokenDescription = (str)TsString.Unescape(value); break; case "tokenid1": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TokenId1 = (u64)oval; } break; case "tokenid2": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TokenId2 = (ChannelId)oval; } break; case "tokentype": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TokenType = (TokenType)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (TokenAddRequest[])to; foreach (var fld in flds) { switch(fld) { case "tokencustomset": foreach(var toi in toc) { toi.TokenCustomSet = TokenCustomSet; } break; case "tokendescription": foreach(var toi in toc) { toi.TokenDescription = TokenDescription; } break; case "tokenid1": foreach(var toi in toc) { toi.TokenId1 = TokenId1; } break; case "tokenid2": foreach(var toi in toc) { toi.TokenId2 = TokenId2; } break; case "tokentype": foreach(var toi in toc) { toi.TokenType = TokenType; } break; } } } } public sealed partial class TokenDelete : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.TokenDelete; public str Token { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "token": Token = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (TokenDelete[])to; foreach (var fld in flds) { switch(fld) { case "token": foreach(var toi in toc) { toi.Token = Token; } break; } } } } public sealed partial class TokenList : INotification, IResponse { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.TokenList; public string? ReturnCode { get; set; } public str Token { get; set; } public DateTime TokenCreateTime { get; set; } public str TokenDescription { get; set; } public u64 TokenId1 { get; set; } public ChannelId TokenId2 { get; set; } public TokenType TokenType { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "token": Token = (str)TsString.Unescape(value); break; case "token_created": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) TokenCreateTime = Tools.FromUnix(oval); } break; case "token_description": TokenDescription = (str)TsString.Unescape(value); break; case "token_id1": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TokenId1 = (u64)oval; } break; case "token_id2": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TokenId2 = (ChannelId)oval; } break; case "token_type": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TokenType = (TokenType)oval; } break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (TokenList[])to; foreach (var fld in flds) { switch(fld) { case "token": foreach(var toi in toc) { toi.Token = Token; } break; case "token_created": foreach(var toi in toc) { toi.TokenCreateTime = TokenCreateTime; } break; case "token_description": foreach(var toi in toc) { toi.TokenDescription = TokenDescription; } break; case "token_id1": foreach(var toi in toc) { toi.TokenId1 = TokenId1; } break; case "token_id2": foreach(var toi in toc) { toi.TokenId2 = TokenId2; } break; case "token_type": foreach(var toi in toc) { toi.TokenType = TokenType; } break; } } } } public sealed partial class TokenListRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.TokenListRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class TokenUse : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.TokenUse; public str Token { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "token": Token = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (TokenUse[])to; foreach (var fld in flds) { switch(fld) { case "token": foreach(var toi in toc) { toi.Token = Token; } break; } } } } public sealed partial class TokenUsed : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.TokenUsed; public ClientDbId ClientDbId { get; set; } public ClientId ClientId { get; set; } public Uid ClientUid { get; set; } public str Token { get; set; } public str Token1 { get; set; } public str Token2 { get; set; } public str TokenCustomSet { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "cldbid": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break; case "clid": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "cluid": ClientUid = (Uid)TsString.Unescape(value); break; case "token": Token = (str)TsString.Unescape(value); break; case "token1": Token1 = (str)TsString.Unescape(value); break; case "token2": Token2 = (str)TsString.Unescape(value); break; case "tokencustomset": TokenCustomSet = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (TokenUsed[])to; foreach (var fld in flds) { switch(fld) { case "cldbid": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break; case "clid": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "cluid": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break; case "token": foreach(var toi in toc) { toi.Token = Token; } break; case "token1": foreach(var toi in toc) { toi.Token1 = Token1; } break; case "token2": foreach(var toi in toc) { toi.Token2 = Token2; } break; case "tokencustomset": foreach(var toi in toc) { toi.TokenCustomSet = TokenCustomSet; } break; } } } } public sealed partial class Use : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.Use; public u16? Port { get; set; } public u32? ServerId { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "port": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) Port = (u16)oval; } break; case "sid": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerId = (u32)oval; } break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (Use[])to; foreach (var fld in flds) { switch(fld) { case "port": foreach(var toi in toc) { toi.Port = Port; } break; case "sid": foreach(var toi in toc) { toi.ServerId = ServerId; } break; } } } } public sealed partial class VersionRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.VersionRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public sealed partial class WhoAmI : IResponse { #pragma warning disable CS8618 public string? ReturnCode { get; set; } public ChannelId ChannelId { get; set; } public ClientId ClientId { get; set; } public ClientDbId DatabaseId { get; set; } public str LoginName { get; set; } public str Name { get; set; } public u64 OriginServerId { get; set; } public Uid Uid { get; set; } public u64 VirtualServerId { get; set; } public u16 VirtualServerPort { get; set; } public str VirtualServerStatus { get; set; } public Uid VirtualServerUid { get; set; } #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { switch(name) { case "client_channel_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break; case "client_database_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DatabaseId = (ClientDbId)oval; } break; case "client_id": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break; case "client_login_name": LoginName = (str)TsString.Unescape(value); break; case "client_nickname": Name = (str)TsString.Unescape(value); break; case "client_origin_server_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) OriginServerId = (u64)oval; } break; case "client_unique_identifier": Uid = (Uid)TsString.Unescape(value); break; case "virtualserver_id": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) VirtualServerId = (u64)oval; } break; case "virtualserver_port": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) VirtualServerPort = (u16)oval; } break; case "virtualserver_status": VirtualServerStatus = (str)TsString.Unescape(value); break; case "virtualserver_unique_identifier": VirtualServerUid = (Uid)TsString.Unescape(value); break; case "return_code": ReturnCode = (str)TsString.Unescape(value); break; } } public void Expand(IMessage[] to, IEnumerable flds) { var toc = (WhoAmI[])to; foreach (var fld in flds) { switch(fld) { case "client_channel_id": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break; case "client_database_id": foreach(var toi in toc) { toi.DatabaseId = DatabaseId; } break; case "client_id": foreach(var toi in toc) { toi.ClientId = ClientId; } break; case "client_login_name": foreach(var toi in toc) { toi.LoginName = LoginName; } break; case "client_nickname": foreach(var toi in toc) { toi.Name = Name; } break; case "client_origin_server_id": foreach(var toi in toc) { toi.OriginServerId = OriginServerId; } break; case "client_unique_identifier": foreach(var toi in toc) { toi.Uid = Uid; } break; case "virtualserver_id": foreach(var toi in toc) { toi.VirtualServerId = VirtualServerId; } break; case "virtualserver_port": foreach(var toi in toc) { toi.VirtualServerPort = VirtualServerPort; } break; case "virtualserver_status": foreach(var toi in toc) { toi.VirtualServerStatus = VirtualServerStatus; } break; case "virtualserver_unique_identifier": foreach(var toi in toc) { toi.VirtualServerUid = VirtualServerUid; } break; } } } } public sealed partial class WhoAmIRequest : INotification { #pragma warning disable CS8618 public NotificationType NotifyType { get; } = NotificationType.WhoAmIRequest; #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } public enum NotificationType { Unknown, ///[C2S] ntfy:banadd BanAdd, ///[C2S] ntfy:banclient BanClient, ///[C2S] ntfy:bandel BanDel, ///[C2S] ntfy:bandelall BanDelAll, ///[S2C] ntfy:notifybanlist BanList, ///[C2S] ntfy:banlist BanListRequest, ///[C2S] ntfy:bindinglist BindingList, ///[C2S] ntfy:channeladdperm ChannelAddPerm, ///[S2C] ntfy:notifychannelchanged ChannelChanged, ///[C2S] ntfy:channelclientaddperm ChannelClientAddPerm, ///[C2S] ntfy:channelclientdelperm ChannelClientDelPerm, ///[S2C] ntfy:notifychannelclientpermlist ChannelClientPermList, ///[C2S] ntfy:channelclientpermlist ChannelClientPermListRequest, ///[C2S] ntfy:channelcreate ChannelCreate, ///[S2C] ntfy:notifychannelcreated ChannelCreated, ///[C2S] ntfy:channeldelete ChannelDelete, ///[S2C] ntfy:notifychanneldeleted ChannelDeleted, ///[C2S] ntfy:channeldelperm ChannelDelPerm, ///[S2C] ntfy:notifychanneldescriptionchanged ChannelDescriptionChanged, ///[C2S] ntfy:channelgetdescription ChannelDescriptionRequest, ///[C2S] ntfy:channeledit ChannelEdit, ///[S2C] ntfy:notifychanneledited ChannelEdited, ///[C2S] ntfy:channelfind ChannelFindRequest, ///[C2S] ntfy:channelgroupadd ChannelGroupAdd, ///[C2S] ntfy:channelgroupaddperm ChannelGroupAddPerm, ///[S2C] ntfy:notifychannelgroupclientlist ChannelGroupClientList, ///[C2S] ntfy:channelgroupclientlist ChannelGroupClientListRequest, ///[C2S] ntfy:channelgroupcopy ChannelGroupCopy, ///[C2S] ntfy:channelgroupdel ChannelGroupDel, ///[C2S] ntfy:channelgroupdelperm ChannelGroupDelPerm, ///[S2C] ntfy:notifychannelgrouplist ChannelGroupList, ///[C2S] ntfy:channelgrouplist ChannelGroupListRequest, ///[S2C] ntfy:notifychannelgrouppermlist ChannelGroupPermList, ///[C2S] ntfy:channelgrouppermlist ChannelGroupPermListRequest, ///[C2S] ntfy:channelgrouprename ChannelGroupRename, ///[C2S] ntfy:channelinfo ChannelInfoRequest, ///[S2C] ntfy:channellist ChannelList, ///[S2C] ntfy:channellistfinished ChannelListFinished, ///[C2S] ntfy:channellist ChannelListRequest, ///[C2S] ntfy:channelmove ChannelMove, ///[S2C] ntfy:notifychannelmoved ChannelMoved, ///[S2C] ntfy:notifychannelpasswordchanged ChannelPasswordChanged, ///[S2C] ntfy:notifychannelpermhints ChannelPermissionHints, ///[S2C] ntfy:notifychannelpermlist ChannelPermList, ///[C2S] ntfy:channelpermlist ChannelPermListRequest, ///[C2S] ntfy:channelsubscribe ChannelSubscribe, ///[C2S] ntfy:channelsubscribeall ChannelSubscribeAll, ///[S2C] ntfy:notifychannelsubscribed ChannelSubscribed, ///[C2S] ntfy:channelunsubscribe ChannelUnsubscribe, ///[C2S] ntfy:channelunsubscribeall ChannelUnsubscribeAll, ///[S2C] ntfy:notifychannelunsubscribed ChannelUnsubscribed, ///[C2S] ntfy:clientaddperm ClientAddPerm, ///[S2C] ntfy:notifyclientchannelgroupchanged ClientChannelGroupChanged, ///[C2S] ntfy:clientchatclosed ClientChatClose, ///[S2C] ntfy:notifyclientchatclosed ClientChatClosed, ///[S2C] ntfy:notifyclientchatcomposing ClientChatComposing, ///[S2C] ntfy:notifyconnectioninfo ClientConnectionInfo, ///[C2S] ntfy:getconnectioninfo ClientConnectionInfoRequest, ///[S2C] ntfy:notifyconnectioninforequest ClientConnectionInfoUpdateRequest, ///[C2S] ntfy:clientdbdelete ClientDbDelete, ///[C2S] ntfy:clientdbedit ClientDbEdit, ///[S2C] ntfy:notifyclientdbfind ClientDbFind, ///[C2S] ntfy:clientdbfind ClientDbFindRequest, ///[S2C] ntfy:notifyclientdbidfromuid ClientDbIdFromUid, ///[C2S] ntfy:clientgetdbidfromuid ClientDbIdFromUidRequest, ///[C2S] ntfy:clientdbinfo ClientDbInfoRequest, ///[S2C] ntfy:notifyclientdblist ClientDbList, ///[C2S] ntfy:clientdblist ClientDbListRequest, ///[C2S] ntfy:clientdelperm ClientDelPerm, ///[C2S] ntfy:clientedit ClientEdit, ///[S2C] ntfy:notifycliententerview ClientEnterView, ///[C2S] ntfy:clientfind ClientFindRequest, ///[S2C] ntfy:notifyclientids ClientIds, ///[C2S] ntfy:clientgetids ClientIdsRequest, ///[C2S] ntfy:clientinfo ClientInfoRequest, ///[C2S] ntfy:clientinit ClientInit, ///[C2S] ntfy:clientinitiv ClientInitIv, ///[C2S] ntfy:clientkick ClientKick, ///[S2C] ntfy:notifyclientleftview ClientLeftView, ///[C2S] ntfy:clientlist ClientListRequest, ///[C2S] ntfy:clientmove ClientMove, ///[S2C] ntfy:notifyclientmoved ClientMoved, ///[S2C] ntfy:notifyclientnamefromdbid ClientNameFromDbId, ///[C2S] ntfy:clientgetnamefromdbid ClientNameFromDbIdRequest, ///[S2C] ntfy:notifyclientnamefromuid ClientNameFromUid, ///[C2S] ntfy:clientgetnamefromuid ClientNameFromUidRequest, ///[S2C] ntfy:notifyclientneededpermissions ClientNeededPermissions, ///[S2C] ntfy:notifyclientpermhints ClientPermissionHints, ///[S2C] ntfy:notifyclientpermlist ClientPermList, ///[C2S] ntfy:clientpermlist ClientPermListRequest, ///[S2C] ntfy:notifyclientpoke ClientPoke, ///[C2S] ntfy:clientpoke ClientPokeRequest, ///[S2C] ntfy:notifyservergroupclientadded ClientServerGroupAdded, ///[S2C] ntfy:notifyservergroupclientdeleted ClientServerGroupRemoved, ///[S2C] ntfy:notifyclientserverqueryloginpassword ClientSetServerQueryLogin, ///[C2S] ntfy:clientsetserverquerylogin ClientSetServerQueryLoginRequest, ///[S2C] ntfy:notifyclientuidfromclid ClientUidFromClid, ///[C2S] ntfy:clientgetuidfromclid ClientUidFromClidRequest, ///[C2S] ntfy:clientupdate ClientUpdate, ///[S2C] ntfy:notifyclientupdated ClientUpdated, ///[C2S] ntfy:clientgetvariables ClientVariablesRequest, ///[S2C] ntfy:error CommandError, ///[C2S] ntfy:complainadd ComplainAdd, ///[C2S] ntfy:complaindel ComplainDel, ///[C2S] ntfy:complaindelall ComplainDelAll, ///[S2C] ntfy:notifycomplainlist ComplainList, ///[C2S] ntfy:complainlist ComplainListRequest, ///[C2S] ntfy:customdelete CustomDelete, ///[C2S] ntfy:custominfo CustomInfoRequest, ///[C2S] ntfy:customsearch CustomSearch, ///[C2S] ntfy:customset CustomSet, ///[C2S] ntfy:clientdisconnect Disconnect, ///[S2C] ntfy:notifystartdownload FileDownload, ///[S2C] ntfy:notifyfileinfo FileInfo, ///[S2C] ntfy:notifyfilelist FileList, ///[S2C] ntfy:notifyfilelistfinished FileListFinished, ///[S2C] ntfy:notifyfiletransferlist FileTransfer, ///[S2C] ntfy:notifystatusfiletransfer FileTransferStatus, ///[S2C] ntfy:notifystartupload FileUpload, ///[C2S] ntfy:ftcreatedir FtCreateDir, ///[C2S] ntfy:ftdeletefile FtDeleteFile, ///[C2S] ntfy:ftgetfileinfo FtFileInfoRequest, ///[C2S] ntfy:ftgetfilelist FtFileListRequest, ///[C2S] ntfy:ftinitdownload FtInitDownload, ///[C2S] ntfy:ftinitupload FtInitUpload, ///[C2S] ntfy:ftlist FtList, ///[C2S] ntfy:ftrenamefile FtRenameFile, ///[C2S] ntfy:ftstop FtStop, ///[C2S] ntfy:gm GlobalMessage, ///[C2S] ntfy:hostinfo HostInfoRequest, ///[S2C] ntfy:initivexpand InitIvExpand, ///[S2C] ntfy:initivexpand2 InitIvExpand2, ///[S2C] ntfy:initserver InitServer, ///[C2S] ntfy:instanceedit InstanceEdit, ///[C2S] ntfy:instanceinfo InstanceInfo, ///[C2S] ntfy:logadd LogAdd, ///[C2S] ntfy:login Login, ///[C2S] ntfy:logout Logout, ///[C2S] ntfy:logview LogView, ///[S2C] ntfy:notifymessage OfflineMessage, ///[C2S] ntfy:messageadd OfflineMessageAdd, ///[C2S] ntfy:messagedel OfflineMessageDel, ///[C2S] ntfy:messageget OfflineMessageGet, ///[S2C] ntfy:notifymessagelist OfflineMessageList, ///[C2S] ntfy:messagelist OfflineMessageListRequest, ///[C2S] ntfy:messageupdateflag OfflineMessageUpdateFlag, ///[S2C] ntfy:notifypermfind PermFind, ///[C2S] ntfy:permfind PermFindRequest, ///[C2S] ntfy:permidgetbyname PermIdByNameRequest, ///[S2C] ntfy:notifypermissionlist PermList, ///[C2S] ntfy:permissionlist PermListRequest, ///[S2C] ntfy:notifypermoverview PermOverview, ///[C2S] ntfy:permoverview PermOverviewRequest, ///[C2S] ntfy:permget PermRequest, ///[C2S] ntfy:permreset PermReset, ///[S2C] ntfy:notifyplugincmd PluginCommand, ///[C2S] ntfy:plugincmd PluginCommandRequest, ///[C2S] ntfy:privilegekeyadd PrivilegeKeyAddRequest, ///[C2S] ntfy:privilegekeydelete PrivilegeKeyDelete, ///[C2S] ntfy:privilegekeylist PrivilegeKeyListRequest, ///[C2S] ntfy:privilegekeyuse PrivilegeKeyUse, ///[C2S] ntfy:quit Quit, ///[C2S] ntfy:sendtextmessage SendTextMessage, ///[S2C] ntfy:notifyserverconnectioninfo ServerConnectionInfo, ///[C2S] ntfy:serverrequestconnectioninfo ServerConnectionInfoRequest, ///[C2S] ntfy:servercreate ServerCreate, ///[C2S] ntfy:serverdelete ServerDelete, ///[C2S] ntfy:serveredit ServerEdit, ///[S2C] ntfy:notifyserveredited ServerEdited, ///[C2S] ntfy:servergroupadd ServerGroupAdd, ///[C2S] ntfy:servergroupaddclient ServerGroupAddClient, ///[C2S] ntfy:servergroupaddperm ServerGroupAddPerm, ///[C2S] ntfy:servergroupautoaddperm ServerGroupAutoAddPerm, ///[C2S] ntfy:servergroupautodelperm ServerGroupAutoDelPerm, ///[S2C] ntfy:notifyservergroupclientlist ServerGroupClientList, ///[C2S] ntfy:servergroupclientlist ServerGroupClientListRequest, ///[C2S] ntfy:servergroupcopy ServerGroupCopy, ///[C2S] ntfy:servergroupdel ServerGroupDel, ///[C2S] ntfy:servergroupdelclient ServerGroupDelClient, ///[C2S] ntfy:servergroupdelperm ServerGroupDelPerm, ///[S2C] ntfy:notifyservergrouplist ServerGroupList, ///[C2S] ntfy:servergrouplist ServerGroupListRequest, ///[S2C] ntfy:notifyservergrouppermlist ServerGroupPermList, ///[C2S] ntfy:servergrouppermlist ServerGroupPermListRequest, ///[C2S] ntfy:servergrouprename ServerGroupRename, ///[S2C] ntfy:notifyservergroupsbyclientid ServerGroupsByClientId, ///[C2S] ntfy:servergroupsbyclientid ServerGroupsByClientIdRequest, ///[C2S] ntfy:serveridgetbyport ServerIdGetByPort, ///[C2S] ntfy:serverinfo ServerInfo, ///[C2S] ntfy:serverlist ServerListRequest, ///[S2C] ntfy:notifyserverlog ServerLog, ///[C2S] ntfy:servernotifyregister ServerNotifyRegister, ///[C2S] ntfy:servernotifyunregister ServerNotifyUnregister, ///[C2S] ntfy:serverprocessstop ServerProcessStop, ///[C2S] ntfy:serversnapshotcreate ServerSnapshotCreate, ///[C2S] ntfy:serversnapshotdeploy ServerSnapshotDeploy, ///[C2S] ntfy:serverstart ServerStart, ///[C2S] ntfy:serverstop ServerStop, ///[C2S] ntfy:servertemppasswordadd ServerTempPasswordAdd, ///[C2S] ntfy:servertemppassworddel ServerTempPasswordDel, ///[S2C] ntfy:notifyservertemppasswordlist ServerTempPasswordList, ///[C2S] ntfy:servertemppasswordlist ServerTempPasswordListRequest, ///[S2C] ntfy:notifyserverupdated ServerUpdated, ///[C2S] ntfy:servergetvariables ServerVariablesRequest, ///[C2S] ntfy:setclientchannelgroup SetClientChannelGroup, ///[S2C] ntfy:notifytextmessage TextMessage, ///[S2C] ntfy:notifytokenadd TokenAdd, ///[C2S] ntfy:tokenadd TokenAddRequest, ///[C2S] ntfy:tokendelete TokenDelete, ///[S2C] ntfy:notifytokenlist TokenList, ///[C2S] ntfy:tokenlist TokenListRequest, ///[C2S] ntfy:tokenuse TokenUse, ///[S2C] ntfy:notifytokenused TokenUsed, ///[C2S] ntfy:use Use, ///[C2S] ntfy:version VersionRequest, ///[C2S] ntfy:whoami WhoAmIRequest, } public static class MessageHelper { public static NotificationType GetToClientNotificationType(string name) { switch(name) { case "notifybanlist": return NotificationType.BanList; case "notifychannelchanged": return NotificationType.ChannelChanged; case "notifychannelclientpermlist": return NotificationType.ChannelClientPermList; case "notifychannelcreated": return NotificationType.ChannelCreated; case "notifychanneldeleted": return NotificationType.ChannelDeleted; case "notifychanneldescriptionchanged": return NotificationType.ChannelDescriptionChanged; case "notifychanneledited": return NotificationType.ChannelEdited; case "notifychannelgroupclientlist": return NotificationType.ChannelGroupClientList; case "notifychannelgrouplist": return NotificationType.ChannelGroupList; case "notifychannelgrouppermlist": return NotificationType.ChannelGroupPermList; case "channellist": return NotificationType.ChannelList; case "channellistfinished": return NotificationType.ChannelListFinished; case "notifychannelmoved": return NotificationType.ChannelMoved; case "notifychannelpasswordchanged": return NotificationType.ChannelPasswordChanged; case "notifychannelpermhints": return NotificationType.ChannelPermissionHints; case "notifychannelpermlist": return NotificationType.ChannelPermList; case "notifychannelsubscribed": return NotificationType.ChannelSubscribed; case "notifychannelunsubscribed": return NotificationType.ChannelUnsubscribed; case "notifyclientchannelgroupchanged": return NotificationType.ClientChannelGroupChanged; case "notifyclientchatclosed": return NotificationType.ClientChatClosed; case "notifyclientchatcomposing": return NotificationType.ClientChatComposing; case "notifyconnectioninfo": return NotificationType.ClientConnectionInfo; case "notifyconnectioninforequest": return NotificationType.ClientConnectionInfoUpdateRequest; case "notifyclientdbfind": return NotificationType.ClientDbFind; case "notifyclientdbidfromuid": return NotificationType.ClientDbIdFromUid; case "notifyclientdblist": return NotificationType.ClientDbList; case "notifycliententerview": return NotificationType.ClientEnterView; case "notifyclientids": return NotificationType.ClientIds; case "notifyclientleftview": return NotificationType.ClientLeftView; case "notifyclientmoved": return NotificationType.ClientMoved; case "notifyclientnamefromdbid": return NotificationType.ClientNameFromDbId; case "notifyclientnamefromuid": return NotificationType.ClientNameFromUid; case "notifyclientneededpermissions": return NotificationType.ClientNeededPermissions; case "notifyclientpermhints": return NotificationType.ClientPermissionHints; case "notifyclientpermlist": return NotificationType.ClientPermList; case "notifyclientpoke": return NotificationType.ClientPoke; case "notifyservergroupclientadded": return NotificationType.ClientServerGroupAdded; case "notifyservergroupclientdeleted": return NotificationType.ClientServerGroupRemoved; case "notifyclientserverqueryloginpassword": return NotificationType.ClientSetServerQueryLogin; case "notifyclientuidfromclid": return NotificationType.ClientUidFromClid; case "notifyclientupdated": return NotificationType.ClientUpdated; case "error": return NotificationType.CommandError; case "notifycomplainlist": return NotificationType.ComplainList; case "notifystartdownload": return NotificationType.FileDownload; case "notifyfileinfo": return NotificationType.FileInfo; case "notifyfilelist": return NotificationType.FileList; case "notifyfilelistfinished": return NotificationType.FileListFinished; case "notifyfiletransferlist": return NotificationType.FileTransfer; case "notifystatusfiletransfer": return NotificationType.FileTransferStatus; case "notifystartupload": return NotificationType.FileUpload; case "initivexpand": return NotificationType.InitIvExpand; case "initivexpand2": return NotificationType.InitIvExpand2; case "initserver": return NotificationType.InitServer; case "notifymessage": return NotificationType.OfflineMessage; case "notifymessagelist": return NotificationType.OfflineMessageList; case "notifypermfind": return NotificationType.PermFind; case "notifypermissionlist": return NotificationType.PermList; case "notifypermoverview": return NotificationType.PermOverview; case "notifyplugincmd": return NotificationType.PluginCommand; case "notifyserverconnectioninfo": return NotificationType.ServerConnectionInfo; case "notifyserveredited": return NotificationType.ServerEdited; case "notifyservergroupclientlist": return NotificationType.ServerGroupClientList; case "notifyservergrouplist": return NotificationType.ServerGroupList; case "notifyservergrouppermlist": return NotificationType.ServerGroupPermList; case "notifyservergroupsbyclientid": return NotificationType.ServerGroupsByClientId; case "notifyserverlog": return NotificationType.ServerLog; case "notifyservertemppasswordlist": return NotificationType.ServerTempPasswordList; case "notifyserverupdated": return NotificationType.ServerUpdated; case "notifytextmessage": return NotificationType.TextMessage; case "notifytokenadd": return NotificationType.TokenAdd; case "notifytokenlist": return NotificationType.TokenList; case "notifytokenused": return NotificationType.TokenUsed; default: return NotificationType.Unknown; } } public static NotificationType GetToServerNotificationType(string name) { switch(name) { case "banadd": return NotificationType.BanAdd; case "banclient": return NotificationType.BanClient; case "bandel": return NotificationType.BanDel; case "bandelall": return NotificationType.BanDelAll; case "banlist": return NotificationType.BanListRequest; case "bindinglist": return NotificationType.BindingList; case "channeladdperm": return NotificationType.ChannelAddPerm; case "channelclientaddperm": return NotificationType.ChannelClientAddPerm; case "channelclientdelperm": return NotificationType.ChannelClientDelPerm; case "channelclientpermlist": return NotificationType.ChannelClientPermListRequest; case "channelcreate": return NotificationType.ChannelCreate; case "channeldelete": return NotificationType.ChannelDelete; case "channeldelperm": return NotificationType.ChannelDelPerm; case "channelgetdescription": return NotificationType.ChannelDescriptionRequest; case "channeledit": return NotificationType.ChannelEdit; case "channelfind": return NotificationType.ChannelFindRequest; case "channelgroupadd": return NotificationType.ChannelGroupAdd; case "channelgroupaddperm": return NotificationType.ChannelGroupAddPerm; case "channelgroupclientlist": return NotificationType.ChannelGroupClientListRequest; case "channelgroupcopy": return NotificationType.ChannelGroupCopy; case "channelgroupdel": return NotificationType.ChannelGroupDel; case "channelgroupdelperm": return NotificationType.ChannelGroupDelPerm; case "channelgrouplist": return NotificationType.ChannelGroupListRequest; case "channelgrouppermlist": return NotificationType.ChannelGroupPermListRequest; case "channelgrouprename": return NotificationType.ChannelGroupRename; case "channelinfo": return NotificationType.ChannelInfoRequest; case "channellist": return NotificationType.ChannelListRequest; case "channelmove": return NotificationType.ChannelMove; case "channelpermlist": return NotificationType.ChannelPermListRequest; case "channelsubscribe": return NotificationType.ChannelSubscribe; case "channelsubscribeall": return NotificationType.ChannelSubscribeAll; case "channelunsubscribe": return NotificationType.ChannelUnsubscribe; case "channelunsubscribeall": return NotificationType.ChannelUnsubscribeAll; case "clientaddperm": return NotificationType.ClientAddPerm; case "clientchatclosed": return NotificationType.ClientChatClose; case "getconnectioninfo": return NotificationType.ClientConnectionInfoRequest; case "clientdbdelete": return NotificationType.ClientDbDelete; case "clientdbedit": return NotificationType.ClientDbEdit; case "clientdbfind": return NotificationType.ClientDbFindRequest; case "clientgetdbidfromuid": return NotificationType.ClientDbIdFromUidRequest; case "clientdbinfo": return NotificationType.ClientDbInfoRequest; case "clientdblist": return NotificationType.ClientDbListRequest; case "clientdelperm": return NotificationType.ClientDelPerm; case "clientedit": return NotificationType.ClientEdit; case "clientfind": return NotificationType.ClientFindRequest; case "clientgetids": return NotificationType.ClientIdsRequest; case "clientinfo": return NotificationType.ClientInfoRequest; case "clientinit": return NotificationType.ClientInit; case "clientinitiv": return NotificationType.ClientInitIv; case "clientkick": return NotificationType.ClientKick; case "clientlist": return NotificationType.ClientListRequest; case "clientmove": return NotificationType.ClientMove; case "clientgetnamefromdbid": return NotificationType.ClientNameFromDbIdRequest; case "clientgetnamefromuid": return NotificationType.ClientNameFromUidRequest; case "clientpermlist": return NotificationType.ClientPermListRequest; case "clientpoke": return NotificationType.ClientPokeRequest; case "clientsetserverquerylogin": return NotificationType.ClientSetServerQueryLoginRequest; case "clientgetuidfromclid": return NotificationType.ClientUidFromClidRequest; case "clientupdate": return NotificationType.ClientUpdate; case "clientgetvariables": return NotificationType.ClientVariablesRequest; case "complainadd": return NotificationType.ComplainAdd; case "complaindel": return NotificationType.ComplainDel; case "complaindelall": return NotificationType.ComplainDelAll; case "complainlist": return NotificationType.ComplainListRequest; case "customdelete": return NotificationType.CustomDelete; case "custominfo": return NotificationType.CustomInfoRequest; case "customsearch": return NotificationType.CustomSearch; case "customset": return NotificationType.CustomSet; case "clientdisconnect": return NotificationType.Disconnect; case "ftcreatedir": return NotificationType.FtCreateDir; case "ftdeletefile": return NotificationType.FtDeleteFile; case "ftgetfileinfo": return NotificationType.FtFileInfoRequest; case "ftgetfilelist": return NotificationType.FtFileListRequest; case "ftinitdownload": return NotificationType.FtInitDownload; case "ftinitupload": return NotificationType.FtInitUpload; case "ftlist": return NotificationType.FtList; case "ftrenamefile": return NotificationType.FtRenameFile; case "ftstop": return NotificationType.FtStop; case "gm": return NotificationType.GlobalMessage; case "hostinfo": return NotificationType.HostInfoRequest; case "instanceedit": return NotificationType.InstanceEdit; case "instanceinfo": return NotificationType.InstanceInfo; case "logadd": return NotificationType.LogAdd; case "login": return NotificationType.Login; case "logout": return NotificationType.Logout; case "logview": return NotificationType.LogView; case "messageadd": return NotificationType.OfflineMessageAdd; case "messagedel": return NotificationType.OfflineMessageDel; case "messageget": return NotificationType.OfflineMessageGet; case "messagelist": return NotificationType.OfflineMessageListRequest; case "messageupdateflag": return NotificationType.OfflineMessageUpdateFlag; case "permfind": return NotificationType.PermFindRequest; case "permidgetbyname": return NotificationType.PermIdByNameRequest; case "permissionlist": return NotificationType.PermListRequest; case "permoverview": return NotificationType.PermOverviewRequest; case "permget": return NotificationType.PermRequest; case "permreset": return NotificationType.PermReset; case "plugincmd": return NotificationType.PluginCommandRequest; case "privilegekeyadd": return NotificationType.PrivilegeKeyAddRequest; case "privilegekeydelete": return NotificationType.PrivilegeKeyDelete; case "privilegekeylist": return NotificationType.PrivilegeKeyListRequest; case "privilegekeyuse": return NotificationType.PrivilegeKeyUse; case "quit": return NotificationType.Quit; case "sendtextmessage": return NotificationType.SendTextMessage; case "serverrequestconnectioninfo": return NotificationType.ServerConnectionInfoRequest; case "servercreate": return NotificationType.ServerCreate; case "serverdelete": return NotificationType.ServerDelete; case "serveredit": return NotificationType.ServerEdit; case "servergroupadd": return NotificationType.ServerGroupAdd; case "servergroupaddclient": return NotificationType.ServerGroupAddClient; case "servergroupaddperm": return NotificationType.ServerGroupAddPerm; case "servergroupautoaddperm": return NotificationType.ServerGroupAutoAddPerm; case "servergroupautodelperm": return NotificationType.ServerGroupAutoDelPerm; case "servergroupclientlist": return NotificationType.ServerGroupClientListRequest; case "servergroupcopy": return NotificationType.ServerGroupCopy; case "servergroupdel": return NotificationType.ServerGroupDel; case "servergroupdelclient": return NotificationType.ServerGroupDelClient; case "servergroupdelperm": return NotificationType.ServerGroupDelPerm; case "servergrouplist": return NotificationType.ServerGroupListRequest; case "servergrouppermlist": return NotificationType.ServerGroupPermListRequest; case "servergrouprename": return NotificationType.ServerGroupRename; case "servergroupsbyclientid": return NotificationType.ServerGroupsByClientIdRequest; case "serveridgetbyport": return NotificationType.ServerIdGetByPort; case "serverinfo": return NotificationType.ServerInfo; case "serverlist": return NotificationType.ServerListRequest; case "servernotifyregister": return NotificationType.ServerNotifyRegister; case "servernotifyunregister": return NotificationType.ServerNotifyUnregister; case "serverprocessstop": return NotificationType.ServerProcessStop; case "serversnapshotcreate": return NotificationType.ServerSnapshotCreate; case "serversnapshotdeploy": return NotificationType.ServerSnapshotDeploy; case "serverstart": return NotificationType.ServerStart; case "serverstop": return NotificationType.ServerStop; case "servertemppasswordadd": return NotificationType.ServerTempPasswordAdd; case "servertemppassworddel": return NotificationType.ServerTempPasswordDel; case "servertemppasswordlist": return NotificationType.ServerTempPasswordListRequest; case "servergetvariables": return NotificationType.ServerVariablesRequest; case "setclientchannelgroup": return NotificationType.SetClientChannelGroup; case "tokenadd": return NotificationType.TokenAddRequest; case "tokendelete": return NotificationType.TokenDelete; case "tokenlist": return NotificationType.TokenListRequest; case "tokenuse": return NotificationType.TokenUse; case "use": return NotificationType.Use; case "version": return NotificationType.VersionRequest; case "whoami": return NotificationType.WhoAmIRequest; default: return NotificationType.Unknown; } } public static INotification GenerateNotificationType(NotificationType name) { switch(name) { case NotificationType.BanAdd: return new BanAdd(); case NotificationType.BanClient: return new BanClient(); case NotificationType.BanDel: return new BanDel(); case NotificationType.BanDelAll: return new BanDelAll(); case NotificationType.BanList: return new BanList(); case NotificationType.BanListRequest: return new BanListRequest(); case NotificationType.BindingList: return new BindingList(); case NotificationType.ChannelAddPerm: return new ChannelAddPerm(); case NotificationType.ChannelChanged: return new ChannelChanged(); case NotificationType.ChannelClientAddPerm: return new ChannelClientAddPerm(); case NotificationType.ChannelClientDelPerm: return new ChannelClientDelPerm(); case NotificationType.ChannelClientPermList: return new ChannelClientPermList(); case NotificationType.ChannelClientPermListRequest: return new ChannelClientPermListRequest(); case NotificationType.ChannelCreate: return new ChannelCreate(); case NotificationType.ChannelCreated: return new ChannelCreated(); case NotificationType.ChannelDelete: return new ChannelDelete(); case NotificationType.ChannelDeleted: return new ChannelDeleted(); case NotificationType.ChannelDelPerm: return new ChannelDelPerm(); case NotificationType.ChannelDescriptionChanged: return new ChannelDescriptionChanged(); case NotificationType.ChannelDescriptionRequest: return new ChannelDescriptionRequest(); case NotificationType.ChannelEdit: return new ChannelEdit(); case NotificationType.ChannelEdited: return new ChannelEdited(); case NotificationType.ChannelFindRequest: return new ChannelFindRequest(); case NotificationType.ChannelGroupAdd: return new ChannelGroupAdd(); case NotificationType.ChannelGroupAddPerm: return new ChannelGroupAddPerm(); case NotificationType.ChannelGroupClientList: return new ChannelGroupClientList(); case NotificationType.ChannelGroupClientListRequest: return new ChannelGroupClientListRequest(); case NotificationType.ChannelGroupCopy: return new ChannelGroupCopy(); case NotificationType.ChannelGroupDel: return new ChannelGroupDel(); case NotificationType.ChannelGroupDelPerm: return new ChannelGroupDelPerm(); case NotificationType.ChannelGroupList: return new ChannelGroupList(); case NotificationType.ChannelGroupListRequest: return new ChannelGroupListRequest(); case NotificationType.ChannelGroupPermList: return new ChannelGroupPermList(); case NotificationType.ChannelGroupPermListRequest: return new ChannelGroupPermListRequest(); case NotificationType.ChannelGroupRename: return new ChannelGroupRename(); case NotificationType.ChannelInfoRequest: return new ChannelInfoRequest(); case NotificationType.ChannelList: return new ChannelList(); case NotificationType.ChannelListFinished: return new ChannelListFinished(); case NotificationType.ChannelListRequest: return new ChannelListRequest(); case NotificationType.ChannelMove: return new ChannelMove(); case NotificationType.ChannelMoved: return new ChannelMoved(); case NotificationType.ChannelPasswordChanged: return new ChannelPasswordChanged(); case NotificationType.ChannelPermissionHints: return new ChannelPermissionHints(); case NotificationType.ChannelPermList: return new ChannelPermList(); case NotificationType.ChannelPermListRequest: return new ChannelPermListRequest(); case NotificationType.ChannelSubscribe: return new ChannelSubscribe(); case NotificationType.ChannelSubscribeAll: return new ChannelSubscribeAll(); case NotificationType.ChannelSubscribed: return new ChannelSubscribed(); case NotificationType.ChannelUnsubscribe: return new ChannelUnsubscribe(); case NotificationType.ChannelUnsubscribeAll: return new ChannelUnsubscribeAll(); case NotificationType.ChannelUnsubscribed: return new ChannelUnsubscribed(); case NotificationType.ClientAddPerm: return new ClientAddPerm(); case NotificationType.ClientChannelGroupChanged: return new ClientChannelGroupChanged(); case NotificationType.ClientChatClose: return new ClientChatClose(); case NotificationType.ClientChatClosed: return new ClientChatClosed(); case NotificationType.ClientChatComposing: return new ClientChatComposing(); case NotificationType.ClientConnectionInfo: return new ClientConnectionInfo(); case NotificationType.ClientConnectionInfoRequest: return new ClientConnectionInfoRequest(); case NotificationType.ClientConnectionInfoUpdateRequest: return new ClientConnectionInfoUpdateRequest(); case NotificationType.ClientDbDelete: return new ClientDbDelete(); case NotificationType.ClientDbEdit: return new ClientDbEdit(); case NotificationType.ClientDbFind: return new ClientDbFind(); case NotificationType.ClientDbFindRequest: return new ClientDbFindRequest(); case NotificationType.ClientDbIdFromUid: return new ClientDbIdFromUid(); case NotificationType.ClientDbIdFromUidRequest: return new ClientDbIdFromUidRequest(); case NotificationType.ClientDbInfoRequest: return new ClientDbInfoRequest(); case NotificationType.ClientDbList: return new ClientDbList(); case NotificationType.ClientDbListRequest: return new ClientDbListRequest(); case NotificationType.ClientDelPerm: return new ClientDelPerm(); case NotificationType.ClientEdit: return new ClientEdit(); case NotificationType.ClientEnterView: return new ClientEnterView(); case NotificationType.ClientFindRequest: return new ClientFindRequest(); case NotificationType.ClientIds: return new ClientIds(); case NotificationType.ClientIdsRequest: return new ClientIdsRequest(); case NotificationType.ClientInfoRequest: return new ClientInfoRequest(); case NotificationType.ClientInit: return new ClientInit(); case NotificationType.ClientInitIv: return new ClientInitIv(); case NotificationType.ClientKick: return new ClientKick(); case NotificationType.ClientLeftView: return new ClientLeftView(); case NotificationType.ClientListRequest: return new ClientListRequest(); case NotificationType.ClientMove: return new ClientMove(); case NotificationType.ClientMoved: return new ClientMoved(); case NotificationType.ClientNameFromDbId: return new ClientNameFromDbId(); case NotificationType.ClientNameFromDbIdRequest: return new ClientNameFromDbIdRequest(); case NotificationType.ClientNameFromUid: return new ClientNameFromUid(); case NotificationType.ClientNameFromUidRequest: return new ClientNameFromUidRequest(); case NotificationType.ClientNeededPermissions: return new ClientNeededPermissions(); case NotificationType.ClientPermissionHints: return new ClientPermissionHints(); case NotificationType.ClientPermList: return new ClientPermList(); case NotificationType.ClientPermListRequest: return new ClientPermListRequest(); case NotificationType.ClientPoke: return new ClientPoke(); case NotificationType.ClientPokeRequest: return new ClientPokeRequest(); case NotificationType.ClientServerGroupAdded: return new ClientServerGroupAdded(); case NotificationType.ClientServerGroupRemoved: return new ClientServerGroupRemoved(); case NotificationType.ClientSetServerQueryLogin: return new ClientSetServerQueryLogin(); case NotificationType.ClientSetServerQueryLoginRequest: return new ClientSetServerQueryLoginRequest(); case NotificationType.ClientUidFromClid: return new ClientUidFromClid(); case NotificationType.ClientUidFromClidRequest: return new ClientUidFromClidRequest(); case NotificationType.ClientUpdate: return new ClientUpdate(); case NotificationType.ClientUpdated: return new ClientUpdated(); case NotificationType.ClientVariablesRequest: return new ClientVariablesRequest(); case NotificationType.CommandError: return new CommandError(); case NotificationType.ComplainAdd: return new ComplainAdd(); case NotificationType.ComplainDel: return new ComplainDel(); case NotificationType.ComplainDelAll: return new ComplainDelAll(); case NotificationType.ComplainList: return new ComplainList(); case NotificationType.ComplainListRequest: return new ComplainListRequest(); case NotificationType.CustomDelete: return new CustomDelete(); case NotificationType.CustomInfoRequest: return new CustomInfoRequest(); case NotificationType.CustomSearch: return new CustomSearch(); case NotificationType.CustomSet: return new CustomSet(); case NotificationType.Disconnect: return new Disconnect(); case NotificationType.FileDownload: return new FileDownload(); case NotificationType.FileInfo: return new FileInfo(); case NotificationType.FileList: return new FileList(); case NotificationType.FileListFinished: return new FileListFinished(); case NotificationType.FileTransfer: return new FileTransfer(); case NotificationType.FileTransferStatus: return new FileTransferStatus(); case NotificationType.FileUpload: return new FileUpload(); case NotificationType.FtCreateDir: return new FtCreateDir(); case NotificationType.FtDeleteFile: return new FtDeleteFile(); case NotificationType.FtFileInfoRequest: return new FtFileInfoRequest(); case NotificationType.FtFileListRequest: return new FtFileListRequest(); case NotificationType.FtInitDownload: return new FtInitDownload(); case NotificationType.FtInitUpload: return new FtInitUpload(); case NotificationType.FtList: return new FtList(); case NotificationType.FtRenameFile: return new FtRenameFile(); case NotificationType.FtStop: return new FtStop(); case NotificationType.GlobalMessage: return new GlobalMessage(); case NotificationType.HostInfoRequest: return new HostInfoRequest(); case NotificationType.InitIvExpand: return new InitIvExpand(); case NotificationType.InitIvExpand2: return new InitIvExpand2(); case NotificationType.InitServer: return new InitServer(); case NotificationType.InstanceEdit: return new InstanceEdit(); case NotificationType.InstanceInfo: return new InstanceInfo(); case NotificationType.LogAdd: return new LogAdd(); case NotificationType.Login: return new Login(); case NotificationType.Logout: return new Logout(); case NotificationType.LogView: return new LogView(); case NotificationType.OfflineMessage: return new OfflineMessage(); case NotificationType.OfflineMessageAdd: return new OfflineMessageAdd(); case NotificationType.OfflineMessageDel: return new OfflineMessageDel(); case NotificationType.OfflineMessageGet: return new OfflineMessageGet(); case NotificationType.OfflineMessageList: return new OfflineMessageList(); case NotificationType.OfflineMessageListRequest: return new OfflineMessageListRequest(); case NotificationType.OfflineMessageUpdateFlag: return new OfflineMessageUpdateFlag(); case NotificationType.PermFind: return new PermFind(); case NotificationType.PermFindRequest: return new PermFindRequest(); case NotificationType.PermIdByNameRequest: return new PermIdByNameRequest(); case NotificationType.PermList: return new PermList(); case NotificationType.PermListRequest: return new PermListRequest(); case NotificationType.PermOverview: return new PermOverview(); case NotificationType.PermOverviewRequest: return new PermOverviewRequest(); case NotificationType.PermRequest: return new PermRequest(); case NotificationType.PermReset: return new PermReset(); case NotificationType.PluginCommand: return new PluginCommand(); case NotificationType.PluginCommandRequest: return new PluginCommandRequest(); case NotificationType.PrivilegeKeyAddRequest: return new PrivilegeKeyAddRequest(); case NotificationType.PrivilegeKeyDelete: return new PrivilegeKeyDelete(); case NotificationType.PrivilegeKeyListRequest: return new PrivilegeKeyListRequest(); case NotificationType.PrivilegeKeyUse: return new PrivilegeKeyUse(); case NotificationType.Quit: return new Quit(); case NotificationType.SendTextMessage: return new SendTextMessage(); case NotificationType.ServerConnectionInfo: return new ServerConnectionInfo(); case NotificationType.ServerConnectionInfoRequest: return new ServerConnectionInfoRequest(); case NotificationType.ServerCreate: return new ServerCreate(); case NotificationType.ServerDelete: return new ServerDelete(); case NotificationType.ServerEdit: return new ServerEdit(); case NotificationType.ServerEdited: return new ServerEdited(); case NotificationType.ServerGroupAdd: return new ServerGroupAdd(); case NotificationType.ServerGroupAddClient: return new ServerGroupAddClient(); case NotificationType.ServerGroupAddPerm: return new ServerGroupAddPerm(); case NotificationType.ServerGroupAutoAddPerm: return new ServerGroupAutoAddPerm(); case NotificationType.ServerGroupAutoDelPerm: return new ServerGroupAutoDelPerm(); case NotificationType.ServerGroupClientList: return new ServerGroupClientList(); case NotificationType.ServerGroupClientListRequest: return new ServerGroupClientListRequest(); case NotificationType.ServerGroupCopy: return new ServerGroupCopy(); case NotificationType.ServerGroupDel: return new ServerGroupDel(); case NotificationType.ServerGroupDelClient: return new ServerGroupDelClient(); case NotificationType.ServerGroupDelPerm: return new ServerGroupDelPerm(); case NotificationType.ServerGroupList: return new ServerGroupList(); case NotificationType.ServerGroupListRequest: return new ServerGroupListRequest(); case NotificationType.ServerGroupPermList: return new ServerGroupPermList(); case NotificationType.ServerGroupPermListRequest: return new ServerGroupPermListRequest(); case NotificationType.ServerGroupRename: return new ServerGroupRename(); case NotificationType.ServerGroupsByClientId: return new ServerGroupsByClientId(); case NotificationType.ServerGroupsByClientIdRequest: return new ServerGroupsByClientIdRequest(); case NotificationType.ServerIdGetByPort: return new ServerIdGetByPort(); case NotificationType.ServerInfo: return new ServerInfo(); case NotificationType.ServerListRequest: return new ServerListRequest(); case NotificationType.ServerLog: return new ServerLog(); case NotificationType.ServerNotifyRegister: return new ServerNotifyRegister(); case NotificationType.ServerNotifyUnregister: return new ServerNotifyUnregister(); case NotificationType.ServerProcessStop: return new ServerProcessStop(); case NotificationType.ServerSnapshotCreate: return new ServerSnapshotCreate(); case NotificationType.ServerSnapshotDeploy: return new ServerSnapshotDeploy(); case NotificationType.ServerStart: return new ServerStart(); case NotificationType.ServerStop: return new ServerStop(); case NotificationType.ServerTempPasswordAdd: return new ServerTempPasswordAdd(); case NotificationType.ServerTempPasswordDel: return new ServerTempPasswordDel(); case NotificationType.ServerTempPasswordList: return new ServerTempPasswordList(); case NotificationType.ServerTempPasswordListRequest: return new ServerTempPasswordListRequest(); case NotificationType.ServerUpdated: return new ServerUpdated(); case NotificationType.ServerVariablesRequest: return new ServerVariablesRequest(); case NotificationType.SetClientChannelGroup: return new SetClientChannelGroup(); case NotificationType.TextMessage: return new TextMessage(); case NotificationType.TokenAdd: return new TokenAdd(); case NotificationType.TokenAddRequest: return new TokenAddRequest(); case NotificationType.TokenDelete: return new TokenDelete(); case NotificationType.TokenList: return new TokenList(); case NotificationType.TokenListRequest: return new TokenListRequest(); case NotificationType.TokenUse: return new TokenUse(); case NotificationType.TokenUsed: return new TokenUsed(); case NotificationType.Use: return new Use(); case NotificationType.VersionRequest: return new VersionRequest(); case NotificationType.WhoAmIRequest: return new WhoAmIRequest(); case NotificationType.Unknown: default: throw Tools.UnhandledDefault(name); } } public static INotification[] InstatiateNotificationArray(NotificationType name, int len) { switch(name) { case NotificationType.BanAdd: { var arr = new BanAdd[len]; for (int i = 0; i < len; i++) arr[i] = new BanAdd(); return arr; } case NotificationType.BanClient: { var arr = new BanClient[len]; for (int i = 0; i < len; i++) arr[i] = new BanClient(); return arr; } case NotificationType.BanDel: { var arr = new BanDel[len]; for (int i = 0; i < len; i++) arr[i] = new BanDel(); return arr; } case NotificationType.BanDelAll: { var arr = new BanDelAll[len]; for (int i = 0; i < len; i++) arr[i] = new BanDelAll(); return arr; } case NotificationType.BanList: { var arr = new BanList[len]; for (int i = 0; i < len; i++) arr[i] = new BanList(); return arr; } case NotificationType.BanListRequest: { var arr = new BanListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new BanListRequest(); return arr; } case NotificationType.BindingList: { var arr = new BindingList[len]; for (int i = 0; i < len; i++) arr[i] = new BindingList(); return arr; } case NotificationType.ChannelAddPerm: { var arr = new ChannelAddPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelAddPerm(); return arr; } case NotificationType.ChannelChanged: { var arr = new ChannelChanged[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelChanged(); return arr; } case NotificationType.ChannelClientAddPerm: { var arr = new ChannelClientAddPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelClientAddPerm(); return arr; } case NotificationType.ChannelClientDelPerm: { var arr = new ChannelClientDelPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelClientDelPerm(); return arr; } case NotificationType.ChannelClientPermList: { var arr = new ChannelClientPermList[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelClientPermList(); return arr; } case NotificationType.ChannelClientPermListRequest: { var arr = new ChannelClientPermListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelClientPermListRequest(); return arr; } case NotificationType.ChannelCreate: { var arr = new ChannelCreate[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelCreate(); return arr; } case NotificationType.ChannelCreated: { var arr = new ChannelCreated[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelCreated(); return arr; } case NotificationType.ChannelDelete: { var arr = new ChannelDelete[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelDelete(); return arr; } case NotificationType.ChannelDeleted: { var arr = new ChannelDeleted[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelDeleted(); return arr; } case NotificationType.ChannelDelPerm: { var arr = new ChannelDelPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelDelPerm(); return arr; } case NotificationType.ChannelDescriptionChanged: { var arr = new ChannelDescriptionChanged[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelDescriptionChanged(); return arr; } case NotificationType.ChannelDescriptionRequest: { var arr = new ChannelDescriptionRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelDescriptionRequest(); return arr; } case NotificationType.ChannelEdit: { var arr = new ChannelEdit[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelEdit(); return arr; } case NotificationType.ChannelEdited: { var arr = new ChannelEdited[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelEdited(); return arr; } case NotificationType.ChannelFindRequest: { var arr = new ChannelFindRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelFindRequest(); return arr; } case NotificationType.ChannelGroupAdd: { var arr = new ChannelGroupAdd[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupAdd(); return arr; } case NotificationType.ChannelGroupAddPerm: { var arr = new ChannelGroupAddPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupAddPerm(); return arr; } case NotificationType.ChannelGroupClientList: { var arr = new ChannelGroupClientList[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupClientList(); return arr; } case NotificationType.ChannelGroupClientListRequest: { var arr = new ChannelGroupClientListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupClientListRequest(); return arr; } case NotificationType.ChannelGroupCopy: { var arr = new ChannelGroupCopy[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupCopy(); return arr; } case NotificationType.ChannelGroupDel: { var arr = new ChannelGroupDel[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupDel(); return arr; } case NotificationType.ChannelGroupDelPerm: { var arr = new ChannelGroupDelPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupDelPerm(); return arr; } case NotificationType.ChannelGroupList: { var arr = new ChannelGroupList[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupList(); return arr; } case NotificationType.ChannelGroupListRequest: { var arr = new ChannelGroupListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupListRequest(); return arr; } case NotificationType.ChannelGroupPermList: { var arr = new ChannelGroupPermList[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupPermList(); return arr; } case NotificationType.ChannelGroupPermListRequest: { var arr = new ChannelGroupPermListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupPermListRequest(); return arr; } case NotificationType.ChannelGroupRename: { var arr = new ChannelGroupRename[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupRename(); return arr; } case NotificationType.ChannelInfoRequest: { var arr = new ChannelInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelInfoRequest(); return arr; } case NotificationType.ChannelList: { var arr = new ChannelList[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelList(); return arr; } case NotificationType.ChannelListFinished: { var arr = new ChannelListFinished[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelListFinished(); return arr; } case NotificationType.ChannelListRequest: { var arr = new ChannelListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelListRequest(); return arr; } case NotificationType.ChannelMove: { var arr = new ChannelMove[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelMove(); return arr; } case NotificationType.ChannelMoved: { var arr = new ChannelMoved[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelMoved(); return arr; } case NotificationType.ChannelPasswordChanged: { var arr = new ChannelPasswordChanged[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelPasswordChanged(); return arr; } case NotificationType.ChannelPermissionHints: { var arr = new ChannelPermissionHints[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelPermissionHints(); return arr; } case NotificationType.ChannelPermList: { var arr = new ChannelPermList[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelPermList(); return arr; } case NotificationType.ChannelPermListRequest: { var arr = new ChannelPermListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelPermListRequest(); return arr; } case NotificationType.ChannelSubscribe: { var arr = new ChannelSubscribe[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelSubscribe(); return arr; } case NotificationType.ChannelSubscribeAll: { var arr = new ChannelSubscribeAll[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelSubscribeAll(); return arr; } case NotificationType.ChannelSubscribed: { var arr = new ChannelSubscribed[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelSubscribed(); return arr; } case NotificationType.ChannelUnsubscribe: { var arr = new ChannelUnsubscribe[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelUnsubscribe(); return arr; } case NotificationType.ChannelUnsubscribeAll: { var arr = new ChannelUnsubscribeAll[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelUnsubscribeAll(); return arr; } case NotificationType.ChannelUnsubscribed: { var arr = new ChannelUnsubscribed[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelUnsubscribed(); return arr; } case NotificationType.ClientAddPerm: { var arr = new ClientAddPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ClientAddPerm(); return arr; } case NotificationType.ClientChannelGroupChanged: { var arr = new ClientChannelGroupChanged[len]; for (int i = 0; i < len; i++) arr[i] = new ClientChannelGroupChanged(); return arr; } case NotificationType.ClientChatClose: { var arr = new ClientChatClose[len]; for (int i = 0; i < len; i++) arr[i] = new ClientChatClose(); return arr; } case NotificationType.ClientChatClosed: { var arr = new ClientChatClosed[len]; for (int i = 0; i < len; i++) arr[i] = new ClientChatClosed(); return arr; } case NotificationType.ClientChatComposing: { var arr = new ClientChatComposing[len]; for (int i = 0; i < len; i++) arr[i] = new ClientChatComposing(); return arr; } case NotificationType.ClientConnectionInfo: { var arr = new ClientConnectionInfo[len]; for (int i = 0; i < len; i++) arr[i] = new ClientConnectionInfo(); return arr; } case NotificationType.ClientConnectionInfoRequest: { var arr = new ClientConnectionInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientConnectionInfoRequest(); return arr; } case NotificationType.ClientConnectionInfoUpdateRequest: { var arr = new ClientConnectionInfoUpdateRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientConnectionInfoUpdateRequest(); return arr; } case NotificationType.ClientDbDelete: { var arr = new ClientDbDelete[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbDelete(); return arr; } case NotificationType.ClientDbEdit: { var arr = new ClientDbEdit[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbEdit(); return arr; } case NotificationType.ClientDbFind: { var arr = new ClientDbFind[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbFind(); return arr; } case NotificationType.ClientDbFindRequest: { var arr = new ClientDbFindRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbFindRequest(); return arr; } case NotificationType.ClientDbIdFromUid: { var arr = new ClientDbIdFromUid[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbIdFromUid(); return arr; } case NotificationType.ClientDbIdFromUidRequest: { var arr = new ClientDbIdFromUidRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbIdFromUidRequest(); return arr; } case NotificationType.ClientDbInfoRequest: { var arr = new ClientDbInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbInfoRequest(); return arr; } case NotificationType.ClientDbList: { var arr = new ClientDbList[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbList(); return arr; } case NotificationType.ClientDbListRequest: { var arr = new ClientDbListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbListRequest(); return arr; } case NotificationType.ClientDelPerm: { var arr = new ClientDelPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDelPerm(); return arr; } case NotificationType.ClientEdit: { var arr = new ClientEdit[len]; for (int i = 0; i < len; i++) arr[i] = new ClientEdit(); return arr; } case NotificationType.ClientEnterView: { var arr = new ClientEnterView[len]; for (int i = 0; i < len; i++) arr[i] = new ClientEnterView(); return arr; } case NotificationType.ClientFindRequest: { var arr = new ClientFindRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientFindRequest(); return arr; } case NotificationType.ClientIds: { var arr = new ClientIds[len]; for (int i = 0; i < len; i++) arr[i] = new ClientIds(); return arr; } case NotificationType.ClientIdsRequest: { var arr = new ClientIdsRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientIdsRequest(); return arr; } case NotificationType.ClientInfoRequest: { var arr = new ClientInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientInfoRequest(); return arr; } case NotificationType.ClientInit: { var arr = new ClientInit[len]; for (int i = 0; i < len; i++) arr[i] = new ClientInit(); return arr; } case NotificationType.ClientInitIv: { var arr = new ClientInitIv[len]; for (int i = 0; i < len; i++) arr[i] = new ClientInitIv(); return arr; } case NotificationType.ClientKick: { var arr = new ClientKick[len]; for (int i = 0; i < len; i++) arr[i] = new ClientKick(); return arr; } case NotificationType.ClientLeftView: { var arr = new ClientLeftView[len]; for (int i = 0; i < len; i++) arr[i] = new ClientLeftView(); return arr; } case NotificationType.ClientListRequest: { var arr = new ClientListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientListRequest(); return arr; } case NotificationType.ClientMove: { var arr = new ClientMove[len]; for (int i = 0; i < len; i++) arr[i] = new ClientMove(); return arr; } case NotificationType.ClientMoved: { var arr = new ClientMoved[len]; for (int i = 0; i < len; i++) arr[i] = new ClientMoved(); return arr; } case NotificationType.ClientNameFromDbId: { var arr = new ClientNameFromDbId[len]; for (int i = 0; i < len; i++) arr[i] = new ClientNameFromDbId(); return arr; } case NotificationType.ClientNameFromDbIdRequest: { var arr = new ClientNameFromDbIdRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientNameFromDbIdRequest(); return arr; } case NotificationType.ClientNameFromUid: { var arr = new ClientNameFromUid[len]; for (int i = 0; i < len; i++) arr[i] = new ClientNameFromUid(); return arr; } case NotificationType.ClientNameFromUidRequest: { var arr = new ClientNameFromUidRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientNameFromUidRequest(); return arr; } case NotificationType.ClientNeededPermissions: { var arr = new ClientNeededPermissions[len]; for (int i = 0; i < len; i++) arr[i] = new ClientNeededPermissions(); return arr; } case NotificationType.ClientPermissionHints: { var arr = new ClientPermissionHints[len]; for (int i = 0; i < len; i++) arr[i] = new ClientPermissionHints(); return arr; } case NotificationType.ClientPermList: { var arr = new ClientPermList[len]; for (int i = 0; i < len; i++) arr[i] = new ClientPermList(); return arr; } case NotificationType.ClientPermListRequest: { var arr = new ClientPermListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientPermListRequest(); return arr; } case NotificationType.ClientPoke: { var arr = new ClientPoke[len]; for (int i = 0; i < len; i++) arr[i] = new ClientPoke(); return arr; } case NotificationType.ClientPokeRequest: { var arr = new ClientPokeRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientPokeRequest(); return arr; } case NotificationType.ClientServerGroupAdded: { var arr = new ClientServerGroupAdded[len]; for (int i = 0; i < len; i++) arr[i] = new ClientServerGroupAdded(); return arr; } case NotificationType.ClientServerGroupRemoved: { var arr = new ClientServerGroupRemoved[len]; for (int i = 0; i < len; i++) arr[i] = new ClientServerGroupRemoved(); return arr; } case NotificationType.ClientSetServerQueryLogin: { var arr = new ClientSetServerQueryLogin[len]; for (int i = 0; i < len; i++) arr[i] = new ClientSetServerQueryLogin(); return arr; } case NotificationType.ClientSetServerQueryLoginRequest: { var arr = new ClientSetServerQueryLoginRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientSetServerQueryLoginRequest(); return arr; } case NotificationType.ClientUidFromClid: { var arr = new ClientUidFromClid[len]; for (int i = 0; i < len; i++) arr[i] = new ClientUidFromClid(); return arr; } case NotificationType.ClientUidFromClidRequest: { var arr = new ClientUidFromClidRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientUidFromClidRequest(); return arr; } case NotificationType.ClientUpdate: { var arr = new ClientUpdate[len]; for (int i = 0; i < len; i++) arr[i] = new ClientUpdate(); return arr; } case NotificationType.ClientUpdated: { var arr = new ClientUpdated[len]; for (int i = 0; i < len; i++) arr[i] = new ClientUpdated(); return arr; } case NotificationType.ClientVariablesRequest: { var arr = new ClientVariablesRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientVariablesRequest(); return arr; } case NotificationType.CommandError: { var arr = new CommandError[len]; for (int i = 0; i < len; i++) arr[i] = new CommandError(); return arr; } case NotificationType.ComplainAdd: { var arr = new ComplainAdd[len]; for (int i = 0; i < len; i++) arr[i] = new ComplainAdd(); return arr; } case NotificationType.ComplainDel: { var arr = new ComplainDel[len]; for (int i = 0; i < len; i++) arr[i] = new ComplainDel(); return arr; } case NotificationType.ComplainDelAll: { var arr = new ComplainDelAll[len]; for (int i = 0; i < len; i++) arr[i] = new ComplainDelAll(); return arr; } case NotificationType.ComplainList: { var arr = new ComplainList[len]; for (int i = 0; i < len; i++) arr[i] = new ComplainList(); return arr; } case NotificationType.ComplainListRequest: { var arr = new ComplainListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ComplainListRequest(); return arr; } case NotificationType.CustomDelete: { var arr = new CustomDelete[len]; for (int i = 0; i < len; i++) arr[i] = new CustomDelete(); return arr; } case NotificationType.CustomInfoRequest: { var arr = new CustomInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new CustomInfoRequest(); return arr; } case NotificationType.CustomSearch: { var arr = new CustomSearch[len]; for (int i = 0; i < len; i++) arr[i] = new CustomSearch(); return arr; } case NotificationType.CustomSet: { var arr = new CustomSet[len]; for (int i = 0; i < len; i++) arr[i] = new CustomSet(); return arr; } case NotificationType.Disconnect: { var arr = new Disconnect[len]; for (int i = 0; i < len; i++) arr[i] = new Disconnect(); return arr; } case NotificationType.FileDownload: { var arr = new FileDownload[len]; for (int i = 0; i < len; i++) arr[i] = new FileDownload(); return arr; } case NotificationType.FileInfo: { var arr = new FileInfo[len]; for (int i = 0; i < len; i++) arr[i] = new FileInfo(); return arr; } case NotificationType.FileList: { var arr = new FileList[len]; for (int i = 0; i < len; i++) arr[i] = new FileList(); return arr; } case NotificationType.FileListFinished: { var arr = new FileListFinished[len]; for (int i = 0; i < len; i++) arr[i] = new FileListFinished(); return arr; } case NotificationType.FileTransfer: { var arr = new FileTransfer[len]; for (int i = 0; i < len; i++) arr[i] = new FileTransfer(); return arr; } case NotificationType.FileTransferStatus: { var arr = new FileTransferStatus[len]; for (int i = 0; i < len; i++) arr[i] = new FileTransferStatus(); return arr; } case NotificationType.FileUpload: { var arr = new FileUpload[len]; for (int i = 0; i < len; i++) arr[i] = new FileUpload(); return arr; } case NotificationType.FtCreateDir: { var arr = new FtCreateDir[len]; for (int i = 0; i < len; i++) arr[i] = new FtCreateDir(); return arr; } case NotificationType.FtDeleteFile: { var arr = new FtDeleteFile[len]; for (int i = 0; i < len; i++) arr[i] = new FtDeleteFile(); return arr; } case NotificationType.FtFileInfoRequest: { var arr = new FtFileInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new FtFileInfoRequest(); return arr; } case NotificationType.FtFileListRequest: { var arr = new FtFileListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new FtFileListRequest(); return arr; } case NotificationType.FtInitDownload: { var arr = new FtInitDownload[len]; for (int i = 0; i < len; i++) arr[i] = new FtInitDownload(); return arr; } case NotificationType.FtInitUpload: { var arr = new FtInitUpload[len]; for (int i = 0; i < len; i++) arr[i] = new FtInitUpload(); return arr; } case NotificationType.FtList: { var arr = new FtList[len]; for (int i = 0; i < len; i++) arr[i] = new FtList(); return arr; } case NotificationType.FtRenameFile: { var arr = new FtRenameFile[len]; for (int i = 0; i < len; i++) arr[i] = new FtRenameFile(); return arr; } case NotificationType.FtStop: { var arr = new FtStop[len]; for (int i = 0; i < len; i++) arr[i] = new FtStop(); return arr; } case NotificationType.GlobalMessage: { var arr = new GlobalMessage[len]; for (int i = 0; i < len; i++) arr[i] = new GlobalMessage(); return arr; } case NotificationType.HostInfoRequest: { var arr = new HostInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new HostInfoRequest(); return arr; } case NotificationType.InitIvExpand: { var arr = new InitIvExpand[len]; for (int i = 0; i < len; i++) arr[i] = new InitIvExpand(); return arr; } case NotificationType.InitIvExpand2: { var arr = new InitIvExpand2[len]; for (int i = 0; i < len; i++) arr[i] = new InitIvExpand2(); return arr; } case NotificationType.InitServer: { var arr = new InitServer[len]; for (int i = 0; i < len; i++) arr[i] = new InitServer(); return arr; } case NotificationType.InstanceEdit: { var arr = new InstanceEdit[len]; for (int i = 0; i < len; i++) arr[i] = new InstanceEdit(); return arr; } case NotificationType.InstanceInfo: { var arr = new InstanceInfo[len]; for (int i = 0; i < len; i++) arr[i] = new InstanceInfo(); return arr; } case NotificationType.LogAdd: { var arr = new LogAdd[len]; for (int i = 0; i < len; i++) arr[i] = new LogAdd(); return arr; } case NotificationType.Login: { var arr = new Login[len]; for (int i = 0; i < len; i++) arr[i] = new Login(); return arr; } case NotificationType.Logout: { var arr = new Logout[len]; for (int i = 0; i < len; i++) arr[i] = new Logout(); return arr; } case NotificationType.LogView: { var arr = new LogView[len]; for (int i = 0; i < len; i++) arr[i] = new LogView(); return arr; } case NotificationType.OfflineMessage: { var arr = new OfflineMessage[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessage(); return arr; } case NotificationType.OfflineMessageAdd: { var arr = new OfflineMessageAdd[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessageAdd(); return arr; } case NotificationType.OfflineMessageDel: { var arr = new OfflineMessageDel[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessageDel(); return arr; } case NotificationType.OfflineMessageGet: { var arr = new OfflineMessageGet[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessageGet(); return arr; } case NotificationType.OfflineMessageList: { var arr = new OfflineMessageList[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessageList(); return arr; } case NotificationType.OfflineMessageListRequest: { var arr = new OfflineMessageListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessageListRequest(); return arr; } case NotificationType.OfflineMessageUpdateFlag: { var arr = new OfflineMessageUpdateFlag[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessageUpdateFlag(); return arr; } case NotificationType.PermFind: { var arr = new PermFind[len]; for (int i = 0; i < len; i++) arr[i] = new PermFind(); return arr; } case NotificationType.PermFindRequest: { var arr = new PermFindRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PermFindRequest(); return arr; } case NotificationType.PermIdByNameRequest: { var arr = new PermIdByNameRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PermIdByNameRequest(); return arr; } case NotificationType.PermList: { var arr = new PermList[len]; for (int i = 0; i < len; i++) arr[i] = new PermList(); return arr; } case NotificationType.PermListRequest: { var arr = new PermListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PermListRequest(); return arr; } case NotificationType.PermOverview: { var arr = new PermOverview[len]; for (int i = 0; i < len; i++) arr[i] = new PermOverview(); return arr; } case NotificationType.PermOverviewRequest: { var arr = new PermOverviewRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PermOverviewRequest(); return arr; } case NotificationType.PermRequest: { var arr = new PermRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PermRequest(); return arr; } case NotificationType.PermReset: { var arr = new PermReset[len]; for (int i = 0; i < len; i++) arr[i] = new PermReset(); return arr; } case NotificationType.PluginCommand: { var arr = new PluginCommand[len]; for (int i = 0; i < len; i++) arr[i] = new PluginCommand(); return arr; } case NotificationType.PluginCommandRequest: { var arr = new PluginCommandRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PluginCommandRequest(); return arr; } case NotificationType.PrivilegeKeyAddRequest: { var arr = new PrivilegeKeyAddRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PrivilegeKeyAddRequest(); return arr; } case NotificationType.PrivilegeKeyDelete: { var arr = new PrivilegeKeyDelete[len]; for (int i = 0; i < len; i++) arr[i] = new PrivilegeKeyDelete(); return arr; } case NotificationType.PrivilegeKeyListRequest: { var arr = new PrivilegeKeyListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PrivilegeKeyListRequest(); return arr; } case NotificationType.PrivilegeKeyUse: { var arr = new PrivilegeKeyUse[len]; for (int i = 0; i < len; i++) arr[i] = new PrivilegeKeyUse(); return arr; } case NotificationType.Quit: { var arr = new Quit[len]; for (int i = 0; i < len; i++) arr[i] = new Quit(); return arr; } case NotificationType.SendTextMessage: { var arr = new SendTextMessage[len]; for (int i = 0; i < len; i++) arr[i] = new SendTextMessage(); return arr; } case NotificationType.ServerConnectionInfo: { var arr = new ServerConnectionInfo[len]; for (int i = 0; i < len; i++) arr[i] = new ServerConnectionInfo(); return arr; } case NotificationType.ServerConnectionInfoRequest: { var arr = new ServerConnectionInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerConnectionInfoRequest(); return arr; } case NotificationType.ServerCreate: { var arr = new ServerCreate[len]; for (int i = 0; i < len; i++) arr[i] = new ServerCreate(); return arr; } case NotificationType.ServerDelete: { var arr = new ServerDelete[len]; for (int i = 0; i < len; i++) arr[i] = new ServerDelete(); return arr; } case NotificationType.ServerEdit: { var arr = new ServerEdit[len]; for (int i = 0; i < len; i++) arr[i] = new ServerEdit(); return arr; } case NotificationType.ServerEdited: { var arr = new ServerEdited[len]; for (int i = 0; i < len; i++) arr[i] = new ServerEdited(); return arr; } case NotificationType.ServerGroupAdd: { var arr = new ServerGroupAdd[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupAdd(); return arr; } case NotificationType.ServerGroupAddClient: { var arr = new ServerGroupAddClient[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupAddClient(); return arr; } case NotificationType.ServerGroupAddPerm: { var arr = new ServerGroupAddPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupAddPerm(); return arr; } case NotificationType.ServerGroupAutoAddPerm: { var arr = new ServerGroupAutoAddPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupAutoAddPerm(); return arr; } case NotificationType.ServerGroupAutoDelPerm: { var arr = new ServerGroupAutoDelPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupAutoDelPerm(); return arr; } case NotificationType.ServerGroupClientList: { var arr = new ServerGroupClientList[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupClientList(); return arr; } case NotificationType.ServerGroupClientListRequest: { var arr = new ServerGroupClientListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupClientListRequest(); return arr; } case NotificationType.ServerGroupCopy: { var arr = new ServerGroupCopy[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupCopy(); return arr; } case NotificationType.ServerGroupDel: { var arr = new ServerGroupDel[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupDel(); return arr; } case NotificationType.ServerGroupDelClient: { var arr = new ServerGroupDelClient[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupDelClient(); return arr; } case NotificationType.ServerGroupDelPerm: { var arr = new ServerGroupDelPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupDelPerm(); return arr; } case NotificationType.ServerGroupList: { var arr = new ServerGroupList[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupList(); return arr; } case NotificationType.ServerGroupListRequest: { var arr = new ServerGroupListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupListRequest(); return arr; } case NotificationType.ServerGroupPermList: { var arr = new ServerGroupPermList[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupPermList(); return arr; } case NotificationType.ServerGroupPermListRequest: { var arr = new ServerGroupPermListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupPermListRequest(); return arr; } case NotificationType.ServerGroupRename: { var arr = new ServerGroupRename[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupRename(); return arr; } case NotificationType.ServerGroupsByClientId: { var arr = new ServerGroupsByClientId[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupsByClientId(); return arr; } case NotificationType.ServerGroupsByClientIdRequest: { var arr = new ServerGroupsByClientIdRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupsByClientIdRequest(); return arr; } case NotificationType.ServerIdGetByPort: { var arr = new ServerIdGetByPort[len]; for (int i = 0; i < len; i++) arr[i] = new ServerIdGetByPort(); return arr; } case NotificationType.ServerInfo: { var arr = new ServerInfo[len]; for (int i = 0; i < len; i++) arr[i] = new ServerInfo(); return arr; } case NotificationType.ServerListRequest: { var arr = new ServerListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerListRequest(); return arr; } case NotificationType.ServerLog: { var arr = new ServerLog[len]; for (int i = 0; i < len; i++) arr[i] = new ServerLog(); return arr; } case NotificationType.ServerNotifyRegister: { var arr = new ServerNotifyRegister[len]; for (int i = 0; i < len; i++) arr[i] = new ServerNotifyRegister(); return arr; } case NotificationType.ServerNotifyUnregister: { var arr = new ServerNotifyUnregister[len]; for (int i = 0; i < len; i++) arr[i] = new ServerNotifyUnregister(); return arr; } case NotificationType.ServerProcessStop: { var arr = new ServerProcessStop[len]; for (int i = 0; i < len; i++) arr[i] = new ServerProcessStop(); return arr; } case NotificationType.ServerSnapshotCreate: { var arr = new ServerSnapshotCreate[len]; for (int i = 0; i < len; i++) arr[i] = new ServerSnapshotCreate(); return arr; } case NotificationType.ServerSnapshotDeploy: { var arr = new ServerSnapshotDeploy[len]; for (int i = 0; i < len; i++) arr[i] = new ServerSnapshotDeploy(); return arr; } case NotificationType.ServerStart: { var arr = new ServerStart[len]; for (int i = 0; i < len; i++) arr[i] = new ServerStart(); return arr; } case NotificationType.ServerStop: { var arr = new ServerStop[len]; for (int i = 0; i < len; i++) arr[i] = new ServerStop(); return arr; } case NotificationType.ServerTempPasswordAdd: { var arr = new ServerTempPasswordAdd[len]; for (int i = 0; i < len; i++) arr[i] = new ServerTempPasswordAdd(); return arr; } case NotificationType.ServerTempPasswordDel: { var arr = new ServerTempPasswordDel[len]; for (int i = 0; i < len; i++) arr[i] = new ServerTempPasswordDel(); return arr; } case NotificationType.ServerTempPasswordList: { var arr = new ServerTempPasswordList[len]; for (int i = 0; i < len; i++) arr[i] = new ServerTempPasswordList(); return arr; } case NotificationType.ServerTempPasswordListRequest: { var arr = new ServerTempPasswordListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerTempPasswordListRequest(); return arr; } case NotificationType.ServerUpdated: { var arr = new ServerUpdated[len]; for (int i = 0; i < len; i++) arr[i] = new ServerUpdated(); return arr; } case NotificationType.ServerVariablesRequest: { var arr = new ServerVariablesRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerVariablesRequest(); return arr; } case NotificationType.SetClientChannelGroup: { var arr = new SetClientChannelGroup[len]; for (int i = 0; i < len; i++) arr[i] = new SetClientChannelGroup(); return arr; } case NotificationType.TextMessage: { var arr = new TextMessage[len]; for (int i = 0; i < len; i++) arr[i] = new TextMessage(); return arr; } case NotificationType.TokenAdd: { var arr = new TokenAdd[len]; for (int i = 0; i < len; i++) arr[i] = new TokenAdd(); return arr; } case NotificationType.TokenAddRequest: { var arr = new TokenAddRequest[len]; for (int i = 0; i < len; i++) arr[i] = new TokenAddRequest(); return arr; } case NotificationType.TokenDelete: { var arr = new TokenDelete[len]; for (int i = 0; i < len; i++) arr[i] = new TokenDelete(); return arr; } case NotificationType.TokenList: { var arr = new TokenList[len]; for (int i = 0; i < len; i++) arr[i] = new TokenList(); return arr; } case NotificationType.TokenListRequest: { var arr = new TokenListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new TokenListRequest(); return arr; } case NotificationType.TokenUse: { var arr = new TokenUse[len]; for (int i = 0; i < len; i++) arr[i] = new TokenUse(); return arr; } case NotificationType.TokenUsed: { var arr = new TokenUsed[len]; for (int i = 0; i < len; i++) arr[i] = new TokenUsed(); return arr; } case NotificationType.Use: { var arr = new Use[len]; for (int i = 0; i < len; i++) arr[i] = new Use(); return arr; } case NotificationType.VersionRequest: { var arr = new VersionRequest[len]; for (int i = 0; i < len; i++) arr[i] = new VersionRequest(); return arr; } case NotificationType.WhoAmIRequest: { var arr = new WhoAmIRequest[len]; for (int i = 0; i < len; i++) arr[i] = new WhoAmIRequest(); return arr; } case NotificationType.Unknown: default: throw Tools.UnhandledDefault(name); } } } } ================================================ FILE: TSLib/Generated/Messages.tt ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // <#@ template debug="true" hostSpecific="true" language="C#" #> <#@ include file="MessageParser.ttinclude" once="true" #> <#@ output extension=".cs" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> using System; using System.Collections.Generic; using System.Buffers.Text; using TSLib.Commands; using TSLib.Helper; <#= ConversionSet #> #nullable enable namespace TSLib.Messages { <# var gen = Messages.Parse(Host.ResolvePath("../Declarations/Messages.toml")); string GenerateDeserializer(Messages.Field fld) { if(fld.isArray) return $"{{ if(value.Length == 0) {fld.pretty} = Array.Empty<{fld.type}>(); else {{" + $" var ss = new SpanSplitter(); ss.First(value, (byte)',');" + $" int cnt = 0; for (int i = 0; i < value.Length; i++) if (value[i] == ',') cnt++;" + $" {fld.pretty} = new {fld.type}[cnt + 1];" + $" for(int i = 0; i < cnt + 1; i++) {{ {GenerateSingleDeserializer(fld, "ss.Trim(value)", fld.pretty + "[i]")} if (i < cnt) value = ss.Next(value); }} }} }}"; else return GenerateSingleDeserializer(fld, "value", fld.pretty); } Dictionary BackingTypes = new Dictionary() { { "Uid", "str" }, { "ClientDbId", "u64" }, { "ClientId", "u16" }, { "ChannelId", "u64" }, { "ServerGroupId", "u64" }, { "ChannelGroupId", "u64" }, { "Codec", "u8" }, { "Ts3ErrorCode", "u32" }, { "LicenseType", "u16" }, { "PermissionId", "u32" }, }; string GenerateSingleDeserializer(Messages.Field fld, string input, string output) { switch (fld.type) { case "bool": return $"{output} = {input}.Length > 0 && {input}[0] != '0';"; case "i8": case "u8": case "i16": case "u16": case "i32": case "u32": case "i64": case "u64": case "f32": case "f64": case "ClientDbId": case "ClientId": case "ChannelId": case "ServerGroupId": case "ChannelGroupId": if(!BackingTypes.TryGetValue(fld.type, out var backType)) backType = fld.type; return $"{{ if(Utf8Parser.TryParse({input}, out {backType} oval, out _)) {output} = ({fld.type})oval; }}"; case "DurationSeconds": return $"{{ if(Utf8Parser.TryParse({input}, out f64 oval, out _)) {output} = TimeSpan.FromSeconds(oval); }}"; case "DurationMilliseconds": return $"{{ if(Utf8Parser.TryParse({input}, out f64 oval, out _)) {output} = TimeSpan.FromMilliseconds(oval); }}"; case "DateTime": return $"{{ if(Utf8Parser.TryParse({input}, out u32 oval, out _)) {output} = Tools.FromUnix(oval); }}"; case "str": case "Uid": case "IpAddr": return $"{output} = ({fld.type})TsString.Unescape({input});"; case "HostMessageMode": case "CodecEncryptionMode": case "HostBannerMode": case "Reason": case "ClientType": case "TextMessageTargetMode": case "GroupType": case "GroupNamingMode": case "Codec": case "Ts3ErrorCode": case "LicenseType": case "TokenType": case "LogLevel": case "PluginTargetMode": case "PermissionType": case "ChannelPermissionHint": case "ClientPermissionHint": if(!BackingTypes.TryGetValue(fld.type, out backType)) backType = "i32"; return $"{{ if(Utf8Parser.TryParse({input}, out {backType} oval, out _)) {output} = ({fld.type})oval; }}"; case "IconHash": return $"{{ if(!{input}.IsEmpty && {input}[0] == (u8)'-') {{ if(Utf8Parser.TryParse({input}, out i32 oval, out _)) {output} = oval; }} else {{ if(Utf8Parser.TryParse({input}, out u64 oval, out _)) {output} = unchecked((i32)oval); }} }}"; case "PermissionId": return $"{{ if(Utf8Parser.TryParse({input}, out u16 oval, out _)) {output} = ser.PermissionTransform.GetName(oval); }}"; default: Warn($"Missing deserializer for {fld.type}"); return ""; } } foreach(var msg in gen.GetOrderedMsg()) { //if(!msg.s2c.Value) continue; #> public sealed partial class <#= msg.name #><# bool isNotify = msg.notify != null; bool isResponse = msg.response.Value; if (isNotify && isResponse) Write(" : INotification, IResponse"); else if (isNotify) Write(" : INotification"); else if (isResponse) Write(" : IResponse"); #> { #pragma warning disable CS8618 <#= isNotify ? "public NotificationType NotifyType { get; } = NotificationType." + msg.name + ";" : "" #> <#= isResponse ? "public string? ReturnCode { get; set; }" : "" #> <# foreach (var (genField, optional) in msg.attributes.Select(f => gen.GetField(f)).OrderBy(x => x.fld.pretty)) { #> public <#= genField.TypeFin(optional) #> <#= genField.pretty #> { get; set; }<# } #> #pragma warning restore CS8618 public void SetField(string name, ReadOnlySpan value, Deserializer ser) {<# if (msg.attributes.Length > 0) { #> switch(name) { <# foreach (var (genField, optional) in msg.attributes.Select(f => gen.GetField(f)).OrderBy(x => x.fld.ts)) { #> case "<#= genField.ts #>": <#= GenerateDeserializer(genField) #> break;<# } #> <#= isResponse ? ("case \"return_code\": " + GenerateDeserializer(gen.GetField("return_code").fld) + " break;") : "" #> } <# } #> } public void Expand(IMessage[] to, IEnumerable flds) {<# if (msg.attributes.Length > 0) { #> var toc = (<#= msg.name #>[])to; foreach (var fld in flds) { switch(fld) { <# foreach (var (genField, optional) in msg.attributes.Select(f => gen.GetField(f)).OrderBy(x => x.fld.ts)) { #> case "<#= genField.ts #>": foreach(var toi in toc) { toi.<#= genField.pretty #> = <#= genField.pretty #>; } break;<# } #> } } <# } #> } } <# } #> public enum NotificationType { Unknown,<# foreach(var ntfy in gen.NotifiesSorted) { /*if(!ntfy.s2c.Value) continue;*/ #> ///<#= ntfy.s2c.Value ? "[S2C] " : "" #><#= ntfy.c2s.Value ? "[C2S] " : "" #>ntfy:<#= ntfy.notify #> <#= ntfy.name #>,<# } #> } public static class MessageHelper { public static NotificationType GetToClientNotificationType(string name) { switch(name) {<# foreach(var ntfy in gen.NotifiesSorted.Where(x => x.s2c.Value)) {#> case "<#= ntfy.notify #>": return NotificationType.<#= ntfy.name #>;<# } #> default: return NotificationType.Unknown; } } public static NotificationType GetToServerNotificationType(string name) { switch(name) {<# foreach(var ntfy in gen.NotifiesSorted.Where(x => x.c2s.Value)) {#> case "<#= ntfy.notify #>": return NotificationType.<#= ntfy.name #>;<# } #> default: return NotificationType.Unknown; } } public static INotification GenerateNotificationType(NotificationType name) { switch(name) {<# foreach(var ntfy in gen.NotifiesSorted) { /*if(!ntfy.s2c.Value) continue;*/ #> case NotificationType.<#= ntfy.name #>: return new <#= ntfy.name #>();<# } #> case NotificationType.Unknown: default: throw Tools.UnhandledDefault(name); } } public static INotification[] InstatiateNotificationArray(NotificationType name, int len) { switch(name) {<# foreach(var ntfy in gen.NotifiesSorted) { /*if(!ntfy.s2c.Value) continue;*/ #> case NotificationType.<#= ntfy.name #>: { var arr = new <#= ntfy.name #>[len]; for (int i = 0; i < len; i++) arr[i] = new <#= ntfy.name #>(); return arr; }<# } #> case NotificationType.Unknown: default: throw Tools.UnhandledDefault(name); } } } } ================================================ FILE: TSLib/Generated/NotificationUtil.ttinclude ================================================ <#+ HashSet sharedNotifications = new HashSet { "ChannelCreated", "ChannelDeleted", "ChannelChanged", "ChannelEdited", "ChannelMoved", "ChannelPasswordChanged", "ClientEnterView", "ClientLeftView", "ClientMoved", "ServerEdited", "TextMessage", "TokenUsed", }; public void GenNtfyDecls(IEnumerable enu, bool root = false) { PushIndent("\t\t"); WriteLine(""); var modifier = root ? " abstract" : " override"; foreach(var ntfy in enu) { Write("public"); if(sharedNotifications.Contains(ntfy.name)) Write(modifier); WriteLine($" event NotifyEventHandler<{ntfy.name}>? On{ntfy.name};"); Write("public"); if(sharedNotifications.Contains(ntfy.name)) Write(modifier); WriteLine($" event EventHandler<{ntfy.name}>? OnEach{ntfy.name};"); } PopIndent(); } #> ================================================ FILE: TSLib/Generated/TsErrorCode.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // namespace TSLib { // Source: http://forum.teamspeak.com/threads/102276-Server-query-error-id-list public enum TsErrorCode : uint { // ReSharper disable InconsistentNaming, UnusedMember.Global /// unknown error code ok = 0x0000, /// undefined error undefined = 0x0001, /// not implemented not_implemented = 0x0002, /// ok_no_update = 0x0003, /// dont_notify = 0x0004, /// library time limit reached lib_time_limit_reached = 0x0005, /// command not found command_not_found = 0x0100, /// unable to bind network port unable_to_bind_network_port = 0x0101, /// no network port available no_network_port_available = 0x0102, /// invalid clientID client_invalid_id = 0x0200, /// nickname is already in use client_nickname_inuse = 0x0201, /// invalid error code client_invalid_error_code = 0x0202, /// max clients protocol limit reached client_protocol_limit_reached = 0x0203, /// invalid client type client_invalid_type = 0x0204, /// already subscribed client_already_subscribed = 0x0205, /// not logged in client_not_logged_in = 0x0206, /// could not validate client identity client_could_not_validate_identity = 0x0207, /// invalid loginname or password client_invalid_password = 0x0208, /// too many clones already connected client_too_many_clones_connected = 0x0209, /// client version outdated, please update client_version_outdated = 0x020a, /// client is online client_is_online = 0x020b, /// client is flooding client_is_flooding = 0x020c, /// client is modified client_hacked = 0x020d, /// can not verify client at this moment client_cannot_verify_now = 0x020e, /// client is not permitted to log in client_login_not_permitted = 0x020f, /// client is not subscribed to the channel client_not_subscribed = 0x0210, /// invalid channelID channel_invalid_id = 0x0300, /// max channels protocol limit reached channel_protocol_limit_reached = 0x0301, /// already member of channel channel_already_in = 0x0302, /// channel name is already in use channel_name_inuse = 0x0303, /// channel not empty channel_not_empty = 0x0304, /// can not delete default channel channel_can_not_delete_default = 0x0305, /// default channel requires permanent channel_default_require_permanent = 0x0306, /// invalid channel flags channel_invalid_flags = 0x0307, /// permanent channel can not be child of non permanent channel channel_parent_not_permanent = 0x0308, /// channel maxclient reached channel_maxclients_reached = 0x0309, /// channel maxfamily reached channel_maxfamily_reached = 0x030a, /// invalid channel order channel_invalid_order = 0x030b, /// channel does not support filetransfers channel_no_filetransfer_supported = 0x030c, /// invalid channel password channel_invalid_password = 0x030d, /// channel is private channel channel_is_private_channel = 0x030e, /// invalid security hash supplied by client channel_invalid_security_hash = 0x030f, /// invalid serverID server_invalid_id = 0x0400, /// server is running server_running = 0x0401, /// server is shutting down server_is_shutting_down = 0x0402, /// server maxclient reached server_maxclients_reached = 0x0403, /// invalid server password server_invalid_password = 0x0404, /// deployment active server_deployment_active = 0x0405, /// unable to stop own server in your connection class server_unable_to_stop_own_server = 0x0406, /// server is virtual server_is_virtual = 0x0407, /// server wrong machineID server_wrong_machineid = 0x0408, /// server is not running server_is_not_running = 0x0409, /// server is booting up server_is_booting = 0x040a, /// server got an invalid status for this operation server_status_invalid = 0x040b, /// server modal quit server_modal_quit = 0x040c, /// server version is too old for command server_version_outdated = 0x040d, /// database error database = 0x0500, /// database empty result set database_empty_result = 0x0501, /// database duplicate entry database_duplicate_entry = 0x0502, /// database no modifications database_no_modifications = 0x0503, /// database invalid constraint database_constraint = 0x0504, /// database reinvoke command database_reinvoke = 0x0505, /// invalid quote parameter_quote = 0x0600, /// invalid parameter count parameter_invalid_count = 0x0601, /// invalid parameter parameter_invalid = 0x0602, /// parameter not found parameter_not_found = 0x0603, /// convert error parameter_convert = 0x0604, /// invalid parameter size parameter_invalid_size = 0x0605, /// missing required parameter parameter_missing = 0x0606, /// invalid checksum parameter_checksum = 0x0607, /// virtual server got a critical error vs_critical = 0x0700, /// Connection lost connection_lost = 0x0701, /// not connected not_connected = 0x0702, /// no cached connection info no_cached_connection_info = 0x0703, /// currently not possible currently_not_possible = 0x0704, /// failed connection initialization failed_connection_initialisation = 0x0705, /// could not resolve hostname could_not_resolve_hostname = 0x0706, /// invalid server connection handler ID invalid_server_connection_handler_id = 0x0707, /// could not initialize Input Manager could_not_initialise_input_manager = 0x0708, /// client library not initialized clientlibrary_not_initialised = 0x0709, /// server library not initialized serverlibrary_not_initialised = 0x070a, /// too many whisper targets whisper_too_many_targets = 0x070b, /// no whisper targets found whisper_no_targets = 0x070c, /// invalid file name file_invalid_name = 0x0800, /// invalid file permissions file_invalid_permissions = 0x0801, /// file already exists file_already_exists = 0x0802, /// file not found file_not_found = 0x0803, /// file input/output error file_io_error = 0x0804, /// invalid file transfer ID file_invalid_transfer_id = 0x0805, /// invalid file path file_invalid_path = 0x0806, /// no files available file_no_files_available = 0x0807, /// overwrite excludes resume file_overwrite_excludes_resume = 0x0808, /// invalid file size file_invalid_size = 0x0809, /// file already in use file_already_in_use = 0x080a, /// could not open file transfer connection file_could_not_open_connection = 0x080b, /// no space left on device (disk full?) file_no_space_left_on_device = 0x080c, /// file exceeds file system's maximum file size file_exceeds_file_system_maximum_size = 0x080d, /// file transfer connection timeout file_transfer_connection_timeout = 0x080e, /// lost file transfer connection file_connection_lost = 0x080f, /// file exceeds supplied file size file_exceeds_supplied_size = 0x0810, /// file transfer complete file_transfer_complete = 0x0811, /// file transfer canceled file_transfer_canceled = 0x0812, /// file transfer interrupted file_transfer_interrupted = 0x0813, /// file transfer server quota exceeded file_transfer_server_quota_exceeded = 0x0814, /// file transfer client quota exceeded file_transfer_client_quota_exceeded = 0x0815, /// file transfer reset file_transfer_reset = 0x0816, /// file transfer limit reached file_transfer_limit_reached = 0x0817, /// preprocessor disabled sound_preprocessor_disabled = 0x0900, /// internal preprocessor sound_internal_preprocessor = 0x0901, /// internal encoder sound_internal_encoder = 0x0902, /// internal playback sound_internal_playback = 0x0903, /// no capture device available sound_no_capture_device_available = 0x0904, /// no playback device available sound_no_playback_device_available = 0x0905, /// could not open capture device sound_could_not_open_capture_device = 0x0906, /// could not open playback device sound_could_not_open_playback_device = 0x0907, /// ServerConnectionHandler has a device registered sound_handler_has_device = 0x0908, /// invalid capture device sound_invalid_capture_device = 0x0909, /// invalid clayback device sound_invalid_playback_device = 0x090a, /// invalid wave file sound_invalid_wave = 0x090b, /// wave file type not supported sound_unsupported_wave = 0x090c, /// could not open wave file sound_open_wave = 0x090d, /// internal capture sound_internal_capture = 0x090e, /// device still in use sound_device_in_use = 0x090f, /// device already registerred sound_device_already_registerred = 0x0910, /// device not registered/known sound_unknown_device = 0x0911, /// unsupported frequency sound_unsupported_frequency = 0x0912, /// invalid channel count sound_invalid_channel_count = 0x0913, /// read error in wave sound_read_wave = 0x0914, /// sound need more data sound_need_more_data = 0x0915, /// sound device was busy sound_device_busy = 0x0916, /// there is no sound data for this period sound_no_data = 0x0917, /// Channelmask set bits count (speakers) is not the same as (count) sound_channel_mask_mismatch = 0x0918, /// invalid group ID permission_invalid_group_id = 0x0a00, /// duplicate entry permission_duplicate_entry = 0x0a01, /// invalid permission ID permission_invalid_perm_id = 0x0a02, /// empty result set permission_empty_result = 0x0a03, /// access to default group is forbidden permission_default_group_forbidden = 0x0a04, /// invalid size permission_invalid_size = 0x0a05, /// invalid value permission_invalid_value = 0x0a06, /// group is not empty permissions_group_not_empty = 0x0a07, /// insufficient client permissions permissions_client_insufficient = 0x0a08, /// insufficient group modify power permissions_insufficient_group_power = 0x0a09, /// insufficient permission modify power permissions_insufficient_permission_power = 0x0a0a, /// template group is currently used permission_template_group_is_used = 0x0a0b, /// permission error permissions = 0x0a0c, /// virtualserver limit reached accounting_virtualserver_limit_reached = 0x0b00, /// max slot limit reached accounting_slot_limit_reached = 0x0b01, /// license file not found accounting_license_file_not_found = 0x0b02, /// license date not ok accounting_license_date_not_ok = 0x0b03, /// unable to connect to accounting server accounting_unable_to_connect_to_server = 0x0b04, /// unknown accounting error accounting_unknown_error = 0x0b05, /// accounting server error accounting_server_error = 0x0b06, /// instance limit reached accounting_instance_limit_reached = 0x0b07, /// instance check error accounting_instance_check_error = 0x0b08, /// license file invalid accounting_license_file_invalid = 0x0b09, /// virtualserver is running elsewhere accounting_running_elsewhere = 0x0b0a, /// virtualserver running in same instance already accounting_instance_duplicated = 0x0b0b, /// virtualserver already started accounting_already_started = 0x0b0c, /// virtualserver not started accounting_not_started = 0x0b0d, /// accounting_to_many_starts = 0x0b0e, /// invalid message id message_invalid_id = 0x0c00, /// invalid ban id ban_invalid_id = 0x0d00, /// connection failed, you are banned connect_failed_banned = 0x0d01, /// rename failed, new name is banned rename_failed_banned = 0x0d02, /// flood ban ban_flooding = 0x0d03, /// unable to initialize tts tts_unable_to_initialize = 0x0e00, /// invalid privilege key privilege_key_invalid = 0x0f00, /// voip_pjsua = 0x1000, /// voip_already_initialized = 0x1001, /// voip_too_many_accounts = 0x1002, /// voip_invalid_account = 0x1003, /// voip_internal_error = 0x1004, /// voip_invalid_connectionId = 0x1005, /// voip_cannot_answer_initiated_call = 0x1006, /// voip_not_initialized = 0x1007, /// invalid password provisioning_invalid_password = 0x1100, /// invalid request provisioning_invalid_request = 0x1101, /// no(more) slots available provisioning_no_slots_available = 0x1102, /// pool missing provisioning_pool_missing = 0x1103, /// pool unknown provisioning_pool_unknown = 0x1104, /// unknown ip location(perhaps LAN ip?) provisioning_unknown_ip_location = 0x1105, /// internal error(tried exceeded) provisioning_internal_tries_exceeded = 0x1106, /// too many slots requested provisioning_too_many_slots_requested = 0x1107, /// too many reserved provisioning_too_many_reserved = 0x1108, /// could not connect to provisioning server provisioning_could_not_connect = 0x1109, /// authentication server not connected provisioning_auth_server_not_connected = 0x1110, /// authentication data too large provisioning_auth_data_too_large = 0x1111, /// already initialized provisioning_already_initialized = 0x1112, /// not initialized provisioning_not_initialized = 0x1113, /// already connecting provisioning_connecting = 0x1114, /// already connected provisioning_already_connected = 0x1115, /// provisioning_not_connected = 0x1116, /// io_error provisioning_io_error = 0x1117, /// provisioning_invalid_timeout = 0x1118, /// provisioning_ts3server_not_found = 0x1119, /// unknown permissionID provisioning_no_permission = 0x111A, /// For own custom errors custom_error = 0xFFFF, // ReSharper enable InconsistentNaming, UnusedMember.Global } } ================================================ FILE: TSLib/Generated/TsErrorCode.tt ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // <#@ template debug="false" hostspecific="true" language="C#" #> <#@ include file="ErrorParser.ttinclude" once="true" #> <#@ output extension=".cs" #> <# var errors = ParseErrors(); #> namespace TSLib { // Source: http://forum.teamspeak.com/threads/102276-Server-query-error-id-list public enum TsErrorCode : uint { // ReSharper disable InconsistentNaming, UnusedMember.Global<# foreach (var line in errors) { #> /// <#= line.Doc #> <#= line.Name #> = <#= line.Value #>,<# } #> /// For own custom errors custom_error = 0xFFFF, // ReSharper enable InconsistentNaming, UnusedMember.Global } } ================================================ FILE: TSLib/Generated/TsPermission.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // using TSLib.Helper; namespace TSLib { // Source: https://www.tsviewer.com/index.php?page=faq&id=12&newlanguage=en public enum TsPermission { // ReSharper disable InconsistentNaming, UnusedMember.Global undefined, /// May occour on error returns with no associated permission unknown, /// Retrieve information about ServerQuery commands b_serverinstance_help_view, /// Retrieve global server version (including platform and build number) b_serverinstance_version_view, /// Retrieve global server information b_serverinstance_info_view, /// List virtual servers stored in the database b_serverinstance_virtualserver_list, /// List active IP bindings on multi-homed machines b_serverinstance_binding_list, /// List permissions available available on the server instance b_serverinstance_permission_list, /// Search permission assignments by name or ID b_serverinstance_permission_find, /// Create virtual servers b_virtualserver_create, /// Delete virtual servers b_virtualserver_delete, /// Start any virtual server in the server instance b_virtualserver_start_any, /// Stop any virtual server in the server instance b_virtualserver_stop_any, /// Change a virtual servers machine ID b_virtualserver_change_machine_id, /// Edit virtual server default template values b_virtualserver_change_template, /// Login to ServerQuery b_serverquery_login, /// Send text messages to all virtual servers at once b_serverinstance_textmessage_send, /// Retrieve global server log b_serverinstance_log_view, /// Write to global server log b_serverinstance_log_add, /// Shutdown the server process b_serverinstance_stop, /// Edit global settings b_serverinstance_modify_settings, /// Edit global ServerQuery groups b_serverinstance_modify_querygroup, /// Edit global template groups b_serverinstance_modify_templates, /// Select a virtual server b_virtualserver_select, /// Retrieve virtual server information b_virtualserver_info_view, /// Retrieve virtual server connection information b_virtualserver_connectioninfo_view, /// List channels on a virtual server b_virtualserver_channel_list, /// Search for channels on a virtual server b_virtualserver_channel_search, /// List clients online on a virtual server b_virtualserver_client_list, /// Search for clients online on a virtual server b_virtualserver_client_search, /// List client identities known by the virtual server b_virtualserver_client_dblist, /// Search for client identities known by the virtual server b_virtualserver_client_dbsearch, /// Retrieve client information b_virtualserver_client_dbinfo, /// Find permissions b_virtualserver_permission_find, /// Find custom fields b_virtualserver_custom_search, /// Start own virtual server b_virtualserver_start, /// Stop own virtual server b_virtualserver_stop, /// List privilege keys available b_virtualserver_token_list, /// Create new privilege keys b_virtualserver_token_add, /// Use a privilege keys to gain access to groups b_virtualserver_token_use, /// Delete a privilege key b_virtualserver_token_delete, /// Retrieve virtual server log b_virtualserver_log_view, /// Write to virtual server log b_virtualserver_log_add, /// Join virtual server ignoring its password b_virtualserver_join_ignore_password, /// Register for server notifications b_virtualserver_notify_register, /// Unregister from server notifications b_virtualserver_notify_unregister, /// Create server snapshots b_virtualserver_snapshot_create, /// Deploy server snapshots b_virtualserver_snapshot_deploy, /// Reset the server permission settings to default values b_virtualserver_permission_reset, /// Modify server name b_virtualserver_modify_name, /// Modify welcome message b_virtualserver_modify_welcomemessage, /// Modify servers max clients b_virtualserver_modify_maxclients, /// Modify reserved slots b_virtualserver_modify_reserved_slots, /// Modify server password b_virtualserver_modify_password, /// Modify default Server Group b_virtualserver_modify_default_servergroup, /// Modify default Channel Group b_virtualserver_modify_default_channelgroup, /// Modify default Channel Admin Group b_virtualserver_modify_default_channeladmingroup, /// Modify channel force silence value b_virtualserver_modify_channel_forced_silence, /// Modify individual complain settings b_virtualserver_modify_complain, /// Modify individual antiflood settings b_virtualserver_modify_antiflood, /// Modify file transfer settings b_virtualserver_modify_ft_settings, /// Modify file transfer quotas b_virtualserver_modify_ft_quotas, /// Modify individual hostmessage settings b_virtualserver_modify_hostmessage, /// Modify individual hostbanner settings b_virtualserver_modify_hostbanner, /// Modify individual hostbutton settings b_virtualserver_modify_hostbutton, /// Modify server port b_virtualserver_modify_port, /// Modify server autostart b_virtualserver_modify_autostart, /// Modify required identity security level b_virtualserver_modify_needed_identity_security_level, /// Modify priority speaker dimm modificator b_virtualserver_modify_priority_speaker_dimm_modificator, /// Modify log settings b_virtualserver_modify_log_settings, /// Modify min client version b_virtualserver_modify_min_client_version, /// Modify server icon b_virtualserver_modify_icon_id, /// Modify web server list reporting settings b_virtualserver_modify_weblist, /// Modify codec encryption mode b_virtualserver_modify_codec_encryption_mode, /// Modify temporary serverpasswords b_virtualserver_modify_temporary_passwords, /// Modify own temporary serverpasswords b_virtualserver_modify_temporary_passwords_own, /// Modify default temporary channel delete delay b_virtualserver_modify_channel_temp_delete_delay_default, /// Modify server nicknames b_virtualserver_modify_nickname, /// Modify integrations b_virtualserver_modify_integrations, /// Min channel creation depth in hierarchy i_channel_min_depth, /// Max channel creation depth in hierarchy i_channel_max_depth, /// Stop inheritance of channel group permissions b_channel_group_inheritance_end, /// Modify channel permission power i_channel_permission_modify_power, /// Needed modify channel permission power i_channel_needed_permission_modify_power, /// Retrieve channel information b_channel_info_view, /// Create sub-channels b_channel_create_child, /// Create permanent channels b_channel_create_permanent, /// Create semi-permanent channels b_channel_create_semi_permanent, /// Create temporary channels b_channel_create_temporary, /// Create private channel b_channel_create_private, /// Create channels with a topic b_channel_create_with_topic, /// Create channels with a description b_channel_create_with_description, /// Create password protected channels b_channel_create_with_password, /// Create channels using Speex Narrowband (8 kHz) codecs b_channel_create_modify_with_codec_speex8, /// Create channels using Speex Wideband (16 kHz) codecs b_channel_create_modify_with_codec_speex16, /// Create channels using Speex Ultra-Wideband (32 kHz) codecs b_channel_create_modify_with_codec_speex32, /// Create channels using the CELT Mono (48 kHz) codec b_channel_create_modify_with_codec_celtmono48, /// Create channels using OPUS (voice) codec b_channel_create_modify_with_codec_opusvoice, /// Create channels using OPUS (music) codec b_channel_create_modify_with_codec_opusmusic, /// Create channels with custom codec quality i_channel_create_modify_with_codec_maxquality, /// Create channels with minimal custom codec latency factor i_channel_create_modify_with_codec_latency_factor_min, /// Create channels with custom max clients b_channel_create_with_maxclients, /// Create channels with custom max family clients b_channel_create_with_maxfamilyclients, /// Create channels with custom sort order b_channel_create_with_sortorder, /// Create default channels b_channel_create_with_default, /// Create channels with needed talk power b_channel_create_with_needed_talk_power, /// Create new channels only with password b_channel_create_modify_with_force_password, /// Max delete delay for temporary channels i_channel_create_modify_with_temp_delete_delay, /// Move channels b_channel_modify_parent, /// Make channel default b_channel_modify_make_default, /// Make channel permanent b_channel_modify_make_permanent, /// Make channel semi-permanent b_channel_modify_make_semi_permanent, /// Make channel temporary b_channel_modify_make_temporary, /// Modify channel name b_channel_modify_name, /// Modify channel topic b_channel_modify_topic, /// Modify channel description b_channel_modify_description, /// Modify channel password b_channel_modify_password, /// Modify channel codec b_channel_modify_codec, /// Modify channel codec quality b_channel_modify_codec_quality, /// Modify channel codec latency factor b_channel_modify_codec_latency_factor, /// Modify channels max clients b_channel_modify_maxclients, /// Modify channels max family clients b_channel_modify_maxfamilyclients, /// Modify channel sort order b_channel_modify_sortorder, /// Change needed channel talk power b_channel_modify_needed_talk_power, /// Channel modify power i_channel_modify_power, /// Needed channel modify power i_channel_needed_modify_power, /// Make channel codec encrypted b_channel_modify_make_codec_encrypted, /// Modify temporary channel delete delay b_channel_modify_temp_delete_delay, /// Delete permanent channels b_channel_delete_permanent, /// Delete semi-permanent channels b_channel_delete_semi_permanent, /// Delete temporary channels b_channel_delete_temporary, /// Force channel delete b_channel_delete_flag_force, /// Delete channel power i_channel_delete_power, /// Needed delete channel power i_channel_needed_delete_power, /// Join permanent channels b_channel_join_permanent, /// Join semi-permanent channels b_channel_join_semi_permanent, /// Join temporary channels b_channel_join_temporary, /// Join channel ignoring its password b_channel_join_ignore_password, /// Ignore channels max clients limit b_channel_join_ignore_maxclients, /// Channel join power i_channel_join_power, /// Needed channel join power i_channel_needed_join_power, /// Channel subscribe power i_channel_subscribe_power, /// Needed channel subscribe power i_channel_needed_subscribe_power, /// Channel description view power i_channel_description_view_power, /// Needed channel needed description view power i_channel_needed_description_view_power, /// Group icon identifier i_icon_id, /// Max icon filesize in bytes i_max_icon_filesize, /// Enables icon management b_icon_manage, /// Group is permanent b_group_is_permanent, /// Group auto-update type i_group_auto_update_type, /// Group auto-update max value i_group_auto_update_max_value, /// Group sort id i_group_sort_id, /// Show group name in tree depending on selected mode i_group_show_name_in_tree, /// List server groups b_virtualserver_servergroup_list, /// List server group permissions b_virtualserver_servergroup_permission_list, /// List clients from a server group b_virtualserver_servergroup_client_list, /// List channel groups b_virtualserver_channelgroup_list, /// List channel group permissions b_virtualserver_channelgroup_permission_list, /// List clients from a channel group b_virtualserver_channelgroup_client_list, /// List client permissions b_virtualserver_client_permission_list, /// List channel permissions b_virtualserver_channel_permission_list, /// List channel client permissions b_virtualserver_channelclient_permission_list, /// Create server groups b_virtualserver_servergroup_create, /// Create channel groups b_virtualserver_channelgroup_create, /// Group modify power i_group_modify_power, /// Needed group modify power i_group_needed_modify_power, /// Group member add power i_group_member_add_power, /// Needed group member add power i_group_needed_member_add_power, /// Group member delete power i_group_member_remove_power, /// Needed group member delete power i_group_needed_member_remove_power, /// Permission modify power i_permission_modify_power, /// Ignore needed permission modify power b_permission_modify_power_ignore, /// Delete server groups b_virtualserver_servergroup_delete, /// Delete channel groups b_virtualserver_channelgroup_delete, /// Client permission modify power i_client_permission_modify_power, /// Needed client permission modify power i_client_needed_permission_modify_power, /// Max additional connections per client identity i_client_max_clones_uid, /// Max idle time in seconds i_client_max_idletime, /// Max avatar filesize in bytes i_client_max_avatar_filesize, /// Max channel subscriptions i_client_max_channel_subscriptions, /// Client is priority speaker b_client_is_priority_speaker, /// Ignore channel group permissions b_client_skip_channelgroup_permissions, /// Force Push-To-Talk capture mode b_client_force_push_to_talk, /// Ignore bans b_client_ignore_bans, /// Ignore antiflood measurements b_client_ignore_antiflood, /// Issue query commands from client b_client_issue_client_query_command, /// Use an reserved slot b_client_use_reserved_slot, /// Use channel commander b_client_use_channel_commander, /// Allow to request talk power b_client_request_talker, /// Allow deletion of avatars from other clients b_client_avatar_delete_other, /// Client will be sticked to current channel b_client_is_sticky, /// Client ignores sticky flag b_client_ignore_sticky, /// Retrieve client information b_client_info_view, /// Retrieve client permissions overview b_client_permissionoverview_view, /// Retrieve clients own permissions overview b_client_permissionoverview_own, /// View client IP address and port b_client_remoteaddress_view, /// ServerQuery view power i_client_serverquery_view_power, /// Needed ServerQuery view power i_client_needed_serverquery_view_power, /// View custom fields b_client_custom_info_view, /// Client kick power from server i_client_kick_from_server_power, /// Needed client kick power from server i_client_needed_kick_from_server_power, /// Client kick power from channel i_client_kick_from_channel_power, /// Needed client kick power from channel i_client_needed_kick_from_channel_power, /// Client ban power i_client_ban_power, /// Needed client ban power i_client_needed_ban_power, /// Client move power i_client_move_power, /// Needed client move power i_client_needed_move_power, /// Complain power i_client_complain_power, /// Needed complain power i_client_needed_complain_power, /// Show complain list b_client_complain_list, /// Delete own complains b_client_complain_delete_own, /// Delete complains b_client_complain_delete, /// Show banlist b_client_ban_list, /// Add a ban b_client_ban_create, /// Delete own bans b_client_ban_delete_own, /// Delete bans b_client_ban_delete, /// Max bantime i_client_ban_max_bantime, /// Client private message power i_client_private_textmessage_power, /// Needed client private message power i_client_needed_private_textmessage_power, /// Send text messages to virtual server b_client_server_textmessage_send, /// Send text messages to channel b_client_channel_textmessage_send, /// Send offline messages to clients b_client_offline_textmessage_send, /// Client talk power i_client_talk_power, /// Needed client talk power i_client_needed_talk_power, /// Client poke power i_client_poke_power, /// Needed client poke power i_client_needed_poke_power, /// Set the talker flag for clients and allow them to speak b_client_set_flag_talker, /// Client whisper power i_client_whisper_power, /// Client needed whisper power i_client_needed_whisper_power, /// Edit a clients description b_client_modify_description, /// Allow client to edit own description b_client_modify_own_description, /// Edit a clients properties in the database b_client_modify_dbproperties, /// Delete a clients properties in the database b_client_delete_dbproperties, /// Create or modify own ServerQuery account b_client_create_modify_serverquery_login, /// Browse files without channel password b_ft_ignore_password, /// Retrieve list of running filetransfers b_ft_transfer_list, /// File upload power i_ft_file_upload_power, /// Needed file upload power i_ft_needed_file_upload_power, /// File download power i_ft_file_download_power, /// Needed file download power i_ft_needed_file_download_power, /// File delete power i_ft_file_delete_power, /// Needed file delete power i_ft_needed_file_delete_power, /// File rename power i_ft_file_rename_power, /// Needed file rename power i_ft_needed_file_rename_power, /// File browse power i_ft_file_browse_power, /// Needed file browse power i_ft_needed_file_browse_power, /// Create directory power i_ft_directory_create_power, /// Needed create directory power i_ft_needed_directory_create_power, /// Download quota per client in MByte i_ft_quota_mb_download_per_client, /// Upload quota per client in MByte i_ft_quota_mb_upload_per_client, // ReSharper restore InconsistentNaming, UnusedMember.Global } public static partial class TsPermissionHelper { public static string GetDescription(TsPermission permid) { switch (permid) { case TsPermission.undefined: return "Undefined permission"; case TsPermission.unknown: return "May occour on error returns with no associated permission"; case TsPermission.b_serverinstance_help_view: return "Retrieve information about ServerQuery commands"; case TsPermission.b_serverinstance_version_view: return "Retrieve global server version (including platform and build number)"; case TsPermission.b_serverinstance_info_view: return "Retrieve global server information"; case TsPermission.b_serverinstance_virtualserver_list: return "List virtual servers stored in the database"; case TsPermission.b_serverinstance_binding_list: return "List active IP bindings on multi-homed machines"; case TsPermission.b_serverinstance_permission_list: return "List permissions available available on the server instance"; case TsPermission.b_serverinstance_permission_find: return "Search permission assignments by name or ID"; case TsPermission.b_virtualserver_create: return "Create virtual servers"; case TsPermission.b_virtualserver_delete: return "Delete virtual servers"; case TsPermission.b_virtualserver_start_any: return "Start any virtual server in the server instance"; case TsPermission.b_virtualserver_stop_any: return "Stop any virtual server in the server instance"; case TsPermission.b_virtualserver_change_machine_id: return "Change a virtual servers machine ID"; case TsPermission.b_virtualserver_change_template: return "Edit virtual server default template values"; case TsPermission.b_serverquery_login: return "Login to ServerQuery"; case TsPermission.b_serverinstance_textmessage_send: return "Send text messages to all virtual servers at once"; case TsPermission.b_serverinstance_log_view: return "Retrieve global server log"; case TsPermission.b_serverinstance_log_add: return "Write to global server log"; case TsPermission.b_serverinstance_stop: return "Shutdown the server process"; case TsPermission.b_serverinstance_modify_settings: return "Edit global settings"; case TsPermission.b_serverinstance_modify_querygroup: return "Edit global ServerQuery groups"; case TsPermission.b_serverinstance_modify_templates: return "Edit global template groups"; case TsPermission.b_virtualserver_select: return "Select a virtual server"; case TsPermission.b_virtualserver_info_view: return "Retrieve virtual server information"; case TsPermission.b_virtualserver_connectioninfo_view: return "Retrieve virtual server connection information"; case TsPermission.b_virtualserver_channel_list: return "List channels on a virtual server"; case TsPermission.b_virtualserver_channel_search: return "Search for channels on a virtual server"; case TsPermission.b_virtualserver_client_list: return "List clients online on a virtual server"; case TsPermission.b_virtualserver_client_search: return "Search for clients online on a virtual server"; case TsPermission.b_virtualserver_client_dblist: return "List client identities known by the virtual server"; case TsPermission.b_virtualserver_client_dbsearch: return "Search for client identities known by the virtual server"; case TsPermission.b_virtualserver_client_dbinfo: return "Retrieve client information"; case TsPermission.b_virtualserver_permission_find: return "Find permissions"; case TsPermission.b_virtualserver_custom_search: return "Find custom fields"; case TsPermission.b_virtualserver_start: return "Start own virtual server"; case TsPermission.b_virtualserver_stop: return "Stop own virtual server"; case TsPermission.b_virtualserver_token_list: return "List privilege keys available"; case TsPermission.b_virtualserver_token_add: return "Create new privilege keys"; case TsPermission.b_virtualserver_token_use: return "Use a privilege keys to gain access to groups"; case TsPermission.b_virtualserver_token_delete: return "Delete a privilege key"; case TsPermission.b_virtualserver_log_view: return "Retrieve virtual server log"; case TsPermission.b_virtualserver_log_add: return "Write to virtual server log"; case TsPermission.b_virtualserver_join_ignore_password: return "Join virtual server ignoring its password"; case TsPermission.b_virtualserver_notify_register: return "Register for server notifications"; case TsPermission.b_virtualserver_notify_unregister: return "Unregister from server notifications"; case TsPermission.b_virtualserver_snapshot_create: return "Create server snapshots"; case TsPermission.b_virtualserver_snapshot_deploy: return "Deploy server snapshots"; case TsPermission.b_virtualserver_permission_reset: return "Reset the server permission settings to default values"; case TsPermission.b_virtualserver_modify_name: return "Modify server name"; case TsPermission.b_virtualserver_modify_welcomemessage: return "Modify welcome message"; case TsPermission.b_virtualserver_modify_maxclients: return "Modify servers max clients"; case TsPermission.b_virtualserver_modify_reserved_slots: return "Modify reserved slots"; case TsPermission.b_virtualserver_modify_password: return "Modify server password"; case TsPermission.b_virtualserver_modify_default_servergroup: return "Modify default Server Group"; case TsPermission.b_virtualserver_modify_default_channelgroup: return "Modify default Channel Group"; case TsPermission.b_virtualserver_modify_default_channeladmingroup: return "Modify default Channel Admin Group"; case TsPermission.b_virtualserver_modify_channel_forced_silence: return "Modify channel force silence value"; case TsPermission.b_virtualserver_modify_complain: return "Modify individual complain settings"; case TsPermission.b_virtualserver_modify_antiflood: return "Modify individual antiflood settings"; case TsPermission.b_virtualserver_modify_ft_settings: return "Modify file transfer settings"; case TsPermission.b_virtualserver_modify_ft_quotas: return "Modify file transfer quotas"; case TsPermission.b_virtualserver_modify_hostmessage: return "Modify individual hostmessage settings"; case TsPermission.b_virtualserver_modify_hostbanner: return "Modify individual hostbanner settings"; case TsPermission.b_virtualserver_modify_hostbutton: return "Modify individual hostbutton settings"; case TsPermission.b_virtualserver_modify_port: return "Modify server port"; case TsPermission.b_virtualserver_modify_autostart: return "Modify server autostart"; case TsPermission.b_virtualserver_modify_needed_identity_security_level: return "Modify required identity security level"; case TsPermission.b_virtualserver_modify_priority_speaker_dimm_modificator: return "Modify priority speaker dimm modificator"; case TsPermission.b_virtualserver_modify_log_settings: return "Modify log settings"; case TsPermission.b_virtualserver_modify_min_client_version: return "Modify min client version"; case TsPermission.b_virtualserver_modify_icon_id: return "Modify server icon"; case TsPermission.b_virtualserver_modify_weblist: return "Modify web server list reporting settings"; case TsPermission.b_virtualserver_modify_codec_encryption_mode: return "Modify codec encryption mode"; case TsPermission.b_virtualserver_modify_temporary_passwords: return "Modify temporary serverpasswords"; case TsPermission.b_virtualserver_modify_temporary_passwords_own: return "Modify own temporary serverpasswords"; case TsPermission.b_virtualserver_modify_channel_temp_delete_delay_default: return "Modify default temporary channel delete delay"; case TsPermission.b_virtualserver_modify_nickname: return "Modify server nicknames"; case TsPermission.b_virtualserver_modify_integrations: return "Modify integrations"; case TsPermission.i_channel_min_depth: return "Min channel creation depth in hierarchy"; case TsPermission.i_channel_max_depth: return "Max channel creation depth in hierarchy"; case TsPermission.b_channel_group_inheritance_end: return "Stop inheritance of channel group permissions"; case TsPermission.i_channel_permission_modify_power: return "Modify channel permission power"; case TsPermission.i_channel_needed_permission_modify_power: return "Needed modify channel permission power"; case TsPermission.b_channel_info_view: return "Retrieve channel information"; case TsPermission.b_channel_create_child: return "Create sub-channels"; case TsPermission.b_channel_create_permanent: return "Create permanent channels"; case TsPermission.b_channel_create_semi_permanent: return "Create semi-permanent channels"; case TsPermission.b_channel_create_temporary: return "Create temporary channels"; case TsPermission.b_channel_create_private: return "Create private channel"; case TsPermission.b_channel_create_with_topic: return "Create channels with a topic"; case TsPermission.b_channel_create_with_description: return "Create channels with a description"; case TsPermission.b_channel_create_with_password: return "Create password protected channels"; case TsPermission.b_channel_create_modify_with_codec_speex8: return "Create channels using Speex Narrowband (8 kHz) codecs"; case TsPermission.b_channel_create_modify_with_codec_speex16: return "Create channels using Speex Wideband (16 kHz) codecs"; case TsPermission.b_channel_create_modify_with_codec_speex32: return "Create channels using Speex Ultra-Wideband (32 kHz) codecs"; case TsPermission.b_channel_create_modify_with_codec_celtmono48: return "Create channels using the CELT Mono (48 kHz) codec"; case TsPermission.b_channel_create_modify_with_codec_opusvoice: return "Create channels using OPUS (voice) codec"; case TsPermission.b_channel_create_modify_with_codec_opusmusic: return "Create channels using OPUS (music) codec"; case TsPermission.i_channel_create_modify_with_codec_maxquality: return "Create channels with custom codec quality"; case TsPermission.i_channel_create_modify_with_codec_latency_factor_min: return "Create channels with minimal custom codec latency factor"; case TsPermission.b_channel_create_with_maxclients: return "Create channels with custom max clients"; case TsPermission.b_channel_create_with_maxfamilyclients: return "Create channels with custom max family clients"; case TsPermission.b_channel_create_with_sortorder: return "Create channels with custom sort order"; case TsPermission.b_channel_create_with_default: return "Create default channels"; case TsPermission.b_channel_create_with_needed_talk_power: return "Create channels with needed talk power"; case TsPermission.b_channel_create_modify_with_force_password: return "Create new channels only with password"; case TsPermission.i_channel_create_modify_with_temp_delete_delay: return "Max delete delay for temporary channels"; case TsPermission.b_channel_modify_parent: return "Move channels"; case TsPermission.b_channel_modify_make_default: return "Make channel default"; case TsPermission.b_channel_modify_make_permanent: return "Make channel permanent"; case TsPermission.b_channel_modify_make_semi_permanent: return "Make channel semi-permanent"; case TsPermission.b_channel_modify_make_temporary: return "Make channel temporary"; case TsPermission.b_channel_modify_name: return "Modify channel name"; case TsPermission.b_channel_modify_topic: return "Modify channel topic"; case TsPermission.b_channel_modify_description: return "Modify channel description"; case TsPermission.b_channel_modify_password: return "Modify channel password"; case TsPermission.b_channel_modify_codec: return "Modify channel codec"; case TsPermission.b_channel_modify_codec_quality: return "Modify channel codec quality"; case TsPermission.b_channel_modify_codec_latency_factor: return "Modify channel codec latency factor"; case TsPermission.b_channel_modify_maxclients: return "Modify channels max clients"; case TsPermission.b_channel_modify_maxfamilyclients: return "Modify channels max family clients"; case TsPermission.b_channel_modify_sortorder: return "Modify channel sort order"; case TsPermission.b_channel_modify_needed_talk_power: return "Change needed channel talk power"; case TsPermission.i_channel_modify_power: return "Channel modify power"; case TsPermission.i_channel_needed_modify_power: return "Needed channel modify power"; case TsPermission.b_channel_modify_make_codec_encrypted: return "Make channel codec encrypted"; case TsPermission.b_channel_modify_temp_delete_delay: return "Modify temporary channel delete delay"; case TsPermission.b_channel_delete_permanent: return "Delete permanent channels"; case TsPermission.b_channel_delete_semi_permanent: return "Delete semi-permanent channels"; case TsPermission.b_channel_delete_temporary: return "Delete temporary channels"; case TsPermission.b_channel_delete_flag_force: return "Force channel delete"; case TsPermission.i_channel_delete_power: return "Delete channel power"; case TsPermission.i_channel_needed_delete_power: return "Needed delete channel power"; case TsPermission.b_channel_join_permanent: return "Join permanent channels"; case TsPermission.b_channel_join_semi_permanent: return "Join semi-permanent channels"; case TsPermission.b_channel_join_temporary: return "Join temporary channels"; case TsPermission.b_channel_join_ignore_password: return "Join channel ignoring its password"; case TsPermission.b_channel_join_ignore_maxclients: return "Ignore channels max clients limit"; case TsPermission.i_channel_join_power: return "Channel join power"; case TsPermission.i_channel_needed_join_power: return "Needed channel join power"; case TsPermission.i_channel_subscribe_power: return "Channel subscribe power"; case TsPermission.i_channel_needed_subscribe_power: return "Needed channel subscribe power"; case TsPermission.i_channel_description_view_power: return "Channel description view power"; case TsPermission.i_channel_needed_description_view_power: return "Needed channel needed description view power"; case TsPermission.i_icon_id: return "Group icon identifier"; case TsPermission.i_max_icon_filesize: return "Max icon filesize in bytes"; case TsPermission.b_icon_manage: return "Enables icon management"; case TsPermission.b_group_is_permanent: return "Group is permanent"; case TsPermission.i_group_auto_update_type: return "Group auto-update type"; case TsPermission.i_group_auto_update_max_value: return "Group auto-update max value"; case TsPermission.i_group_sort_id: return "Group sort id"; case TsPermission.i_group_show_name_in_tree: return "Show group name in tree depending on selected mode"; case TsPermission.b_virtualserver_servergroup_list: return "List server groups"; case TsPermission.b_virtualserver_servergroup_permission_list: return "List server group permissions"; case TsPermission.b_virtualserver_servergroup_client_list: return "List clients from a server group"; case TsPermission.b_virtualserver_channelgroup_list: return "List channel groups"; case TsPermission.b_virtualserver_channelgroup_permission_list: return "List channel group permissions"; case TsPermission.b_virtualserver_channelgroup_client_list: return "List clients from a channel group"; case TsPermission.b_virtualserver_client_permission_list: return "List client permissions"; case TsPermission.b_virtualserver_channel_permission_list: return "List channel permissions"; case TsPermission.b_virtualserver_channelclient_permission_list: return "List channel client permissions"; case TsPermission.b_virtualserver_servergroup_create: return "Create server groups"; case TsPermission.b_virtualserver_channelgroup_create: return "Create channel groups"; case TsPermission.i_group_modify_power: return "Group modify power"; case TsPermission.i_group_needed_modify_power: return "Needed group modify power"; case TsPermission.i_group_member_add_power: return "Group member add power"; case TsPermission.i_group_needed_member_add_power: return "Needed group member add power"; case TsPermission.i_group_member_remove_power: return "Group member delete power"; case TsPermission.i_group_needed_member_remove_power: return "Needed group member delete power"; case TsPermission.i_permission_modify_power: return "Permission modify power"; case TsPermission.b_permission_modify_power_ignore: return "Ignore needed permission modify power"; case TsPermission.b_virtualserver_servergroup_delete: return "Delete server groups"; case TsPermission.b_virtualserver_channelgroup_delete: return "Delete channel groups"; case TsPermission.i_client_permission_modify_power: return "Client permission modify power"; case TsPermission.i_client_needed_permission_modify_power: return "Needed client permission modify power"; case TsPermission.i_client_max_clones_uid: return "Max additional connections per client identity"; case TsPermission.i_client_max_idletime: return "Max idle time in seconds"; case TsPermission.i_client_max_avatar_filesize: return "Max avatar filesize in bytes"; case TsPermission.i_client_max_channel_subscriptions: return "Max channel subscriptions"; case TsPermission.b_client_is_priority_speaker: return "Client is priority speaker"; case TsPermission.b_client_skip_channelgroup_permissions: return "Ignore channel group permissions"; case TsPermission.b_client_force_push_to_talk: return "Force Push-To-Talk capture mode"; case TsPermission.b_client_ignore_bans: return "Ignore bans"; case TsPermission.b_client_ignore_antiflood: return "Ignore antiflood measurements"; case TsPermission.b_client_issue_client_query_command: return "Issue query commands from client"; case TsPermission.b_client_use_reserved_slot: return "Use an reserved slot"; case TsPermission.b_client_use_channel_commander: return "Use channel commander"; case TsPermission.b_client_request_talker: return "Allow to request talk power"; case TsPermission.b_client_avatar_delete_other: return "Allow deletion of avatars from other clients"; case TsPermission.b_client_is_sticky: return "Client will be sticked to current channel"; case TsPermission.b_client_ignore_sticky: return "Client ignores sticky flag"; case TsPermission.b_client_info_view: return "Retrieve client information"; case TsPermission.b_client_permissionoverview_view: return "Retrieve client permissions overview"; case TsPermission.b_client_permissionoverview_own: return "Retrieve clients own permissions overview"; case TsPermission.b_client_remoteaddress_view: return "View client IP address and port"; case TsPermission.i_client_serverquery_view_power: return "ServerQuery view power"; case TsPermission.i_client_needed_serverquery_view_power: return "Needed ServerQuery view power"; case TsPermission.b_client_custom_info_view: return "View custom fields"; case TsPermission.i_client_kick_from_server_power: return "Client kick power from server"; case TsPermission.i_client_needed_kick_from_server_power: return "Needed client kick power from server"; case TsPermission.i_client_kick_from_channel_power: return "Client kick power from channel"; case TsPermission.i_client_needed_kick_from_channel_power: return "Needed client kick power from channel"; case TsPermission.i_client_ban_power: return "Client ban power"; case TsPermission.i_client_needed_ban_power: return "Needed client ban power"; case TsPermission.i_client_move_power: return "Client move power"; case TsPermission.i_client_needed_move_power: return "Needed client move power"; case TsPermission.i_client_complain_power: return "Complain power"; case TsPermission.i_client_needed_complain_power: return "Needed complain power"; case TsPermission.b_client_complain_list: return "Show complain list"; case TsPermission.b_client_complain_delete_own: return "Delete own complains"; case TsPermission.b_client_complain_delete: return "Delete complains"; case TsPermission.b_client_ban_list: return "Show banlist"; case TsPermission.b_client_ban_create: return "Add a ban"; case TsPermission.b_client_ban_delete_own: return "Delete own bans"; case TsPermission.b_client_ban_delete: return "Delete bans"; case TsPermission.i_client_ban_max_bantime: return "Max bantime"; case TsPermission.i_client_private_textmessage_power: return "Client private message power"; case TsPermission.i_client_needed_private_textmessage_power: return "Needed client private message power"; case TsPermission.b_client_server_textmessage_send: return "Send text messages to virtual server"; case TsPermission.b_client_channel_textmessage_send: return "Send text messages to channel"; case TsPermission.b_client_offline_textmessage_send: return "Send offline messages to clients"; case TsPermission.i_client_talk_power: return "Client talk power"; case TsPermission.i_client_needed_talk_power: return "Needed client talk power"; case TsPermission.i_client_poke_power: return "Client poke power"; case TsPermission.i_client_needed_poke_power: return "Needed client poke power"; case TsPermission.b_client_set_flag_talker: return "Set the talker flag for clients and allow them to speak"; case TsPermission.i_client_whisper_power: return "Client whisper power"; case TsPermission.i_client_needed_whisper_power: return "Client needed whisper power"; case TsPermission.b_client_modify_description: return "Edit a clients description"; case TsPermission.b_client_modify_own_description: return "Allow client to edit own description"; case TsPermission.b_client_modify_dbproperties: return "Edit a clients properties in the database"; case TsPermission.b_client_delete_dbproperties: return "Delete a clients properties in the database"; case TsPermission.b_client_create_modify_serverquery_login: return "Create or modify own ServerQuery account"; case TsPermission.b_ft_ignore_password: return "Browse files without channel password"; case TsPermission.b_ft_transfer_list: return "Retrieve list of running filetransfers"; case TsPermission.i_ft_file_upload_power: return "File upload power"; case TsPermission.i_ft_needed_file_upload_power: return "Needed file upload power"; case TsPermission.i_ft_file_download_power: return "File download power"; case TsPermission.i_ft_needed_file_download_power: return "Needed file download power"; case TsPermission.i_ft_file_delete_power: return "File delete power"; case TsPermission.i_ft_needed_file_delete_power: return "Needed file delete power"; case TsPermission.i_ft_file_rename_power: return "File rename power"; case TsPermission.i_ft_needed_file_rename_power: return "Needed file rename power"; case TsPermission.i_ft_file_browse_power: return "File browse power"; case TsPermission.i_ft_needed_file_browse_power: return "Needed file browse power"; case TsPermission.i_ft_directory_create_power: return "Create directory power"; case TsPermission.i_ft_needed_directory_create_power: return "Needed create directory power"; case TsPermission.i_ft_quota_mb_download_per_client: return "Download quota per client in MByte"; case TsPermission.i_ft_quota_mb_upload_per_client: return "Upload quota per client in MByte"; default: throw Tools.UnhandledDefault(permid); } } } } ================================================ FILE: TSLib/Generated/TsPermission.tt ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // <#@ template debug="false" hostspecific="true" language="C#" #> <#@ assembly name="System.Core" #> <#@ assembly name="Microsoft.VisualBasic" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="Microsoft.VisualBasic.FileIO" #> <#@ output extension=".cs" #> <# string declFilePath = Host.ResolvePath("../Declarations/Permissions.csv"); var data = new List(); using (TextFieldParser parser = new TextFieldParser(declFilePath)) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); while (!parser.EndOfData) data.Add(parser.ReadFields()); } #> using TSLib.Helper; namespace TSLib { // Source: https://www.tsviewer.com/index.php?page=faq&id=12&newlanguage=en public enum TsPermission { // ReSharper disable InconsistentNaming, UnusedMember.Global undefined,<# foreach (var line in data.Skip(1)) { #> /// <#= line[1] #> <#= line[0] #>,<# } #> // ReSharper restore InconsistentNaming, UnusedMember.Global } public static partial class TsPermissionHelper { public static string GetDescription(TsPermission permid) { switch (permid) { case TsPermission.undefined: return "Undefined permission";<# foreach (var line in data.Skip(1)) { #> case TsPermission.<#= line[0] #>: return "<#= line[1] #>";<# } #> default: throw Tools.UnhandledDefault(permid); } } } } ================================================ FILE: TSLib/Generated/TsVersion.gen.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // namespace TSLib { partial class TsVersionSigned { // ReSharper disable InconsistentNaming, UnusedMember.Global public static TsVersionSigned VER_WIN_3_X_X { get; } = new TsVersionSigned("3.?.? [Build: 5680278000] DEBUG", "Windows", ClientPlatform.Windows, 5680278000UL, "FaA10gndI44f19ZThYJX2OSM8ESrx9/vJ2uY+rON4enzzPsPR9kiPhsUXtMcC5szzTu6F/vLCiNNEhCr70CKCQ=="); public static TsVersionSigned VER_MAC_3_X_X { get; } = new TsVersionSigned("3.?.? [Build: 5680278000]", "OS X", ClientPlatform.MacOs, 5680278000UL, "SttEnjoWE8jqIM6BOHSfiZP9DGjW0EP/ajU4bdKqgGMV4aYq/kzwVA9gxbmdIzV4lbaokvXBqrRjfBHrTVh8Cg=="); public static TsVersionSigned VER_LIN_3_X_X { get; } = new TsVersionSigned("3.?.? [Build: 5680278000]", "Linux", ClientPlatform.Linux, 5680278000UL, "Hjd+N58Gv3ENhoKmGYy2bNRBsNNgm5kpiaQWxOj5HN2DXttG6REjymSwJtpJ8muC2gSwRuZi0R+8Laan5ts5CQ=="); public static TsVersionSigned VER_IOS_3_X_X { get; } = new TsVersionSigned("3.?.? [Build: 5680278000]", "iOS", ClientPlatform.Ios, 5680278000UL, "XrAf+Buq6Eb0ehEW/niFp06YX+nGGOS0Ke4MoUBzn+cX9q6G5C0A/d5XtgcNMe8r9jJgV/adIYVpsGS3pVlSAA=="); public static TsVersionSigned VER_AND_3_X_X { get; } = new TsVersionSigned("3.?.? [Build: 5680278000]", "Android", ClientPlatform.Android, 5680278000UL, "AWb948BY32Z7bpIyoAlQguSmxOGcmjESPceQe1DpW5IZ4+AW1KfTk2VUIYNfUPsxReDJMCtlhVKslzhR2lf0AA=="); public static TsVersionSigned VER_MAC_5_0_0 { get; } = new TsVersionSigned("5.0.0-beta.25 [Build: 1588064367]", "macOS", ClientPlatform.MacOs, 1588064367UL, "+Y1iB58sLO38/4AI1YRUlEhXhhrbkAVbaSmOcZj0IrTmQm1eY+prEYJPQgF8StFdjWmAGmMG3ezzb0wEzRE3CQ=="); public static TsVersionSigned VER_LIN_5_0_0 { get; } = new TsVersionSigned("5.0.0-beta.25 [Build: 1588064367]", "Linux", ClientPlatform.Linux, 1588064367UL, "L5rpK9OLT84Hgpg/NXSCwpHfrRc/JTtMa/kFfaD2rlF7c/YHiEnly/4+A9y0iowA70+5JEzyH6CBjkniiz4DAw=="); public static TsVersionSigned VER_WIN_3_5_3 { get; } = new TsVersionSigned("3.5.3 [Build: 1587971024]", "Windows", ClientPlatform.Windows, 1587971024UL, "Kvmj7qX6wJCPI5GVT71samfmhz/bvs7M+OTXWB/JWxdQbxDe17xda7dzUWLX7pjvdJTqZmbse1HBmTxThPKvAg=="); public static TsVersionSigned VER_LIN_3_5_3 { get; } = new TsVersionSigned("3.5.3 [Build: 1587971024]", "Linux", ClientPlatform.Linux, 1587971024UL, "59chu1YQ1W4DdVj+yJOVmwhJK7s9p9FatqIjQRxEDmIb0CcDDO/K8CrbVnBHbD67/cExJbC3PjC/o/n0pDbiCg=="); public static TsVersionSigned VER_WIN_5_0_0 { get; } = new TsVersionSigned("5.0.0-test.111 [Build: 1587633723]", "Windows", ClientPlatform.Windows, 1587633723UL, "60DETVUkR9veo0Cc9WCV+t3r0w836CfRZTgw/sZH0LL6AwtAab8sbcYNcOBybSssn+QgZI37kdc7B9YViszgCw=="); public static TsVersionSigned VER_MAC_3_5_3 { get; } = new TsVersionSigned("3.5.3 [Build: 1586955962]", "OS X", ClientPlatform.MacOs, 1586955962UL, "/9gsbyyJoyHW1okwykGgXrn2j29wvnEfnw6/Hvft2WS12CURxTv5L9uLuu36I5u3TzWOxyB9dEbD1FeZ201uCQ=="); public static TsVersionSigned VER_WIN_3_5_2 { get; } = new TsVersionSigned("3.5.2 [Build: 1585812952]", "Windows", ClientPlatform.Windows, 1585812952UL, "6HIIG9j6bIUavbDFJR50Hk3hwl1j4BL/1hQS5Q4JfAS0oerwLNBbdAfXM963aOlE8yan9d/LWiXnuSKhQXAKAQ=="); public static TsVersionSigned VER_MAC_3_5_2 { get; } = new TsVersionSigned("3.5.2 [Build: 1585812952]", "OS X", ClientPlatform.MacOs, 1585812952UL, "VhEA3HpeSCbV06Dfh5wonQ+XMuC8dG96ZXvU5HCNLvkSatAfOsDGLaQNLfbkVZVcs0Hvf9oPFgWvAseSX96rCw=="); public static TsVersionSigned VER_LIN_3_5_2 { get; } = new TsVersionSigned("3.5.2 [Build: 1585812952]", "Linux", ClientPlatform.Linux, 1585812952UL, "Fy5GNeXUzrP5chKDWhG4G7T3jj8tjg0JkoTNRl+tgrONOWNbNf1zBD+I2LNqJREJXvaSrXcMB1pOQQrWKIXqDQ=="); public static TsVersionSigned VER_WIN_3_5_1 { get; } = new TsVersionSigned("3.5.1 [Build: 1584955996]", "Windows", ClientPlatform.Windows, 1584955996UL, "LY20d0yqDFwknHND8FYADnvsKnq81kya6lAEnJEQ+87oN0k8KqTXMDpy/0z0yC54+B8Mo/P8kSjrpRugaVAPDA=="); public static TsVersionSigned VER_MAC_3_5_1 { get; } = new TsVersionSigned("3.5.1 [Build: 1584955996]", "OS X", ClientPlatform.MacOs, 1584955996UL, "xk8NdgtqWPihDy1gUPGVtcLkfrl5Fd2lfigB0N7d9K0VGyCxC4ZvQOdX6kM/StTX1xulCnENp0wb+gqwjO5nBA=="); public static TsVersionSigned VER_LIN_3_5_1 { get; } = new TsVersionSigned("3.5.1 [Build: 1584955996]", "Linux", ClientPlatform.Linux, 1584955996UL, "YtR6uJ0zzFwlAXoV1ikV8DVD9y7ka0WCh46wvALArdCBw9zaBLE7ese6Uu3U2Dmg4//ook5cNvupeOlzHcGPDQ=="); public static TsVersionSigned VER_WIN_3_5_0 { get; } = new TsVersionSigned("3.5.0 [Build: 1584610661]", "Windows", ClientPlatform.Windows, 1584610661UL, "8um3guYdjDlKHOUZMYqt//4nT9k+SBYnAAP/9CarVp5pUXEzYaTZlflyOi6hjYIDn5cQ7gdvrKmdXLOXBJiqCA=="); public static TsVersionSigned VER_MAC_3_5_0 { get; } = new TsVersionSigned("3.5.0 [Build: 1584610661]", "OS X", ClientPlatform.MacOs, 1584610661UL, "RZJrT/fysauFMv9ugB82ZAZN/t/MSWeJmFLu35FXx/r+3O1QZrM8rDfU5Iq/moG68hPRcc12KloOvrlVTdfiBg=="); public static TsVersionSigned VER_LIN_3_5_0 { get; } = new TsVersionSigned("3.5.0 [Build: 1584610661]", "Linux", ClientPlatform.Linux, 1584610661UL, "kHfR/JyZ6Ah06rW/t+dFIHkOgLGFth5CCbRr9T3xfPd2gqL5CeYei47LGBjA9K9GrVVRivF0L5eo5MrxGh/QDA=="); public static TsVersionSigned VER_IOS_3_5_1 { get; } = new TsVersionSigned("3.5.1 [Build: 1582118844]", "iOS", ClientPlatform.Ios, 1582118844UL, "3ZiKmiSA9g1xUhb67wgAPz7duV97QCoMQn4OmjqXUffVN5cvztaUhIBm0oZ8n0DEXsgx8hulbqWBFIN8QgAIBA=="); public static TsVersionSigned VER_AND_3_5_0 { get; } = new TsVersionSigned("3.5.0 [Build: 1582117478]", "Android", ClientPlatform.Android, 1582117478UL, "vASJQFPECG2TpUh5ATsR2c/gVrvsuZ9QlMpKN51F+HnanYNH3oCSGoievQX6ACjsKH3OZihNFQZ6f5HRU/MAAg=="); public static TsVersionSigned VER_IOS_3_5_0 { get; } = new TsVersionSigned("3.5.0 [Build: 1574357871]", "iOS", ClientPlatform.Ios, 1574357871UL, "9m9E+yrIfJKmRDvujRH5IsbHXClEbgm9zRms+iL9ikLhiM1gzIBWBVVUKFqmtpSSZDq3lnmkN9DmaC8gxhvPBw=="); public static TsVersionSigned VER_WIN_3_3_2 { get; } = new TsVersionSigned("3.3.2 [Build: 1566767614]", "Windows", ClientPlatform.Windows, 1566767614UL, "fAjM3pPl95eGXrhFcsvCXgdI6Epr8XpafOJZlYbFws2VMllYy/4DUleSVzPuVqu/TCgrTaqb0wP+KANse3/vAw=="); public static TsVersionSigned VER_MAC_3_3_2 { get; } = new TsVersionSigned("3.3.2 [Build: 1566767614]", "OS X", ClientPlatform.MacOs, 1566767614UL, "JiKoykMS5BExaAEMpIYB3JRH+YturPua/Q+VTQxJGRi002zni9b8ReitLaJJQt2EMcNAbDpl57um4mekqFvGBA=="); public static TsVersionSigned VER_LIN_3_3_2 { get; } = new TsVersionSigned("3.3.2 [Build: 1566767614]", "Linux", ClientPlatform.Linux, 1566767614UL, "UhiFNnz8npgT22qkLXlZJnX3T2n+a8usv/0cTh+tgybrgsFd2WIuI3eabWCibPeU+AYeHLaeYR+x+pF4GX/NDw=="); public static TsVersionSigned VER_WIN_3_3_1 { get; } = new TsVersionSigned("3.3.1 [Build: 1566673023]", "Windows", ClientPlatform.Windows, 1566673023UL, "utZjz6KhPiaR9zdhS3NvbLpi4oTGH/vseHd9/mUrLxYYD5JvfeeHH6nzLf8H3manoNrQnONsCcqUOvYglCotCQ=="); public static TsVersionSigned VER_MAC_3_3_1 { get; } = new TsVersionSigned("3.3.1 [Build: 1566673023]", "OS X", ClientPlatform.MacOs, 1566673023UL, "dNpW3zyuLCNdhCJpCbaCHWob9xnHSbrRNyJgNShwAPQfyclrtarPLOiTYN9IgQbIGxTu1Yo4fra59VHzpHhaDQ=="); public static TsVersionSigned VER_LIN_3_3_1 { get; } = new TsVersionSigned("3.3.1 [Build: 1566673023]", "Linux", ClientPlatform.Linux, 1566673023UL, "IdO00q19oqEwf9CB1R2c+2ZALMrUC6YPwTohdmD9abnDzpfDH/P/p70oDolrL+pRLoh1LjDiLtUdKRETLbeqAw=="); public static TsVersionSigned VER_AND_3_3_1 { get; } = new TsVersionSigned("3.3.1 [Build: 1564678999]", "Android", ClientPlatform.Android, 1564678999UL, "kPqHuXEgLxpThXc5XYdvTLk+iaY0AL99jf2WJIXKBJuCJmD0pfW1Ep/zYCxU2NGsu4HIHMMXnB0d2lkr7AHiDw=="); public static TsVersionSigned VER_WIN_3_3_0 { get; } = new TsVersionSigned("3.3.0 [Build: 1560850141]", "Windows", ClientPlatform.Windows, 1560850141UL, "v9gCHwBYJKBxLWwptMvqhj+tvWuSAz/AjcThvv/J3ZNsPeivRk4P9Y9YtalQbIRkrALQSC+qNc5wIAw4HG2cCA=="); public static TsVersionSigned VER_MAC_3_3_0 { get; } = new TsVersionSigned("3.3.0 [Build: 1560850141]", "OS X", ClientPlatform.MacOs, 1560850141UL, "Z/UJgrYae1BsdKJfvMorW4/zIQ8E0sKBMTBI5Cm58oYE3TtCE9+1FpUE9VkqWSm3J8SMmu2+J/FpaK6pa8KaBQ=="); public static TsVersionSigned VER_LIN_3_3_0 { get; } = new TsVersionSigned("3.3.0 [Build: 1560850141]", "Linux", ClientPlatform.Linux, 1560850141UL, "8giDUlJFDtdmzpfyngDzL3UP47C1+U1iwrzROU70MoiSeswf1oJujYeQ1bx4dD2OPxF4Avi/XgbZUQ/Y4NcDAA=="); public static TsVersionSigned VER_AND_3_3_0 { get; } = new TsVersionSigned("3.3.0 [Build: 1559834030]", "Android", ClientPlatform.Android, 1559834030UL, "Ux59iejFFnEANHPjL4dmwUgXKhvnV7dPqjzAIqYMNs0RoF9RyhsgxEaJO72IgNt7D3yaD+4lGtYfcEFG8WDKCg=="); public static TsVersionSigned VER_IOS_3_3_0 { get; } = new TsVersionSigned("3.3.0 [Build: 1559144369]", "iOS", ClientPlatform.Ios, 1559144369UL, "xXYmjT4t0D0Oll99yVPTsRXxJuqFr4ShKEtetow7ii6Qwkm3mkMIrg67NR8foo24bBQgcY+s1CQC88CD8WT6Bg=="); public static TsVersionSigned VER_WIN_3_2_5 { get; } = new TsVersionSigned("3.2.5 [Build: 1555517253]", "Windows", ClientPlatform.Windows, 1555517253UL, "iyy+8G7ksPHvXb45ijQ9Kfr8TMsCc3sGRKJLiPArx7YMPu8YV4GgYzM4+MpuMQUTlNkU7w5B0od9IJ/7E4nDDQ=="); public static TsVersionSigned VER_MAC_3_2_5 { get; } = new TsVersionSigned("3.2.5 [Build: 1555517253]", "OS X", ClientPlatform.MacOs, 1555517253UL, "xrP7+C0BjffIZf7FD21P/xYoCSTmq8nCa3w2q3McX2DlUIEjfMLAX7uepdeiNYZfspAWJmi9QIkpQCltNBwqAg=="); public static TsVersionSigned VER_LIN_3_2_5 { get; } = new TsVersionSigned("3.2.5 [Build: 1555517253]", "Linux", ClientPlatform.Linux, 1555517253UL, "+nqAMBv2NxHYfPwHyRmleALMU/2gpiv1LAV6dmrLjNXaTS3BwLBVuysSuqHsuiK3/Xff0IRRFANz8qT1ztJqDQ=="); public static TsVersionSigned VER_MAC_0_0_1 { get; } = new TsVersionSigned("0.0.1 [Build: 1555082010]", "OS X", ClientPlatform.MacOs, 1555082010UL, "o/GYOMVcxtE+JWFjozRjS9FJ/h35gGcPfvZkc23AlglNXI5aj6oGg3Gin3M1fLOnSOxn3TSU5WhaQtvCYZgZDg=="); public static TsVersionSigned VER_WIN_0_0_1 { get; } = new TsVersionSigned("0.0.1 [Build: 1555015683]", "Windows", ClientPlatform.Windows, 1555015683UL, "AMnbAjVfFPOWlwcEFQjz0pokTLpjGEN7TdH6HliidbMBQXLlj9T/LmwRr+IT/ZjpY9+znSXLbVmF2+d0jLRLAA=="); public static TsVersionSigned VER_AND_3_2_5 { get; } = new TsVersionSigned("3.2.5 [Build: 1554991343]", "Android", ClientPlatform.Android, 1554991343UL, "HkOn2tmPaY8qTNhnpZl34QkmhHJzOBVuUdeANQQoCMqDyDovii5zFJnGALyuab5/bHPl9rqy1jllmhWlm34JCA=="); public static TsVersionSigned VER_LIN_0_0_1 { get; } = new TsVersionSigned("0.0.1 [Build: 1550226976]", "Linux", ClientPlatform.Linux, 1550226976UL, "22vWrtMv2ObaBwrQGw2CLs2LzUQJ94KoXiVuMObXf5pfoIw2MY4ZqMt8oL9CCyQBtKl6vV3CZntLrAR25ljeDw=="); public static TsVersionSigned VER_IOS_3_2_3 { get; } = new TsVersionSigned("3.2.3 [Build: 1538494750]", "iOS", ClientPlatform.Ios, 1538494750UL, "YgRxbZGpaxVAPuC3bln8HiCdgyx8EgM37H+VCSjZnn+05+lo1w74P9LFHSVqr1NBuB5YtKNWp0xjHRbBZVJtDQ=="); public static TsVersionSigned VER_WIN_3_2_3 { get; } = new TsVersionSigned("3.2.3 [Build: 1538467030]", "Windows", ClientPlatform.Windows, 1538467030UL, "dZ1i/CsCaAh4F7Pi2F/FfaBpdTmUuNVsAIRnqm86FUR3HhwBRn+xlmbwRF8gObgFMuwFMCLmawncFWplSILKAQ=="); public static TsVersionSigned VER_MAC_3_2_3 { get; } = new TsVersionSigned("3.2.3 [Build: 1538467030]", "OS X", ClientPlatform.MacOs, 1538467030UL, "yr8F54NuExnwarhvcJ27f3LvDop1wqwrhyqEVvpliRKi0hLD3e+cW2mJWRkq0eDjPRQ2kzPvBst9yNH1MsuYAQ=="); public static TsVersionSigned VER_LIN_3_2_3 { get; } = new TsVersionSigned("3.2.3 [Build: 1538467030]", "Linux", ClientPlatform.Linux, 1538467030UL, "pEBdtUvRUmczMmHZM5xmeZuiRP/Kb/H2YShNKGpaat8aPTmG5EF+zsbjUFNWW4tnt43Yard0bWDUsrJ9/mmjBQ=="); public static TsVersionSigned VER_AND_3_2_4 { get; } = new TsVersionSigned("3.2.4 [Build: 1537790492]", "Android", ClientPlatform.Android, 1537790492UL, "cJVVnQRoUWsYSaYKWZ/sIGAAMTpnBDFu8T6shyH5o9AXWLVyu2qRmVVuyvKmMSlEVlYNtVrHIlC2AHtq3l2nDg=="); public static TsVersionSigned VER_AND_3_2_3 { get; } = new TsVersionSigned("3.2.3 [Build: 1537790492]", "Android", ClientPlatform.Android, 1537790492UL, "qLdDfrZyNIdl1pDYtyrGbOLZK/Yi/i8PE/a7QOInsEa5/RBz+HW8EBGPvazz+lLZbHrBXyp875NyrKtLnc4dDg=="); public static TsVersionSigned VER_WIN_3_2_2 { get; } = new TsVersionSigned("3.2.2 [Build: 1537178465]", "Windows", ClientPlatform.Windows, 1537178465UL, "LHJV3O+hoZZlKWDPKH4ZMCoPUarYWwnaUgfMP+Xdm/4sY5NYUYjkVQaU4FS4pqxii5jx6O4cFToG7ekFB53NBA=="); public static TsVersionSigned VER_MAC_3_2_2 { get; } = new TsVersionSigned("3.2.2 [Build: 1537178465]", "OS X", ClientPlatform.MacOs, 1537178465UL, "QbSOeAPhPHgZKykNbEAlzGLZe8w+ulxcZXbk07wOBGLK/vWCfQlyIDPUK5DipGBUfRY9yJvxfUx7g9b5dU8aBw=="); public static TsVersionSigned VER_LIN_3_2_2 { get; } = new TsVersionSigned("3.2.2 [Build: 1537178465]", "Linux", ClientPlatform.Linux, 1537178465UL, "P2NaVyWrk5AkG1KE8hTPCT6J0ql0NzLeeII4BF3WarfVjDbekqKu2sQfO7W3OSJKN3cH8w5470csP4LZ+hrkAA=="); public static TsVersionSigned VER_IOS_3_2_2 { get; } = new TsVersionSigned("3.2.2 [Build: 1536587534]", "iOS", ClientPlatform.Ios, 1536587534UL, "4rsRo3H9Uw0kui/cQkaBiqYy8ox6/gC6jDUVktcB6I71m1TeqUYy/IYMYbNSBtv0bmKntvcA0ZU79+zoXUkSAg=="); public static TsVersionSigned VER_AND_3_2_2 { get; } = new TsVersionSigned("3.2.2 [Build: 1536327256]", "Android", ClientPlatform.Android, 1536327256UL, "dwHJuheBuCMZlUGz2N+DeyoWokK9/ui0CCV6HE4yJ6fqjoyFIyuX9TqXho63tNKXDa0XscL1U4TOaJlgU6pWDQ=="); public static TsVersionSigned VER_AND_3_2_1 { get; } = new TsVersionSigned("3.2.1 [Build: 1535010120]", "Android", ClientPlatform.Android, 1535010120UL, "HHlJgd/XKWFdPOR5N4n2hpsjZ3y5b+4f4x1tLk397GI+gcALWlehtQDSaxe2R975/dFcEWmHiFd9zSC3tsecDA=="); public static TsVersionSigned VER_IOS_3_2_0 { get; } = new TsVersionSigned("3.2.0 [Build: 1534410132]", "iOS", ClientPlatform.Ios, 1534410132UL, "BIWgZdgGSu6yPwCiEDQuORaLRqV1Z17ZLcxYdLqM2hfWXiKwBOO/j5eH4IH7LGubFfDwdGcVW2RUYKATpaJAAA=="); public static TsVersionSigned VER_AND_3_2_0 { get; } = new TsVersionSigned("3.2.0 [Build: 1534407950]", "Android", ClientPlatform.Android, 1534407950UL, "rY2Hhki/5tJZW5YyJI6S9o9zuU4IGFpONwR6JBJ3Q7Pukfj08z2brFwCmGR61RzH8IaoPxoAWXIHQoHp6fUABQ=="); public static TsVersionSigned VER_WIN_3_2_1 { get; } = new TsVersionSigned("3.2.1 [Build: 1534255236]", "Windows", ClientPlatform.Windows, 1534255236UL, "RtNOb2UrlXwwy3lplxRilvknygxamwb3eKlRRAsG5YjrMEikStl/Sf+oJgFUFBBMSJ+q+xPx3+xfOmMxAkB8Bg=="); public static TsVersionSigned VER_MAC_3_2_1 { get; } = new TsVersionSigned("3.2.1 [Build: 1534255236]", "OS X", ClientPlatform.MacOs, 1534255236UL, "AWbZhd8XH+s7uu5Qkb2QkdDcc9/WXfNu2iKWD+e6m2oTrOmI1Jt55SsyDTvkpBpumnWsrtR/GI2nK9HbmFhGAw=="); public static TsVersionSigned VER_LIN_3_2_1 { get; } = new TsVersionSigned("3.2.1 [Build: 1534255236]", "Linux", ClientPlatform.Linux, 1534255236UL, "betw82OYRNjyhXDHmmUKwR6xfvyPHBMdkn+jukQKNG8PPLKOfLFb0OAMXPZxp9n8gio840gFowwA/jnbg/OMBw=="); public static TsVersionSigned VER_WIN_3_2_0 { get; } = new TsVersionSigned("3.2.0 [Build: 1533739581]", "Windows", ClientPlatform.Windows, 1533739581UL, "TJ1XoCjQz+VxW15qiGInWf5llTBtVu+2m2ShbY0/HWTM7adLyfThq7wzSgr09Fvowibvu91nOFxTlIpPXCAVAQ=="); public static TsVersionSigned VER_MAC_3_2_0 { get; } = new TsVersionSigned("3.2.0 [Build: 1533739581]", "OS X", ClientPlatform.MacOs, 1533739581UL, "WkySbYMiHN22ra3Y1cktHyeNikQ4fZ0K++8brc+8ImYhuzrmuzeGwL+QNaPJNty7stTNCfRUSpDzVAWz5TYQCA=="); public static TsVersionSigned VER_LIN_3_2_0 { get; } = new TsVersionSigned("3.2.0 [Build: 1533739581]", "Linux", ClientPlatform.Linux, 1533739581UL, "Vt+iPp952TU4uKwGXY0L61mXgBNfXg+1+16fnS0snPU9fhkfOKzdPN4rBELOwJ5XzZc33KdVC8rzZGYzlQceBg=="); public static TsVersionSigned VER_WIN_3_1_10 { get; } = new TsVersionSigned("3.1.10 [Build: 1528537615]", "Windows", ClientPlatform.Windows, 1528537615UL, "+/BWvueikGg4YkO1v2uuZB5vtJJgUZ5bL8cRfxAstfnCVdro2ja+4a+8rGUzDx8/vvTZOUVD6U95hnWb638MCQ=="); public static TsVersionSigned VER_MAC_3_1_10 { get; } = new TsVersionSigned("3.1.10 [Build: 1528537615]", "OS X", ClientPlatform.MacOs, 1528537615UL, "AJMF6gyw5DBtzAuW7aA7YcZaLIgOHFappwzWtE+0UUMYgMjMkSZ1LewDaW3YyRDHuLG5Nb7X26VNhFNZu+ohBw=="); public static TsVersionSigned VER_LIN_3_1_10 { get; } = new TsVersionSigned("3.1.10 [Build: 1528537615]", "Linux", ClientPlatform.Linux, 1528537615UL, "jEfjYy09JfbJPZ+W3fwqygOu8uuc5raYTGpbJ5F8dHLHpqUfvmCyJVKoXRieMNkmPzeiylsUc9/HiV+8bt8tDw=="); public static TsVersionSigned VER_WIN_3_1_9 { get; } = new TsVersionSigned("3.1.9 [Build: 1525442084]", "Windows", ClientPlatform.Windows, 1525442084UL, "2SLjPTFXM9hQyNkeEGYIzs0fkBffyhsh5z+ZuaCcZdDfM8vgRM5lrAU6KNspFjLddcvw8cXw6gxRY73ZHsRVBg=="); public static TsVersionSigned VER_MAC_3_1_9 { get; } = new TsVersionSigned("3.1.9 [Build: 1525442084]", "OS X", ClientPlatform.MacOs, 1525442084UL, "WVaMmYPig4eG2JUM8cMMW2MA7+IoRoPUSr74CPe7oS8TLHGjYxPr1FP88op6YsFFQrPJysWmIsnGR7BiFXjHCQ=="); public static TsVersionSigned VER_LIN_3_1_9 { get; } = new TsVersionSigned("3.1.9 [Build: 1525442084]", "Linux", ClientPlatform.Linux, 1525442084UL, "wBcnfNU7FA0CvFeisKhywZWzmUqD6IBFbYQTveMvxWowXUjWwNHTg9tbRLQ1YgBFDdlOwV36VMX7aAMXMX2rAA=="); public static TsVersionSigned VER_IOS_3_1_8 { get; } = new TsVersionSigned("3.1.8 [Build: 1516887927]", "iOS", ClientPlatform.Ios, 1516887927UL, "pdWyIOpTWECIdA2NExrjqY1a7Q0alFyU7MgiDJYdiUXAspusOHwMIcfKm7oAh+Ty2gcgVgOh8wAPyZcKFKYXBA=="); public static TsVersionSigned VER_AND_3_1_8 { get; } = new TsVersionSigned("3.1.8 [Build: 1516865456]", "Android", ClientPlatform.Android, 1516865456UL, "sG/qsKb9iZpBRXFSYY2Tuq7ZLUKHcmgA/6Qe/cx35L3risqoH4aGkPkDicuKtaQi8Ikh4IrQz6xe7V49M+8VBg=="); public static TsVersionSigned VER_WIN_3_1_8 { get; } = new TsVersionSigned("3.1.8 [Build: 1516614607]", "Windows", ClientPlatform.Windows, 1516614607UL, "gDEgQf/BiOQZdAheKccM1XWcMUj2OUQqt75oFuvF2c0MQMXyv88cZQdUuckKbcBRp7RpmLInto4PIgd7mPO7BQ=="); public static TsVersionSigned VER_MAC_3_1_8 { get; } = new TsVersionSigned("3.1.8 [Build: 1516614607]", "OS X", ClientPlatform.MacOs, 1516614607UL, "93J+FDUbtRjonzFnQpGdgN6+o4jwI2M65zEKftQILCdZlGHGfc7z5Z9+TM6nU0/pnPgTqvKmaw9WYPsh88iCCA=="); public static TsVersionSigned VER_LIN_3_1_8 { get; } = new TsVersionSigned("3.1.8 [Build: 1516614607]", "Linux", ClientPlatform.Linux, 1516614607UL, "LJ5q+KWT4KwBX7oR/9j9A12hBrq5ds5ony99f9kepNmqFskhT7gfB51bAJNgAMOzXVCeaItNmc10F2wUNktqCw=="); public static TsVersionSigned VER_WIN_3_1_7 { get; } = new TsVersionSigned("3.1.7 [Build: 1513163251]", "Windows", ClientPlatform.Windows, 1513163251UL, "tdNngCAZ1ImAf7BxJzO4RXv5nBRsUERsrSOnMKVUFNQg6BS4Bzag0RFgLVzs2DRj19AC8+q5cXgH+5Ms50mTCA=="); public static TsVersionSigned VER_MAC_3_1_7 { get; } = new TsVersionSigned("3.1.7 [Build: 1513163251]", "OS X", ClientPlatform.MacOs, 1513163251UL, "41eIdGPhullYi9ofXewHPXf232ZbepovkYsmR3Kc4CPlA5d/K599m5BZYBYwSz1/YfKvbTzzg0VE0FRbhcZmBQ=="); public static TsVersionSigned VER_LIN_3_1_7 { get; } = new TsVersionSigned("3.1.7 [Build: 1513163251]", "Linux", ClientPlatform.Linux, 1513163251UL, "/j5TZqPuOU8yMYPdGehvijYvU74KefRrKO5sgTUrkpeslNFiy4XfU7quKW0diLHQoPQn1t3KArdfzOAMk8dlAg=="); public static TsVersionSigned VER_AND_3_1_7 { get; } = new TsVersionSigned("3.1.7 [Build: 1512665843]", "Android", ClientPlatform.Android, 1512665843UL, "J04O7RCgM3ZlecpZz5H8IgWggyCJQB5KG4/MEEB5/mrW6XJEK4J5IpU3jKztkvy54B8Nrj9tbwMaRujZfILSAg=="); public static TsVersionSigned VER_IOS_3_1_6 { get; } = new TsVersionSigned("3.1.6 [Build: 1502881949]", "iOS", ClientPlatform.Ios, 1502881949UL, "DXVaZKOza0ivNdKG66VPD/g+TYwio6XmJlCfralcUIpJuh3PI4ZgAnjxzXONzTmgFm0O/rb2iN/vvxIYwhcqAQ=="); public static TsVersionSigned VER_WIN_3_1_6 { get; } = new TsVersionSigned("3.1.6 [Build: 1502873983]", "Windows", ClientPlatform.Windows, 1502873983UL, "73fB82Jt1lmIRHKBFaE8h1JKPGFbnt6/yrXOHwTS93Oo7Adx1usY5TzNg+8BKy9nmmA2FEBnRmz5cRfXDghnBA=="); public static TsVersionSigned VER_MAC_3_1_6 { get; } = new TsVersionSigned("3.1.6 [Build: 1502873983]", "OS X", ClientPlatform.MacOs, 1502873983UL, "ELteM70OI6OkQ6hjOr1m1ZXxDtOeCI7pqO2ce7+Sw7CoUgKlqxreTKVSlHpD7XfCEuqo3AdNfxWUNAaBci3DDA=="); public static TsVersionSigned VER_LIN_3_1_6 { get; } = new TsVersionSigned("3.1.6 [Build: 1502873983]", "Linux", ClientPlatform.Linux, 1502873983UL, "o+l92HKfiUF+THx2rBsuNjj/S1QpxG1fd5o3Q7qtWxkviR3LI3JeWyc26eTmoQoMTgI3jjHV7dCwHsK1BVu6Aw=="); public static TsVersionSigned VER_AND_3_1_6 { get; } = new TsVersionSigned("3.1.6 [Build: 1502275280]", "Android", ClientPlatform.Android, 1502275280UL, "sEg1lt9N9lck/Kub6/N6kffI28dEsTrybGLsLc/MeWWfZ/t3EoVwwqCcBxEbUZyszx1htnbnWbd/dYBcrjSCCw=="); public static TsVersionSigned VER_WIN_3_1_5 { get; } = new TsVersionSigned("3.1.5 [Build: 1500537355]", "Windows", ClientPlatform.Windows, 1500537355UL, "O9WqHB9oX0qe9AXIYmJm0+mzl6VLxNvrGF0lGlovLaig5MXUIwd6T00NkCj62OkBbzM3eECs9FUuJk7N8V0dCg=="); public static TsVersionSigned VER_MAC_3_1_5 { get; } = new TsVersionSigned("3.1.5 [Build: 1500537355]", "OS X", ClientPlatform.MacOs, 1500537355UL, "oiS3ROFEy4r7zhkmCuj4cro2kIwntHNpuTFpFB+zV+AkfwX3Y2F51/JJPWG0J63tPR82n3ot/JiDkJqPKBJpDg=="); public static TsVersionSigned VER_LIN_3_1_5 { get; } = new TsVersionSigned("3.1.5 [Build: 1500537355]", "Linux", ClientPlatform.Linux, 1500537355UL, "Ea/9gUeh5HuXyiOZ+gRDPOn0rDHzXDVSYB70qy/BtczJPZn/0dDwQgRAF7/W6vHcaH67j+IF9AtUpuDCA6yzBw=="); public static TsVersionSigned VER_WIN_3_1_4_2 { get; } = new TsVersionSigned("3.1.4.2 [Build: 1498644101]", "Windows", ClientPlatform.Windows, 1498644101UL, "WtscrpvJG13kbF6aoVzsGwQuE/WwR1b8++ydDc8IpmiXLw+zFC6zFUvLinOeE0zZgh2Hs5Amp3DZoPJSynOWBg=="); public static TsVersionSigned VER_MAC_3_1_4_2 { get; } = new TsVersionSigned("3.1.4.2 [Build: 1498644101]", "OS X", ClientPlatform.MacOs, 1498644101UL, "MMVozpqhiRqPHFu+skm8ftODA2waeWJx2trAx205schgiJMz+H4KOLfoa92Fjrn8kAQZxpA3krUro/iBpJYkBw=="); public static TsVersionSigned VER_LIN_3_1_4_2 { get; } = new TsVersionSigned("3.1.4.2 [Build: 1498644101]", "Linux", ClientPlatform.Linux, 1498644101UL, "Rv3SzHDwLIkuUqySQhn279jf2b7PPzCQH2q53zHWH5qyFL/Qw4m/n7ZrXEF46/sUSpOPFPYjfKMKcN/9IRCoCQ=="); public static TsVersionSigned VER_AND_3_1_3_1 { get; } = new TsVersionSigned("3.1.3.1 [Build: 1493128735]", "Android", ClientPlatform.Android, 1493128735UL, "Me2oMSfwCsCCGsBtgDTy+TCidslmK66JxQVR2qFsKv0v6izk6o7jzuPIFdL8Fo4rVegdCyuXPbzmOPe9j71YCQ=="); public static TsVersionSigned VER_WIN_3_1_4 { get; } = new TsVersionSigned("3.1.4 [Build: 1491993378]", "Windows", ClientPlatform.Windows, 1491993378UL, "rwdyEwnJCzbVfNCqbxMrRyhL5BSYqYSzKQkeZ6m5KImc1F8VB8wEkwwwyxoG7SimC/sxIyy4h27CjBFP6rcgBQ=="); public static TsVersionSigned VER_MAC_3_1_4 { get; } = new TsVersionSigned("3.1.4 [Build: 1491993378]", "OS X", ClientPlatform.MacOs, 1491993378UL, "JSg4RcthTCvJUSXTLhrmdPt1592Nk1lG9AuXg+yIyOBL6tlb030+hXniu/QrI2NeNHAMYxTJgZyi+rTnu6sFCQ=="); public static TsVersionSigned VER_LIN_3_1_4 { get; } = new TsVersionSigned("3.1.4 [Build: 1491993378]", "Linux", ClientPlatform.Linux, 1491993378UL, "wJPx0S2Q2S8EgSEpZhu+Yp80d6xVQDX5u9DYgm7XxI7sh7gJIoBbdaE5cfjwR2UN6XFyV+V/2AV4stB3CxtgCQ=="); public static TsVersionSigned VER_IOS_3_1_2 { get; } = new TsVersionSigned("3.1.2 [Build: 1490291439]", "iOS", ClientPlatform.Ios, 1490291439UL, "mTC8yRgh04oHF3jKleXVy5324ysJKp2LQIUhWh85MXqPTjh9CD0pgiUIoTuCzDQTNutAzRefcLVwniaIhNCnAw=="); public static TsVersionSigned VER_WIN_3_1_3 { get; } = new TsVersionSigned("3.1.3 [Build: 1490279472]", "Windows", ClientPlatform.Windows, 1490279472UL, "7RPY2bzJmMdgVX24VuKD3lTnYYb6yHWqfn2x21tFOjXL9q+2t7tU9Vy8Bh5/IpeiqklUHTWc23mWpYOCoW9eCA=="); public static TsVersionSigned VER_LIN_3_1_3 { get; } = new TsVersionSigned("3.1.3 [Build: 1490279472]", "Linux", ClientPlatform.Linux, 1490279472UL, "Y1M2TQvKLGmUSP4YPuTBQOeUxmF+jaqazFXuN4v2gOKP8QmxyYOsg9PsG9z7SFYQkgneQxs8QdzC+IGo0bOWBQ=="); public static TsVersionSigned VER_WIN_3_1_2 { get; } = new TsVersionSigned("3.1.2 [Build: 1489662774]", "Windows", ClientPlatform.Windows, 1489662774UL, "5Aaj21gGFtrjW9424ezfLa1SMQBpZvgQgcJLZmrLoNMe4XebBPV2s8rxEDAIodfFpruLxLFbFpH63A/BGnJyDw=="); public static TsVersionSigned VER_MAC_3_1_2 { get; } = new TsVersionSigned("3.1.2 [Build: 1489662774]", "OS X", ClientPlatform.MacOs, 1489662774UL, "571chpoaq6bxLisThXfiU3zB7pU0NOmH/Qso8ABTR0TXmcK9Y16pYwmPFs/d7fmcHVeI3xSM4dbgzKjRSB61Dg=="); public static TsVersionSigned VER_LIN_3_1_2 { get; } = new TsVersionSigned("3.1.2 [Build: 1489662774]", "Linux", ClientPlatform.Linux, 1489662774UL, "W9TgKEviDgWvrQErw8vaoQcPboaUx8xRL5MPoQzlur9eO2yseHgvzkpWGYqSQyCI+ptcCpTHaXRFym0imKnfBA=="); public static TsVersionSigned VER_WIN_3_1_1_1 { get; } = new TsVersionSigned("3.1.1.1 [Build: 1487668590]", "Windows", ClientPlatform.Windows, 1487668590UL, "CchjMitGiVGfRlGph0D1mDjOCJCnkVxR/WuYvNHdPyeQUCncRWML8jYxYfnhRF6CzViwYRnsmZkN+W5oenB2CQ=="); public static TsVersionSigned VER_MAC_3_1_1_1 { get; } = new TsVersionSigned("3.1.1.1 [Build: 1487668590]", "OS X", ClientPlatform.MacOs, 1487668590UL, "WrETtyinA18FGhiDC458SwfGDozCnM+euEDmCeyC1YgQnfaEC49FtoVAbw2fry/daonzgxmyNBymVHhoUX5iDA=="); public static TsVersionSigned VER_LIN_3_1_1_1 { get; } = new TsVersionSigned("3.1.1.1 [Build: 1487668590]", "Linux", ClientPlatform.Linux, 1487668590UL, "0B4RK2WOu5w39+CLznQtaexYeNqqBwU9YHBvSLw3bu+OAne8XtFc2NJzepjynrxwc1/xsmrm8uEZJzqzF+TcAg=="); public static TsVersionSigned VER_WIN_3_1_1 { get; } = new TsVersionSigned("3.1.1 [Build: 1486712038]", "Windows", ClientPlatform.Windows, 1486712038UL, "sryyx++NhRWKDAo+Tnwv9N+IrOaQBP0XjjDszY0BBv0YIMr4jmdHtgrwzWkUqhU7kfql7qBWIhlb/r0l1ZHeBw=="); public static TsVersionSigned VER_LIN_3_1_1 { get; } = new TsVersionSigned("3.1.1 [Build: 1486712038]", "Linux", ClientPlatform.Linux, 1486712038UL, "umeERdZkG9pS3oeJTirnYK9Q947j8lVlszz2VXBPcjhQrsiKFM6lIkbj3K2HSqA/hJ+sUOcuZgo880PmU6ZdCw=="); public static TsVersionSigned VER_WIN_3_1_0_1 { get; } = new TsVersionSigned("3.1.0.1 [Build: 1484223040]", "Windows", ClientPlatform.Windows, 1484223040UL, "oaaorJ4co/sS2m5JT5oRiu9AieW6kfFY+RENqPfp26iP4pbWbf9GcZj+JhDA+/JyLpfueCcSulZSRRbash2JCw=="); public static TsVersionSigned VER_LIN_3_1_0_1 { get; } = new TsVersionSigned("3.1.0.1 [Build: 1484223040]", "Linux", ClientPlatform.Linux, 1484223040UL, "xWfxm14Vw53mTMHuzeaIM428KkoI/2wuoR4O2TIuy2Q7ZpwaN48vG0rMJbUQNVycP8rRHg+bIGuFiJai8f5dDg=="); public static TsVersionSigned VER_AND_3_1_0 { get; } = new TsVersionSigned("3.1.0 [Build: 1481889010]", "Android", ClientPlatform.Android, 1481889010UL, "eH8svg9XpltTbw+UYkQ4ixfqpbEAhwO9nmDDUWuI11swEU3Ye5HKGlFv70LxHZSgYlEqEH/N1J9U4ygptbPIDg=="); public static TsVersionSigned VER_WIN_3_1 { get; } = new TsVersionSigned("3.1 [Build: 1481795005]", "Windows", ClientPlatform.Windows, 1481795005UL, "3TpZZM0V+PKHELFnsfRPoKjEFfvfHUL/6mUP5LHbI3nvmdOjRqEEKi4ndXZG6OpWOKQ3VeadHDH0KBfD8EI2Cg=="); public static TsVersionSigned VER_LIN_3_1 { get; } = new TsVersionSigned("3.1 [Build: 1481795005]", "Linux", ClientPlatform.Linux, 1481795005UL, "xpJQcdaIImbctnJw0PnLQOIZBcmN+HDGcjxoIW8So7SSdSYLyUI5lAECWaCewbYmNKqaO85YqXPiNXfOBM5fBA=="); public static TsVersionSigned VER_IOS_3_1 { get; } = new TsVersionSigned("3.1 [Build: 1481641346]", "iOS", ClientPlatform.Ios, 1481641346UL, "SDH0QNTA1wDQdfIU0HbcRugD3qkkPHnvlSq/IeW/I4A2myFQnDbzm8ilEGR0vOU4NoTae8CH5XsBmRqwyPIeBA=="); public static TsVersionSigned VER_WIN_3_0_19_4 { get; } = new TsVersionSigned("3.0.19.4 [Build: 1468491418]", "Windows", ClientPlatform.Windows, 1468491418UL, "ldWL49uDKC3N9uxdgWRMTOzUuiG1nBqUiOa+Nal5HvdxJiN4fsTnmmPo5tvglN7WqoVoFfuuKuYq1LzodtEtCg=="); public static TsVersionSigned VER_MAC_3_0_19_4 { get; } = new TsVersionSigned("3.0.19.4 [Build: 1468491418]", "OS X", ClientPlatform.MacOs, 1468491418UL, "Pvcizdk3HRQMzTLt7goUYBmmS5nbAS1g2E6HIypLU+9eXTqGTBLim0UUtKc0s867TFHbK91GroDrTtv0aMUGAw=="); public static TsVersionSigned VER_LIN_3_0_19_4 { get; } = new TsVersionSigned("3.0.19.4 [Build: 1468491418]", "Linux", ClientPlatform.Linux, 1468491418UL, "jvhhk75EV3nCGeewx4Y5zZmiZSN07q5ByKZ9Wlmg85aAbnw7c1jKq5/Iq0zY6dfGwCEwuKod0I5lQcVLf2NTCg=="); public static TsVersionSigned VER_WIN_3_0_19_3 { get; } = new TsVersionSigned("3.0.19.3 [Build: 1466672534]", "Windows", ClientPlatform.Windows, 1466672534UL, "a1OYzvM18mrmfUQBUgxYBxYz2DUU6y5k3/mEL6FurzU0y97Bd1FL7+PRpcHyPkg4R+kKAFZ1nhyzbgkGphDWDg=="); public static TsVersionSigned VER_WIN_3_0_19_2 { get; } = new TsVersionSigned("3.0.19.2 [Build: 1466597785]", "Windows", ClientPlatform.Windows, 1466597785UL, "sDOzu7rCGb7kBID2WbBk35DjPijKkXzujnsAtLhXxhkQ+am0JlDOpuU1ISHhq9gCl/Qo0dzc723o0AIPI+yoCQ=="); public static TsVersionSigned VER_WIN_3_0_20 { get; } = new TsVersionSigned("3.0.20 [Build: 1465542546]", "Windows", ClientPlatform.Windows, 1465542546UL, "vDK31sOwOvDpTXgqAJzmR1NzeUeSDG9dLMgIz5LCX+KpDSVD/qU60mzScz9tuc9AsLyrL8DxHpDDO3eQD+hYCA=="); public static TsVersionSigned VER_AND_3_0_23 { get; } = new TsVersionSigned("3.0.23 [Build: 1463662487]", "Android", ClientPlatform.Android, 1463662487UL, "RN+cwFI+jSHJEhggucIuUyEteWNVFy4iw0QDp3qn2UzfopypFVE9BPZqJjBUGeoCN7Q/SfYL4RNIRzJEQaZUCA=="); public static TsVersionSigned VER_WIN_3_0_19_1 { get; } = new TsVersionSigned("3.0.19.1 [Build: 1461588969]", "Windows", ClientPlatform.Windows, 1461588969UL, "KYo52MA89dowkYpFU1KixgHngjbJ6F2Yi++5tbaqBlBpz9YikX2gI3sqmU1kP1ghsKCLKM7o0patDH1hv9bmAg=="); public static TsVersionSigned VER_MAC_3_0_19_1 { get; } = new TsVersionSigned("3.0.19.1 [Build: 1461588969]", "OS X", ClientPlatform.MacOs, 1461588969UL, "J4cWj2v28tC/8uRqXB1nnAQPfFngOFE/E4Yx7uKMY+Cb8csFrhsJW4J8i+t3dpvZeMJ0BJnB0a/dZ1iL4zh1Dw=="); public static TsVersionSigned VER_WIN_3_0_19 { get; } = new TsVersionSigned("3.0.19 [Build: 1459504131]", "Windows", ClientPlatform.Windows, 1459504131UL, "JoHyZHF4k/a3+QH1zPNSEzc40487fzbpssyRZtoWB5kbQorAJgwlpcScA08J4vjGoUbdaTZsT0vCw56wo/Q9Ag=="); public static TsVersionSigned VER_LIN_3_0_19 { get; } = new TsVersionSigned("3.0.19 [Build: 1459504131]", "Linux", ClientPlatform.Linux, 1459504131UL, "48s6oiT+4yKVJPsEzbPUZ2L2LqrKJ0bixxVmTFjS5f5EsfDFbD8bl7t3V+OQd84bgN7t8W80B/fjEW45IszpAg=="); public static TsVersionSigned VER_AND_3_0_21 { get; } = new TsVersionSigned("3.0.21 [Build: 1449476724]", "Android", ClientPlatform.Android, 1449476724UL, "X/xPOfXLC8ycGeWMlBc5zbyjQdBj7gYFVaSfG95gcZLoNijUaWDkB8DiqBfDvmef2JgmF8YdKTdmwjUm2n5MCw=="); public static TsVersionSigned VER_AND_3_0_20_2 { get; } = new TsVersionSigned("3.0.20.2 [Build: 1445517273]", "Android", ClientPlatform.Android, 1445517273UL, "fp6DjpIL/GlTmI3o2QEhwnXUj/pY7OFvZVPbtFBizI2Rloqm+8i0jG8Iwk05ZBn1bDOF6acPzHjBwZgl8CeWAg=="); public static TsVersionSigned VER_IOS_3_0_18_2 { get; } = new TsVersionSigned("3.0.18.2 [Build: 1445516611]", "iOS", ClientPlatform.Ios, 1445516611UL, "TEC965pHLJhoiNA2N95xBjQfh2n6uasS3BRFraucFv/+WgAKCKeoUYb3tu6feO5zvTEEiH6YCsedQdhbU1FFCw=="); public static TsVersionSigned VER_WIN_3_0_18_2 { get; } = new TsVersionSigned("3.0.18.2 [Build: 1445512488]", "Windows", ClientPlatform.Windows, 1445512488UL, "F0hY25Dtja0wcU6dzC39rNuYbhnDAbIwPHC3VO9Oicf13kUY2I2g6scPZ3p195Cw9gUYdBIRYm8ucHEhtSeWCw=="); public static TsVersionSigned VER_MAC_3_0_18_2 { get; } = new TsVersionSigned("3.0.18.2 [Build: 1445512488]", "OS X", ClientPlatform.MacOs, 1445512488UL, "hRZrg1T+25VXJffJoM9hV1qPe90HHrjbuHJM4SOj2QIasS+5bFSgzZ50/zus7Yzj8ZUovPWwn7B7WwdyiU29BQ=="); public static TsVersionSigned VER_LIN_3_0_18_2 { get; } = new TsVersionSigned("3.0.18.2 [Build: 1445512488]", "Linux", ClientPlatform.Linux, 1445512488UL, "W9sU8xDfWZ+eQryTdNxXVXM5Ak81wJpYKDLOiJoJUuEXoxcPnKBWpTr5JPrUzheQvkUYUIJf6WzgGAG2B7GYCg=="); public static TsVersionSigned VER_WIN_3_0_18_1 { get; } = new TsVersionSigned("3.0.18.1 [Build: 1444491275]", "Windows", ClientPlatform.Windows, 1444491275UL, "xqfa3CUd2GFiTqjJWYzcu9ZbxVVLng8qIMKlVxMqWdiM8JrTRiXBAaTBDd8Xc+flVe+rGSIOZTkXRsz1rqjiAA=="); public static TsVersionSigned VER_WIN_3_0_18 { get; } = new TsVersionSigned("3.0.18 [Build: 1442998335]", "Windows", ClientPlatform.Windows, 1442998335UL, "vUgm8mJoeVLBG6qB2HcYF7YNG4D+H/4edILaZbHze2Unua6mrBvNmbtRkRtmRyDZSd7sVQHMApinRDgGT1mUBw=="); public static TsVersionSigned VER_WIN_3_0_17 { get; } = new TsVersionSigned("3.0.17 [Build: 1438673913]", "Windows", ClientPlatform.Windows, 1438673913UL, "znDjHvCgmQF/jQKTK49X8tnXqF7AGXfS2XYcogww4XxNTBxp2tf1aFc/jgboKco9EuVa0ku2cf/xg9wW3Cm7AQ=="); public static TsVersionSigned VER_WIN_3_0_16 { get; } = new TsVersionSigned("3.0.16 [Build: 1407159763]", "Windows", ClientPlatform.Windows, 1407159763UL, "Y1DuQGXo/8/rYznEGyeQHgpvZMuiCH4FYm4QVyAgLYyMpNpc/LM7XetVWhDQxGsNejkN/2olI7GVJkt4X+ooDg=="); public static TsVersionSigned VER_MAC_3_0_16 { get; } = new TsVersionSigned("3.0.16 [Build: 1407159763]", "OS X", ClientPlatform.MacOs, 1407159763UL, "vLAH2cYjkF/3sQCgr/zSmtffXcH2flI2vOnUP3uNIDSm8gKO61Q2hOdQaUzXE1yekLSMx2E9RYz+OQjQ868KAw=="); public static TsVersionSigned VER_LIN_3_0_16 { get; } = new TsVersionSigned("3.0.16 [Build: 1407159763]", "Linux", ClientPlatform.Linux, 1407159763UL, "8776GitHAgkFPfOLxEh5x+Luuh4NrYPEJUdsUzNKndcAuWMYjwQTZkmeZOeG/swdn/p2Cg2pRfZfsIFSOAUWCQ=="); public static TsVersionSigned VER_WIN_3_0_15_1 { get; } = new TsVersionSigned("3.0.15.1 [Build: 1405341092]", "Windows", ClientPlatform.Windows, 1405341092UL, "b+hr0KQWOVW2WEn49BmNb08R9zimsJcThm2gEeF7EAgRUeUDYzeplh5HrHmda0ftbbnrzWV33U/GOo2LAs/rAg=="); public static TsVersionSigned VER_WIN_3_0_15 { get; } = new TsVersionSigned("3.0.15 [Build: 1403250090]", "Windows", ClientPlatform.Windows, 1403250090UL, "FKKAHPwV1swKwH6mqHqdcGuYm8o5mZw4WreBxJrQjOprC3NXXcJviPe0p7EZPI810HOWMfmQRUgFpggoRL8kAQ=="); public static TsVersionSigned VER_WIN_3_0_14 { get; } = new TsVersionSigned("3.0.14 [Build: 1394624943]", "Windows", ClientPlatform.Windows, 1394624943UL, "F0WIO9sBVzG893AtX2Jfd98cH6yZPAnfMBNvBlQbAIfvfyiq+cbjZ31AUngEjq7UPIYdnYSsdRX9hczwdBrKAQ=="); public static TsVersionSigned VER_WIN_3_0_13_1 { get; } = new TsVersionSigned("3.0.13.1 [Build: 1382530211]", "Windows", ClientPlatform.Windows, 1382530211UL, "bCIfLPUgTM6C0kNkesvhcxaDPvV9h6qLbYVy9cQVSP5lzaYebZaeDzAOOHsdjKcRTa6LU1oHEdz9D/d+2gxJCw=="); public static TsVersionSigned VER_MAC_3_0_13_1 { get; } = new TsVersionSigned("3.0.13.1 [Build: 1382530211]", "OS X", ClientPlatform.MacOs, 1382530211UL, "0KNdNcf2zmYUV7JzfKlXdM0Y6/dv9LOlETE8h2mTxq0YitdbZSObUdAJvrdiKX0LH2QP4h3QF2JeXyzjRSQTCw=="); public static TsVersionSigned VER_AND_3_0_13 { get; } = new TsVersionSigned("3.0.13 [Build: 1380616389]", "Android", ClientPlatform.Android, 1380616389UL, "04JRo/B0zh54n18a61qWr3qFUrEVQeEiy7dyIEVhCLMwY8QJwk7kwG7GQKSxnr0rmRfTzD7iDXMUWlcwgkc/Cg=="); public static TsVersionSigned VER_WIN_3_0_13 { get; } = new TsVersionSigned("3.0.13 [Build: 1380283653]", "Windows", ClientPlatform.Windows, 1380283653UL, "7dA+6EbVyMevol4gE3/Cu1WonRjqu1C6pTWF+txApbaiTgKtZ/ky+NVxluPkSDnCxXN1pOR4uGdF6B7LUqQgDQ=="); public static TsVersionSigned VER_WIN_3_0_12 { get; } = new TsVersionSigned("3.0.12 [Build: 1378715177]", "Windows", ClientPlatform.Windows, 1378715177UL, "x6wFA5xqjenf6kbAh36IC4CkrbT8/uSBpgjM9juSt9oxGCXLqHOC2oaYlB1zZSJZjT4sOrnp0M+uOdVjYCzLCg=="); public static TsVersionSigned VER_WIN_3_0_11_1 { get; } = new TsVersionSigned("3.0.11.1 [Build: 1375773286]", "Windows", ClientPlatform.Windows, 1375773286UL, "Qfvcn4uQmKETDsD4LbtdbZR8rDetJ26Z/bVbu5SZJjMjGlYEMSbJnR4PtOBshdMSEwEsAJf1G+5tjx+onm2fDA=="); public static TsVersionSigned VER_MAC_3_0_11_1 { get; } = new TsVersionSigned("3.0.11.1 [Build: 1375773286]", "OS X", ClientPlatform.MacOs, 1375773286UL, "BngQ1112epNzhND5v7uDdbClbP9dSWczXKxvi1iRQo+xWt7WLYKJu/05MrW/CtPVtKwlT4PnbfI0Trvw+HvUCA=="); public static TsVersionSigned VER_LIN_3_0_11_1 { get; } = new TsVersionSigned("3.0.11.1 [Build: 1375773286]", "Linux", ClientPlatform.Linux, 1375773286UL, "JMTTCSHw+ibyhqCDCWRgby/oJ5uAYHk0/QOwqqI5rNHCKTkb+ce6N+4J38WXAnRmtcEaMb0s30s3ipQBokrqDw=="); public static TsVersionSigned VER_WIN_3_0_11 { get; } = new TsVersionSigned("3.0.11 [Build: 1375083581]", "Windows", ClientPlatform.Windows, 1375083581UL, "54wPDkfv0kT56UE0lv/LFkFJObH+Q4Irmo4Brfz1EcvjVhj8hJ+RCHcVTZsdKU2XvVvh+VLJpURulEHsAOsyBw=="); // ReSharper restore InconsistentNaming, UnusedMember.Global } } ================================================ FILE: TSLib/Generated/TsVersion.gen.tt ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // <#@ template debug="false" hostspecific="true" language="C#" #> <#@ assembly name="System.Core" #> <#@ assembly name="Microsoft.VisualBasic" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="Microsoft.VisualBasic.FileIO" #> <#@ import namespace="System.Text.RegularExpressions" #> <#@ output extension=".cs" #> <# string declFilePath = Host.ResolvePath("../Declarations/Versions.csv"); var data = new List(); using (TextFieldParser parser = new TextFieldParser(declFilePath)) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); while (!parser.EndOfData) data.Add(parser.ReadFields()); } var dict = new Dictionary { { "Windows", new Ver { plat = "WIN", enu = "Windows" } }, { "Linux", new Ver { plat = "LIN", enu = "Linux" } }, { "OS X", new Ver { plat = "MAC", enu = "MacOs" } }, { "macOS", new Ver { plat = "MAC", enu = "MacOs" } }, { "Android", new Ver { plat = "AND", enu = "Android" } }, { "iOS", new Ver { plat = "IOS", enu = "Ios" } }, }; var reg = new Regex(@"^(\d(?:\.[\d?]+)+)"); string BuildToFld(string build) { var m = reg.Match(build); return string.Join("_", m.Groups[1].Value.Split('.').Select(x => x.Replace("?", "X"))); } #> namespace TSLib { partial class TsVersionSigned { // ReSharper disable InconsistentNaming, UnusedMember.Global<# var header = data[0]; int ichan = Array.IndexOf(header, "channel"); int iname = Array.IndexOf(header, "version"); int iplat = Array.IndexOf(header, "platform"); int ihash = Array.IndexOf(header, "hash"); var duplicates = new HashSet(); foreach (var line in data.Skip(1).Reverse()) { var ver = dict[line[iplat]]; var fldName = $"VER_{ver.plat}_{BuildToFld(line[iname])}"; if (duplicates.Contains(fldName)) continue; duplicates.Add(fldName); Regex VersionPattern = new Regex(@"([^ ])* \[Build: (\d+)\]"); var build = VersionPattern.Match(line[iname]).Groups[2].Value; #> public static TsVersionSigned <#= fldName #> { get; } = new TsVersionSigned("<#= line[iname] #>", "<#= line[iplat] #>", ClientPlatform.<#= ver.enu #>, <#= build #>UL, "<#= line[ihash] #>");<# } #> // ReSharper restore InconsistentNaming, UnusedMember.Global } } <#+ class Ver { public string plat; public string enu; } #> ================================================ FILE: TSLib/Generated/Util.ttinclude ================================================ <#@ assembly name="System.Core" #> <#@ assembly name="%userprofile%/.nuget/packages/nett/0.13.0/lib/Net40/Nett.dll" #> <#+ public void Warn(string _warn) { WriteLine($"#warning {_warn}"); } const string ConversionSet = @"#pragma warning disable CS8019 // Ignore unused imports using i8 = System.SByte; using u8 = System.Byte; using i16 = System.Int16; using u16 = System.UInt16; using i32 = System.Int32; using u32 = System.UInt32; using i64 = System.Int64; using u64 = System.UInt64; using f32 = System.Single; using f64 = System.Double; using str = System.String; using DateTime = System.DateTime; using Duration = System.TimeSpan; using DurationSeconds = System.TimeSpan; using DurationMilliseconds = System.TimeSpan; using SocketAddr = System.String; using IpAddr = System.String; using Ts3ErrorCode = TSLib.TsErrorCode; using Ts3Permission = TSLib.TsPermission; using IconHash = System.Int32; using ConnectionId = System.UInt32; using EccKeyPubP256 = TSLib.Uid; #pragma warning restore CS8019"; #> ================================================ FILE: TSLib/Helper/AsyncEventHandler.cs ================================================ using System; using System.Linq; using System.Threading.Tasks; namespace TSLib.Helper { // Normal EventHandler: // public delegate void EventHandler(object? sender, EventArgs e); public delegate Task AsyncEventHandler(object? sender, EventArgs e); public delegate Task AsyncEventHandler(object? sender, T value); public static class AsyncEventExtensions { public static Task InvokeAsync(this AsyncEventHandler? ev, object? sender, T value) { if (ev == null) return Task.CompletedTask; var invList = ev.GetInvocationList(); if (invList.Length == 1) { return ((AsyncEventHandler)invList[0]).Invoke(sender, value); } return Task.WhenAll(invList.Select(func => ((AsyncEventHandler)func).Invoke(sender, value))); } public static Task InvokeAsync(this AsyncEventHandler? ev, object? sender) => InvokeAsync(ev, sender, EventArgs.Empty); public static Task InvokeAsync(this AsyncEventHandler? ev, object? sender, EventArgs e) { if (ev == null) return Task.CompletedTask; var invList = ev.GetInvocationList(); if (invList.Length == 1) { return ((AsyncEventHandler)invList[0]).Invoke(sender, e); } return Task.WhenAll(invList.Select(func => ((AsyncEventHandler)func).Invoke(sender, e))); } } } ================================================ FILE: TSLib/Helper/CommandErrorExtensions.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace TSLib.Messages { public partial class CommandError { public static CommandError ConnectionClosed { get; } = Custom("Connection closed"); public static CommandError NoResult { get; } = Custom("Result is empty"); public static CommandError Parser { get; } = Custom("Result could not be parsed"); public static CommandError CommandTimeout { get; } = Custom("Command protocol timout"); public static CommandError Custom(string message) => new CommandError { Id = TsErrorCode.custom_error, Message = message }; public string ErrorFormat() { if (MissingPermissionId != null && MissingPermissionId != TsPermission.unknown && MissingPermissionId != TsPermission.undefined) return $"{Id}: the command failed to execute: {Message} (missing permission:{MissingPermissionId})"; else return $"{Id}: the command failed to execute: {Message}"; } } /// Provides useful extension methods for error formatting. public static class CommandErrorExtensions { public static R MapToSingle(in this R result) where T : IMessage { if (result.Ok) return MapToSingle(result.Value); return R.Err(result.Error); } public static async Task> MapToSingle(this Task> task) where T : IMessage => (await task).MapToSingle(); internal static R MapToSingle(this IEnumerable enu) where T : IMessage { var first = enu.FirstOrDefault(); if (first != null) return R.OkR(first); return R.Err(CommandError.NoResult); } public static R MapToSingle(in this R result) where T : class, IMessage => result.UnwrapNotification().MapToSingle(); public static async Task> MapToSingle(this Task> task) where T : class, IMessage => (await task).MapToSingle(); public static R UnwrapNotification(in this R result) where T : class, IMessage { if (!result.Ok) return result.Error; return R.OkR((T[])result.Value.Notifications); } public static R WrapInterface(in this R result) where TC : notnull, IMessage, TI where TI : notnull { if (!result.Ok) return result.Error; return result.Value; } } } ================================================ FILE: TSLib/Helper/DebugUtil.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Linq; namespace TSLib.Helper { internal static class DebugUtil { public static string DebugToHex(byte[] bytes) => bytes is null ? "" : DebugToHex(bytes.AsSpan()); public static string DebugToHex(ReadOnlySpan bytes) { var c = new char[bytes.Length * 3]; for (int bx = 0, cx = 0; bx < bytes.Length; ++bx, ++cx) { var b = (byte)(bytes[bx] >> 4); c[cx] = (char)(b > 9 ? b - 10 + 'A' : b + '0'); b = (byte)(bytes[bx] & 0x0F); c[++cx] = (char)(b > 9 ? b - 10 + 'A' : b + '0'); c[++cx] = ' '; } return new string(c); } public static byte[] DebugFromHex(string hex) => hex.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) .Select(x => Convert.ToByte(x, 16)).ToArray(); } } ================================================ FILE: TSLib/Helper/LogId.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TSLib.Helper { public readonly struct Id : IEquatable { public static readonly Id Null = new Id(-1); public int Value { get; } public Id(int id) { Value = id; } public static implicit operator int(Id id) => id.Value; public override string ToString() => Value.ToString(); public override bool Equals(object? obj) => obj is Id id && Equals(id); public bool Equals(Id other) => Value == other.Value; public override int GetHashCode() => Value; public static bool operator ==(Id id, Id other) => id.Value == other.Value; public static bool operator !=(Id id, Id other) => id.Value != other.Value; } } ================================================ FILE: TSLib/Helper/MissingEnumCaseException.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Runtime.Serialization; namespace TSLib.Helper { [Serializable] public sealed class MissingEnumCaseException : Exception { public MissingEnumCaseException(string enumTypeName, string valueName) : base($"The switch does not handle the value \"{valueName}\" from \"{enumTypeName}\".") { } public MissingEnumCaseException(string message, Exception inner) : base(message, inner) { } private MissingEnumCaseException(SerializationInfo info, StreamingContext context) : base(info, context) { } } } ================================================ FILE: TSLib/Helper/NativeLibraryLoader.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; namespace TSLib.Helper { internal static class NativeLibraryLoader { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); #if !NETCOREAPP3_1 [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr LoadLibrary(string dllToLoad); #endif public static bool DirectLoadLibrary(string lib, Action? dummyLoad = null) { if (Tools.IsLinux) { try { dummyLoad?.Invoke(); } catch (DllNotFoundException ex) { Log.Error(ex, "Failed to load library \"{0}\".", lib); return false; } } else { foreach (var libPath in LibPathOptions(lib)) { Log.Debug("Loading \"{0}\" from \"{1}\"", lib, libPath); #if NETCOREAPP3_1 if (NativeLibrary.TryLoad(libPath, out _)) return true; #else var handle = LoadLibrary(libPath); if (handle != IntPtr.Zero) return true; #endif } Log.Error("Failed to load library \"{0}\", error: {1}", lib, Marshal.GetLastWin32Error()); return false; } return true; } private static IEnumerable LibPathOptions(string lib) { var fullPath = Directory.GetCurrentDirectory(); yield return Path.Combine(fullPath, "lib", ArchFolder, lib); yield return Path.Combine(fullPath, "lib", lib); var asmPath = Path.GetDirectoryName(typeof(NativeLibraryLoader).Assembly.Location)!; yield return Path.Combine(asmPath, "lib", ArchFolder, lib); yield return Path.Combine(asmPath, "lib", lib); } public static string ArchFolder { get { if (IntPtr.Size == 8) return "x64"; if (IntPtr.Size == 4) return "x86"; return "xOther"; } } } } ================================================ FILE: TSLib/Helper/R.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Diagnostics; using System.Diagnostics.CodeAnalysis; namespace System { /// /// Provides a safe alternative to Exceptions for error and result wrapping. /// This type represents either success or an error + message. /// public static class R { public static readonly _Ok Ok = new _Ok(); public static readonly _Error Err = new _Error(); } #pragma warning disable IDE1006 // Naming Styles public readonly struct _Ok { } public readonly struct _Error { } #pragma warning restore IDE1006 // Naming Styles /// /// Provides a safe alternative to Exceptions for error and result wrapping. /// This type represents either success + value or an error + error-object. /// The value is guaranteed to be non-null when successful. /// /// The type of the success value. /// The error type. [DebuggerDisplay("{Ok ? (\"Ok : \" + typeof(TSuccess).Name) : (\"Err : \" + typeof(TError).Name), nq}")] public readonly struct R where TSuccess : notnull where TError : notnull { private readonly bool isError; public bool Ok => !isError; public TError Error { get; } public TSuccess Value { get; } private R(TSuccess value) { isError = false; Error = default!; if (value == null) throw new ArgumentNullException(nameof(value), "Return of ok must not be null."); Value = value; } private R(TError error) { isError = true; Value = default!; if (error == null) throw new ArgumentNullException(nameof(error), "Error must not be null."); Error = error; } internal R(bool isError, TSuccess value, TError error) { this.isError = isError; Value = value; Error = error; } /// Creates a new failed result with an error object /// The error public static R Err(TError error) => new R(error); /// Creates a new successful result with a value /// The value public static R OkR(TSuccess value) => new R(value); public static implicit operator bool(R result) => result.Ok; public static implicit operator TError(R result) => result.Error; public static implicit operator R(TSuccess result) => new R(result); public static implicit operator R(TError error) => new R(error); // Fluent get public bool GetOk([MaybeNullWhen(false)] out TSuccess value) { if (Ok) value = Value; else value = default!; return Ok; } public bool Get([MaybeNullWhen(false)] out TSuccess result, [MaybeNullWhen(true)] out TError error) { if (Ok) { result = Value; error = default!; } else { result = default!; error = Error; } return Ok; } // Unwrapping [return: MaybeNull, NotNullIfNotNull("alt")] public TSuccess OkOr([AllowNull] TSuccess alt) => Ok ? Value : alt; public TSuccess Unwrap() => Ok ? Value : throw new InvalidOperationException("Called upwrap on error"); // Downwrapping public E OnlyError() => new E(isError, Error); public static implicit operator E(R result) => result.OnlyError(); public R Map(Func map) where T : notnull => Ok ? new R(isError, map(Value), default!) : new R(isError, default!, Error); public R MapError(Func mapE) where T : notnull => Ok ? new R(isError, Value, default!) : new R(isError, default!, mapE(Error)); } /// /// Provides a safe alternative to Exceptions for error and result wrapping. /// This type represents either success or an error + error object. /// /// The type of the error value. [DebuggerDisplay("{Ok ? \"Ok\" : (\"Err : \" + typeof(TError).Name), nq}")] public readonly struct E where TError : notnull { /// Represents a successful state. public static E OkR { get; } = new E(); private readonly bool isError; public bool Ok => !isError; public TError Error { get; } private E(TError error) { isError = true; if (error == null) throw new ArgumentNullException(nameof(error), "Error must not be null."); Error = error; } internal E(bool isError, TError error) { this.isError = isError; Error = error; } // No null check here, we already check cosistently. /// Creates a new failed result with a error object. /// The error object. public static E Err(TError error) => new E(error); public static implicit operator bool(E result) => result.Ok; public static implicit operator TError(E result) => result.Error; public static implicit operator E(TError result) => new E(result); // Fluent get public bool GetOk([MaybeNullWhen(true)] out TError error) { if (Ok) error = default!; else error = Error; return Ok; } // Convenience casting public static implicit operator E(_Ok _) => OkR; // Unwrapping public void Unwrap() { if (!Ok) throw new InvalidOperationException("Called upwrap on error"); } // Upwrapping /// /// Adds a success value to the result. /// This will not change the success state of the result. /// Therefore the value may only be null when the state is an error. /// /// The success value. Can be null when the current state is an error. /// A new combined result. public R WithValue(TSuccess value) where TSuccess : notnull { if (!isError && value == null) throw new ArgumentNullException(nameof(value), "Value must not be null."); return new R(isError, value, Error); } } public static class RExtensions { public static R Flat(this R, TError> boxedR) where TSuccess : notnull where TError : notnull { if (!boxedR.Ok) return boxedR.Error; return boxedR.Value; } public static E Flat(this R, TError> boxedR) where TError : notnull { if (!boxedR.Ok) return boxedR.Error; return boxedR.Value; } } } ================================================ FILE: TSLib/Helper/SpanExtensions.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TSLib.Helper { public static class SpanExtensions { public static string NewUtf8String(this ReadOnlySpan span) { #if NETSTANDARD2_1 || NETCOREAPP3_1 return Tools.Utf8Encoder.GetString(span); #else return Tools.Utf8Encoder.GetString(span.ToArray()); #endif } public static string NewUtf8String(this Span span) => ((ReadOnlySpan)span).NewUtf8String(); public static ReadOnlySpan Trim(this ReadOnlySpan span, byte elem) => span.TrimStart(elem).TrimEnd(elem); public static ReadOnlySpan TrimStart(this ReadOnlySpan span, byte elem) { int start = 0; for (; start < span.Length; start++) { if (span[start] != elem) break; } return span.Slice(start); } public static ReadOnlySpan TrimEnd(this ReadOnlySpan span, byte elem) { int end = span.Length - 1; for (; end >= 0; end--) { if (span[end] != elem) break; } return span.Slice(0, end + 1); } } } ================================================ FILE: TSLib/Helper/SpanSplitter.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Runtime.CompilerServices; namespace TSLib.Helper { internal struct SpanSplitter where T : IEquatable { public bool HasNext => NextIndex >= 0; public int NextIndex { get; private set; } private T splitchar; [MethodImpl(MethodImplOptions.AggressiveInlining)] public void First(in ReadOnlySpan span, T split) { splitchar = split; NextIndex = span.IndexOf(split); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReadOnlySpan Next(in ReadOnlySpan current) { if (!HasNext) throw new InvalidOperationException("No next element in span split"); var ret = current.Slice(NextIndex + 1); NextIndex = ret.IndexOf(splitchar); return ret; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReadOnlySpan Trim(in ReadOnlySpan current) => HasNext ? current.Slice(0, NextIndex) : current; } } ================================================ FILE: TSLib/Helper/Tools.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TSLib.Helper { public static class Tools { public static bool IsLinux { get { var p = (int)Environment.OSVersion.Platform; return p == 4 || p == 6 || p == 128; } } public static IEnumerable GetFlags(this Enum input) => Enum.GetValues(input.GetType()).Cast().Where(input.HasFlag); // Encoding public static Encoding Utf8Encoder { get; } = new UTF8Encoding(false, false); // Time public static readonly DateTime UnixTimeStart = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); public static uint ToUnix(this DateTime dateTime) => (uint)(dateTime - UnixTimeStart).TotalSeconds; public static DateTime FromUnix(uint unixTimestamp) => UnixTimeStart.AddSeconds(unixTimestamp); public static uint UnixNow => (uint)(DateTime.UtcNow - UnixTimeStart).TotalSeconds; public static DateTime Now => DateTime.UtcNow; // Random public static Random Random { get; } = new Random(); public static T PickRandom(IReadOnlyList collection) { int pick = Random.Next(0, collection.Count); return collection[pick]; } // Math public static TimeSpan Min(this TimeSpan a, TimeSpan b) => a < b ? a : b; public static TimeSpan Max(this TimeSpan a, TimeSpan b) => a > b ? a : b; public static int MathMod(int x, int mod) => (x % mod + mod) % mod; public static float Clamp(float value, float min, float max) => Math.Min(Math.Max(value, min), max); public static int Clamp(int value, int min, int max) => Math.Min(Math.Max(value, min), max); // Generic public static void SetLogId(Id id) => SetLogId(id.ToString()); public static void SetLogId(string id) => NLog.MappedDiagnosticsLogicalContext.Set("BotId", id); public static Exception UnhandledDefault(T value) where T : struct { return new MissingEnumCaseException(typeof(T).Name, value.ToString() ?? string.Empty); } } } ================================================ FILE: TSLib/LazyNotification.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using TSLib.Messages; namespace TSLib { public readonly struct LazyNotification { public readonly INotification[] Notifications; public readonly NotificationType NotifyType; public LazyNotification(INotification[] notifications, NotificationType notifyType) { Notifications = notifications; NotifyType = notifyType; } } } ================================================ FILE: TSLib/MessageProcessor.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Concurrent; using System.Collections.Generic; using TSLib.Helper; using TSLib.Messages; namespace TSLib { internal abstract class BaseMessageProcessor { protected static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); protected readonly List[] dependingBlocks; private readonly Func findTypeOfNotification; public Deserializer Deserializer { get; } = new Deserializer(); protected ReadOnlyMemory? cmdLineBuffer; private const byte AsciiSpace = (byte)' '; protected BaseMessageProcessor(Func findTypeOfNotification) { dependingBlocks = new List[Enum.GetValues(typeof(NotificationType)).Length]; this.findTypeOfNotification = findTypeOfNotification; } public LazyNotification? PushMessage(ReadOnlyMemory message) { var msgSpan = message.Span; string notifyname; int splitindex = msgSpan.IndexOf(AsciiSpace); if (splitindex < 0) notifyname = msgSpan.TrimEnd(AsciiSpace).NewUtf8String(); else notifyname = msgSpan.Slice(0, splitindex).NewUtf8String(); bool hasEqual = notifyname.IndexOf('=') >= 0; NotificationType ntfyType; if (hasEqual || (ntfyType = findTypeOfNotification(notifyname)) == NotificationType.Unknown) { if (!hasEqual) Log.Debug("Maybe unknown notification: {0}", notifyname); cmdLineBuffer = message; return null; } var lineDataPart = splitindex < 0 ? ReadOnlySpan.Empty : msgSpan.Slice(splitindex); // if it's not an error it is a notification if (ntfyType != NotificationType.CommandError) { var notification = Deserializer.GenerateNotification(lineDataPart, ntfyType); if (notification is null) { Log.Warn("Got unparsable message. ({0})", msgSpan.NewUtf8String()); return null; } var lazyNotification = new LazyNotification(notification, ntfyType); var dependantList = dependingBlocks[(int)ntfyType]; if (dependantList != null) { foreach (var item in dependantList) { item.SetNotification(lazyNotification); if (item.DependsOn != null) { foreach (var otherDepType in item.DependsOn) { if (otherDepType == ntfyType) continue; dependingBlocks[(int)otherDepType]?.Remove(item); } } } dependantList.Clear(); } return lazyNotification; } var result = Deserializer.GenerateSingleNotification(lineDataPart, NotificationType.CommandError); var errorStatus = result is null ? CommandError.Custom("Invalid Error code") : (CommandError)result; return PushMessageInternal(errorStatus, ntfyType); } protected abstract LazyNotification? PushMessageInternal(CommandError errorStatus, NotificationType ntfyType); public abstract void DropQueue(); } internal sealed class AsyncMessageProcessor : BaseMessageProcessor { private readonly Dictionary requestDict; public AsyncMessageProcessor(Func findTypeOfNotification) : base(findTypeOfNotification) { requestDict = new Dictionary(); } protected override LazyNotification? PushMessageInternal(CommandError errorStatus, NotificationType ntfyType) { if (errorStatus.ReturnCode is null) { return new LazyNotification(new[] { errorStatus }, ntfyType); } // otherwise it is the result status code to a request if (requestDict.Remove(errorStatus.ReturnCode, out var waitBlock)) { waitBlock.SetAnswerAuto(errorStatus, cmdLineBuffer); cmdLineBuffer = null; } else { /* ??? */ } return null; } public void EnqueueRequest(string returnCode, WaitBlock waitBlock) { requestDict.Add(returnCode, waitBlock); if (waitBlock.DependsOn != null) { foreach (var dependantType in waitBlock.DependsOn) { var depentantList = dependingBlocks[(int)dependantType]; if (depentantList is null) dependingBlocks[(int)dependantType] = depentantList = new List(); depentantList.Add(waitBlock); } } } public override void DropQueue() { foreach (var wb in requestDict.Values) wb.SetError(CommandError.ConnectionClosed); requestDict.Clear(); foreach (var block in dependingBlocks) { block?.ForEach(wb => wb.SetError(CommandError.ConnectionClosed)); block?.Clear(); } } } internal sealed class SyncMessageProcessor : BaseMessageProcessor { private readonly ConcurrentQueue requestQueue; public SyncMessageProcessor(Func findTypeOfNotification) : base(findTypeOfNotification) { requestQueue = new ConcurrentQueue(); } protected override LazyNotification? PushMessageInternal(CommandError errorStatus, NotificationType ntfyType) { if (!requestQueue.IsEmpty && requestQueue.TryDequeue(out var waitBlock)) { waitBlock.SetAnswerAuto(errorStatus, cmdLineBuffer); cmdLineBuffer = null; } else { /* ??? */ } return null; } public void EnqueueRequest(WaitBlock waitBlock) { requestQueue.Enqueue(waitBlock); } public override void DropQueue() { while (!requestQueue.IsEmpty && requestQueue.TryDequeue(out var waitBlock)) waitBlock.SetError(CommandError.ConnectionClosed); } } } ================================================ FILE: TSLib/Messages/BaseTypes.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; namespace TSLib.Messages { public interface IMessage { void SetField(string name, ReadOnlySpan value, Deserializer ser); void Expand(IMessage[] to, IEnumerable flds); } public interface INotification : IMessage { NotificationType NotifyType { get; } } public interface IResponse : IMessage { string? ReturnCode { get; set; } } } ================================================ FILE: TSLib/Messages/Deserializer.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using TSLib.Helper; namespace TSLib.Messages { public class Deserializer { protected static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); public IPermissionTransform PermissionTransform { get; set; } = DummyPermissionTransform.Instance; private const byte AsciiSpace = (byte)' '; private const byte AsciiPipe = (byte)'|'; private const byte AsciiEquals = (byte)'='; // data to notification public INotification[]? GenerateNotification(ReadOnlySpan line, NotificationType ntfyType) { if (ntfyType == NotificationType.Unknown) throw new ArgumentException("The NotificationType must not be unknown", nameof(ntfyType)); var pipes = PipeList(line); var arr = MessageHelper.InstatiateNotificationArray(ntfyType, (pipes?.Count ?? 0) + 1); return Dersialize(arr, line, pipes); } public INotification? GenerateSingleNotification(ReadOnlySpan line, NotificationType ntfyType) { if (line.IsEmpty) throw new ArgumentNullException(nameof(line)); var result = GenerateNotification(line, ntfyType); if (result is null || result.Length == 0) return null; return result[0]; } private static List? PipeList(ReadOnlySpan line) { List? pipes = null; for (int i = 0; i < line.Length; i++) if (line[i] == AsciiPipe) (pipes ??= new List()).Add(i); return pipes; } private T[]? Dersialize(T[] arr, ReadOnlySpan line, List? pipes) where T : IMessage { if (pipes is null || pipes.Count == 0) { if (!ParseKeyValueLine(arr[0], line, null, null)) return null; return arr; } var arrItems = new HashSet(); var single = new List(); if (!ParseKeyValueLine(arr[^1], line.Slice(pipes[^1] + 1).Trim(AsciiSpace), arrItems, null)) return null; for (int i = 0; i < pipes.Count - 1; i++) { if (!ParseKeyValueLine(arr[i + 1], line.Slice(pipes[i] + 1, pipes[i + 1] - pipes[i] - 1), arrItems, null)) return null; } // trim with the first one if (!ParseKeyValueLine(arr[0], line.Slice(0, pipes[0]), arrItems, single)) return null; if (arrItems.Count > 0) { arr[0].Expand((IMessage[])(object)arr, single); } return arr; } // data to response public T[]? GenerateResponse(ReadOnlySpan line) where T : IResponse, new() { if (line.IsEmpty) return Array.Empty(); var pipes = PipeList(line); var arr = new T[(pipes?.Count ?? 0) + 1]; for (int i = 0; i < arr.Length; i++) arr[i] = new T(); return Dersialize(arr, line, pipes); } private bool ParseKeyValueLine(IMessage qm, ReadOnlySpan line, HashSet? indexing, List? single) { if (line.IsEmpty) return true; var ss = new SpanSplitter(); ss.First(line, AsciiSpace); var key = ReadOnlySpan.Empty; var value = ReadOnlySpan.Empty; try { do { var param = ss.Trim(line); var kvpSplitIndex = param.IndexOf(AsciiEquals); key = kvpSplitIndex >= 0 ? param.Slice(0, kvpSplitIndex) : ReadOnlySpan.Empty; value = kvpSplitIndex <= param.Length - 1 ? param.Slice(kvpSplitIndex + 1) : ReadOnlySpan.Empty; if (!key.IsEmpty) { var keyStr = key.NewUtf8String(); qm.SetField(keyStr, value, this); if (indexing != null) { if (single is null) { indexing.Add(keyStr); } else if (!indexing.Contains(keyStr)) { single.Add(keyStr); } else { indexing = null; single = null; } } } if (!ss.HasNext) break; line = ss.Next(line); } while (line.Length > 0); return true; } catch (Exception ex) { Log.Error(ex, "Deserialization format error. Data: class:{0} field:{1} value:{2} msg:{3}", qm.GetType().Name, key.NewUtf8String(), value.NewUtf8String(), line.NewUtf8String()); return false; } } } } ================================================ FILE: TSLib/Messages/MessageAdditions.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . namespace TSLib.Messages { public interface IChannelCreateResponse { ChannelId ChannelId { get; set; } } partial class ChannelCreateResponse : IChannelCreateResponse { } partial class ChannelCreated : IChannelCreateResponse { } } ================================================ FILE: TSLib/Messages/PermissionTransform.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TSLib.Messages { public interface IPermissionTransform { ushort GetId(TsPermission name); TsPermission GetName(ushort id); } public class DummyPermissionTransform : IPermissionTransform { public static readonly IPermissionTransform Instance = new DummyPermissionTransform(); public ushort GetId(TsPermission name) => 0; public TsPermission GetName(ushort id) => TsPermission.undefined; } public class TablePermissionTransform : IPermissionTransform { private readonly TsPermission[] nameTable; private readonly ushort[] idTable; public TablePermissionTransform(TsPermission[] nameTable) { this.nameTable = nameTable; idTable = new ushort[Enum.GetValues(typeof(TsPermission)).Length]; for (ushort i = 0; i < nameTable.Length; i++) { idTable[(int)nameTable[i]] = i; } } public ushort GetId(TsPermission name) => (int)name < idTable.Length ? idTable[(int)name] : (ushort)0; public TsPermission GetName(ushort id) => id < nameTable.Length ? nameTable[id] : TsPermission.undefined; } } ================================================ FILE: TSLib/Messages/ResponseDictionary.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using TSLib.Helper; using KeyType = System.String; using ValueType = System.String; namespace TSLib.Messages { public class ResponseDictionary : IDictionary, IResponse { private readonly IDictionary data; public ResponseDictionary() { data = new Dictionary(); } public ResponseDictionary(IDictionary dataDict) { data = dataDict; } public ValueType this[KeyType key] { get => data[key]; set => throw new NotSupportedException(); } public int Count => data.Count; public bool IsReadOnly => true; public ICollection Keys => data.Keys; public ICollection Values => data.Values; public void Add(KeyValuePair item) { throw new NotSupportedException(); } public void Add(KeyType key, ValueType value) { throw new NotSupportedException(); } public void Clear() { throw new NotSupportedException(); } public bool Contains(KeyValuePair item) => data.Contains(item); public bool ContainsKey(string key) => data.ContainsKey(key); public void CopyTo(KeyValuePair[] array, int arrayIndex) => data.CopyTo(array, arrayIndex); public IEnumerator> GetEnumerator() => data.GetEnumerator(); public bool Remove(KeyValuePair item) { throw new NotSupportedException(); } public bool Remove(KeyType key) { throw new NotSupportedException(); } public bool TryGetValue(KeyType key, [MaybeNullWhen(false)] out ValueType value) => data.TryGetValue(key, out value!); IEnumerator IEnumerable.GetEnumerator() => data.GetEnumerator(); public void SetField(string name, ReadOnlySpan value, Deserializer ser) => data[name] = value.NewUtf8String(); public void Expand(IMessage[] to, IEnumerable flds) { foreach (var fld in flds) { if (TryGetValue(fld, out var fldval)) { foreach (var toi in (ResponseDictionary[])to) { toi.data[fld] = fldval; } } } } public string? ReturnCode { get => data.ContainsKey("return_code") ? data["return_code"] : string.Empty; set => data["return_code"] = value!; } } public sealed class ResponseVoid : IResponse { public string? ReturnCode { get => null; set { } } public void SetField(string name, ReadOnlySpan value, Deserializer ser) { } public void Expand(IMessage[] to, IEnumerable flds) { } } } ================================================ FILE: TSLib/Properties.cs ================================================ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("TS3ABotUnitTests")] ================================================ FILE: TSLib/Query/TsQueryClient.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Buffers; using System.IO; using System.IO.Pipelines; using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; using TSLib.Commands; using TSLib.Full.Book; using TSLib.Helper; using TSLib.Messages; using CmdR = System.Threading.Tasks.Task>; namespace TSLib.Query { public sealed partial class TsQueryClient : TsBaseFunctions { private readonly object sendQueueLock = new object(); private readonly TcpClient tcpClient; private StreamReader? tcpReader; private StreamWriter? tcpWriter; private CancellationTokenSource? cts; private readonly SyncMessageProcessor msgProc; private readonly IEventDispatcher dispatcher; private readonly Pipe dataPipe = new Pipe(); public override ClientType ClientType => ClientType.Query; public override bool Connected => tcpClient.Connected; private bool connecting; public override bool Connecting => connecting && !Connected; protected override Deserializer Deserializer => msgProc.Deserializer; public override event EventHandler? OnDisconnected; public TsQueryClient() { connecting = false; tcpClient = new TcpClient(); msgProc = new SyncMessageProcessor(MessageHelper.GetToClientNotificationType); dispatcher = new ExtraThreadEventDispatcher(); } public override async CmdR Connect(ConnectionData conData) { remoteAddress = await TsDnsResolver.TryResolve(conData.Address, TsDnsResolver.TsQueryDefaultPort); if (remoteAddress is null) return CommandError.Custom("Could not read or resolve address."); NetworkStream tcpStream; try { connecting = true; await tcpClient.ConnectAsync(remoteAddress.Address, remoteAddress.Port); ConnectionData = conData; tcpStream = tcpClient.GetStream(); tcpReader = new StreamReader(tcpStream, Tools.Utf8Encoder); tcpWriter = new StreamWriter(tcpStream, Tools.Utf8Encoder) { NewLine = "\n" }; if (await tcpReader.ReadLineAsync() != "TS3") return CommandError.Custom("Protocol violation. The stream must start with 'TS3'"); if (string.IsNullOrEmpty(await tcpReader.ReadLineAsync())) await tcpReader.ReadLineAsync(); } catch (SocketException ex) { return CommandError.Custom("Could not connect: " + ex.Message); } finally { connecting = false; } cts = new CancellationTokenSource(); dispatcher.Init(InvokeEvent, conData.LogId); _ = NetworkLoop(tcpStream, cts.Token); return R.Ok; } public override Task Disconnect() { lock (sendQueueLock) { SendRaw("quit"); cts?.Cancel(); cts = null; if (tcpClient.Connected) tcpClient.Dispose(); } return Task.CompletedTask; } private async Task NetworkLoop(NetworkStream tcpStream, CancellationToken cancellationToken) { await Task.WhenAll(NetworkToPipeLoopAsync(tcpStream, dataPipe.Writer, cancellationToken), PipeProcessorAsync(dataPipe.Reader, cancellationToken)); OnDisconnected?.Invoke(this, new DisconnectEventArgs(Reason.LeftServer)); } private async Task NetworkToPipeLoopAsync(NetworkStream stream, PipeWriter writer, CancellationToken cancellationToken = default) { const int minimumBufferSize = 4096; #if !(NETSTANDARD2_1 || NETCOREAPP3_1) var dataReadBuffer = new byte[minimumBufferSize]; #endif while (!cancellationToken.IsCancellationRequested) { try { var mem = writer.GetMemory(minimumBufferSize); #if NETSTANDARD2_1 || NETCOREAPP3_1 int bytesRead = await stream.ReadAsync(mem, cancellationToken); #else int bytesRead = await stream.ReadAsync(dataReadBuffer, 0, dataReadBuffer.Length, cancellationToken); dataReadBuffer.CopyTo(mem); #endif if (bytesRead == 0) break; writer.Advance(bytesRead); } catch (IOException) { break; } var result = await writer.FlushAsync(cancellationToken); if (result.IsCompleted || result.IsCanceled) break; } await writer.CompleteAsync(); } private async Task PipeProcessorAsync(PipeReader reader, CancellationToken cancelationToken = default) { while (!cancelationToken.IsCancellationRequested) { var result = await reader.ReadAsync(cancelationToken); var buffer = result.Buffer; SequencePosition? position; do { position = buffer.PositionOf((byte)'\n'); if (position != null) { var notif = msgProc.PushMessage(buffer.Slice(0, position.Value).ToArray()); if (notif.HasValue) { dispatcher.Invoke(notif.Value); } // +2 = skipping \n\r buffer = buffer.Slice(buffer.GetPosition(2, position.Value)); } } while (position != null); reader.AdvanceTo(buffer.Start, buffer.End); if (result.IsCompleted || result.IsCanceled) break; } await reader.CompleteAsync(); } public override Task> Send(TsCommand com) { using var wb = new WaitBlock(msgProc.Deserializer); lock (sendQueueLock) { msgProc.EnqueueRequest(wb); SendRaw(com.ToString()); } return wb.WaitForMessageAsync(); } public override Task> SendHybrid(TsCommand com, NotificationType type) => Send(com); private void SendRaw(string data) { if (!tcpClient.Connected) return; tcpWriter?.WriteLine(data); tcpWriter?.Flush(); } #region QUERY SPECIFIC COMMANDS private static readonly string[] TargetTypeString = { "(dummy)", "textprivate", "textchannel", "textserver", "channel", "server" }; public CmdR RegisterNotification(TextMessageTargetMode target) => RegisterNotification(TargetTypeString[(int)target], null); public CmdR RegisterNotificationChannel(ChannelId? channel = null) => RegisterNotification(TargetTypeString[(int)ReasonIdentifier.Channel], channel); public CmdR RegisterNotificationServer() => RegisterNotification(TargetTypeString[(int)ReasonIdentifier.Server], null); private CmdR RegisterNotification(string target, ChannelId? channel) => SendVoid(new TsCommand("servernotifyregister") { { "event", target }, { "id", channel }, }); public CmdR Login(string username, string password) => SendVoid(new TsCommand("login") { { "client_login_name", username }, { "client_login_password", password }, }); public CmdR UseServer(int serverId) => SendVoid(new TsCommand("use") { { "sid", serverId }, }); public CmdR UseServerPort(ushort port) => SendVoid(new TsCommand("use") { { "port", port }, }); // Splitted base commands public override async Task> ChannelCreate(string name, string? namePhonetic = null, string? topic = null, string? description = null, string? password = null, Codec? codec = null, int? codecQuality = null, int? codecLatencyFactor = null, bool? codecEncrypted = null, int? maxClients = null, int? maxFamilyClients = null, bool? maxClientsUnlimited = null, bool? maxFamilyClientsUnlimited = null, bool? maxFamilyClientsInherited = null, ChannelId? order = null, ChannelId? parent = null, ChannelType? type = null, TimeSpan? deleteDelay = null, int? neededTalkPower = null) { var result = await Send(ChannelOp("channelcreate", null, name, namePhonetic, topic, description, password, codec, codecQuality, codecLatencyFactor, codecEncrypted, maxClients, maxFamilyClients, maxClientsUnlimited, maxFamilyClientsUnlimited, maxFamilyClientsInherited, order, parent, type, deleteDelay, neededTalkPower)); return result.MapToSingle() .WrapInterface(); } public override Task> ServerGroupAdd(string name, GroupType? type = null) => Send(new TsCommand("servergroupadd") { { "name", name }, { "type", (int?)type } }).MapToSingle(); public override Task> FileTransferInitUpload(ChannelId channelId, string path, string channelPassword, ushort clientTransferId, long fileSize, bool overwrite, bool resume) => Send(new TsCommand("ftinitupload") { { "cid", channelId }, { "name", path }, { "cpw", channelPassword }, { "clientftfid", clientTransferId }, { "size", fileSize }, { "overwrite", overwrite }, { "resume", resume } }).MapToSingle(); public override Task> FileTransferInitDownload(ChannelId channelId, string path, string channelPassword, ushort clientTransferId, long seek) => Send(new TsCommand("ftinitdownload") { { "cid", channelId }, { "name", path }, { "cpw", channelPassword }, { "clientftfid", clientTransferId }, { "seekpos", seek } }).MapToSingle(); #endregion public override void Dispose() { lock (sendQueueLock) { tcpWriter?.Dispose(); tcpWriter = null; tcpReader?.Dispose(); tcpReader = null; msgProc.DropQueue(); dispatcher.Dispose(); } } } } ================================================ FILE: TSLib/Query/TsQueryClient.gen.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // using System; using TSLib.Helper; using TSLib.Messages; #nullable enable namespace TSLib.Query { partial class TsQueryClient { public override event NotifyEventHandler? OnChannelChanged; public override event EventHandler? OnEachChannelChanged; public override event NotifyEventHandler? OnChannelCreated; public override event EventHandler? OnEachChannelCreated; public override event NotifyEventHandler? OnChannelDeleted; public override event EventHandler? OnEachChannelDeleted; public override event NotifyEventHandler? OnChannelEdited; public override event EventHandler? OnEachChannelEdited; public override event NotifyEventHandler? OnChannelMoved; public override event EventHandler? OnEachChannelMoved; public override event NotifyEventHandler? OnChannelPasswordChanged; public override event EventHandler? OnEachChannelPasswordChanged; public override event NotifyEventHandler? OnClientEnterView; public override event EventHandler? OnEachClientEnterView; public override event NotifyEventHandler? OnClientLeftView; public override event EventHandler? OnEachClientLeftView; public override event NotifyEventHandler? OnClientMoved; public override event EventHandler? OnEachClientMoved; public override event NotifyEventHandler? OnServerEdited; public override event EventHandler? OnEachServerEdited; public override event NotifyEventHandler? OnTextMessage; public override event EventHandler? OnEachTextMessage; public override event NotifyEventHandler? OnTokenUsed; public override event EventHandler? OnEachTokenUsed; private void InvokeEvent(LazyNotification lazyNotification) { var ntf = lazyNotification.Notifications; switch (lazyNotification.NotifyType) { case NotificationType.ChannelChanged: { var ntfc = (ChannelChanged[])ntf; OnChannelChanged?.Invoke(this, ntfc); var ev = OnEachChannelChanged; foreach(var that in ntfc) { ev?.Invoke(this, that); } break; } case NotificationType.ChannelCreated: { var ntfc = (ChannelCreated[])ntf; OnChannelCreated?.Invoke(this, ntfc); var ev = OnEachChannelCreated; foreach(var that in ntfc) { ev?.Invoke(this, that); } break; } case NotificationType.ChannelDeleted: { var ntfc = (ChannelDeleted[])ntf; OnChannelDeleted?.Invoke(this, ntfc); var ev = OnEachChannelDeleted; foreach(var that in ntfc) { ev?.Invoke(this, that); } break; } case NotificationType.ChannelEdited: { var ntfc = (ChannelEdited[])ntf; OnChannelEdited?.Invoke(this, ntfc); var ev = OnEachChannelEdited; foreach(var that in ntfc) { ev?.Invoke(this, that); } break; } case NotificationType.ChannelMoved: { var ntfc = (ChannelMoved[])ntf; OnChannelMoved?.Invoke(this, ntfc); var ev = OnEachChannelMoved; foreach(var that in ntfc) { ev?.Invoke(this, that); } break; } case NotificationType.ChannelPasswordChanged: { var ntfc = (ChannelPasswordChanged[])ntf; OnChannelPasswordChanged?.Invoke(this, ntfc); var ev = OnEachChannelPasswordChanged; foreach(var that in ntfc) { ev?.Invoke(this, that); } break; } case NotificationType.ClientEnterView: { var ntfc = (ClientEnterView[])ntf; OnClientEnterView?.Invoke(this, ntfc); var ev = OnEachClientEnterView; foreach(var that in ntfc) { ev?.Invoke(this, that); } break; } case NotificationType.ClientLeftView: { var ntfc = (ClientLeftView[])ntf; OnClientLeftView?.Invoke(this, ntfc); var ev = OnEachClientLeftView; foreach(var that in ntfc) { ev?.Invoke(this, that); } break; } case NotificationType.ClientMoved: { var ntfc = (ClientMoved[])ntf; OnClientMoved?.Invoke(this, ntfc); var ev = OnEachClientMoved; foreach(var that in ntfc) { ev?.Invoke(this, that); } break; } case NotificationType.ServerEdited: { var ntfc = (ServerEdited[])ntf; OnServerEdited?.Invoke(this, ntfc); var ev = OnEachServerEdited; foreach(var that in ntfc) { ev?.Invoke(this, that); } break; } case NotificationType.TextMessage: { var ntfc = (TextMessage[])ntf; OnTextMessage?.Invoke(this, ntfc); var ev = OnEachTextMessage; foreach(var that in ntfc) { ev?.Invoke(this, that); } break; } case NotificationType.TokenUsed: { var ntfc = (TokenUsed[])ntf; OnTokenUsed?.Invoke(this, ntfc); var ev = OnEachTokenUsed; foreach(var that in ntfc) { ev?.Invoke(this, that); } break; } case NotificationType.CommandError: break; case NotificationType.Unknown: default: throw Tools.UnhandledDefault(lazyNotification.NotifyType); } } } } ================================================ FILE: TSLib/Query/TsQueryClient.gen.tt ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // <#@ template debug="true" hostSpecific="true" language="C#" #> <#@ include file="../Generated/M2BParser.ttinclude" once="true" #> <#@ include file="../Generated/MessageParser.ttinclude" once="true" #> <#@ include file="../Generated/BookParser.ttinclude" once="true" #> <#@ include file="../Generated/NotificationUtil.ttinclude" once="true" #> <#@ output extension=".cs" #> <#@ import namespace="System.Collections.Generic" #> using System; using TSLib.Helper; using TSLib.Messages; #nullable enable namespace TSLib.Query { partial class TsQueryClient { <# var genbook = BookDeclarations.Parse(Host.ResolvePath("../Declarations/Book.toml")); var genmsg = Messages.Parse(Host.ResolvePath("../Declarations/Messages.toml")); var genm2b = M2BDeclarations.Parse(Host.ResolvePath("../Declarations/MessagesToBook.toml"), genmsg, genbook); GenNtfyDecls(OnlyS2C(genmsg.NotifiesSorted).Where(ntfy => sharedNotifications.Contains(ntfy.name))); #> private void InvokeEvent(LazyNotification lazyNotification) { var ntf = lazyNotification.Notifications; switch (lazyNotification.NotifyType) { <# foreach(var ntfy in OnlyS2C(genmsg.NotifiesSorted)) { if(!sharedNotifications.Contains(ntfy.name)) continue; #> case NotificationType.<#= ntfy.name #>: { var ntfc = (<#=ntfy.name #>[])ntf; On<#= ntfy.name #>?.Invoke(this, ntfc); var ev = OnEach<#= ntfy.name #>; foreach(var that in ntfc) { ev?.Invoke(this, that); } break; } <# } #> case NotificationType.CommandError: break; case NotificationType.Unknown: default: throw Tools.UnhandledDefault(lazyNotification.NotifyType); } } } } ================================================ FILE: TSLib/Scheduler/DedicatedTaskScheduler.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; using TSLib.Helper; namespace TSLib.Scheduler { public sealed class DedicatedTaskScheduler : TaskScheduler, IDisposable { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private static readonly TimeSpan CombineTimerThreshold = TimeSpan.FromMilliseconds(10); private readonly TaskFactory factory; private readonly BlockingCollection queue = new BlockingCollection(); private readonly HashSet timers = new HashSet(); private readonly Thread thread; private readonly Id logId; // This is not a duraration but an instant from ticks // The TimeSpan class is used for calculation convenience // The values is used as a cache so we don't need to recheck the list on each loop private TimeSpan nextTimerDue = TimeSpan.MaxValue; private readonly Stopwatch monotoneClock = Stopwatch.StartNew(); private bool IsOwnThread => Thread.CurrentThread == thread; #if DEBUG private readonly Stack taskStack = new Stack(); private TimeSpan lastTaskCompleted = TimeSpan.MinValue; private readonly Stopwatch overallWatch = new Stopwatch(); private TimeSpan actualRunningTime; #endif private DedicatedTaskScheduler() { factory = new TaskFactory(this); thread = Thread.CurrentThread; } public DedicatedTaskScheduler(Id id) { factory = new TaskFactory(this); this.logId = id; thread = new Thread(DoWork) { Name = DispatcherHelper.CreateDispatcherTitle(id) }; thread.Start(); } public static void FromCurrentThread(Action root) { var dedi = new DedicatedTaskScheduler(); _ = dedi.Invoke(root); dedi.DoWork(); } private void DoWork() { Tools.SetLogId(logId); while (!queue.IsCompleted) { TimeSpan timeTillNextTimer = DispatchTimers(); if (queue.TryTake(out var task, timeTillNextTimer)) { if (task != Task.CompletedTask) { TryExecuteTaskInternal(task, false); } } } Log.Debug("Finalizing TaskScheduler"); queue.Dispose(); Log.Debug("TaskScheduler closed"); } private TimeSpan DispatchTimers() { var now = GetTimestamp(); if (timers.Count == 0) { Log.ConditionalTrace("Quick return 1"); nextTimerDue = TimeSpan.MaxValue; return Timeout.InfiniteTimeSpan; } // [Heuristic] // Problem: We don't want to recheck the list each time a new Task // is processed from the queue. // Idea: On very high load, when the queue is permanently full and // the current cache is in 'inf' cache state starting timers // will only add more load which won't be processed anyway. // So we wait for that the queue is empty then we recheck. // When we are not in 'inf' state we will just check like normal. if (queue.Count > 0 && now + CombineTimerThreshold < nextTimerDue && nextTimerDue != TimeSpan.MaxValue) { Log.ConditionalTrace("Quick return 2"); return nextTimerDue - now; } Log.ConditionalTrace("Recalc"); var timeTillNextTimer = TimeSpan.MaxValue; foreach (var timer in timers) // TODO might be modified { var due = timer.Timestamp + timer.Interval; TimeSpan wait; if (due < now) { _ = Invoke(timer.Method); timer.Timestamp = GetTimestamp(); wait = timer.Interval; } else { wait = due - now; } if (wait < timeTillNextTimer) { timeTillNextTimer = wait; } } Trace.Assert(timeTillNextTimer != TimeSpan.MaxValue); timeTillNextTimer = timeTillNextTimer.Max(CombineTimerThreshold); nextTimerDue = now + timeTillNextTimer; return timeTillNextTimer; } private bool TryExecuteTaskInternal(Task task, bool inline) { #if DEBUG LogExecuteEnter(task, inline); #endif bool ok = TryExecuteTask(task); #if DEBUG LogExecuteExit(task); #endif return ok; } #if DEBUG private void LogExecuteEnter(Task task, bool inline) { if (taskStack.Count == 0) { overallWatch.Restart(); actualRunningTime = TimeSpan.Zero; lastTaskCompleted = GetTimestamp(); } Log.Trace("Processing Task {0} {1}", task.Id, inline ? "inline" : "from queue"); taskStack.Push(task); } private void LogExecuteExit(Task task) { var now = GetTimestamp(); var calcTime = (now - lastTaskCompleted); actualRunningTime += calcTime; Log.Trace("Task {0} took {1:F3}ms. Resulted {2}", task.Id, calcTime.TotalMilliseconds, task.Status); lastTaskCompleted = now; Trace.Assert(task == taskStack.Pop()); if (taskStack.Count == 0) { var overallTime = overallWatch.Elapsed; Log.Debug("Overall call time: {0:F3} Task Time: {1:F3} Overhead: {2:F3}", overallTime.TotalMilliseconds, actualRunningTime.TotalMilliseconds, (overallTime - actualRunningTime).TotalMilliseconds); if (queue.Count == 0) Log.Trace("Eoq"); } } #endif public override int MaximumConcurrencyLevel => 1; protected override IEnumerable? GetScheduledTasks() => queue.ToArray(); protected override void QueueTask(Task task) => QueueTaskInternal(task); private void QueueTaskInternal(Task task) { if (task is null) throw new ArgumentNullException(nameof(task)); try { queue.Add(task); } catch (Exception ex) { Log.Debug(ex, "Dropping Task"); } } protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) => IsOwnThread && TryExecuteTaskInternal(task, true); public TickWorker CreateTimer(Action method, TimeSpan interval, bool active) { VerifyOwnThread(); if (method is null) throw new ArgumentNullException(nameof(method)); var worker = new TickWorker(this, method, interval); // Add the worker to the list (if it's enabled) if (active) worker.Enable(); return worker; } internal void EnableTimer(TickWorker timer) { VerifyOwnThread(); timer.Timestamp = GetTimestamp(); timers.Add(timer); BumpTimer(); } internal void DisableTimer(TickWorker timer) { VerifyOwnThread(); timers.Remove(timer); } internal void BumpTimer() => QueueTaskInternal(Task.CompletedTask); private TimeSpan GetTimestamp() => monotoneClock.Elapsed; public void VerifyOwnThread() { if (!IsOwnThread) { var stack = new StackTrace(); Log.Error("Current call is not scheduled correctly. Sched: {0}, Own: {1}. Stack: {2}", (Current as DedicatedTaskScheduler)?.logId.ToString() ?? $"S{Current.Id}", logId, stack ); throw new TaskSchedulerException("Cannot call from an outside thread"); } } // Invokes public Task Invoke(Action action) { if (Current == this) { action(); return Task.CompletedTask; } return factory.StartNew(action, CancellationToken.None, TaskCreationOptions.None, this); } public Task Invoke(Func action) { if (Current == this) { var t = action(); return Task.FromResult(t); } return factory.StartNew(action, CancellationToken.None, TaskCreationOptions.None, this); } public Task InvokeAsync(Func action) { if (Current == this) { var t = action(); return t; } return factory.StartNew(action, CancellationToken.None, TaskCreationOptions.None, this).Unwrap(); } public Task InvokeAsync(Func> action) { if (Current == this) { var t = action(); return t; } return factory.StartNew(action, CancellationToken.None, TaskCreationOptions.None, this).Unwrap(); } public override string ToString() => $"Dedicated Task Scheduler: {logId}"; public void Dispose() { queue.CompleteAdding(); } } } ================================================ FILE: TSLib/Scheduler/DispatcherHelper.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using TSLib.Helper; namespace TSLib.Scheduler { internal static class DispatcherHelper { public const string DispatcherTitle = "TS Dispatcher"; internal static string CreateLogThreadName(string threadName, Id id) => threadName + (id == Id.Null ? "" : $"[{id}]"); internal static string CreateDispatcherTitle(Id id) => CreateLogThreadName(DispatcherTitle, id); } } ================================================ FILE: TSLib/Scheduler/TickWorker.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TSLib.Scheduler { public class TickWorker { readonly DedicatedTaskScheduler parent; private TimeSpan interval; internal Action Method { get; } internal TimeSpan Timestamp { get; set; } = TimeSpan.Zero; public TimeSpan Interval { get => interval; set { if (value <= TimeSpan.Zero) throw new ArgumentOutOfRangeException(nameof(Interval), "Interval must not be 0 or negative"); interval = value; } } public bool IsActive { get; private set; } = false; public void Enable() { if (!IsActive) { parent.EnableTimer(this); IsActive = true; } } public void Disable() { if (IsActive) { parent.DisableTimer(this); IsActive = false; } } internal TickWorker(DedicatedTaskScheduler parent, Action method, TimeSpan interval) { this.parent = parent; Method = method; Interval = interval; } } } ================================================ FILE: TSLib/TSLib.csproj ================================================ Library netcoreapp3.1;netstandard2.0;netstandard2.1 8.0 TSLib TSLib enable AnyCPU false portable https://github.com/Splamy/TS3AudioBot.git git true false Splamy.TSLib Splamy, Flakebi, TSLib Contributors TSLib A free and open source TeamSpeak 3 and 5 client library. Can connect as normal voice or query client and is optimized for performance. Splamy, Flakebi, TSLib Contributors OSL-3.0 https://github.com/Splamy/TS3AudioBot TeamSpeak, TS3, TS5, Voice, Client, Query, Normal, Communication 1.1.0 ReSpeak.png https://splamy.de/static/ReSpeak.png all runtime; build; native; contentfiles; analyzers; buildtransitive TextTemplatingFileGenerator TsCommand.gen.cs TextTemplatingFileGenerator Book.cs TextTemplatingFileGenerator TsErrorCode.cs TextTemplatingFileGenerator M2B.cs TextTemplatingFileGenerator Messages.cs TextTemplatingFileGenerator TsPermission.cs TextTemplatingFileGenerator TsFullClient.gen.cs TsQueryClient.gen.cs TextTemplatingFileGenerator TextTemplatingFileGenerator Types.gen.cs TextTemplatingFileGenerator TsVersion.gen.cs TextTemplatingFileGenerator TsBaseFunctions.gen.cs True True TsCommand.gen.tt True True TsFullClient.gen.tt True True Book.tt True True TsErrorCode.tt True True M2B.tt True True Messages.tt True True TsPermission.tt True True TsVersion.gen.tt TsQueryClient.gen.tt True True True True TsBaseFunctions.gen.tt True True Types.gen.tt ================================================ FILE: TSLib/TsBaseFunctions.FileTransfer.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.IO; using System.Linq; using System.Net.Sockets; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using TSLib.Messages; using IOFileInfo = System.IO.FileInfo; namespace TSLib { partial class TsBaseFunctions { /// Initiate a file upload to the server. /// Local file to upload. /// The channel id to upload to. /// The upload path within the channel. Eg: "file.txt", "path/file.png" /// True if the upload should overwrite the file if it exists. /// False will throw an exception if the file already exists. /// The password for the channel. /// A token to track the file transfer. public Task> UploadFile(IOFileInfo file, ChannelId channel, string path, bool overwrite = false, string channelPassword = "") => UploadFile(file.Open(FileMode.Open, FileAccess.Read), channel, path, overwrite, channelPassword); /// Initiate a file upload to the server. /// Data stream to upload. /// The channel id to upload to. /// The upload path within the channel. Eg: "file.txt", "path/file.png" /// True if the upload should overwrite the file if it exists. /// False will throw an exception if the file already exists. /// The password for the channel. /// True will the stream after the upload is finished. /// Will generate a md5 sum of the uploaded file. /// A token to track the file transfer. public async Task> UploadFile(Stream stream, ChannelId channel, string path, bool overwrite = false, string channelPassword = "", bool closeStream = true, bool createMd5 = false) { ushort cftid = GetFreeTransferId(); var request = await FileTransferInitUpload(channel, path, channelPassword, cftid, stream.Length, overwrite, false); if (!request.Ok) { if (closeStream) { #if NETSTANDARD2_0 stream.Dispose(); #else await stream.DisposeAsync(); #endif } return request.Error; } var token = new FileTransferToken(stream, request.Value, channel, path, channelPassword, stream.Length, createMd5) { CloseStreamWhenDone = closeStream }; return await Transfer(token); } /// Initiate a file download from the server. /// Local file to save to. /// The channel id to download from. /// The download path within the channel. Eg: "file.txt", "path/file.png" /// The password for the channel. /// A token to track the file transfer. public Task> DownloadFile(IOFileInfo file, ChannelId channel, string path, string channelPassword = "") => DownloadFile(file.Open(FileMode.Create, FileAccess.Write), channel, path, channelPassword, true); /// Initiate a file download from the server. /// Data stream to write to. /// The channel id to download from. /// The download path within the channel. Eg: "file.txt", "path/file.png" /// The password for the channel. /// True will the stream after the download is finished. /// A token to track the file transfer. public async Task> DownloadFile(Stream stream, ChannelId channel, string path, string channelPassword = "", bool closeStream = true) { ushort cftid = GetFreeTransferId(); var request = await FileTransferInitDownload(channel, path, channelPassword, cftid, 0); if (!request.Ok) { if (closeStream) { #if NETSTANDARD2_0 stream.Dispose(); #else await stream.DisposeAsync(); #endif } return request.Error; } var token = new FileTransferToken(stream, request.Value, channel, path, channelPassword, 0) { CloseStreamWhenDone = closeStream }; return await Transfer(token); } private async Task> Transfer(FileTransferToken token) { try { if (remoteAddress is null) { token.Status = TransferStatus.Failed; Log.Trace("Client is not connected. Transfer failed {@token}", token); return CommandError.ConnectionClosed; } if (token.Status != TransferStatus.Waiting) return CommandError.Custom("Token is not open"); token.Status = TransferStatus.Transfering; Log.Trace("Creating new file transfer connection to {0}", remoteAddress); using var client = new TcpClient(remoteAddress.AddressFamily); try { await client.ConnectAsync(remoteAddress.Address, token.Port); } catch (SocketException ex) { Log.Warn(ex, "SocketException trying to connect to filetransfer port"); token.Status = TransferStatus.Failed; return CommandError.ConnectionClosed; } using var md5Dig = token.CreateMd5 ? MD5.Create() : null; using var stream = client.GetStream(); byte[] keyBytes = Encoding.ASCII.GetBytes(token.TransferKey); await stream.WriteAsync(keyBytes, 0, keyBytes.Length); if (token.SeekPosition >= 0 && token.LocalStream.Position != token.SeekPosition) token.LocalStream.Seek(token.SeekPosition, SeekOrigin.Begin); if (token.Direction == TransferDirection.Upload) { // https://referencesource.microsoft.com/#mscorlib/system/io/stream.cs,2a0f078c2e0c0aa8,references const int bufferSize = 81920; var buffer = new byte[bufferSize]; int read; md5Dig?.Initialize(); while ((read = await token.LocalStream.ReadAsync(buffer, 0, buffer.Length)) != 0) { await stream.WriteAsync(buffer, 0, read); md5Dig?.TransformBlock(buffer, 0, read, buffer, 0); } md5Dig?.TransformFinalBlock(Array.Empty(), 0, 0); token.Md5Sum = md5Dig?.Hash; } else // Download { // try to preallocate space try { token.LocalStream.SetLength(token.Size); } catch (NotSupportedException) { } await stream.CopyToAsync(token.LocalStream); } if (token.Status == TransferStatus.Transfering && token.LocalStream.Position == token.Size) { token.Status = TransferStatus.Done; if (token.CloseStreamWhenDone) { #if NETSTANDARD2_0 token.LocalStream.Dispose(); #else await token.LocalStream.DisposeAsync(); #endif } } } catch (IOException ex) { Log.Debug(ex, "IOException during filetransfer"); } catch (Exception ex) { Log.Error(ex, "Exception during filetransfer"); } finally { if (token.Status != TransferStatus.Done && token.Status != TransferStatus.Cancelled) token.Status = TransferStatus.Failed; } if (token.Status == TransferStatus.Failed) return CommandError.Custom("Upload didn't finish"); return token; } private ushort GetFreeTransferId() => unchecked(++transferIdCnt); /// Resumes a download from a previously stopped position. /// The aborted token. public async Task> Resume(FileTransferToken token) { if (token.Status != TransferStatus.Cancelled) return CommandError.Custom("Only cancelled transfers can be resumed"); if (token.Direction == TransferDirection.Upload) { var result = await FileTransferInitUpload(token.ChannelId, token.Path, token.ChannelPassword, token.ClientTransferId, token.Size, false, true); if (!result.Ok) return result.Error; var request = result.Value; token.ServerTransferId = request.ServerFileTransferId; token.SeekPosition = (long)request.SeekPosition; token.Port = request.Port; token.TransferKey = request.FileTransferKey; } else // Download { var result = await FileTransferInitDownload(token.ChannelId, token.Path, token.ChannelPassword, token.ClientTransferId, token.LocalStream.Position); if (!result.Ok) return result.Error; var request = result.Value; token.ServerTransferId = request.ServerFileTransferId; token.SeekPosition = -1; token.Port = request.Port; token.TransferKey = request.FileTransferKey; } token.Status = TransferStatus.Waiting; return await Transfer(token); } /// Stops an active transfer. /// The token to abort. /// True to delete the file. /// False to only temporarily stop the transfer (can be resumed again with ). public async Task Abort(FileTransferToken token, bool delete = false) { if (token.Status != TransferStatus.Transfering && token.Status != TransferStatus.Waiting) return; await FileTransferStop(token.ServerTransferId, delete); token.Status = TransferStatus.Cancelled; if (delete && token.CloseStreamWhenDone) { #if NETSTANDARD2_0 token.LocalStream.Dispose(); #else await token.LocalStream.DisposeAsync(); #endif } } /// Gets information about the current transfer status. /// The transfer to check. /// Returns an information object or null when not available. public async Task> GetStats(FileTransferToken token) { if (token.Status != TransferStatus.Transfering) return CommandError.Custom("No transfer found"); var result = await FileTransferList(); if (result.Ok) return result.Value.Where(x => x.ServerFileTransferId == token.ServerTransferId).MapToSingle(); return result.Error; } } /// Points to a file transfer. /// This token can be used to further interact with a transfer via the . public sealed class FileTransferToken { public Stream LocalStream { get; } public TransferDirection Direction { get; } public ChannelId ChannelId { get; } public string Path { get; } public long Size { get; } public ushort ClientTransferId { get; } public ushort ServerTransferId { get; internal set; } public string ChannelPassword { get; set; } public ushort Port { get; internal set; } public long SeekPosition { get; internal set; } public string TransferKey { get; internal set; } public bool CloseStreamWhenDone { get; set; } public bool CreateMd5 { get; } public byte[]? Md5Sum { get; internal set; } public TransferStatus Status { get; set; } public FileTransferToken(Stream localStream, FileUpload upload, ChannelId channelId, string path, string channelPassword, long size, bool createMd5) : this(localStream, upload.ClientFileTransferId, upload.ServerFileTransferId, TransferDirection.Upload, channelId, path, channelPassword, upload.Port, (long)upload.SeekPosition, upload.FileTransferKey, size, createMd5) { } public FileTransferToken(Stream localStream, FileDownload download, ChannelId channelId, string path, string channelPassword, long seekPos) : this(localStream, download.ClientFileTransferId, download.ServerFileTransferId, TransferDirection.Download, channelId, path, channelPassword, download.Port, seekPos, download.FileTransferKey, (long)download.Size, false) { } public FileTransferToken(Stream localStream, ushort cftid, ushort sftid, TransferDirection dir, ChannelId channelId, string path, string channelPassword, ushort port, long seekPos, string transferKey, long size, bool createMd5) { CloseStreamWhenDone = false; Status = TransferStatus.Waiting; LocalStream = localStream; Direction = dir; ClientTransferId = cftid; ServerTransferId = sftid; ChannelId = channelId; Path = path; ChannelPassword = channelPassword; Port = port; SeekPosition = seekPos; TransferKey = transferKey; Size = size; CreateMd5 = createMd5; } } public enum TransferDirection { Upload, Download, } public enum TransferStatus { Waiting, Transfering, Done, Cancelled, Failed, } } ================================================ FILE: TSLib/TsBaseFunctions.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading.Tasks; using TSLib.Commands; using TSLib.Full.Book; using TSLib.Messages; using CmdR = System.Threading.Tasks.Task>; namespace TSLib { public delegate void NotifyEventHandler(object sender, IEnumerable e) where TEventArgs : INotification; /// A shared function base between the query and full client. public abstract partial class TsBaseFunctions : IDisposable { protected readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); /// After the client disconnected. public abstract event EventHandler OnDisconnected; /// Get whether this client is currently connected. public abstract bool Connected { get; } /// Get whether this client is currently trying to connect. public abstract bool Connecting { get; } /// The derived client type. public abstract ClientType ClientType { get; } /// The connection data this client was last connected with (or is currently connected to). public ConnectionData? ConnectionData { get; protected set; } internal IPEndPoint? remoteAddress; private ushort transferIdCnt; protected abstract Deserializer Deserializer { get; } public TsConst ServerConstants { get; protected set; } = TsConst.Default; public abstract CmdR Connect(ConnectionData conData); public abstract Task Disconnect(); public abstract void Dispose(); #region NETWORK SEND /// Sends a command to the server. Commands look exactly like query commands and mostly also behave identically. /// The type to deserialize the response to. Use for unknown response data. /// The raw command to send. /// Returns an enumeration of the deserialized and split up in objects data. public abstract Task> Send(TsCommand com) where T : IResponse, new(); /// /// Sends a command and depending on the client type waits for a response or notification. /// NOTE: Do not use this method unless you are sure the ts command fits the criteria. /// /// The command to send. /// The notification type to wait for and serialize to. public abstract Task> SendHybrid(TsCommand com, NotificationType type) where T : class, IResponse, new(); #endregion private string? GenPassword(string? password) { if (ClientType == ClientType.Full && password != null) return Full.TsCrypt.HashPassword(password); else return password; } #region UNIVERSAL COMMANDS public CmdR ChangeName(string newName) => SendVoid(new TsCommand("clientupdate") { { "client_nickname", newName }, }); public CmdR ChangeBadges(string newBadges) => SendVoid(new TsCommand("clientupdate") { { "client_badges", newBadges }, }); public CmdR ChangeDescription(string newDescription, ClientId clientId) => SendVoid(new TsCommand("clientedit") { { "clid", clientId }, { "client_description", newDescription }, }); /// Displays information about your current ServerQuery connection including your loginname, etc. public Task> WhoAmI() // Q ? => Send("whoami").MapToSingle(); public CmdR SendPrivateMessage(string message, ClientId clientId) => SendMessage(message, TextMessageTargetMode.Private, clientId.Value); public CmdR SendChannelMessage(string message) => SendMessage(message, TextMessageTargetMode.Channel, 0); public CmdR SendServerMessage(string message, ulong serverId) => SendMessage(message, TextMessageTargetMode.Server, serverId); /// Sends a text message to a specified target. /// If targetmode is set to , a message is sent to the client with the ID specified by target. /// If targetmode is set to or , /// the target parameter will be ignored and a message is sent to the current channel or server respectively. public CmdR SendMessage(string message, TextMessageTargetMode target, ulong id) => SendVoid(new TsCommand("sendtextmessage") { { "targetmode", (int)target }, { "target", id }, { "msg", message }, }); /// Sends a text message to all clients on all virtual servers in the TeamSpeak 3 Server instance. public CmdR SendGlobalMessage(string message) => SendVoid(new TsCommand("gm") { { "msg", message }, }); public CmdR KickClientFromServer(ClientId clientId, string? reasonMsg = null) => KickClient(new[] { clientId }, ReasonIdentifier.Server, reasonMsg); public CmdR KickClientFromServer(ClientId[] clientIds, string? reasonMsg = null) => KickClient(clientIds, ReasonIdentifier.Server, reasonMsg); public CmdR KickClientFromChannel(ClientId clientId, string? reasonMsg = null) => KickClient(new[] { clientId }, ReasonIdentifier.Channel, reasonMsg); public CmdR KickClientFromChannel(ClientId[] clientIds, string? reasonMsg = null) => KickClient(clientIds, ReasonIdentifier.Channel, reasonMsg); /// Kicks one or more clients specified with clid from their currently joined channel or from the server, depending on . /// The reasonmsg parameter specifies a text message sent to the kicked clients. /// This parameter is optional and may only have a maximum of 40 characters. public CmdR KickClient(ClientId[] clientIds, ReasonIdentifier reasonId, string? reasonMsg = null) => SendVoid(new TsCommand("clientkick") { { "reasonid", (int)reasonId }, { "clid", clientIds }, { "reasonmsg", reasonMsg }, }); public CmdR BanClient(ushort clientId, TimeSpan? duration = null, string? reasonMsg = null) => BanClient(new CommandParameter("clid", clientId), reasonMsg, duration); public CmdR BanClient(Uid clientUid = default, TimeSpan? duration = null, string? reasonMsg = null) => BanClient(new CommandParameter("uid", clientUid), reasonMsg, duration); private CmdR BanClient(ICommandPart clientIdentifier, string? reasonMsg = null, TimeSpan? duration = null) => SendVoid(new TsCommand("banclient") { clientIdentifier, { "banreason", reasonMsg }, { "time", duration?.TotalSeconds }, }); public CmdR ChannelEdit(ChannelId channelId, string? name = null, string? namePhonetic = null, string? topic = null, string? description = null, string? password = null, Codec? codec = null, int? codecQuality = null, int? codecLatencyFactor = null, bool? codecEncrypted = null, int? maxClients = null, int? maxFamilyClients = null, bool? maxClientsUnlimited = null, bool? maxFamilyClientsUnlimited = null, bool? maxFamilyClientsInherited = null, ChannelId? order = null, ChannelType? type = null, TimeSpan? deleteDelay = null, int? neededTalkPower = null) => SendVoid(ChannelOp("channeledit", channelId, name, namePhonetic, topic, description, password, codec, codecQuality, codecLatencyFactor, codecEncrypted, maxClients, maxFamilyClients, maxClientsUnlimited, maxFamilyClientsUnlimited, maxFamilyClientsInherited, order, null, type, deleteDelay, neededTalkPower)); public abstract Task> ChannelCreate(string name, string? namePhonetic = null, string? topic = null, string? description = null, string? password = null, Codec? codec = null, int? codecQuality = null, int? codecLatencyFactor = null, bool? codecEncrypted = null, int? maxClients = null, int? maxFamilyClients = null, bool? maxClientsUnlimited = null, bool? maxFamilyClientsUnlimited = null, bool? maxFamilyClientsInherited = null, ChannelId? order = null, ChannelId? parent = null, ChannelType? type = null, TimeSpan? deleteDelay = null, int? neededTalkPower = null); protected TsCommand ChannelOp(string op, ChannelId? channelId, string? name, string? namePhonetic, string? topic, string? description, string? password, Codec? codec, int? codecQuality, int? codecLatencyFactor, bool? codecEncrypted, int? maxClients, int? maxFamilyClients, bool? maxClientsUnlimited, bool? maxFamilyClientsUnlimited, bool? maxFamilyClientsInherited, ChannelId? order, ChannelId? parent, ChannelType? type, TimeSpan? deleteDelay, int? neededTalkPower) => new TsCommand(op) { { "cid", channelId }, { "cpid", parent }, { "channel_name", name }, { "channel_name_phonetic", namePhonetic }, { "channel_topic", topic }, { "channel_description", description }, { "channel_password", GenPassword(password) }, { "channel_codec", (byte?)codec }, { "channel_codec_quality", codecQuality }, { "channel_codec_latency_factor", codecLatencyFactor }, { "channel_codec_is_unencrypted", !codecEncrypted }, { "channel_maxclients", maxClients }, { "channel_maxfamilyclients", maxFamilyClients }, { "channel_flag_maxclients_unlimited", maxClientsUnlimited }, { "channel_flag_maxfamilyclients_unlimited", maxFamilyClientsUnlimited }, { "channel_flag_maxfamilyclients_inherited", maxFamilyClientsInherited }, { "channel_order", order }, { "channel_flag_permanent", type == null ? (bool?)null : type == ChannelType.Permanent }, { "channel_flag_semi_permanent", type == null ? (bool?)null : type == ChannelType.SemiPermanent }, { "channel_delete_delay", (ulong?)deleteDelay?.TotalSeconds }, // TODO Check { "channel_needed_talk_power", neededTalkPower }, }; /// Displays detailed configuration information about a channel including ID, topic, description, etc. /// For detailed information, see Channel Properties. public Task> ChannelInfo(ChannelId channelId) => Send(new TsCommand("channelinfo") { { "cid", channelId }, }); /// Displays a list of channels created on a virtual server including their ID, order, name, etc. /// The output can be modified using several command options. public Task> ChannelList(ChannelListOptions options = 0) => Send("channellist", new CommandOption(options)); public CmdR ChannelMove(ChannelId channelId, ChannelId? parent = null, ChannelId? order = null) => SendVoid(new TsCommand("channelmove") { { "cid", channelId }, { "cpid", parent }, { "order", order }, }); public CmdR ChannelDelete(ChannelId channelId, bool force = false) => SendVoid(new TsCommand("channeldelete") { { "cid", channelId }, { "force", force }, }); /// Displays detailed database information about a client including unique ID, creation date, etc. public Task> ClientDbInfo(ClientDbId clientDbId) => Send(new TsCommand("clientdbinfo") { { "cldbid", clientDbId }, }).MapToSingle(); /// Displays a list of clients online on a virtual server including their ID, nickname, status flags, etc. /// The output can be modified using several command options. /// Please note that the output will only contain clients which are currently in channels you're able to subscribe to. public Task> ClientList(ClientListOptions options = 0) => Send("clientlist", new CommandOption(options)); /// Displays detailed configuration information about a client including unique ID, nickname, client version, etc. public Task> ClientInfo(ClientId clientId) => Send(new TsCommand("clientinfo") { { "clid", clientId }, }).MapToSingle(); /// Use a token key and gain access to a server or channel group. /// Please note that the server will automatically delete the token after it has been used. public CmdR PrivilegeKeyUse(string key) => SendVoid(new TsCommand("privilegekeyuse") { { "token", key }, }); /// Adds a set of specified permissions to the server group specified with . /// Multiple permissions can be added by providing the four parameters of each permission. public CmdR ServerGroupAddPerm(ServerGroupId serverGroupId, TsPermission permission, int permissionValue, bool permissionNegated, bool permissionSkip) => SendVoid(new TsCommand("servergroupaddperm") { { "sgid", serverGroupId }, { "permvalue", permissionValue }, { "permnegated", permissionNegated }, { "permskip", permissionSkip }, TsPermissionHelper.GetAsParameter(Deserializer.PermissionTransform, permission), }); /// Adds a set of specified permissions to the server group specified with . /// Multiple permissions can be added by providing the four parameters of each permission. public CmdR ServerGroupAddPerm(ServerGroupId serverGroupId, TsPermission[] permission, int[] permissionValue, bool[] permissionNegated, bool[] permissionSkip) => SendVoid(new TsCommand("servergroupaddperm") { { "sgid", serverGroupId }, { "permvalue", permissionValue }, { "permnegated", permissionNegated }, { "permskip", permissionSkip }, TsPermissionHelper.GetAsMultiParameter(Deserializer.PermissionTransform, permission), }); /// Adds a client to the server group specified with . Please note that a /// client cannot be added to default groups or template groups. public CmdR ServerGroupAddClient(ServerGroupId serverGroupId, ClientDbId clientDbId) => SendVoid(new TsCommand("servergroupaddclient") { { "sgid", serverGroupId }, { "cldbid", clientDbId }, }); /// Removes a client specified with cldbid from the server group specified with . public CmdR ServerGroupDelClient(ServerGroupId serverGroupId, ClientDbId clientDbId) => SendVoid(new TsCommand("servergroupdelclient") { { "sgid", serverGroupId }, { "cldbid", clientDbId }, }); public CmdR FileTransferStop(ushort serverTransferId, bool delete) => SendVoid(new TsCommand("ftstop") { { "serverftfid", serverTransferId }, { "delete", delete }, }); public CmdR FileTransferDeleteFile(ChannelId channelId, string[] path, string channelPassword = "") => SendVoid(new TsCommand("ftdeletefile") { { "cid", channelId }, { "cpw", channelPassword }, { "name", path }, }); public CmdR FileTransferCreateDirectory(ChannelId channelId, string path, string channelPassword = "") => SendVoid(new TsCommand("ftcreatedir") { { "cid", channelId }, { "dirname", path }, { "cpw", channelPassword }, }); public CmdR FileTransferRenameFile(ChannelId channelId, string oldName, string channelPassword, string newName, ChannelId? targetChannel = null, string targetChannelPassword = "") => SendVoid(new TsCommand("ftrenamefile") { { "cid", channelId }, { "oldname", oldName }, { "newname", newName }, { "cpw", channelPassword }, { "tcid", targetChannel }, { "tcpw", targetChannel.HasValue ? targetChannelPassword : null }, }); public async CmdR UploadAvatar(System.IO.Stream image) { var token = await UploadFile(image, ChannelId.Null, "/avatar", overwrite: true, createMd5: true); if (!token.Ok) return CommandError.Custom("Avatar upload failed: " + token.Error.ErrorFormat()); if (token.Value.Status != TransferStatus.Done) return CommandError.Custom("Avatar upload failed"); var md5 = string.Concat(token.Value.Md5Sum.Select(x => x.ToString("x2"))); return await SendVoid(new TsCommand("clientupdate") { { "client_flag_avatar", md5 } }); } /// Deletes the avatar of a user. /// Can be called without uid to delete own avatar. /// The client uid where the avatar should be deleted. public CmdR DeleteAvatar(Uid? clientUid = null) { string path = "/avatar_" + clientUid; return FileTransferDeleteFile(ChannelId.Null, new[] { path }); } public CmdR ClientMove(ClientId clientId, ChannelId channelId, string? channelPassword = null) => SendVoid(new TsCommand("clientmove") { { "clid", clientId }, { "cid", channelId }, { "cpw", GenPassword(channelPassword) }, }); #endregion #region UNIVERSAL HYRBRID COMMANDS /// Creates a new server group using the name specified with and return its ID. /// The optional parameter can be used to create ServerQuery groups and template groups. public abstract Task> ServerGroupAdd(string name, GroupType? type = null); /// Displays all server groups the client specified with is currently residing in. public Task> ServerGroupsByClientDbId(ClientDbId clDbId) => SendHybrid(new TsCommand("servergroupsbyclientid") { { "cldbid", clDbId } }, NotificationType.ServerGroupsByClientId); public abstract Task> FileTransferInitUpload(ChannelId channelId, string path, string channelPassword, ushort clientTransferId, long fileSize, bool overwrite, bool resume); public abstract Task> FileTransferInitDownload(ChannelId channelId, string path, string channelPassword, ushort clientTransferId, long seek); public Task> FileTransferList() => SendHybrid(new TsCommand("ftlist"), NotificationType.FileTransfer); public Task> FileTransferGetFileList(ChannelId channelId, string path, string channelPassword = "") => SendHybrid(new TsCommand("ftgetfilelist") { { "cid", channelId }, { "path", path }, { "cpw", channelPassword } // TODO CHECK ? }, NotificationType.FileList); public Task> FileTransferGetFileInfo(ChannelId channelId, string[] path, string channelPassword = "") => SendHybrid(new TsCommand("ftgetfileinfo") { { "cid", channelId }, { "cpw", channelPassword }, // TODO CHECK ? { "name", path } }, NotificationType.FileInfo); public Task> GetClientDbIdFromUid(Uid clientUid) => SendHybrid(new TsCommand("clientgetdbidfromuid") { { "cluid", clientUid } }, NotificationType.ClientDbIdFromUid).MapToSingle(); public Task> GetClientUidFromClientId(ClientId clientId) => SendHybrid(new TsCommand("clientgetuidfromclid") { { "clid", clientId } }, NotificationType.ClientUidFromClid).MapToSingle(); public Task> GetClientNameFromUid(Uid clientUid) => SendHybrid(new TsCommand("clientgetnamefromuid") { { "cluid", clientUid } }, NotificationType.ClientNameFromUid).MapToSingle(); public Task> GetClientIds(Uid clientUid) => SendHybrid(new TsCommand("clientgetids") { { "cluid", clientUid } }, NotificationType.ClientIds); public Task> PermOverview(ClientDbId clientDbId, ChannelId channelId, params TsPermission[] permission) => SendHybrid(new TsCommand("permoverview") { { "cldbid", clientDbId }, { "cid", channelId }, TsPermissionHelper.GetAsMultiParameter(Deserializer.PermissionTransform, permission) }, NotificationType.PermOverview); public Task> PermissionList() => SendHybrid(new TsCommand("permissionlist"), NotificationType.PermList); public Task> GetServerConnectionInfo() => SendHybrid(new TsCommand("serverrequestconnectioninfo"), NotificationType.ServerConnectionInfo).MapToSingle(); public Task> ServerGroupClientList(ServerGroupId serverGroupId, bool getNames = false) => SendHybrid(new TsCommand("servergroupclientlist") { { "sgid", serverGroupId }, { getNames ? new CommandOption("names") : null } }, NotificationType.ServerGroupClientList); #endregion } } ================================================ FILE: TSLib/TsBaseFunctions.gen.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // using System; using System.Threading.Tasks; using TSLib.Commands; using TSLib.Messages; #nullable enable namespace TSLib { partial class TsBaseFunctions { /// /// Sends a TS-command. /// /// /// /// The command name. /// The parameters to be added to this command. /// See , or for more information. /// /// public async Task> Send(string command, params ICommandPart[] parameter) => await Send(new TsCommand(command, parameter)); /// /// Sends a TS-command. /// /// /// /// The command name. /// The parameters to be added to this command. /// See , or for more information. /// /// Returns an enumeration of the deserialized and split up in objects data. public async Task> Send(string command, params ICommandPart[] parameter) where T : IResponse, new() => await Send(new TsCommand(command, parameter)); /// /// Sends a TS-command. /// /// The response (if any) is not deserialized and is discarded. /// /// The command name. /// The parameters to be added to this command. /// See , or for more information. /// /// public async Task> SendVoid(string command, params ICommandPart[] parameter) => await Send(new TsCommand(command, parameter)); /// /// Sends a TS-command. /// /// The response (if any) is not deserialized and is discarded. /// /// The command name. /// The parameters to be added to this command. /// See , or for more information. /// /// public async Task> SendVoid(TsCommand com) => await Send(com); /// /// Sends a TS-command. /// This will send a normal query-command when connected via query client. When connected as a full client the first specified notification is used as the response. /// /// /// The command name. /// The parameters to be added to this command. /// See , or for more information. /// The notification type to wait for and serialize to when called from the full client. /// public async Task> SendHybrid(string command, NotificationType type, params ICommandPart[] parameter) => await SendHybrid(new TsCommand(command, parameter), type); /// /// Sends a TS-command. /// This will send a normal query-command when connected via query client. When connected as a full client the first specified notification is used as the response. /// /// /// The command name. /// The parameters to be added to this command. /// See , or for more information. /// The notification type to wait for and serialize to when called from the full client. /// Returns an enumeration of the deserialized and split up in objects data. public async Task> SendHybrid(string command, NotificationType type, params ICommandPart[] parameter) where T : class, IResponse, new() => await SendHybrid(new TsCommand(command, parameter), type); #pragma warning disable CS0067 public abstract event NotifyEventHandler? OnChannelChanged; public abstract event EventHandler? OnEachChannelChanged; public abstract event NotifyEventHandler? OnChannelCreated; public abstract event EventHandler? OnEachChannelCreated; public abstract event NotifyEventHandler? OnChannelDeleted; public abstract event EventHandler? OnEachChannelDeleted; public abstract event NotifyEventHandler? OnChannelEdited; public abstract event EventHandler? OnEachChannelEdited; public abstract event NotifyEventHandler? OnChannelMoved; public abstract event EventHandler? OnEachChannelMoved; public abstract event NotifyEventHandler? OnChannelPasswordChanged; public abstract event EventHandler? OnEachChannelPasswordChanged; public abstract event NotifyEventHandler? OnClientEnterView; public abstract event EventHandler? OnEachClientEnterView; public abstract event NotifyEventHandler? OnClientLeftView; public abstract event EventHandler? OnEachClientLeftView; public abstract event NotifyEventHandler? OnClientMoved; public abstract event EventHandler? OnEachClientMoved; public abstract event NotifyEventHandler? OnServerEdited; public abstract event EventHandler? OnEachServerEdited; public abstract event NotifyEventHandler? OnTextMessage; public abstract event EventHandler? OnEachTextMessage; public abstract event NotifyEventHandler? OnTokenUsed; public abstract event EventHandler? OnEachTokenUsed; #pragma warning restore CS0067 } } ================================================ FILE: TSLib/TsBaseFunctions.gen.tt ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // <#@ template debug="true" hostSpecific="true" language="C#" #> <#@ include file="Generated/MessageParser.ttinclude" once="true" #> <#@ include file="Generated/NotificationUtil.ttinclude" once="true" #> <#@ output extension=".cs" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> using System; using System.Threading.Tasks; using TSLib.Commands; using TSLib.Messages; #nullable enable namespace TSLib { partial class TsBaseFunctions { <# // SEND UTILITY METHODS foreach(var isHybrid in new[]{ false, true }) foreach(var hasReturn in new[]{ "dict", "T", "void" }) { if (isHybrid && hasReturn == "void") continue; Func Ret = (a, b, c) => { return hasReturn == "dict" ? a : hasReturn == "T" ? b : hasReturn == "void" ? c : "!ERR!"; }; var retSuffix = Ret("", "", "Void"); var callTitle = "Send" + retSuffix + (isHybrid ? "Hybrid" : ""); var retType = Ret( "Task>", "Task>", "Task>"); var genMod = Ret("", "", ""); var genSuffix = Ret("", $" where T : {(isHybrid ? "class, " : "")}IResponse, new()", ""); var fwdModInfix = Ret("", "", ""); var fwdTitle = "Send" + (isHybrid ? "Hybrid" : ""); var fwdSuffix = Ret("", "", ".ContinueWith(t => t.Result.OnlyError())"); foreach(var vparam in new[]{ "cp", "com" }) { if(vparam == "com" && callTitle == fwdTitle) continue; Func Par = (a, b) => { return vparam == "cp" ? a : vparam == "com" ? b : "!ERR!"; }; var hybridParam = isHybrid ? ", NotificationType type" : ""; var callParam = Par( $"string command{hybridParam}, params ICommandPart[] parameter", $"TsCommand com{hybridParam}"); var fwdParam = Par( $"new TsCommand(command, parameter)", $"com"); if (isHybrid) fwdParam += ", type"; #> /// /// Sends a TS-command. /// <# if(isHybrid) { #>This will send a normal query-command when connected via query client. When connected as a full client the first specified notification is used as the response.<# } #> /// <# if(hasReturn == "void") { #>The response (if any) is not deserialized and is discarded.<# } #> /// /// The command name. /// The parameters to be added to this command. /// See , or for more information. /// <# if(isHybrid) { #>The notification type to wait for and serialize to when called from the full client.<# } #> /// <# if(hasReturn == "T") { #>Returns an enumeration of the deserialized and split up in objects data.<# } #> public async <#= retType #> <#= callTitle #><#= genMod #>(<#= callParam #>)<#= genSuffix #> => await <#= fwdTitle #><#= fwdModInfix #>(<#= fwdParam #>); <# }} #> #pragma warning disable CS0067 <# // NOTIFICATIONS var genmsg = Messages.Parse(Host.ResolvePath("Declarations/Messages.toml")); GenNtfyDecls(OnlyS2C(genmsg.NotifiesSorted).Where(ntfy => sharedNotifications.Contains(ntfy.name)), true); #> #pragma warning restore CS0067 } } ================================================ FILE: TSLib/TsDnsResolver.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using Heijden.Dns.Portable; using Heijden.DNS; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using TSLib.Helper; namespace TSLib { /// Provides methods to resolve TSDNS, SRV redirects and nicknames public static class TsDnsResolver { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); public const ushort TsVoiceDefaultPort = 9987; public const ushort TsQueryDefaultPort = 10011; private const ushort TsDnsDefaultPort = 41144; private const string DnsPrefixTcp = "_tsdns._tcp."; private const string DnsPrefixUdp = "_ts3._udp."; private const string NicknameLookup = "https://named.myteamspeak.com/lookup?name="; private static readonly TimeSpan LookupTimeout = TimeSpan.FromSeconds(1); public static readonly Resolver Resolver = new Resolver(new[] { // Google new IPEndPoint(new IPAddress(new byte[] { 8,8,8,8 }), 53), new IPEndPoint(new IPAddress(new byte[] { 8,8,4,4 }), 53), // Cloudflare new IPEndPoint(new IPAddress(new byte[] { 1,1,1,1 }), 53), new IPEndPoint(new IPAddress(new byte[] { 1,0,0,1 }), 53), // OpenDNS new IPEndPoint(new IPAddress(new byte[] { 208,67,222,222 }), 53), new IPEndPoint(new IPAddress(new byte[] { 208,67,220,220 }), 53), // Freenom new IPEndPoint(new IPAddress(new byte[] { 80,80,80,80 }), 53), new IPEndPoint(new IPAddress(new byte[] { 80,80,81,81 }), 53), }); // TODO maybe change to proper TLRU private static readonly ConcurrentDictionary addressCache = new ConcurrentDictionary(); private static readonly TimeSpan CacheTimeout = TimeSpan.FromMinutes(10); /// Tries to resolve an address string to an ip. /// The address, nickname, etc. to resolve. /// The default port when no port is specified with the address or the resolved address. /// The ip address if successfully resolved. public static async Task TryResolve(string address, ushort defaultPort = TsVoiceDefaultPort) { if (string.IsNullOrEmpty(address)) throw new ArgumentNullException(nameof(address)); if (addressCache.TryGetValue(address, out var cache) && Tools.Now - cache.Created < CacheTimeout) return cache.Ip; var endPoint = await TryResolveUncached(address, defaultPort); addressCache.TryAdd(address, new CacheEntry(endPoint, Tools.Now)); return endPoint; } public static async Task TryResolveUncached(string address, ushort defaultPort = TsVoiceDefaultPort) { if (string.IsNullOrEmpty(address)) throw new ArgumentNullException(nameof(address)); IPEndPoint? endPoint; Log.Debug("Trying to look up '{0}'", address); // if this address does not look like a domain it might be a nickname if (!address.Contains(".") && !address.Contains(":") && address != "localhost") { Log.Debug("Resolving '{0}' as nickname", address); var resolvedNickname = await ResolveNickname(address).ConfigureAwait(false); if (resolvedNickname != null) { Log.Debug("Resolved nickname '{0}' as '{1}'", address, resolvedNickname); address = resolvedNickname; } } // host is specified as an IP (+ Port) if ((endPoint = ParseIpEndPoint(address, defaultPort)) != null) { Log.Debug("Address is an ip: '{0}'", endPoint); return endPoint; } if (!Uri.TryCreate("http://" + address, UriKind.Absolute, out var uri)) { Log.Warn("Could not parse address as uri"); return null; } // host is a dns name var hasUriPort = !string.IsNullOrEmpty(uri.GetComponents(UriComponents.Port, UriFormat.Unescaped)); // Try resolve udp prefix // At this address we'll get ts voice server endPoint = await ResolveSrv(Resolver, DnsPrefixUdp + uri.Host).ConfigureAwait(false); if (endPoint != null) { if (hasUriPort) endPoint.Port = uri.Port; Log.Debug("Address found using _udp prefix '{0}'", endPoint); return endPoint; } // split domain to get a list of subdomains, for e.g.: // my.cool.subdomain.from.de // => from.de // => subdomain.from.de // => cool.subdomain.from.de var domainSplit = uri.Host.Split('.'); if (domainSplit.Length <= 1) return null; var domainList = new List(); for (int i = 1; i < Math.Min(domainSplit.Length, 4); i++) domainList.Add(string.Join(".", domainSplit, domainSplit.Length - (i + 1), i + 1)); // Try resolve tcp prefix // Under this address we'll get the tsdns server foreach (var domain in domainList) { var srvEndPoint = await ResolveSrv(Resolver, DnsPrefixTcp + domain).ConfigureAwait(false); if (srvEndPoint is null) continue; endPoint = await ResolveTsDns(srvEndPoint, uri.Host, defaultPort).ConfigureAwait(false); if (endPoint != null) { if (hasUriPort) endPoint.Port = uri.Port; Log.Debug("Address found using _tcp prefix '{0}'", endPoint); return endPoint; } } // Try resolve to the tsdns service directly foreach (var domain in domainList) { endPoint = await ResolveTsDns(domain, TsDnsDefaultPort, uri.Host, defaultPort).ConfigureAwait(false); if (endPoint != null) return endPoint; } // Try to normally resolve server address var hostAddress = await ResolveDns(uri.Host).ConfigureAwait(false); if (hostAddress is null) return null; var port = hasUriPort ? uri.Port : defaultPort; return new IPEndPoint(hostAddress, port); } private static async Task ResolveSrv(Resolver resolver, string domain) { Log.Trace("Resolving srv record '{0}'", domain); Response response; try { response = await resolver.Query(domain, QType.SRV, QClass.IN).ConfigureAwait(false); } catch (Exception ex) { Log.Warn(ex, "Unexcepted dns resolve error."); return null; } if (response.RecordsSRV.Length > 0) { var srvRecord = response.RecordsSRV[0]; var hostAddress = await ResolveDns(srvRecord.TARGET).ConfigureAwait(false); if (hostAddress != null) return new IPEndPoint(hostAddress, srvRecord.PORT); } return null; } private static async Task ResolveTsDns(string tsDnsAddress, ushort port, string resolveAddress, ushort defaultPort) { Log.Trace("Looking for the tsdns under '{0}'", tsDnsAddress); var hostAddress = await ResolveDns(tsDnsAddress).ConfigureAwait(false); if (hostAddress is null) return null; return await ResolveTsDns(new IPEndPoint(hostAddress, port), resolveAddress, defaultPort).ConfigureAwait(false); } private static async Task ResolveTsDns(IPEndPoint tsDnsAddress, string resolveAddress, ushort defaultPort) { Log.Trace("Looking up tsdns address '{0}'", resolveAddress); try { using var client = new TcpClient(); var cancelTask = Task.Delay(LookupTimeout); var connectTask = client.ConnectAsync(tsDnsAddress.Address, tsDnsAddress.Port).ContinueWith(async t => { // Swallow error on connect error try { await t; } catch { } }, TaskContinuationOptions.OnlyOnFaulted); await Task.WhenAny(connectTask, cancelTask); if (cancelTask.IsCompleted) { Log.Debug("Request to '{0}' timed out", tsDnsAddress); return null; } using var stream = client.GetStream(); var addBuf = Encoding.ASCII.GetBytes(resolveAddress); await stream.WriteAsync(addBuf, 0, addBuf.Length); await stream.FlushAsync(); stream.ReadTimeout = (int)LookupTimeout.TotalMilliseconds; var readBuffer = new byte[128]; int readLen = await stream.ReadAsync(readBuffer, 0, readBuffer.Length); string returnString = Encoding.ASCII.GetString(readBuffer, 0, readLen); return ParseIpEndPoint(returnString, defaultPort); } catch (Exception ex) { Log.Debug(ex, "Socket error checking '{0}', reason {1}", resolveAddress, ex.Message); return null; } } private static async Task ResolveDns(string hostOrNameAddress) { try { Log.Trace("Lookup dns: '{0}'", hostOrNameAddress); IPHostEntry hostEntry = await Dns.GetHostEntryAsync(hostOrNameAddress).ConfigureAwait(false); if (hostEntry.AddressList.Length == 0) return null; return hostEntry.AddressList[0]; } catch (SocketException) { return null; } } private static readonly Regex IpRegex = new Regex(@"(?(?:\d{1,3}\.){3}\d{1,3}|\[[0-9a-fA-F:]+\]|localhost)(?::(?\d{1,5}))?", RegexOptions.ECMAScript | RegexOptions.Compiled); private static IPEndPoint? ParseIpEndPoint(string address, ushort defaultPort) { var match = IpRegex.Match(address); if (!match.Success) return null; IPAddress ipAddr; if (match.Groups["ip"].Value == "localhost") ipAddr = IPAddress.Loopback; else if (!IPAddress.TryParse(match.Groups["ip"].Value, out ipAddr)) return null; if (!match.Groups["port"].Success) return new IPEndPoint(ipAddr, defaultPort); if (!ushort.TryParse(match.Groups["port"].Value, out ushort port)) return null; return new IPEndPoint(ipAddr, port); } private static async Task ResolveNickname(string nickname) { string result; try { var request = WebRequest.Create(NicknameLookup + Uri.EscapeDataString(nickname)); using var respose = await request.GetResponseAsync().ConfigureAwait(false); using var stream = respose.GetResponseStream(); using var reader = new StreamReader(stream, Tools.Utf8Encoder, false, (int)respose.ContentLength); result = await reader.ReadToEndAsync().ConfigureAwait(false); } catch (Exception ex) { Log.Warn(ex, "Failed to resolve nickname \"{0}\"", nickname); return null; } var splits = result.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); if (splits.Length == 0) { Log.Warn("Nickname \"{0}\" has no address entries", nickname); return null; } return splits[0]; } private readonly struct CacheEntry { public IPEndPoint? Ip { get; } public DateTime Created { get; } public CacheEntry(IPEndPoint? ip, DateTime created) { Ip = ip; Created = created; } } } } ================================================ FILE: TSLib/TsEnums.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; namespace TSLib { /* * Most important Id datatypes: * * ClientUid: string * ClientDbId: ulong * ClientId: ushort * ChannelId: ulong * ServerGroupId: ulong * ChannelGroupId: ulong * PermissionIdT: int ??? */ public enum ClientType { Full = 0, Query, } [Flags] public enum ClientListOptions { // ReSharper disable InconsistentNaming, UnusedMember.Global uid = 1 << 0, away = 1 << 1, voice = 1 << 2, times = 1 << 3, groups = 1 << 4, info = 1 << 5, icon = 1 << 6, country = 1 << 7, // ReSharper restore InconsistentNaming, UnusedMember.Global } [Flags] public enum ChannelListOptions { // ReSharper disable InconsistentNaming, UnusedMember.Global topic = 1 << 0, flags = 1 << 1, voice = 1 << 2, limits = 1 << 3, icon = 1 << 4, secondsempty = 1 << 5, // ReSharper restore InconsistentNaming, UnusedMember.Global } public enum GroupNamingMode { /// No group name is displayed. None = 0, /// The group is displayed before the client name. Before, /// The group is displayed after the client name. After } // ReSharper disable UnusedMember.Global public enum Reason { UserAction = 0, UserOrChannelMoved, SubscriptionChanged, Timeout, KickedFromChannel, KickedFromServer, Banned, ServerStopped, LeftServer, ChannelUpdated, ServerOrChannelEdited, ServerShutdown, SocketError = 1000, } public enum GroupWhisperType : byte { /// Targets all users in the specified server group. /// (Requires servergroup targetId) ServerGroup = 0, /// Targets all users in the specified channel group. /// (Requires channelgroup targetId) ChannelGroup, /// Targets all users with channel commander. ChannelCommander, /// Targets all users on the server. AllClients, } public enum GroupWhisperTarget : byte { AllChannels = 0, CurrentChannel, ParentChannel, AllParentChannel, ChannelFamily, CompleteChannelFamily, Subchannels, } // ReSharper enable UnusedMember.Global public enum LicenseType : ushort { /// No licence NoLicense = 0, ///Authorised TeamSpeak Host Provider License (ATHP) Athp = 1, ///Offline/LAN License Lan = 2, ///Non-Profit License (NPL) Npl = 3, ///Unknown License Unknown = 4, } // http://media.teamspeak.com/ts3_literature/TeamSpeak%203%20Server%20Query%20Manual.pdf // public_definitions.h from the ts3 plugin library public enum HostMessageMode { /// Dont display anything None = 0, /// Display message in chatlog. Log, /// Display message in modal dialog. Modal, /// Display message in modal dialog and close connection. ModalQuit } public enum HostBannerMode { ///Do not adjust. NoAdjust = 0, ///Adjust but ignore aspect ratio (like TeamSpeak 2). IgnoreAspect, ///Adjust and keep aspect ratio. KeepAspect } public enum Codec : byte { ///mono, 16bit, 8kHz SpeexNarrowband = 0, ///mono, 16bit, 16kHz SpeexWideband, ///mono, 16bit, 32kHz SpeexUltraWideband, ///mono, 16bit, 48kHz CeltMono, ///mono, 16bit, 48kHz, optimized for voice OpusVoice, ///stereo, 16bit, 48kHz, optimized for music OpusMusic, /// PCM S16LE 1/2 Channel (TSLib extension; not supported by normal TeamSpeak clients!) Raw = 127, } public enum CodecEncryptionMode { ///Configure per channel. Individual = 0, ///Globally disabled. Disabled, ///Globally enabled. Enabled } public enum TextMessageTargetMode { /// Target is a client. Private = 1, /// Target is a channel. Channel, /// Target is a virtual server. Server, } public enum LogLevel { ///Everything that is really bad. Error = 1, ///Everything that might be bad. Warning, ///Output that might help find a problem. Debug, ///Informational output. Info } public enum ReasonIdentifier { ///Kick client from channel. Channel = 4, ///Kick client from server. Server, } public enum GroupType { ///Template group (used for new virtual servers). Template = 0, ///Regular group (used for regular clients). Regular, ///Global query group (used for ServerQuery clients). Query } public enum PermissionType { ///Server group permission. (id1: ServerGroupId, id2: 0) ServerGroup = 0, ///Client specific permission. (id1: ClientDbId, id2: 0) GlobalClient, ///Channel specific permission. (id1: ChannelId, id2: 0) Channel, ///Channel group permission. (id1: ChannelId, id2: ChannelGroupId) ChannelGroup, ///Channel-client specific permission. (id1: ChannelId, id2: ClientDbId) ChannelClient } public enum TokenType { ///Server group token (id1: ServerGroupId, id2: 0). ServerGroup = 0, ///Channel group token (id1: ServerGroupId, id2: ChannelId). ChannelGroup } public enum PluginTargetMode { ///Send to all clients in current channel. CurrentChannel = 0, ///Send to all clients on server. Server, ///Send to all given client ids. Client, ///Send to all subscribed clients in current channel. CurrentChannelSubscribedClients, } // notifychannelpermhints [Flags] public enum ChannelPermissionHint { None = 0, Join = 1 << 0, // b_channel_join_* Modify = 1 << 1, // i_channel_modify_power ForceDelete = 1 << 2, // b_channel_delete_flag_force Delete = 1 << 3, // b_channel_delete_* Subscribe = 1 << 4, // i_channel_subscribe_power ViewDescription = 1 << 5, // i_channel_description_view_power FileUpload = 1 << 6, // i_ft_file_upload_power FileDownload = 1 << 7, // i_ft_needed_file_download_power FileDelete = 1 << 8, // i_ft_file_delete_power FileRename = 1 << 9, // i_ft_file_rename_power FileBrowse = 1 << 10, // i_ft_file_browse_power FileDirectoryCreate = 1 << 11, // i_ft_directory_create_power ModifyPermissions = 1 << 12, // i_channel_permission_modify_power All = (1 << 13) - 1, } // notifyclientpermhints [Flags] public enum ClientPermissionHint { None = 0, KickServer = 1 << 0, // i_client_kick_from_server_power KickChannel = 1 << 1, // i_client_kick_from_channel_power Ban = 1 << 2, // i_client_ban_power MoveClient = 1 << 3, // i_client_move_power PrivateMessage = 1 << 4, // i_client_private_textmessage_power Poke = 1 << 5, // i_client_poke_power Whisper = 1 << 6, // i_client_whisper_power Complain = 1 << 7, // i_client_complain_power ModifyPermissions = 1 << 8, // i_client_permission_modify_power All = (1 << 9) - 1, } } ================================================ FILE: TSLib/TsPermissionHelper.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Linq; using TSLib.Commands; using TSLib.Helper; using TSLib.Messages; namespace TSLib { public static partial class TsPermissionHelper { public static ICommandPart GetAsParameter(IPermissionTransform permissionTransform, TsPermission permission) { if (permissionTransform is null || permissionTransform == DummyPermissionTransform.Instance) return new CommandParameter("permsid", permission.ToString()); else return new CommandParameter("permid", permissionTransform.GetId(permission)); } public static ICommandPart GetAsMultiParameter(IPermissionTransform permissionTransform, params TsPermission[] permission) { if (permissionTransform is null || permissionTransform == DummyPermissionTransform.Instance) return new CommandMultiParameter("permsid", permission.Select(x => x.ToString())); else return new CommandMultiParameter("permid", permission.Select(x => permissionTransform.GetId(x))); } public static PermOverview Combine(this PermOverview perm, PermOverview other) { // A pretty good documentation on permissions: http://yat.qa/ressourcen/definitionen-und-algorithmen/#permissions switch (perm.PermissionType) { case PermissionType.ServerGroup: switch (other.PermissionType) { case PermissionType.ServerGroup: if (perm.PermissionNegated && other.PermissionNegated) return perm.PermissionValue < other.PermissionValue ? perm : other; else if (other.PermissionNegated) return other; else return perm.PermissionValue > other.PermissionValue ? perm : other; case PermissionType.GlobalClient: case PermissionType.ChannelClient: return other; case PermissionType.Channel: case PermissionType.ChannelGroup: if (perm.PermissionSkip) return perm; else return other; default: throw Tools.UnhandledDefault(perm.PermissionType); } case PermissionType.GlobalClient: switch (other.PermissionType) { case PermissionType.ServerGroup: return Combine(other, perm); case PermissionType.GlobalClient: return perm.PermissionValue > other.PermissionValue ? perm : other; case PermissionType.Channel: case PermissionType.ChannelGroup: if (perm.PermissionSkip) return perm; else return other; case PermissionType.ChannelClient: return other; default: throw Tools.UnhandledDefault(perm.PermissionType); } case PermissionType.Channel: switch (other.PermissionType) { case PermissionType.ServerGroup: case PermissionType.GlobalClient: return Combine(other, perm); case PermissionType.Channel: return perm.PermissionValue > other.PermissionValue ? perm : other; case PermissionType.ChannelGroup: case PermissionType.ChannelClient: return other; default: throw Tools.UnhandledDefault(perm.PermissionType); } case PermissionType.ChannelGroup: switch (other.PermissionType) { case PermissionType.ServerGroup: case PermissionType.GlobalClient: case PermissionType.Channel: return perm; case PermissionType.ChannelGroup: return perm.PermissionValue > other.PermissionValue ? perm : other; case PermissionType.ChannelClient: return other; default: throw Tools.UnhandledDefault(perm.PermissionType); } case PermissionType.ChannelClient: switch (other.PermissionType) { case PermissionType.ServerGroup: case PermissionType.GlobalClient: case PermissionType.Channel: case PermissionType.ChannelGroup: return perm; case PermissionType.ChannelClient: return perm.PermissionValue > other.PermissionValue ? perm : other; default: throw Tools.UnhandledDefault(perm.PermissionType); } default: throw Tools.UnhandledDefault(perm.PermissionType); } } } } ================================================ FILE: TSLib/TsVersion.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System.Collections.Generic; using System.Text.RegularExpressions; using TSLib.Full; namespace TSLib { /// Describes a version tuple of version and platform. public class TsVersion { protected static readonly Regex VersionPattern = new Regex(@"([^ ])* \[Build: (\d+)\]", RegexOptions.ECMAScript | RegexOptions.Compiled); private static readonly Dictionary Platforms = new Dictionary { { "Windows", ClientPlatform.Windows }, { "Linux", ClientPlatform.Linux }, { "OS X", ClientPlatform.MacOs }, { "macOS", ClientPlatform.MacOs }, { "Android", ClientPlatform.Android }, { "iOS", ClientPlatform.Ios }, }; protected static ClientPlatform GetPlatform(string platform) => Platforms.TryGetValue(platform, out var enu) ? enu : ClientPlatform.Other; public string Version { get; } public string Platform { get; } public ClientPlatform PlatformType { get; } public ulong Build { get; } public TsVersion(string rawVersion, string platform, ulong build) : this(rawVersion, platform, GetPlatform(platform), build) { } public TsVersion(string rawVersion, string platform, ClientPlatform platformType, ulong build) { Version = rawVersion; Platform = platform; PlatformType = platformType; Build = build; } public static TsVersion? TryParse(string version, string platform) { var match = VersionPattern.Match(version); if (!match.Success) return null; if (!ulong.TryParse(match.Groups[2].Value, out var build)) return null; return new TsVersion(version, platform, build); } } /// /// Describes a triple of version, platform and a cryptographical signature (usually distributed by "TeamSpeak Systems"). /// Each triple has to match and is not interchangeable with other triple parts. /// public sealed partial class TsVersionSigned : TsVersion { public string Sign { get; } public TsVersionSigned(string rawVersion, string platform, ulong build, string sign) : this(rawVersion, platform, GetPlatform(platform), build, sign) { } public TsVersionSigned(string rawVersion, string platform, ClientPlatform platformType, ulong build, string sign) : base(rawVersion, platform, platformType, build) { Sign = sign; } public static TsVersionSigned? TryParse(string version, string platform, string sign) { var match = VersionPattern.Match(version); if (!match.Success) return null; if (!ulong.TryParse(match.Groups[2].Value, out var build)) return null; var prelim = new TsVersionSigned(version, platform, build, sign); if (!prelim.CheckValid()) return null; return prelim; } public bool CheckValid() => TsCrypt.EdCheck(this); } public enum ClientPlatform { Other = 0, Windows, Linux, MacOs, Android, Ios, } } ================================================ FILE: TSLib/Types.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using TSLib.Full; namespace TSLib { public partial struct Uid { /// Unofficial type public static readonly Uid Anonymous = new Uid("anonymous"); public static readonly Uid ServerAdmin = new Uid("serveradmin"); public static bool IsValid(string uid) { if (uid == Anonymous.Value || uid == ServerAdmin.Value) return true; var result = TsCrypt.Base64Decode(uid); return result != null && result.Length == 20; } } public partial struct ChannelId { public string ToPath() => $"/{Value}"; } } ================================================ FILE: TSLib/Types.gen.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // #nullable enable using Newtonsoft.Json; using System; using System.Diagnostics; using System.Globalization; using System.Runtime.InteropServices; namespace TSLib { public static class TsTypes { public static Type[] All => new Type[] { typeof(Uid),typeof(ClientDbId),typeof(ClientId),typeof(ChannelId),typeof(ServerGroupId),typeof(ChannelGroupId), }; } [StructLayout(LayoutKind.Sequential, Pack=0)] [DebuggerDisplay("{Value, nq}")] [JsonConverter(typeof(Uid.Converter))] public readonly partial struct Uid : IEquatable { public static readonly Uid Null = new Uid(string.Empty); public static Uid To(String v) => new Uid(v); public String Value { get; } public Uid(String value) { if (value == null) throw new ArgumentNullException(nameof(value)); Value = value; } public static explicit operator Uid(String v) => new Uid(v); public static bool operator ==(Uid a, Uid b) => a.Value == b.Value; public static bool operator !=(Uid a, Uid b) => a.Value != b.Value; public override int GetHashCode() => Value?.GetHashCode() ?? 0 ; public override bool Equals(object? obj) => obj is Uid c && this.Equals(c); public override string ToString() => Value ?? ""; public bool Equals(Uid other) => string.Equals(Value, other.Value, StringComparison.Ordinal); public static Uid? TryFrom(object value) { if (value is string s) return new Uid(s); return null; } private class Converter : JsonConverter { public override void WriteJson(JsonWriter writer, Uid value, JsonSerializer serializer) => writer.WriteValue(value.Value); public override Uid ReadJson(JsonReader reader, Type objectType, Uid existingValue, bool hasExistingValue, JsonSerializer serializer) => new Uid((reader.ReadAsString() ?? throw new FormatException())); } } [StructLayout(LayoutKind.Sequential, Pack=0)] [DebuggerDisplay("{Value, nq}")] [JsonConverter(typeof(ClientDbId.Converter))] public readonly partial struct ClientDbId : IFormattable, IEquatable { public static readonly ClientDbId Null = new ClientDbId(default); public static ClientDbId To(UInt64 v) => new ClientDbId(v); public UInt64 Value { get; } public ClientDbId(UInt64 value) { Value = value; } public static explicit operator ClientDbId(UInt64 v) => new ClientDbId(v); public static bool operator ==(ClientDbId a, ClientDbId b) => a.Value == b.Value; public static bool operator !=(ClientDbId a, ClientDbId b) => a.Value != b.Value; public override int GetHashCode() => Value.GetHashCode() ; public override bool Equals(object? obj) => obj is ClientDbId c && this.Equals(c); public override string ToString() => Value .ToString(); public bool Equals(ClientDbId other) => Value.Equals(other.Value); public string ToString(string? format, IFormatProvider? formatProvider) => Value.ToString(format, formatProvider); public static ClientDbId? TryFrom(object value) { if (value is UInt64 bvalue) return new ClientDbId(bvalue); if (value is string s && UInt64.TryParse(s, out var num)) return new ClientDbId(num); if (value is IConvertible c) return new ClientDbId(c.ToUInt64(CultureInfo.InvariantCulture)); return null; } private class Converter : JsonConverter { public override void WriteJson(JsonWriter writer, ClientDbId value, JsonSerializer serializer) => writer.WriteValue(value.Value); public override ClientDbId ReadJson(JsonReader reader, Type objectType, ClientDbId existingValue, bool hasExistingValue, JsonSerializer serializer) => new ClientDbId(UInt64.Parse(reader.ReadAsString() ?? throw new FormatException())); } } [StructLayout(LayoutKind.Sequential, Pack=0)] [DebuggerDisplay("{Value, nq}")] [JsonConverter(typeof(ClientId.Converter))] public readonly partial struct ClientId : IFormattable, IEquatable { public static readonly ClientId Null = new ClientId(default); public static ClientId To(UInt16 v) => new ClientId(v); public UInt16 Value { get; } public ClientId(UInt16 value) { Value = value; } public static explicit operator ClientId(UInt16 v) => new ClientId(v); public static bool operator ==(ClientId a, ClientId b) => a.Value == b.Value; public static bool operator !=(ClientId a, ClientId b) => a.Value != b.Value; public override int GetHashCode() => Value.GetHashCode() ; public override bool Equals(object? obj) => obj is ClientId c && this.Equals(c); public override string ToString() => Value .ToString(); public bool Equals(ClientId other) => Value.Equals(other.Value); public string ToString(string? format, IFormatProvider? formatProvider) => Value.ToString(format, formatProvider); public static ClientId? TryFrom(object value) { if (value is UInt16 bvalue) return new ClientId(bvalue); if (value is string s && UInt16.TryParse(s, out var num)) return new ClientId(num); if (value is IConvertible c) return new ClientId(c.ToUInt16(CultureInfo.InvariantCulture)); return null; } private class Converter : JsonConverter { public override void WriteJson(JsonWriter writer, ClientId value, JsonSerializer serializer) => writer.WriteValue(value.Value); public override ClientId ReadJson(JsonReader reader, Type objectType, ClientId existingValue, bool hasExistingValue, JsonSerializer serializer) => new ClientId(UInt16.Parse(reader.ReadAsString() ?? throw new FormatException())); } } [StructLayout(LayoutKind.Sequential, Pack=0)] [DebuggerDisplay("{Value, nq}")] [JsonConverter(typeof(ChannelId.Converter))] public readonly partial struct ChannelId : IFormattable, IEquatable { public static readonly ChannelId Null = new ChannelId(default); public static ChannelId To(UInt64 v) => new ChannelId(v); public UInt64 Value { get; } public ChannelId(UInt64 value) { Value = value; } public static explicit operator ChannelId(UInt64 v) => new ChannelId(v); public static bool operator ==(ChannelId a, ChannelId b) => a.Value == b.Value; public static bool operator !=(ChannelId a, ChannelId b) => a.Value != b.Value; public override int GetHashCode() => Value.GetHashCode() ; public override bool Equals(object? obj) => obj is ChannelId c && this.Equals(c); public override string ToString() => Value .ToString(); public bool Equals(ChannelId other) => Value.Equals(other.Value); public string ToString(string? format, IFormatProvider? formatProvider) => Value.ToString(format, formatProvider); public static ChannelId? TryFrom(object value) { if (value is UInt64 bvalue) return new ChannelId(bvalue); if (value is string s && UInt64.TryParse(s, out var num)) return new ChannelId(num); if (value is IConvertible c) return new ChannelId(c.ToUInt64(CultureInfo.InvariantCulture)); return null; } private class Converter : JsonConverter { public override void WriteJson(JsonWriter writer, ChannelId value, JsonSerializer serializer) => writer.WriteValue(value.Value); public override ChannelId ReadJson(JsonReader reader, Type objectType, ChannelId existingValue, bool hasExistingValue, JsonSerializer serializer) => new ChannelId(UInt64.Parse(reader.ReadAsString() ?? throw new FormatException())); } } [StructLayout(LayoutKind.Sequential, Pack=0)] [DebuggerDisplay("{Value, nq}")] [JsonConverter(typeof(ServerGroupId.Converter))] public readonly partial struct ServerGroupId : IFormattable, IEquatable { public static readonly ServerGroupId Null = new ServerGroupId(default); public static ServerGroupId To(UInt64 v) => new ServerGroupId(v); public UInt64 Value { get; } public ServerGroupId(UInt64 value) { Value = value; } public static explicit operator ServerGroupId(UInt64 v) => new ServerGroupId(v); public static bool operator ==(ServerGroupId a, ServerGroupId b) => a.Value == b.Value; public static bool operator !=(ServerGroupId a, ServerGroupId b) => a.Value != b.Value; public override int GetHashCode() => Value.GetHashCode() ; public override bool Equals(object? obj) => obj is ServerGroupId c && this.Equals(c); public override string ToString() => Value .ToString(); public bool Equals(ServerGroupId other) => Value.Equals(other.Value); public string ToString(string? format, IFormatProvider? formatProvider) => Value.ToString(format, formatProvider); public static ServerGroupId? TryFrom(object value) { if (value is UInt64 bvalue) return new ServerGroupId(bvalue); if (value is string s && UInt64.TryParse(s, out var num)) return new ServerGroupId(num); if (value is IConvertible c) return new ServerGroupId(c.ToUInt64(CultureInfo.InvariantCulture)); return null; } private class Converter : JsonConverter { public override void WriteJson(JsonWriter writer, ServerGroupId value, JsonSerializer serializer) => writer.WriteValue(value.Value); public override ServerGroupId ReadJson(JsonReader reader, Type objectType, ServerGroupId existingValue, bool hasExistingValue, JsonSerializer serializer) => new ServerGroupId(UInt64.Parse(reader.ReadAsString() ?? throw new FormatException())); } } [StructLayout(LayoutKind.Sequential, Pack=0)] [DebuggerDisplay("{Value, nq}")] [JsonConverter(typeof(ChannelGroupId.Converter))] public readonly partial struct ChannelGroupId : IFormattable, IEquatable { public static readonly ChannelGroupId Null = new ChannelGroupId(default); public static ChannelGroupId To(UInt64 v) => new ChannelGroupId(v); public UInt64 Value { get; } public ChannelGroupId(UInt64 value) { Value = value; } public static explicit operator ChannelGroupId(UInt64 v) => new ChannelGroupId(v); public static bool operator ==(ChannelGroupId a, ChannelGroupId b) => a.Value == b.Value; public static bool operator !=(ChannelGroupId a, ChannelGroupId b) => a.Value != b.Value; public override int GetHashCode() => Value.GetHashCode() ; public override bool Equals(object? obj) => obj is ChannelGroupId c && this.Equals(c); public override string ToString() => Value .ToString(); public bool Equals(ChannelGroupId other) => Value.Equals(other.Value); public string ToString(string? format, IFormatProvider? formatProvider) => Value.ToString(format, formatProvider); public static ChannelGroupId? TryFrom(object value) { if (value is UInt64 bvalue) return new ChannelGroupId(bvalue); if (value is string s && UInt64.TryParse(s, out var num)) return new ChannelGroupId(num); if (value is IConvertible c) return new ChannelGroupId(c.ToUInt64(CultureInfo.InvariantCulture)); return null; } private class Converter : JsonConverter { public override void WriteJson(JsonWriter writer, ChannelGroupId value, JsonSerializer serializer) => writer.WriteValue(value.Value); public override ChannelGroupId ReadJson(JsonReader reader, Type objectType, ChannelGroupId existingValue, bool hasExistingValue, JsonSerializer serializer) => new ChannelGroupId(UInt64.Parse(reader.ReadAsString() ?? throw new FormatException())); } } } ================================================ FILE: TSLib/Types.gen.tt ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . // <#@ template debug="true" hostSpecific="true" language="C#" #> <#@ output extension=".cs" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <# var types = new (string alias, string backing)[] { ("Uid", "String"), ("ClientDbId", "UInt64"), ("ClientId", "UInt16"), ("ChannelId", "UInt64"), ("ServerGroupId", "UInt64"), ("ChannelGroupId", "UInt64"), //("IconHash", "Int32"), //("ConnectionId", "UInt32"), }; #> #nullable enable using Newtonsoft.Json; using System; using System.Diagnostics; using System.Globalization; using System.Runtime.InteropServices; namespace TSLib { public static class TsTypes { public static Type[] All => new Type[] { <# foreach(var type in types) { Write($"typeof({type.alias}),"); } #> }; } <# foreach(var type in types) { var isStr = type.backing.Equals("string",StringComparison.OrdinalIgnoreCase); #> [StructLayout(LayoutKind.Sequential, Pack=0)] [DebuggerDisplay("{Value, nq}")] [JsonConverter(typeof(<#= type.alias #>.Converter))] public readonly partial struct <#= type.alias #> :<#= isStr ? "" : " IFormattable," #> IEquatable<<#= type.alias #>> { public static readonly <#= type.alias #> Null = new <#= type.alias #>(<#= isStr ? "string.Empty" : "default" #>); public static <#= type.alias #> To(<#= type.backing #> v) => new <#= type.alias #>(v); public <#= type.backing #> Value { get; } public <#= type.alias #>(<#= type.backing #> value) { <#= isStr ? "if (value == null) throw new ArgumentNullException(nameof(value));" : "" #> Value = value; } public static explicit operator <#= type.alias #>(<#= type.backing #> v) => new <#= type.alias #>(v); public static bool operator ==(<#= type.alias #> a, <#= type.alias #> b) => a.Value == b.Value; public static bool operator !=(<#= type.alias #> a, <#= type.alias #> b) => a.Value != b.Value; public override int GetHashCode() => <#= isStr ? "Value?.GetHashCode() ?? 0" : "Value.GetHashCode()" #> ; public override bool Equals(object? obj) => obj is <#= type.alias #> c && this.Equals(c); public override string ToString() => Value <#= isStr ? "?? \"\"" : ".ToString()" #>; <# if (isStr) { #> public bool Equals(<#= type.alias #> other) => string.Equals(Value, other.Value, StringComparison.Ordinal); <# } else { #> public bool Equals(<#= type.alias #> other) => Value.Equals(other.Value); public string ToString(string? format, IFormatProvider? formatProvider) => Value.ToString(format, formatProvider); <# } #> public static <#= type.alias #>? TryFrom(object value) { <# if (isStr) { #> if (value is string s) return new <#= type.alias #>(s); return null; <# } else { #> if (value is <#= type.backing #> bvalue) return new <#= type.alias #>(bvalue); if (value is string s && <#= type.backing #>.TryParse(s, out var num)) return new <#= type.alias #>(num); if (value is IConvertible c) return new <#= type.alias #>(c.To<#= type.backing #>(CultureInfo.InvariantCulture)); return null; <# } #> } private class Converter : JsonConverter<<#= type.alias #>> { public override void WriteJson(JsonWriter writer, <#= type.alias #> value, JsonSerializer serializer) => writer.WriteValue(value.Value); public override <#= type.alias #> ReadJson(JsonReader reader, Type objectType, <#= type.alias #> existingValue, bool hasExistingValue, JsonSerializer serializer) => new <#= type.alias #>(<#= isStr ? "" : type.backing + ".Parse" #>(reader.ReadAsString() ?? throw new FormatException())); } } <# } #> } ================================================ FILE: TSLib/WaitBlock.cs ================================================ // TSLib - A free TeamSpeak 3 and 5 client library // Copyright (C) 2017 TSLib contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the Open Software License v. 3.0 // // You should have received a copy of the Open Software License along with this // program. If not, see . using System; using System.Diagnostics; using System.Threading.Tasks; using TSLib.Full; using TSLib.Messages; namespace TSLib { /// /// Synchronizes data between the receiving packet Thread and the waiting dispatcher Thread. /// internal sealed class WaitBlock : IDisposable { private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); private const string NotANotifyBlock = "This waitblock has no dependent notification"; private const string NotifyListEmpty = "Depending notification array must not be empty"; private const string NotifyDoesNotMatch = "The notification does not match this waitblock"; private static readonly TimeSpan CommandTimeout = PacketHandlerConst.PacketTimeout.Divide(2); private bool isDisposed; private readonly Deserializer deserializer; private readonly TaskCompletionSource, CommandError>> answerWaiterAsync; private readonly TaskCompletionSource? notificationWaiterAsync; public NotificationType[]? DependsOn { get; } public WaitBlock(Deserializer deserializer, NotificationType[]? dependsOn = null) { this.deserializer = deserializer; isDisposed = false; DependsOn = dependsOn; answerWaiterAsync = new TaskCompletionSource, CommandError>>(); if (dependsOn != null) { if (dependsOn.Length == 0) throw new InvalidOperationException(NotifyListEmpty); notificationWaiterAsync = new TaskCompletionSource(); } } public void SetError(CommandError commandError) { if (commandError.Id == TsErrorCode.ok) throw new ArgumentException("Passed explicit error without error code", nameof(commandError)); SetAnswerAuto(commandError, null); } public void SetAnswer(ReadOnlyMemory commandLine) => SetAnswerAuto(null, commandLine); public void SetAnswerAuto(CommandError? commandError, ReadOnlyMemory? commandLine) { if (isDisposed) return; if (commandError != null && commandError.Id != TsErrorCode.ok) { answerWaiterAsync.SetResult(commandError); } else if (commandLine != null) { answerWaiterAsync.SetResult(commandLine.Value); } else { answerWaiterAsync.SetResult(ReadOnlyMemory.Empty); } } public void SetNotification(LazyNotification notification) { if (isDisposed) return; if (notificationWaiterAsync is null || DependsOn is null) throw new InvalidOperationException(NotANotifyBlock); if (Array.IndexOf(DependsOn, notification.NotifyType) < 0) throw new ArgumentException(NotifyDoesNotMatch); notificationWaiterAsync.SetResult(notification); } public async Task> WaitForMessageAsync() where T : IResponse, new() { if (isDisposed) throw new ObjectDisposedException(nameof(WaitBlock)); var timeOut = Task.Delay(CommandTimeout); var res = await Task.WhenAny(answerWaiterAsync.Task, timeOut); if (res == timeOut) return CommandError.CommandTimeout; Trace.Assert(answerWaiterAsync.Task.IsCompleted); if (!(await answerWaiterAsync.Task).Get(out var value, out var error)) return error; var response = deserializer.GenerateResponse(value.Span); if (response is null) return CommandError.Parser; else return response; } public async Task> WaitForNotificationAsync() { if (isDisposed) throw new ObjectDisposedException(nameof(WaitBlock)); if (notificationWaiterAsync is null) throw new InvalidOperationException(NotANotifyBlock); var timeOut = Task.Delay(CommandTimeout); if (await Task.WhenAny(answerWaiterAsync.Task, timeOut) == timeOut) return CommandError.CommandTimeout; Trace.Assert(answerWaiterAsync.Task.IsCompleted); if (!(await answerWaiterAsync.Task).OnlyError().GetOk(out var error)) return error; if (await Task.WhenAny(notificationWaiterAsync.Task, timeOut) == timeOut) return CommandError.CommandTimeout; Trace.Assert(notificationWaiterAsync.Task.IsCompleted); return await notificationWaiterAsync.Task; } public void Dispose() { if (isDisposed) return; answerWaiterAsync.TrySetResult(CommandError.ConnectionClosed); notificationWaiterAsync?.TrySetCanceled(); isDisposed = true; } } } ================================================ FILE: TSLib/bin/Debug/netcoreapp3.1/TSLib.deps.json ================================================ { "runtimeTarget": { "name": ".NETCoreApp,Version=v3.1", "signature": "" }, "compilationOptions": {}, "targets": { ".NETCoreApp,Version=v3.1": { "TSLib/1.1.0": { "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Nullable": "1.2.1", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2" }, "runtime": { "TSLib.dll": {} } }, "Heijden.Dns.Portable/2.0.19": { "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": { "assemblyVersion": "2.0.19.0", "fileVersion": "2.0.19.0" } } }, "Microsoft.NETCore.Platforms/1.1.0": {}, "Microsoft.NETCore.Targets/1.1.0": {}, "Microsoft.Win32.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "Newtonsoft.Json/12.0.3": { "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "assemblyVersion": "12.0.0.0", "fileVersion": "12.0.3.23909" } } }, "NLog/4.7.3": { "runtime": { "lib/netstandard2.0/NLog.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.7.3.11982" } } }, "Nullable/1.2.1": {}, "Portable.BouncyCastle/1.8.6.7": { "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "assemblyVersion": "1.8.6.0", "fileVersion": "1.8.6.7" } } }, "runtime.native.System/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" } }, "Splamy.Ed25519.Toolkit/1.0.3": { "runtime": { "lib/netcoreapp2.1/Chaos.NaCl.dll": { "assemblyVersion": "1.0.3.0", "fileVersion": "1.0.3.0" } } }, "System.Collections/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Diagnostics.Debug/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Diagnostics.Tracing/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Globalization/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.IO/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.IO.FileSystem/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.IO.FileSystem.Primitives/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "System.IO.Pipelines/4.7.2": { "runtime": { "lib/netcoreapp3.0/System.IO.Pipelines.dll": { "assemblyVersion": "4.0.2.1", "fileVersion": "4.700.20.21406" } } }, "System.Linq/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" } }, "System.Net.NetworkInformation/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" } }, "System.Net.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Net.Sockets/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.Reflection/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Reflection.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Resources.ResourceManager/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Runtime/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" } }, "System.Runtime.Extensions/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Runtime.Handles/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Runtime.InteropServices/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Security.Claims/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" } }, "System.Security.Principal/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "System.Security.Principal.Windows/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" } }, "System.Text.Encoding/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Threading/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.Threading.Overlapped/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Threading.Tasks/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Threading.Thread/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "System.Threading.ThreadPool/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } } } }, "libraries": { "TSLib/1.1.0": { "type": "project", "serviceable": false, "sha512": "" }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "serviceable": true, "sha512": "sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==", "path": "heijden.dns.portable/2.0.19", "hashPath": "heijden.dns.portable.2.0.19.nupkg.sha512" }, "Microsoft.NETCore.Platforms/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", "path": "microsoft.netcore.platforms/1.1.0", "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "path": "microsoft.netcore.targets/1.1.0", "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "path": "microsoft.win32.primitives/4.3.0", "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" }, "Newtonsoft.Json/12.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==", "path": "newtonsoft.json/12.0.3", "hashPath": "newtonsoft.json.12.0.3.nupkg.sha512" }, "NLog/4.7.3": { "type": "package", "serviceable": true, "sha512": "sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==", "path": "nlog/4.7.3", "hashPath": "nlog.4.7.3.nupkg.sha512" }, "Nullable/1.2.1": { "type": "package", "serviceable": true, "sha512": "sha512-rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==", "path": "nullable/1.2.1", "hashPath": "nullable.1.2.1.nupkg.sha512" }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "serviceable": true, "sha512": "sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==", "path": "portable.bouncycastle/1.8.6.7", "hashPath": "portable.bouncycastle.1.8.6.7.nupkg.sha512" }, "runtime.native.System/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", "path": "runtime.native.system/4.3.0", "hashPath": "runtime.native.system.4.3.0.nupkg.sha512" }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==", "path": "splamy.ed25519.toolkit/1.0.3", "hashPath": "splamy.ed25519.toolkit.1.0.3.nupkg.sha512" }, "System.Collections/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "path": "system.collections/4.3.0", "hashPath": "system.collections.4.3.0.nupkg.sha512" }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "path": "system.diagnostics.debug/4.3.0", "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "path": "system.diagnostics.tracing/4.3.0", "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" }, "System.Globalization/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "path": "system.globalization/4.3.0", "hashPath": "system.globalization.4.3.0.nupkg.sha512" }, "System.IO/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "path": "system.io/4.3.0", "hashPath": "system.io.4.3.0.nupkg.sha512" }, "System.IO.FileSystem/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "path": "system.io.filesystem/4.3.0", "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "path": "system.io.filesystem.primitives/4.3.0", "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" }, "System.IO.Pipelines/4.7.2": { "type": "package", "serviceable": true, "sha512": "sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==", "path": "system.io.pipelines/4.7.2", "hashPath": "system.io.pipelines.4.7.2.nupkg.sha512" }, "System.Linq/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "path": "system.linq/4.3.0", "hashPath": "system.linq.4.3.0.nupkg.sha512" }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==", "path": "system.net.networkinformation/4.3.0", "hashPath": "system.net.networkinformation.4.3.0.nupkg.sha512" }, "System.Net.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "path": "system.net.primitives/4.3.0", "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" }, "System.Net.Sockets/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "path": "system.net.sockets/4.3.0", "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" }, "System.Reflection/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "path": "system.reflection/4.3.0", "hashPath": "system.reflection.4.3.0.nupkg.sha512" }, "System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "path": "system.reflection.primitives/4.3.0", "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "path": "system.resources.resourcemanager/4.3.0", "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "System.Runtime/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "path": "system.runtime/4.3.0", "hashPath": "system.runtime.4.3.0.nupkg.sha512" }, "System.Runtime.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "path": "system.runtime.extensions/4.3.0", "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" }, "System.Runtime.Handles/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "path": "system.runtime.handles/4.3.0", "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "path": "system.runtime.interopservices/4.3.0", "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" }, "System.Security.Claims/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "path": "system.security.claims/4.3.0", "hashPath": "system.security.claims.4.3.0.nupkg.sha512" }, "System.Security.Principal/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "path": "system.security.principal/4.3.0", "hashPath": "system.security.principal.4.3.0.nupkg.sha512" }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", "path": "system.security.principal.windows/4.3.0", "hashPath": "system.security.principal.windows.4.3.0.nupkg.sha512" }, "System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "path": "system.text.encoding/4.3.0", "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" }, "System.Threading/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "path": "system.threading/4.3.0", "hashPath": "system.threading.4.3.0.nupkg.sha512" }, "System.Threading.Overlapped/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", "path": "system.threading.overlapped/4.3.0", "hashPath": "system.threading.overlapped.4.3.0.nupkg.sha512" }, "System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "path": "system.threading.tasks/4.3.0", "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" }, "System.Threading.Thread/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", "path": "system.threading.thread/4.3.0", "hashPath": "system.threading.thread.4.3.0.nupkg.sha512" }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", "path": "system.threading.threadpool/4.3.0", "hashPath": "system.threading.threadpool.4.3.0.nupkg.sha512" } } } ================================================ FILE: TSLib/bin/Debug/netstandard2.0/TSLib.deps.json ================================================ { "runtimeTarget": { "name": ".NETStandard,Version=v2.0/", "signature": "" }, "compilationOptions": {}, "targets": { ".NETStandard,Version=v2.0": {}, ".NETStandard,Version=v2.0/": { "TSLib/1.1.0": { "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NETStandard.Library": "2.0.3", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Nullable": "1.2.1", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2", "System.Memory": "4.5.4" }, "runtime": { "TSLib.dll": {} } }, "Heijden.Dns.Portable/2.0.19": { "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": { "assemblyVersion": "2.0.19.0", "fileVersion": "2.0.19.0" } } }, "Microsoft.NETCore.Platforms/1.1.0": {}, "Microsoft.NETCore.Targets/1.1.0": {}, "Microsoft.Win32.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "NETStandard.Library/2.0.3": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0" } }, "Newtonsoft.Json/12.0.3": { "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "assemblyVersion": "12.0.0.0", "fileVersion": "12.0.3.23909" } } }, "NLog/4.7.3": { "runtime": { "lib/netstandard2.0/NLog.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.7.3.11982" } } }, "Nullable/1.2.1": {}, "Portable.BouncyCastle/1.8.6.7": { "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "assemblyVersion": "1.8.6.0", "fileVersion": "1.8.6.7" } } }, "runtime.native.System/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" } }, "Splamy.Ed25519.Toolkit/1.0.3": { "dependencies": { "System.Memory": "4.5.4" }, "runtime": { "lib/netstandard2.0/Chaos.NaCl.dll": { "assemblyVersion": "1.0.3.0", "fileVersion": "1.0.3.0" } } }, "System.Buffers/4.5.1": { "runtime": { "lib/netstandard2.0/System.Buffers.dll": { "assemblyVersion": "4.0.3.0", "fileVersion": "4.6.28619.1" } } }, "System.Collections/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Diagnostics.Debug/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Diagnostics.Tracing/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Globalization/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.IO/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.IO.FileSystem/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.IO.FileSystem.Primitives/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.6.24705.1" } } }, "System.IO.Pipelines/4.7.2": { "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.4", "System.Threading.Tasks.Extensions": "4.5.4" }, "runtime": { "lib/netstandard2.0/System.IO.Pipelines.dll": { "assemblyVersion": "4.0.2.1", "fileVersion": "4.700.20.21406" } } }, "System.Linq/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" }, "runtime": { "lib/netstandard1.6/System.Linq.dll": { "assemblyVersion": "4.1.1.0", "fileVersion": "4.6.24705.1" } } }, "System.Memory/4.5.4": { "dependencies": { "System.Buffers": "4.5.1", "System.Numerics.Vectors": "4.4.0", "System.Runtime.CompilerServices.Unsafe": "4.5.3" }, "runtime": { "lib/netstandard2.0/System.Memory.dll": { "assemblyVersion": "4.0.1.1", "fileVersion": "4.6.28619.1" } } }, "System.Net.NetworkInformation/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" } }, "System.Net.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Net.Sockets/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.Numerics.Vectors/4.4.0": { "runtime": { "lib/netstandard2.0/System.Numerics.Vectors.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.6.25519.3" } } }, "System.Reflection/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Reflection.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Resources.ResourceManager/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Runtime/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" } }, "System.Runtime.CompilerServices.Unsafe/4.5.3": { "runtime": { "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { "assemblyVersion": "4.0.4.1", "fileVersion": "4.6.28619.1" } } }, "System.Runtime.Extensions/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Runtime.Handles/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Runtime.InteropServices/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Security.Claims/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Security.Claims.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.6.24705.1" } } }, "System.Security.Principal/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" }, "runtime": { "lib/netstandard1.0/System.Security.Principal.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.6.24705.1" } } }, "System.Security.Principal.Windows/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" } }, "System.Text.Encoding/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Threading/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Threading.dll": { "assemblyVersion": "4.0.12.0", "fileVersion": "4.6.24705.1" } } }, "System.Threading.Overlapped/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Threading.Tasks/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Threading.Tasks.Extensions/4.5.4": { "dependencies": { "System.Runtime.CompilerServices.Unsafe": "4.5.3" }, "runtime": { "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll": { "assemblyVersion": "4.2.0.1", "fileVersion": "4.6.28619.1" } } }, "System.Threading.Thread/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Threading.Thread.dll": { "assemblyVersion": "4.0.1.0", "fileVersion": "4.6.24705.1" } } }, "System.Threading.ThreadPool/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Threading.ThreadPool.dll": { "assemblyVersion": "4.0.11.0", "fileVersion": "4.6.24705.1" } } } } }, "libraries": { "TSLib/1.1.0": { "type": "project", "serviceable": false, "sha512": "" }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "serviceable": true, "sha512": "sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==", "path": "heijden.dns.portable/2.0.19", "hashPath": "heijden.dns.portable.2.0.19.nupkg.sha512" }, "Microsoft.NETCore.Platforms/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", "path": "microsoft.netcore.platforms/1.1.0", "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "path": "microsoft.netcore.targets/1.1.0", "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "path": "microsoft.win32.primitives/4.3.0", "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" }, "NETStandard.Library/2.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", "path": "netstandard.library/2.0.3", "hashPath": "netstandard.library.2.0.3.nupkg.sha512" }, "Newtonsoft.Json/12.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==", "path": "newtonsoft.json/12.0.3", "hashPath": "newtonsoft.json.12.0.3.nupkg.sha512" }, "NLog/4.7.3": { "type": "package", "serviceable": true, "sha512": "sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==", "path": "nlog/4.7.3", "hashPath": "nlog.4.7.3.nupkg.sha512" }, "Nullable/1.2.1": { "type": "package", "serviceable": true, "sha512": "sha512-rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==", "path": "nullable/1.2.1", "hashPath": "nullable.1.2.1.nupkg.sha512" }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "serviceable": true, "sha512": "sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==", "path": "portable.bouncycastle/1.8.6.7", "hashPath": "portable.bouncycastle.1.8.6.7.nupkg.sha512" }, "runtime.native.System/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", "path": "runtime.native.system/4.3.0", "hashPath": "runtime.native.system.4.3.0.nupkg.sha512" }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==", "path": "splamy.ed25519.toolkit/1.0.3", "hashPath": "splamy.ed25519.toolkit.1.0.3.nupkg.sha512" }, "System.Buffers/4.5.1": { "type": "package", "serviceable": true, "sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==", "path": "system.buffers/4.5.1", "hashPath": "system.buffers.4.5.1.nupkg.sha512" }, "System.Collections/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "path": "system.collections/4.3.0", "hashPath": "system.collections.4.3.0.nupkg.sha512" }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "path": "system.diagnostics.debug/4.3.0", "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "path": "system.diagnostics.tracing/4.3.0", "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" }, "System.Globalization/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "path": "system.globalization/4.3.0", "hashPath": "system.globalization.4.3.0.nupkg.sha512" }, "System.IO/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "path": "system.io/4.3.0", "hashPath": "system.io.4.3.0.nupkg.sha512" }, "System.IO.FileSystem/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "path": "system.io.filesystem/4.3.0", "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "path": "system.io.filesystem.primitives/4.3.0", "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" }, "System.IO.Pipelines/4.7.2": { "type": "package", "serviceable": true, "sha512": "sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==", "path": "system.io.pipelines/4.7.2", "hashPath": "system.io.pipelines.4.7.2.nupkg.sha512" }, "System.Linq/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "path": "system.linq/4.3.0", "hashPath": "system.linq.4.3.0.nupkg.sha512" }, "System.Memory/4.5.4": { "type": "package", "serviceable": true, "sha512": "sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", "path": "system.memory/4.5.4", "hashPath": "system.memory.4.5.4.nupkg.sha512" }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==", "path": "system.net.networkinformation/4.3.0", "hashPath": "system.net.networkinformation.4.3.0.nupkg.sha512" }, "System.Net.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "path": "system.net.primitives/4.3.0", "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" }, "System.Net.Sockets/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "path": "system.net.sockets/4.3.0", "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" }, "System.Numerics.Vectors/4.4.0": { "type": "package", "serviceable": true, "sha512": "sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==", "path": "system.numerics.vectors/4.4.0", "hashPath": "system.numerics.vectors.4.4.0.nupkg.sha512" }, "System.Reflection/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "path": "system.reflection/4.3.0", "hashPath": "system.reflection.4.3.0.nupkg.sha512" }, "System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "path": "system.reflection.primitives/4.3.0", "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "path": "system.resources.resourcemanager/4.3.0", "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "System.Runtime/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "path": "system.runtime/4.3.0", "hashPath": "system.runtime.4.3.0.nupkg.sha512" }, "System.Runtime.CompilerServices.Unsafe/4.5.3": { "type": "package", "serviceable": true, "sha512": "sha512-3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==", "path": "system.runtime.compilerservices.unsafe/4.5.3", "hashPath": "system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512" }, "System.Runtime.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "path": "system.runtime.extensions/4.3.0", "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" }, "System.Runtime.Handles/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "path": "system.runtime.handles/4.3.0", "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "path": "system.runtime.interopservices/4.3.0", "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" }, "System.Security.Claims/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "path": "system.security.claims/4.3.0", "hashPath": "system.security.claims.4.3.0.nupkg.sha512" }, "System.Security.Principal/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "path": "system.security.principal/4.3.0", "hashPath": "system.security.principal.4.3.0.nupkg.sha512" }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", "path": "system.security.principal.windows/4.3.0", "hashPath": "system.security.principal.windows.4.3.0.nupkg.sha512" }, "System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "path": "system.text.encoding/4.3.0", "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" }, "System.Threading/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "path": "system.threading/4.3.0", "hashPath": "system.threading.4.3.0.nupkg.sha512" }, "System.Threading.Overlapped/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", "path": "system.threading.overlapped/4.3.0", "hashPath": "system.threading.overlapped.4.3.0.nupkg.sha512" }, "System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "path": "system.threading.tasks/4.3.0", "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" }, "System.Threading.Tasks.Extensions/4.5.4": { "type": "package", "serviceable": true, "sha512": "sha512-zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", "path": "system.threading.tasks.extensions/4.5.4", "hashPath": "system.threading.tasks.extensions.4.5.4.nupkg.sha512" }, "System.Threading.Thread/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", "path": "system.threading.thread/4.3.0", "hashPath": "system.threading.thread.4.3.0.nupkg.sha512" }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", "path": "system.threading.threadpool/4.3.0", "hashPath": "system.threading.threadpool.4.3.0.nupkg.sha512" } } } ================================================ FILE: TSLib/bin/Debug/netstandard2.1/TSLib.deps.json ================================================ { "runtimeTarget": { "name": ".NETStandard,Version=v2.1/", "signature": "" }, "compilationOptions": {}, "targets": { ".NETStandard,Version=v2.1": {}, ".NETStandard,Version=v2.1/": { "TSLib/1.1.0": { "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Nullable": "1.2.1", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2" }, "runtime": { "TSLib.dll": {} } }, "Heijden.Dns.Portable/2.0.19": { "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": { "assemblyVersion": "2.0.19.0", "fileVersion": "2.0.19.0" } } }, "Microsoft.NETCore.Platforms/1.1.0": {}, "Microsoft.NETCore.Targets/1.1.0": {}, "Microsoft.Win32.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "Newtonsoft.Json/12.0.3": { "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "assemblyVersion": "12.0.0.0", "fileVersion": "12.0.3.23909" } } }, "NLog/4.7.3": { "runtime": { "lib/netstandard2.0/NLog.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.7.3.11982" } } }, "Nullable/1.2.1": {}, "Portable.BouncyCastle/1.8.6.7": { "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "assemblyVersion": "1.8.6.0", "fileVersion": "1.8.6.7" } } }, "runtime.native.System/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" } }, "Splamy.Ed25519.Toolkit/1.0.3": { "dependencies": { "System.Memory": "4.5.4" }, "runtime": { "lib/netstandard2.0/Chaos.NaCl.dll": { "assemblyVersion": "1.0.3.0", "fileVersion": "1.0.3.0" } } }, "System.Buffers/4.5.1": { "runtime": { "lib/netstandard2.0/System.Buffers.dll": { "assemblyVersion": "4.0.3.0", "fileVersion": "4.6.28619.1" } } }, "System.Collections/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Diagnostics.Debug/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Diagnostics.Tracing/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Globalization/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.IO/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.IO.FileSystem/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.IO.FileSystem.Primitives/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.6.24705.1" } } }, "System.IO.Pipelines/4.7.2": { "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.4", "System.Threading.Tasks.Extensions": "4.5.4" }, "runtime": { "lib/netstandard2.0/System.IO.Pipelines.dll": { "assemblyVersion": "4.0.2.1", "fileVersion": "4.700.20.21406" } } }, "System.Linq/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" }, "runtime": { "lib/netstandard1.6/System.Linq.dll": { "assemblyVersion": "4.1.1.0", "fileVersion": "4.6.24705.1" } } }, "System.Memory/4.5.4": { "dependencies": { "System.Buffers": "4.5.1", "System.Numerics.Vectors": "4.4.0", "System.Runtime.CompilerServices.Unsafe": "4.5.3" }, "runtime": { "lib/netstandard2.0/System.Memory.dll": { "assemblyVersion": "4.0.1.1", "fileVersion": "4.6.28619.1" } } }, "System.Net.NetworkInformation/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" } }, "System.Net.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Net.Sockets/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.Numerics.Vectors/4.4.0": { "runtime": { "lib/netstandard2.0/System.Numerics.Vectors.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.6.25519.3" } } }, "System.Reflection/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Reflection.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Resources.ResourceManager/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Runtime/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" } }, "System.Runtime.CompilerServices.Unsafe/4.5.3": { "runtime": { "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { "assemblyVersion": "4.0.4.1", "fileVersion": "4.6.28619.1" } } }, "System.Runtime.Extensions/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Runtime.Handles/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Runtime.InteropServices/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Security.Claims/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Security.Claims.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.6.24705.1" } } }, "System.Security.Principal/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" }, "runtime": { "lib/netstandard1.0/System.Security.Principal.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.6.24705.1" } } }, "System.Security.Principal.Windows/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" } }, "System.Text.Encoding/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Threading/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Threading.dll": { "assemblyVersion": "4.0.12.0", "fileVersion": "4.6.24705.1" } } }, "System.Threading.Overlapped/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Threading.Tasks/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Threading.Tasks.Extensions/4.5.4": { "dependencies": { "System.Runtime.CompilerServices.Unsafe": "4.5.3" }, "runtime": { "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll": { "assemblyVersion": "4.2.0.1", "fileVersion": "4.6.28619.1" } } }, "System.Threading.Thread/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Threading.Thread.dll": { "assemblyVersion": "4.0.1.0", "fileVersion": "4.6.24705.1" } } }, "System.Threading.ThreadPool/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Threading.ThreadPool.dll": { "assemblyVersion": "4.0.11.0", "fileVersion": "4.6.24705.1" } } } } }, "libraries": { "TSLib/1.1.0": { "type": "project", "serviceable": false, "sha512": "" }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "serviceable": true, "sha512": "sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==", "path": "heijden.dns.portable/2.0.19", "hashPath": "heijden.dns.portable.2.0.19.nupkg.sha512" }, "Microsoft.NETCore.Platforms/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", "path": "microsoft.netcore.platforms/1.1.0", "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "path": "microsoft.netcore.targets/1.1.0", "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "path": "microsoft.win32.primitives/4.3.0", "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" }, "Newtonsoft.Json/12.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==", "path": "newtonsoft.json/12.0.3", "hashPath": "newtonsoft.json.12.0.3.nupkg.sha512" }, "NLog/4.7.3": { "type": "package", "serviceable": true, "sha512": "sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==", "path": "nlog/4.7.3", "hashPath": "nlog.4.7.3.nupkg.sha512" }, "Nullable/1.2.1": { "type": "package", "serviceable": true, "sha512": "sha512-rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==", "path": "nullable/1.2.1", "hashPath": "nullable.1.2.1.nupkg.sha512" }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "serviceable": true, "sha512": "sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==", "path": "portable.bouncycastle/1.8.6.7", "hashPath": "portable.bouncycastle.1.8.6.7.nupkg.sha512" }, "runtime.native.System/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", "path": "runtime.native.system/4.3.0", "hashPath": "runtime.native.system.4.3.0.nupkg.sha512" }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==", "path": "splamy.ed25519.toolkit/1.0.3", "hashPath": "splamy.ed25519.toolkit.1.0.3.nupkg.sha512" }, "System.Buffers/4.5.1": { "type": "package", "serviceable": true, "sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==", "path": "system.buffers/4.5.1", "hashPath": "system.buffers.4.5.1.nupkg.sha512" }, "System.Collections/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "path": "system.collections/4.3.0", "hashPath": "system.collections.4.3.0.nupkg.sha512" }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "path": "system.diagnostics.debug/4.3.0", "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "path": "system.diagnostics.tracing/4.3.0", "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" }, "System.Globalization/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "path": "system.globalization/4.3.0", "hashPath": "system.globalization.4.3.0.nupkg.sha512" }, "System.IO/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "path": "system.io/4.3.0", "hashPath": "system.io.4.3.0.nupkg.sha512" }, "System.IO.FileSystem/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "path": "system.io.filesystem/4.3.0", "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "path": "system.io.filesystem.primitives/4.3.0", "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" }, "System.IO.Pipelines/4.7.2": { "type": "package", "serviceable": true, "sha512": "sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==", "path": "system.io.pipelines/4.7.2", "hashPath": "system.io.pipelines.4.7.2.nupkg.sha512" }, "System.Linq/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "path": "system.linq/4.3.0", "hashPath": "system.linq.4.3.0.nupkg.sha512" }, "System.Memory/4.5.4": { "type": "package", "serviceable": true, "sha512": "sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", "path": "system.memory/4.5.4", "hashPath": "system.memory.4.5.4.nupkg.sha512" }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==", "path": "system.net.networkinformation/4.3.0", "hashPath": "system.net.networkinformation.4.3.0.nupkg.sha512" }, "System.Net.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "path": "system.net.primitives/4.3.0", "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" }, "System.Net.Sockets/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "path": "system.net.sockets/4.3.0", "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" }, "System.Numerics.Vectors/4.4.0": { "type": "package", "serviceable": true, "sha512": "sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==", "path": "system.numerics.vectors/4.4.0", "hashPath": "system.numerics.vectors.4.4.0.nupkg.sha512" }, "System.Reflection/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "path": "system.reflection/4.3.0", "hashPath": "system.reflection.4.3.0.nupkg.sha512" }, "System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "path": "system.reflection.primitives/4.3.0", "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "path": "system.resources.resourcemanager/4.3.0", "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "System.Runtime/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "path": "system.runtime/4.3.0", "hashPath": "system.runtime.4.3.0.nupkg.sha512" }, "System.Runtime.CompilerServices.Unsafe/4.5.3": { "type": "package", "serviceable": true, "sha512": "sha512-3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==", "path": "system.runtime.compilerservices.unsafe/4.5.3", "hashPath": "system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512" }, "System.Runtime.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "path": "system.runtime.extensions/4.3.0", "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" }, "System.Runtime.Handles/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "path": "system.runtime.handles/4.3.0", "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "path": "system.runtime.interopservices/4.3.0", "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" }, "System.Security.Claims/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "path": "system.security.claims/4.3.0", "hashPath": "system.security.claims.4.3.0.nupkg.sha512" }, "System.Security.Principal/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "path": "system.security.principal/4.3.0", "hashPath": "system.security.principal.4.3.0.nupkg.sha512" }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", "path": "system.security.principal.windows/4.3.0", "hashPath": "system.security.principal.windows.4.3.0.nupkg.sha512" }, "System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "path": "system.text.encoding/4.3.0", "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" }, "System.Threading/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "path": "system.threading/4.3.0", "hashPath": "system.threading.4.3.0.nupkg.sha512" }, "System.Threading.Overlapped/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", "path": "system.threading.overlapped/4.3.0", "hashPath": "system.threading.overlapped.4.3.0.nupkg.sha512" }, "System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "path": "system.threading.tasks/4.3.0", "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" }, "System.Threading.Tasks.Extensions/4.5.4": { "type": "package", "serviceable": true, "sha512": "sha512-zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", "path": "system.threading.tasks.extensions/4.5.4", "hashPath": "system.threading.tasks.extensions.4.5.4.nupkg.sha512" }, "System.Threading.Thread/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", "path": "system.threading.thread/4.3.0", "hashPath": "system.threading.thread.4.3.0.nupkg.sha512" }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", "path": "system.threading.threadpool/4.3.0", "hashPath": "system.threading.threadpool.4.3.0.nupkg.sha512" } } } ================================================ FILE: TSLib/bin/Release/netcoreapp3.1/TSLib.deps.json ================================================ { "runtimeTarget": { "name": ".NETCoreApp,Version=v3.1", "signature": "" }, "compilationOptions": {}, "targets": { ".NETCoreApp,Version=v3.1": { "TSLib/1.1.0": { "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Nullable": "1.2.1", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2" }, "runtime": { "TSLib.dll": {} } }, "Heijden.Dns.Portable/2.0.19": { "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": { "assemblyVersion": "2.0.19.0", "fileVersion": "2.0.19.0" } } }, "Microsoft.NETCore.Platforms/1.1.0": {}, "Microsoft.NETCore.Targets/1.1.0": {}, "Microsoft.Win32.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "Newtonsoft.Json/12.0.3": { "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "assemblyVersion": "12.0.0.0", "fileVersion": "12.0.3.23909" } } }, "NLog/4.7.3": { "runtime": { "lib/netstandard2.0/NLog.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.7.3.11982" } } }, "Nullable/1.2.1": {}, "Portable.BouncyCastle/1.8.6.7": { "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "assemblyVersion": "1.8.6.0", "fileVersion": "1.8.6.7" } } }, "runtime.native.System/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" } }, "Splamy.Ed25519.Toolkit/1.0.3": { "runtime": { "lib/netcoreapp2.1/Chaos.NaCl.dll": { "assemblyVersion": "1.0.3.0", "fileVersion": "1.0.3.0" } } }, "System.Collections/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Diagnostics.Debug/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Diagnostics.Tracing/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Globalization/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.IO/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.IO.FileSystem/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.IO.FileSystem.Primitives/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "System.IO.Pipelines/4.7.2": { "runtime": { "lib/netcoreapp3.0/System.IO.Pipelines.dll": { "assemblyVersion": "4.0.2.1", "fileVersion": "4.700.20.21406" } } }, "System.Linq/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" } }, "System.Net.NetworkInformation/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" } }, "System.Net.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Net.Sockets/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.Reflection/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Reflection.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Resources.ResourceManager/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Runtime/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" } }, "System.Runtime.Extensions/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Runtime.Handles/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Runtime.InteropServices/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Security.Claims/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" } }, "System.Security.Principal/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "System.Security.Principal.Windows/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" } }, "System.Text.Encoding/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Threading/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.Threading.Overlapped/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Threading.Tasks/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Threading.Thread/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" } }, "System.Threading.ThreadPool/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } } } }, "libraries": { "TSLib/1.1.0": { "type": "project", "serviceable": false, "sha512": "" }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "serviceable": true, "sha512": "sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==", "path": "heijden.dns.portable/2.0.19", "hashPath": "heijden.dns.portable.2.0.19.nupkg.sha512" }, "Microsoft.NETCore.Platforms/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", "path": "microsoft.netcore.platforms/1.1.0", "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "path": "microsoft.netcore.targets/1.1.0", "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "path": "microsoft.win32.primitives/4.3.0", "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" }, "Newtonsoft.Json/12.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==", "path": "newtonsoft.json/12.0.3", "hashPath": "newtonsoft.json.12.0.3.nupkg.sha512" }, "NLog/4.7.3": { "type": "package", "serviceable": true, "sha512": "sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==", "path": "nlog/4.7.3", "hashPath": "nlog.4.7.3.nupkg.sha512" }, "Nullable/1.2.1": { "type": "package", "serviceable": true, "sha512": "sha512-rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==", "path": "nullable/1.2.1", "hashPath": "nullable.1.2.1.nupkg.sha512" }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "serviceable": true, "sha512": "sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==", "path": "portable.bouncycastle/1.8.6.7", "hashPath": "portable.bouncycastle.1.8.6.7.nupkg.sha512" }, "runtime.native.System/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", "path": "runtime.native.system/4.3.0", "hashPath": "runtime.native.system.4.3.0.nupkg.sha512" }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==", "path": "splamy.ed25519.toolkit/1.0.3", "hashPath": "splamy.ed25519.toolkit.1.0.3.nupkg.sha512" }, "System.Collections/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "path": "system.collections/4.3.0", "hashPath": "system.collections.4.3.0.nupkg.sha512" }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "path": "system.diagnostics.debug/4.3.0", "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "path": "system.diagnostics.tracing/4.3.0", "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" }, "System.Globalization/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "path": "system.globalization/4.3.0", "hashPath": "system.globalization.4.3.0.nupkg.sha512" }, "System.IO/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "path": "system.io/4.3.0", "hashPath": "system.io.4.3.0.nupkg.sha512" }, "System.IO.FileSystem/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "path": "system.io.filesystem/4.3.0", "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "path": "system.io.filesystem.primitives/4.3.0", "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" }, "System.IO.Pipelines/4.7.2": { "type": "package", "serviceable": true, "sha512": "sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==", "path": "system.io.pipelines/4.7.2", "hashPath": "system.io.pipelines.4.7.2.nupkg.sha512" }, "System.Linq/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "path": "system.linq/4.3.0", "hashPath": "system.linq.4.3.0.nupkg.sha512" }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==", "path": "system.net.networkinformation/4.3.0", "hashPath": "system.net.networkinformation.4.3.0.nupkg.sha512" }, "System.Net.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "path": "system.net.primitives/4.3.0", "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" }, "System.Net.Sockets/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "path": "system.net.sockets/4.3.0", "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" }, "System.Reflection/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "path": "system.reflection/4.3.0", "hashPath": "system.reflection.4.3.0.nupkg.sha512" }, "System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "path": "system.reflection.primitives/4.3.0", "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "path": "system.resources.resourcemanager/4.3.0", "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "System.Runtime/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "path": "system.runtime/4.3.0", "hashPath": "system.runtime.4.3.0.nupkg.sha512" }, "System.Runtime.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "path": "system.runtime.extensions/4.3.0", "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" }, "System.Runtime.Handles/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "path": "system.runtime.handles/4.3.0", "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "path": "system.runtime.interopservices/4.3.0", "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" }, "System.Security.Claims/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "path": "system.security.claims/4.3.0", "hashPath": "system.security.claims.4.3.0.nupkg.sha512" }, "System.Security.Principal/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "path": "system.security.principal/4.3.0", "hashPath": "system.security.principal.4.3.0.nupkg.sha512" }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", "path": "system.security.principal.windows/4.3.0", "hashPath": "system.security.principal.windows.4.3.0.nupkg.sha512" }, "System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "path": "system.text.encoding/4.3.0", "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" }, "System.Threading/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "path": "system.threading/4.3.0", "hashPath": "system.threading.4.3.0.nupkg.sha512" }, "System.Threading.Overlapped/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", "path": "system.threading.overlapped/4.3.0", "hashPath": "system.threading.overlapped.4.3.0.nupkg.sha512" }, "System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "path": "system.threading.tasks/4.3.0", "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" }, "System.Threading.Thread/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", "path": "system.threading.thread/4.3.0", "hashPath": "system.threading.thread.4.3.0.nupkg.sha512" }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", "path": "system.threading.threadpool/4.3.0", "hashPath": "system.threading.threadpool.4.3.0.nupkg.sha512" } } } ================================================ FILE: TSLib/bin/Release/netstandard2.0/TSLib.deps.json ================================================ { "runtimeTarget": { "name": ".NETStandard,Version=v2.0/", "signature": "" }, "compilationOptions": {}, "targets": { ".NETStandard,Version=v2.0": {}, ".NETStandard,Version=v2.0/": { "TSLib/1.1.0": { "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NETStandard.Library": "2.0.3", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Nullable": "1.2.1", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2", "System.Memory": "4.5.4" }, "runtime": { "TSLib.dll": {} } }, "Heijden.Dns.Portable/2.0.19": { "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": { "assemblyVersion": "2.0.19.0", "fileVersion": "2.0.19.0" } } }, "Microsoft.NETCore.Platforms/1.1.0": {}, "Microsoft.NETCore.Targets/1.1.0": {}, "Microsoft.Win32.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "NETStandard.Library/2.0.3": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0" } }, "Newtonsoft.Json/12.0.3": { "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "assemblyVersion": "12.0.0.0", "fileVersion": "12.0.3.23909" } } }, "NLog/4.7.3": { "runtime": { "lib/netstandard2.0/NLog.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.7.3.11982" } } }, "Nullable/1.2.1": {}, "Portable.BouncyCastle/1.8.6.7": { "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "assemblyVersion": "1.8.6.0", "fileVersion": "1.8.6.7" } } }, "runtime.native.System/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" } }, "Splamy.Ed25519.Toolkit/1.0.3": { "dependencies": { "System.Memory": "4.5.4" }, "runtime": { "lib/netstandard2.0/Chaos.NaCl.dll": { "assemblyVersion": "1.0.3.0", "fileVersion": "1.0.3.0" } } }, "System.Buffers/4.5.1": { "runtime": { "lib/netstandard2.0/System.Buffers.dll": { "assemblyVersion": "4.0.3.0", "fileVersion": "4.6.28619.1" } } }, "System.Collections/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Diagnostics.Debug/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Diagnostics.Tracing/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Globalization/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.IO/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.IO.FileSystem/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.IO.FileSystem.Primitives/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.6.24705.1" } } }, "System.IO.Pipelines/4.7.2": { "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.4", "System.Threading.Tasks.Extensions": "4.5.4" }, "runtime": { "lib/netstandard2.0/System.IO.Pipelines.dll": { "assemblyVersion": "4.0.2.1", "fileVersion": "4.700.20.21406" } } }, "System.Linq/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" }, "runtime": { "lib/netstandard1.6/System.Linq.dll": { "assemblyVersion": "4.1.1.0", "fileVersion": "4.6.24705.1" } } }, "System.Memory/4.5.4": { "dependencies": { "System.Buffers": "4.5.1", "System.Numerics.Vectors": "4.4.0", "System.Runtime.CompilerServices.Unsafe": "4.5.3" }, "runtime": { "lib/netstandard2.0/System.Memory.dll": { "assemblyVersion": "4.0.1.1", "fileVersion": "4.6.28619.1" } } }, "System.Net.NetworkInformation/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" } }, "System.Net.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Net.Sockets/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.Numerics.Vectors/4.4.0": { "runtime": { "lib/netstandard2.0/System.Numerics.Vectors.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.6.25519.3" } } }, "System.Reflection/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Reflection.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Resources.ResourceManager/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Runtime/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" } }, "System.Runtime.CompilerServices.Unsafe/4.5.3": { "runtime": { "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { "assemblyVersion": "4.0.4.1", "fileVersion": "4.6.28619.1" } } }, "System.Runtime.Extensions/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Runtime.Handles/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Runtime.InteropServices/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Security.Claims/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Security.Claims.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.6.24705.1" } } }, "System.Security.Principal/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" }, "runtime": { "lib/netstandard1.0/System.Security.Principal.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.6.24705.1" } } }, "System.Security.Principal.Windows/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" } }, "System.Text.Encoding/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Threading/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Threading.dll": { "assemblyVersion": "4.0.12.0", "fileVersion": "4.6.24705.1" } } }, "System.Threading.Overlapped/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Threading.Tasks/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Threading.Tasks.Extensions/4.5.4": { "dependencies": { "System.Runtime.CompilerServices.Unsafe": "4.5.3" }, "runtime": { "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll": { "assemblyVersion": "4.2.0.1", "fileVersion": "4.6.28619.1" } } }, "System.Threading.Thread/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Threading.Thread.dll": { "assemblyVersion": "4.0.1.0", "fileVersion": "4.6.24705.1" } } }, "System.Threading.ThreadPool/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Threading.ThreadPool.dll": { "assemblyVersion": "4.0.11.0", "fileVersion": "4.6.24705.1" } } } } }, "libraries": { "TSLib/1.1.0": { "type": "project", "serviceable": false, "sha512": "" }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "serviceable": true, "sha512": "sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==", "path": "heijden.dns.portable/2.0.19", "hashPath": "heijden.dns.portable.2.0.19.nupkg.sha512" }, "Microsoft.NETCore.Platforms/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", "path": "microsoft.netcore.platforms/1.1.0", "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "path": "microsoft.netcore.targets/1.1.0", "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "path": "microsoft.win32.primitives/4.3.0", "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" }, "NETStandard.Library/2.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", "path": "netstandard.library/2.0.3", "hashPath": "netstandard.library.2.0.3.nupkg.sha512" }, "Newtonsoft.Json/12.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==", "path": "newtonsoft.json/12.0.3", "hashPath": "newtonsoft.json.12.0.3.nupkg.sha512" }, "NLog/4.7.3": { "type": "package", "serviceable": true, "sha512": "sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==", "path": "nlog/4.7.3", "hashPath": "nlog.4.7.3.nupkg.sha512" }, "Nullable/1.2.1": { "type": "package", "serviceable": true, "sha512": "sha512-rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==", "path": "nullable/1.2.1", "hashPath": "nullable.1.2.1.nupkg.sha512" }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "serviceable": true, "sha512": "sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==", "path": "portable.bouncycastle/1.8.6.7", "hashPath": "portable.bouncycastle.1.8.6.7.nupkg.sha512" }, "runtime.native.System/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", "path": "runtime.native.system/4.3.0", "hashPath": "runtime.native.system.4.3.0.nupkg.sha512" }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==", "path": "splamy.ed25519.toolkit/1.0.3", "hashPath": "splamy.ed25519.toolkit.1.0.3.nupkg.sha512" }, "System.Buffers/4.5.1": { "type": "package", "serviceable": true, "sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==", "path": "system.buffers/4.5.1", "hashPath": "system.buffers.4.5.1.nupkg.sha512" }, "System.Collections/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "path": "system.collections/4.3.0", "hashPath": "system.collections.4.3.0.nupkg.sha512" }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "path": "system.diagnostics.debug/4.3.0", "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "path": "system.diagnostics.tracing/4.3.0", "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" }, "System.Globalization/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "path": "system.globalization/4.3.0", "hashPath": "system.globalization.4.3.0.nupkg.sha512" }, "System.IO/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "path": "system.io/4.3.0", "hashPath": "system.io.4.3.0.nupkg.sha512" }, "System.IO.FileSystem/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "path": "system.io.filesystem/4.3.0", "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "path": "system.io.filesystem.primitives/4.3.0", "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" }, "System.IO.Pipelines/4.7.2": { "type": "package", "serviceable": true, "sha512": "sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==", "path": "system.io.pipelines/4.7.2", "hashPath": "system.io.pipelines.4.7.2.nupkg.sha512" }, "System.Linq/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "path": "system.linq/4.3.0", "hashPath": "system.linq.4.3.0.nupkg.sha512" }, "System.Memory/4.5.4": { "type": "package", "serviceable": true, "sha512": "sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", "path": "system.memory/4.5.4", "hashPath": "system.memory.4.5.4.nupkg.sha512" }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==", "path": "system.net.networkinformation/4.3.0", "hashPath": "system.net.networkinformation.4.3.0.nupkg.sha512" }, "System.Net.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "path": "system.net.primitives/4.3.0", "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" }, "System.Net.Sockets/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "path": "system.net.sockets/4.3.0", "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" }, "System.Numerics.Vectors/4.4.0": { "type": "package", "serviceable": true, "sha512": "sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==", "path": "system.numerics.vectors/4.4.0", "hashPath": "system.numerics.vectors.4.4.0.nupkg.sha512" }, "System.Reflection/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "path": "system.reflection/4.3.0", "hashPath": "system.reflection.4.3.0.nupkg.sha512" }, "System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "path": "system.reflection.primitives/4.3.0", "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "path": "system.resources.resourcemanager/4.3.0", "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "System.Runtime/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "path": "system.runtime/4.3.0", "hashPath": "system.runtime.4.3.0.nupkg.sha512" }, "System.Runtime.CompilerServices.Unsafe/4.5.3": { "type": "package", "serviceable": true, "sha512": "sha512-3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==", "path": "system.runtime.compilerservices.unsafe/4.5.3", "hashPath": "system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512" }, "System.Runtime.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "path": "system.runtime.extensions/4.3.0", "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" }, "System.Runtime.Handles/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "path": "system.runtime.handles/4.3.0", "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "path": "system.runtime.interopservices/4.3.0", "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" }, "System.Security.Claims/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "path": "system.security.claims/4.3.0", "hashPath": "system.security.claims.4.3.0.nupkg.sha512" }, "System.Security.Principal/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "path": "system.security.principal/4.3.0", "hashPath": "system.security.principal.4.3.0.nupkg.sha512" }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", "path": "system.security.principal.windows/4.3.0", "hashPath": "system.security.principal.windows.4.3.0.nupkg.sha512" }, "System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "path": "system.text.encoding/4.3.0", "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" }, "System.Threading/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "path": "system.threading/4.3.0", "hashPath": "system.threading.4.3.0.nupkg.sha512" }, "System.Threading.Overlapped/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", "path": "system.threading.overlapped/4.3.0", "hashPath": "system.threading.overlapped.4.3.0.nupkg.sha512" }, "System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "path": "system.threading.tasks/4.3.0", "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" }, "System.Threading.Tasks.Extensions/4.5.4": { "type": "package", "serviceable": true, "sha512": "sha512-zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", "path": "system.threading.tasks.extensions/4.5.4", "hashPath": "system.threading.tasks.extensions.4.5.4.nupkg.sha512" }, "System.Threading.Thread/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", "path": "system.threading.thread/4.3.0", "hashPath": "system.threading.thread.4.3.0.nupkg.sha512" }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", "path": "system.threading.threadpool/4.3.0", "hashPath": "system.threading.threadpool.4.3.0.nupkg.sha512" } } } ================================================ FILE: TSLib/bin/Release/netstandard2.1/TSLib.deps.json ================================================ { "runtimeTarget": { "name": ".NETStandard,Version=v2.1/", "signature": "" }, "compilationOptions": {}, "targets": { ".NETStandard,Version=v2.1": {}, ".NETStandard,Version=v2.1/": { "TSLib/1.1.0": { "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Nullable": "1.2.1", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2" }, "runtime": { "TSLib.dll": {} } }, "Heijden.Dns.Portable/2.0.19": { "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": { "assemblyVersion": "2.0.19.0", "fileVersion": "2.0.19.0" } } }, "Microsoft.NETCore.Platforms/1.1.0": {}, "Microsoft.NETCore.Targets/1.1.0": {}, "Microsoft.Win32.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "Newtonsoft.Json/12.0.3": { "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { "assemblyVersion": "12.0.0.0", "fileVersion": "12.0.3.23909" } } }, "NLog/4.7.3": { "runtime": { "lib/netstandard2.0/NLog.dll": { "assemblyVersion": "4.0.0.0", "fileVersion": "4.7.3.11982" } } }, "Nullable/1.2.1": {}, "Portable.BouncyCastle/1.8.6.7": { "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": { "assemblyVersion": "1.8.6.0", "fileVersion": "1.8.6.7" } } }, "runtime.native.System/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" } }, "Splamy.Ed25519.Toolkit/1.0.3": { "dependencies": { "System.Memory": "4.5.4" }, "runtime": { "lib/netstandard2.0/Chaos.NaCl.dll": { "assemblyVersion": "1.0.3.0", "fileVersion": "1.0.3.0" } } }, "System.Buffers/4.5.1": { "runtime": { "lib/netstandard2.0/System.Buffers.dll": { "assemblyVersion": "4.0.3.0", "fileVersion": "4.6.28619.1" } } }, "System.Collections/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Diagnostics.Debug/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Diagnostics.Tracing/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Globalization/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.IO/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.IO.FileSystem/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.IO.FileSystem.Primitives/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.6.24705.1" } } }, "System.IO.Pipelines/4.7.2": { "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.4", "System.Threading.Tasks.Extensions": "4.5.4" }, "runtime": { "lib/netstandard2.0/System.IO.Pipelines.dll": { "assemblyVersion": "4.0.2.1", "fileVersion": "4.700.20.21406" } } }, "System.Linq/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" }, "runtime": { "lib/netstandard1.6/System.Linq.dll": { "assemblyVersion": "4.1.1.0", "fileVersion": "4.6.24705.1" } } }, "System.Memory/4.5.4": { "dependencies": { "System.Buffers": "4.5.1", "System.Numerics.Vectors": "4.4.0", "System.Runtime.CompilerServices.Unsafe": "4.5.3" }, "runtime": { "lib/netstandard2.0/System.Memory.dll": { "assemblyVersion": "4.0.1.1", "fileVersion": "4.6.28619.1" } } }, "System.Net.NetworkInformation/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" } }, "System.Net.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Net.Sockets/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" } }, "System.Numerics.Vectors/4.4.0": { "runtime": { "lib/netstandard2.0/System.Numerics.Vectors.dll": { "assemblyVersion": "4.1.3.0", "fileVersion": "4.6.25519.3" } } }, "System.Reflection/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Reflection.Primitives/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Resources.ResourceManager/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" } }, "System.Runtime/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" } }, "System.Runtime.CompilerServices.Unsafe/4.5.3": { "runtime": { "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { "assemblyVersion": "4.0.4.1", "fileVersion": "4.6.28619.1" } } }, "System.Runtime.Extensions/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Runtime.Handles/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Runtime.InteropServices/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Security.Claims/4.3.0": { "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Security.Claims.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.6.24705.1" } } }, "System.Security.Principal/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" }, "runtime": { "lib/netstandard1.0/System.Security.Principal.dll": { "assemblyVersion": "4.0.2.0", "fileVersion": "4.6.24705.1" } } }, "System.Security.Principal.Windows/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" } }, "System.Text.Encoding/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Threading/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Threading.dll": { "assemblyVersion": "4.0.12.0", "fileVersion": "4.6.24705.1" } } }, "System.Threading.Overlapped/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" } }, "System.Threading.Tasks/4.3.0": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } }, "System.Threading.Tasks.Extensions/4.5.4": { "dependencies": { "System.Runtime.CompilerServices.Unsafe": "4.5.3" }, "runtime": { "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll": { "assemblyVersion": "4.2.0.1", "fileVersion": "4.6.28619.1" } } }, "System.Threading.Thread/4.3.0": { "dependencies": { "System.Runtime": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Threading.Thread.dll": { "assemblyVersion": "4.0.1.0", "fileVersion": "4.6.24705.1" } } }, "System.Threading.ThreadPool/4.3.0": { "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "runtime": { "lib/netstandard1.3/System.Threading.ThreadPool.dll": { "assemblyVersion": "4.0.11.0", "fileVersion": "4.6.24705.1" } } } } }, "libraries": { "TSLib/1.1.0": { "type": "project", "serviceable": false, "sha512": "" }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "serviceable": true, "sha512": "sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==", "path": "heijden.dns.portable/2.0.19", "hashPath": "heijden.dns.portable.2.0.19.nupkg.sha512" }, "Microsoft.NETCore.Platforms/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", "path": "microsoft.netcore.platforms/1.1.0", "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "serviceable": true, "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "path": "microsoft.netcore.targets/1.1.0", "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "path": "microsoft.win32.primitives/4.3.0", "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" }, "Newtonsoft.Json/12.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==", "path": "newtonsoft.json/12.0.3", "hashPath": "newtonsoft.json.12.0.3.nupkg.sha512" }, "NLog/4.7.3": { "type": "package", "serviceable": true, "sha512": "sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==", "path": "nlog/4.7.3", "hashPath": "nlog.4.7.3.nupkg.sha512" }, "Nullable/1.2.1": { "type": "package", "serviceable": true, "sha512": "sha512-rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==", "path": "nullable/1.2.1", "hashPath": "nullable.1.2.1.nupkg.sha512" }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "serviceable": true, "sha512": "sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==", "path": "portable.bouncycastle/1.8.6.7", "hashPath": "portable.bouncycastle.1.8.6.7.nupkg.sha512" }, "runtime.native.System/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", "path": "runtime.native.system/4.3.0", "hashPath": "runtime.native.system.4.3.0.nupkg.sha512" }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "serviceable": true, "sha512": "sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==", "path": "splamy.ed25519.toolkit/1.0.3", "hashPath": "splamy.ed25519.toolkit.1.0.3.nupkg.sha512" }, "System.Buffers/4.5.1": { "type": "package", "serviceable": true, "sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==", "path": "system.buffers/4.5.1", "hashPath": "system.buffers.4.5.1.nupkg.sha512" }, "System.Collections/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "path": "system.collections/4.3.0", "hashPath": "system.collections.4.3.0.nupkg.sha512" }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "path": "system.diagnostics.debug/4.3.0", "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "path": "system.diagnostics.tracing/4.3.0", "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" }, "System.Globalization/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "path": "system.globalization/4.3.0", "hashPath": "system.globalization.4.3.0.nupkg.sha512" }, "System.IO/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "path": "system.io/4.3.0", "hashPath": "system.io.4.3.0.nupkg.sha512" }, "System.IO.FileSystem/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "path": "system.io.filesystem/4.3.0", "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "path": "system.io.filesystem.primitives/4.3.0", "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" }, "System.IO.Pipelines/4.7.2": { "type": "package", "serviceable": true, "sha512": "sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==", "path": "system.io.pipelines/4.7.2", "hashPath": "system.io.pipelines.4.7.2.nupkg.sha512" }, "System.Linq/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "path": "system.linq/4.3.0", "hashPath": "system.linq.4.3.0.nupkg.sha512" }, "System.Memory/4.5.4": { "type": "package", "serviceable": true, "sha512": "sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", "path": "system.memory/4.5.4", "hashPath": "system.memory.4.5.4.nupkg.sha512" }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==", "path": "system.net.networkinformation/4.3.0", "hashPath": "system.net.networkinformation.4.3.0.nupkg.sha512" }, "System.Net.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "path": "system.net.primitives/4.3.0", "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" }, "System.Net.Sockets/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "path": "system.net.sockets/4.3.0", "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" }, "System.Numerics.Vectors/4.4.0": { "type": "package", "serviceable": true, "sha512": "sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==", "path": "system.numerics.vectors/4.4.0", "hashPath": "system.numerics.vectors.4.4.0.nupkg.sha512" }, "System.Reflection/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "path": "system.reflection/4.3.0", "hashPath": "system.reflection.4.3.0.nupkg.sha512" }, "System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "path": "system.reflection.primitives/4.3.0", "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "path": "system.resources.resourcemanager/4.3.0", "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "System.Runtime/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "path": "system.runtime/4.3.0", "hashPath": "system.runtime.4.3.0.nupkg.sha512" }, "System.Runtime.CompilerServices.Unsafe/4.5.3": { "type": "package", "serviceable": true, "sha512": "sha512-3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==", "path": "system.runtime.compilerservices.unsafe/4.5.3", "hashPath": "system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512" }, "System.Runtime.Extensions/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "path": "system.runtime.extensions/4.3.0", "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" }, "System.Runtime.Handles/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "path": "system.runtime.handles/4.3.0", "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "path": "system.runtime.interopservices/4.3.0", "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" }, "System.Security.Claims/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "path": "system.security.claims/4.3.0", "hashPath": "system.security.claims.4.3.0.nupkg.sha512" }, "System.Security.Principal/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "path": "system.security.principal/4.3.0", "hashPath": "system.security.principal.4.3.0.nupkg.sha512" }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", "path": "system.security.principal.windows/4.3.0", "hashPath": "system.security.principal.windows.4.3.0.nupkg.sha512" }, "System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "path": "system.text.encoding/4.3.0", "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" }, "System.Threading/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "path": "system.threading/4.3.0", "hashPath": "system.threading.4.3.0.nupkg.sha512" }, "System.Threading.Overlapped/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", "path": "system.threading.overlapped/4.3.0", "hashPath": "system.threading.overlapped.4.3.0.nupkg.sha512" }, "System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "path": "system.threading.tasks/4.3.0", "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" }, "System.Threading.Tasks.Extensions/4.5.4": { "type": "package", "serviceable": true, "sha512": "sha512-zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", "path": "system.threading.tasks.extensions/4.5.4", "hashPath": "system.threading.tasks.extensions.4.5.4.nupkg.sha512" }, "System.Threading.Thread/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", "path": "system.threading.thread/4.3.0", "hashPath": "system.threading.thread.4.3.0.nupkg.sha512" }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "serviceable": true, "sha512": "sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", "path": "system.threading.threadpool/4.3.0", "hashPath": "system.threading.threadpool.4.3.0.nupkg.sha512" } } } ================================================ FILE: TSLib/dnc2_compat/Extensions.cs ================================================ #if NETSTANDARD2_0 using System; using System.Collections.Generic; internal static class Extensions { // TimeSpan public static TimeSpan Divide(this TimeSpan timeSpan, double divisor) => TimeSpan.FromTicks((long)(timeSpan.Ticks / divisor)); // Dictionary public static bool Remove(this Dictionary dict, K key, out V value) { if (dict.TryGetValue(key, out value)) { return dict.Remove(key); } return false; } } #endif ================================================ FILE: TSLib/dnc2_compat/Range.cs ================================================ // Source: https://www.meziantou.net/how-to-use-csharp-8-indices-and-ranges-in-dotnet-standard-2-0-and-dotn.htm // https://github.com/dotnet/corefx/blob/1597b894a2e9cac668ce6e484506eca778a85197/src/Common/src/CoreLib/System/Index.cs // https://github.com/dotnet/corefx/blob/1597b894a2e9cac668ce6e484506eca778a85197/src/Common/src/CoreLib/System/Range.cs #if NETSTANDARD2_0 using System.Runtime.CompilerServices; namespace System { /// Represent a type can be used to index a collection either from the start or the end. /// /// Index is used by the C# compiler to support the new index syntax /// /// int[] someArray = new int[5] { 1, 2, 3, 4, 5 } ; /// int lastElement = someArray[^1]; // lastElement = 5 /// /// internal readonly struct Index : IEquatable { private readonly int _value; /// Construct an Index using a value and indicating if the index is from the start or from the end. /// The index value. it has to be zero or positive number. /// Indicating if the index is from the start or from the end. /// /// If the Index constructed from the end, index value 1 means pointing at the last element and index value 0 means pointing at beyond last element. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public Index(int value, bool fromEnd = false) { if (value < 0) { throw new ArgumentOutOfRangeException(nameof(value), "value must be non-negative"); } if (fromEnd) _value = ~value; else _value = value; } // The following private constructors mainly created for perf reason to avoid the checks private Index(int value) { _value = value; } /// Create an Index pointing at first element. public static Index Start => new Index(0); /// Create an Index pointing at beyond last element. public static Index End => new Index(~0); /// Create an Index from the start at the position indicated by the value. /// The index value from the start. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Index FromStart(int value) { if (value < 0) { throw new ArgumentOutOfRangeException(nameof(value), "value must be non-negative"); } return new Index(value); } /// Create an Index from the end at the position indicated by the value. /// The index value from the end. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Index FromEnd(int value) { if (value < 0) { throw new ArgumentOutOfRangeException(nameof(value), "value must be non-negative"); } return new Index(~value); } /// Returns the index value. public int Value { get { if (_value < 0) { return ~_value; } else { return _value; } } } /// Indicates whether the index is from the start or the end. public bool IsFromEnd => _value < 0; /// Calculate the offset from the start using the giving collection length. /// The length of the collection that the Index will be used with. length has to be a positive value /// /// For performance reason, we don't validate the input length parameter and the returned offset value against negative values. /// we don't validate either the returned offset is greater than the input length. /// It is expected Index will be used with collections which always have non negative length/count. If the returned offset is negative and /// then used to index a collection will get out of range exception which will be same affect as the validation. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public int GetOffset(int length) { var offset = _value; if (IsFromEnd) { // offset = length - (~value) // offset = length + (~(~value) + 1) // offset = length + value + 1 offset += length + 1; } return offset; } /// Indicates whether the current Index object is equal to another object of the same type. /// An object to compare with this object public override bool Equals(object? value) => value is Index index && _value == index._value; /// Indicates whether the current Index object is equal to another Index object. /// An object to compare with this object public bool Equals(Index other) => _value == other._value; /// Returns the hash code for this instance. public override int GetHashCode() => _value; /// Converts integer number to an Index. public static implicit operator Index(int value) => FromStart(value); /// Converts the value of the current Index object to its equivalent string representation. public override string ToString() { if (IsFromEnd) return "^" + ((uint)Value).ToString(); return ((uint)Value).ToString(); } } /// Represent a range has start and end indexes. /// /// Range is used by the C# compiler to support the range syntax. /// /// int[] someArray = new int[5] { 1, 2, 3, 4, 5 }; /// int[] subArray1 = someArray[0..2]; // { 1, 2 } /// int[] subArray2 = someArray[1..^0]; // { 2, 3, 4, 5 } /// /// internal readonly struct Range : IEquatable { /// Represent the inclusive start index of the Range. public Index Start { get; } /// Represent the exclusive end index of the Range. public Index End { get; } /// Construct a Range object using the start and end indexes. /// Represent the inclusive start index of the range. /// Represent the exclusive end index of the range. public Range(Index start, Index end) { Start = start; End = end; } /// Indicates whether the current Range object is equal to another object of the same type. /// An object to compare with this object public override bool Equals(object? value) => value is Range r && r.Start.Equals(Start) && r.End.Equals(End); /// Indicates whether the current Range object is equal to another Range object. /// An object to compare with this object public bool Equals(Range other) => other.Start.Equals(Start) && other.End.Equals(End); /// Returns the hash code for this instance. public override int GetHashCode() { return Start.GetHashCode() * 31 + End.GetHashCode(); } /// Converts the value of the current Range object to its equivalent string representation. public override string ToString() { return Start + ".." + End; } /// Create a Range object starting from start index to the end of the collection. public static Range StartAt(Index start) => new Range(start, Index.End); /// Create a Range object starting from first element in the collection to the end Index. public static Range EndAt(Index end) => new Range(Index.Start, end); /// Create a Range object starting from first element to the end. public static Range All => new Range(Index.Start, Index.End); /// Calculate the start offset and length of range object using a collection length. /// The length of the collection that the range will be used with. length has to be a positive value. /// /// For performance reason, we don't validate the input length parameter against negative values. /// It is expected Range will be used with collections which always have non negative length/count. /// We validate the range is inside the length scope though. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public (int Offset, int Length) GetOffsetAndLength(int length) { int start; var startIndex = Start; if (startIndex.IsFromEnd) start = length - startIndex.Value; else start = startIndex.Value; int end; var endIndex = End; if (endIndex.IsFromEnd) end = length - endIndex.Value; else end = endIndex.Value; if ((uint)end > (uint)length || (uint)start > (uint)end) { throw new ArgumentOutOfRangeException(nameof(length)); } return (start, end - start); } } } namespace System.Runtime.CompilerServices { internal static class RuntimeHelpers { /// /// Slices the specified array using the specified range. /// public static T[] GetSubArray(T[] array, Range range) { if (array == null) { throw new ArgumentNullException(nameof(array)); } (int offset, int length) = range.GetOffsetAndLength(array.Length); if (default(T) != null || typeof(T[]) == array.GetType()) { // We know the type of the array to be exactly T[]. if (length == 0) { return Array.Empty(); } var dest = new T[length]; Array.Copy(array, offset, dest, 0, length); return dest; } else { // The array is actually a U[] where U:T. var dest = (T[])Array.CreateInstance(array.GetType().GetElementType(), length); Array.Copy(array, offset, dest, 0, length); return dest; } } } } #endif ================================================ FILE: TSLib/dnc2_compat/info.txt ================================================ Since netstandard2.0 does not contain a lot of features wich are required for C# 8 or available in with netstandard2.1 / dotnet core 3.+ this folder provides preprocessor-conditionals to supply them. The folder can be completely deleted once netstandard2.0 is not targeted anymore. ================================================ FILE: TSLib/obj/Debug/netcoreapp3.1/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs ================================================ // using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v3.1", FrameworkDisplayName = "")] ================================================ FILE: TSLib/obj/Debug/netcoreapp3.1/TSLib.AssemblyInfo.cs ================================================ //------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("TSLib")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyCopyrightAttribute("Splamy, Flakebi, TSLib Contributors")] [assembly: System.Reflection.AssemblyDescriptionAttribute("\n A free and open source TeamSpeak 3 and 5 client library.\n Can connect" + " as normal voice or query client and is optimized for performance.\n ")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] [assembly: System.Reflection.AssemblyProductAttribute("TSLib")] [assembly: System.Reflection.AssemblyTitleAttribute("TSLib")] [assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/Splamy/TS3AudioBot.git")] // 由 MSBuild WriteCodeFragment 类生成。 ================================================ FILE: TSLib/obj/Debug/netcoreapp3.1/TSLib.AssemblyInfoInputs.cache ================================================ 2ff3ef079d87000ac18187eaa94cbfde54c93cad ================================================ FILE: TSLib/obj/Debug/netcoreapp3.1/TSLib.GeneratedMSBuildEditorConfig.editorconfig ================================================ is_global = true build_property.RootNamespace = TSLib build_property.ProjectDir = G:\TS3DEV\TS3AudioBot-master\TSLib\ ================================================ FILE: TSLib/obj/Debug/netcoreapp3.1/TSLib.csproj.CoreCompileInputs.cache ================================================ ffffd03aad5d6c3afe005e27ac3e8402eeec43f7 ================================================ FILE: TSLib/obj/Debug/netcoreapp3.1/TSLib.csproj.FileListAbsolute.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netcoreapp3.1\TSLib.deps.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netcoreapp3.1\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netcoreapp3.1\TSLib.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.csproj.AssemblyReference.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.GeneratedMSBuildEditorConfig.editorconfig C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.AssemblyInfoInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.AssemblyInfo.cs C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.csproj.CoreCompileInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.pdb G:\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netcoreapp3.1\TSLib.deps.json G:\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netcoreapp3.1\TSLib.dll G:\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netcoreapp3.1\TSLib.pdb G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.csproj.AssemblyReference.cache G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.GeneratedMSBuildEditorConfig.editorconfig G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.AssemblyInfoInputs.cache G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.AssemblyInfo.cs G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.csproj.CoreCompileInputs.cache G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.dll G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netcoreapp3.1\TSLib.pdb ================================================ FILE: TSLib/obj/Debug/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.cs ================================================ // using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.0", FrameworkDisplayName = "")] ================================================ FILE: TSLib/obj/Debug/netstandard2.0/NuGet/2C8E6E8C03FF0327F78E3CB90559803756F36314/Nullable/1.2.1/Nullable/NullableAttributes.cs ================================================ // // This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable). // Please see https://github.com/manuelroemer/Nullable for more information. // // IMPORTANT: // DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references. // Consider migrating to PackageReferences instead: // https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference // Migrating brings the following benefits: // * The "Nullable" folder and the "NullableAttributes.cs" files don't appear in your project. // * The added files are immutable and can therefore not be modified by coincidence. // * Updating/Uninstalling the package will work flawlessly. // #region License // MIT License // // Copyright (c) 2019 Manuel Römer // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #endregion #if !NULLABLE_ATTRIBUTES_DISABLE #nullable enable #pragma warning disable namespace System.Diagnostics.CodeAnalysis { using global::System; #if DEBUG /// /// Specifies that is allowed as an input even if the /// corresponding type disallows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class AllowNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public AllowNullAttribute() { } } #if DEBUG /// /// Specifies that is disallowed as an input even if the /// corresponding type allows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class DisallowNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public DisallowNullAttribute() { } } #if DEBUG /// /// Specifies that a method that will never return under any circumstance. /// #endif [AttributeUsage(AttributeTargets.Method, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class DoesNotReturnAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// /// #endif public DoesNotReturnAttribute() { } } #if DEBUG /// /// Specifies that the method will not return if the associated /// parameter is passed the specified value. /// #endif [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class DoesNotReturnIfAttribute : Attribute { #if DEBUG /// /// Gets the condition parameter value. /// Code after the method is considered unreachable by diagnostics if the argument /// to the associated parameter matches this value. /// #endif public bool ParameterValue { get; } #if DEBUG /// /// Initializes a new instance of the /// class with the specified parameter value. /// /// /// The condition parameter value. /// Code after the method is considered unreachable by diagnostics if the argument /// to the associated parameter matches this value. /// #endif public DoesNotReturnIfAttribute(bool parameterValue) { ParameterValue = parameterValue; } } #if DEBUG /// /// Specifies that an output may be even if the /// corresponding type disallows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class MaybeNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public MaybeNullAttribute() { } } #if DEBUG /// /// Specifies that when a method returns , /// the parameter may be even if the corresponding type disallows it. /// #endif [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class MaybeNullWhenAttribute : Attribute { #if DEBUG /// /// Gets the return value condition. /// If the method returns this value, the associated parameter may be . /// #endif public bool ReturnValue { get; } #if DEBUG /// /// Initializes the attribute with the specified return value condition. /// /// /// The return value condition. /// If the method returns this value, the associated parameter may be . /// #endif public MaybeNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } #if DEBUG /// /// Specifies that an output is not even if the /// corresponding type allows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class NotNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public NotNullAttribute() { } } #if DEBUG /// /// Specifies that the output will be non- if the /// named parameter is non-. /// #endif [AttributeUsage( AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, AllowMultiple = true, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class NotNullIfNotNullAttribute : Attribute { #if DEBUG /// /// Gets the associated parameter name. /// The output will be non- if the argument to the /// parameter specified is non-. /// #endif public string ParameterName { get; } #if DEBUG /// /// Initializes the attribute with the associated parameter name. /// /// /// The associated parameter name. /// The output will be non- if the argument to the /// parameter specified is non-. /// #endif public NotNullIfNotNullAttribute(string parameterName) { // .NET Core 3.0 doesn't throw an ArgumentNullException, even though this is // tagged as non-null. // Follow this behavior here. ParameterName = parameterName; } } #if DEBUG /// /// Specifies that when a method returns , /// the parameter will not be even if the corresponding type allows it. /// #endif [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class NotNullWhenAttribute : Attribute { #if DEBUG /// /// Gets the return value condition. /// If the method returns this value, the associated parameter will not be . /// #endif public bool ReturnValue { get; } #if DEBUG /// /// Initializes the attribute with the specified return value condition. /// /// /// The return value condition. /// If the method returns this value, the associated parameter will not be . /// #endif public NotNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } } #pragma warning enable #nullable restore #endif // NULLABLE_ATTRIBUTES_DISABLE ================================================ FILE: TSLib/obj/Debug/netstandard2.0/NuGet/7BA94E4E53727142735FA3B08F79617CD03664FD/Nullable/1.2.1/Nullable/NullableAttributes.cs ================================================ // // This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable). // Please see https://github.com/manuelroemer/Nullable for more information. // // IMPORTANT: // DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references. // Consider migrating to PackageReferences instead: // https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference // Migrating brings the following benefits: // * The "Nullable" folder and the "NullableAttributes.cs" files don't appear in your project. // * The added files are immutable and can therefore not be modified by coincidence. // * Updating/Uninstalling the package will work flawlessly. // #region License // MIT License // // Copyright (c) 2019 Manuel Römer // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #endregion #if !NULLABLE_ATTRIBUTES_DISABLE #nullable enable #pragma warning disable namespace System.Diagnostics.CodeAnalysis { using global::System; #if DEBUG /// /// Specifies that is allowed as an input even if the /// corresponding type disallows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class AllowNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public AllowNullAttribute() { } } #if DEBUG /// /// Specifies that is disallowed as an input even if the /// corresponding type allows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class DisallowNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public DisallowNullAttribute() { } } #if DEBUG /// /// Specifies that a method that will never return under any circumstance. /// #endif [AttributeUsage(AttributeTargets.Method, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class DoesNotReturnAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// /// #endif public DoesNotReturnAttribute() { } } #if DEBUG /// /// Specifies that the method will not return if the associated /// parameter is passed the specified value. /// #endif [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class DoesNotReturnIfAttribute : Attribute { #if DEBUG /// /// Gets the condition parameter value. /// Code after the method is considered unreachable by diagnostics if the argument /// to the associated parameter matches this value. /// #endif public bool ParameterValue { get; } #if DEBUG /// /// Initializes a new instance of the /// class with the specified parameter value. /// /// /// The condition parameter value. /// Code after the method is considered unreachable by diagnostics if the argument /// to the associated parameter matches this value. /// #endif public DoesNotReturnIfAttribute(bool parameterValue) { ParameterValue = parameterValue; } } #if DEBUG /// /// Specifies that an output may be even if the /// corresponding type disallows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class MaybeNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public MaybeNullAttribute() { } } #if DEBUG /// /// Specifies that when a method returns , /// the parameter may be even if the corresponding type disallows it. /// #endif [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class MaybeNullWhenAttribute : Attribute { #if DEBUG /// /// Gets the return value condition. /// If the method returns this value, the associated parameter may be . /// #endif public bool ReturnValue { get; } #if DEBUG /// /// Initializes the attribute with the specified return value condition. /// /// /// The return value condition. /// If the method returns this value, the associated parameter may be . /// #endif public MaybeNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } #if DEBUG /// /// Specifies that an output is not even if the /// corresponding type allows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class NotNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public NotNullAttribute() { } } #if DEBUG /// /// Specifies that the output will be non- if the /// named parameter is non-. /// #endif [AttributeUsage( AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, AllowMultiple = true, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class NotNullIfNotNullAttribute : Attribute { #if DEBUG /// /// Gets the associated parameter name. /// The output will be non- if the argument to the /// parameter specified is non-. /// #endif public string ParameterName { get; } #if DEBUG /// /// Initializes the attribute with the associated parameter name. /// /// /// The associated parameter name. /// The output will be non- if the argument to the /// parameter specified is non-. /// #endif public NotNullIfNotNullAttribute(string parameterName) { // .NET Core 3.0 doesn't throw an ArgumentNullException, even though this is // tagged as non-null. // Follow this behavior here. ParameterName = parameterName; } } #if DEBUG /// /// Specifies that when a method returns , /// the parameter will not be even if the corresponding type allows it. /// #endif [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class NotNullWhenAttribute : Attribute { #if DEBUG /// /// Gets the return value condition. /// If the method returns this value, the associated parameter will not be . /// #endif public bool ReturnValue { get; } #if DEBUG /// /// Initializes the attribute with the specified return value condition. /// /// /// The return value condition. /// If the method returns this value, the associated parameter will not be . /// #endif public NotNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } } #pragma warning enable #nullable restore #endif // NULLABLE_ATTRIBUTES_DISABLE ================================================ FILE: TSLib/obj/Debug/netstandard2.0/TSLib.AssemblyInfo.cs ================================================ //------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("TSLib")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyCopyrightAttribute("Splamy, Flakebi, TSLib Contributors")] [assembly: System.Reflection.AssemblyDescriptionAttribute("\n A free and open source TeamSpeak 3 and 5 client library.\n Can connect" + " as normal voice or query client and is optimized for performance.\n ")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] [assembly: System.Reflection.AssemblyProductAttribute("TSLib")] [assembly: System.Reflection.AssemblyTitleAttribute("TSLib")] [assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/Splamy/TS3AudioBot.git")] // 由 MSBuild WriteCodeFragment 类生成。 ================================================ FILE: TSLib/obj/Debug/netstandard2.0/TSLib.AssemblyInfoInputs.cache ================================================ 2ff3ef079d87000ac18187eaa94cbfde54c93cad ================================================ FILE: TSLib/obj/Debug/netstandard2.0/TSLib.GeneratedMSBuildEditorConfig.editorconfig ================================================ is_global = true build_property.RootNamespace = TSLib build_property.ProjectDir = G:\TS3DEV\TS3AudioBot-master\TSLib\ ================================================ FILE: TSLib/obj/Debug/netstandard2.0/TSLib.csproj.CoreCompileInputs.cache ================================================ e3b073d87aad04aa8978486c82341498240963e0 ================================================ FILE: TSLib/obj/Debug/netstandard2.0/TSLib.csproj.FileListAbsolute.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netstandard2.0\TSLib.deps.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netstandard2.0\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netstandard2.0\TSLib.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\NuGet\2C8E6E8C03FF0327F78E3CB90559803756F36314\Nullable\1.2.1\Nullable\NullableAttributes.cs C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\TSLib.csproj.AssemblyReference.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\TSLib.GeneratedMSBuildEditorConfig.editorconfig C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\TSLib.AssemblyInfoInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\TSLib.AssemblyInfo.cs C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\TSLib.csproj.CoreCompileInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\TSLib.pdb G:\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netstandard2.0\TSLib.deps.json G:\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netstandard2.0\TSLib.dll G:\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netstandard2.0\TSLib.pdb G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\TSLib.GeneratedMSBuildEditorConfig.editorconfig G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\TSLib.AssemblyInfoInputs.cache G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\TSLib.AssemblyInfo.cs G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\TSLib.csproj.CoreCompileInputs.cache G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\TSLib.dll G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.0\TSLib.pdb ================================================ FILE: TSLib/obj/Debug/netstandard2.1/.NETStandard,Version=v2.1.AssemblyAttributes.cs ================================================ // using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.1", FrameworkDisplayName = "")] ================================================ FILE: TSLib/obj/Debug/netstandard2.1/TSLib.AssemblyInfo.cs ================================================ //------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("TSLib")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyCopyrightAttribute("Splamy, Flakebi, TSLib Contributors")] [assembly: System.Reflection.AssemblyDescriptionAttribute("\n A free and open source TeamSpeak 3 and 5 client library.\n Can connect" + " as normal voice or query client and is optimized for performance.\n ")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] [assembly: System.Reflection.AssemblyProductAttribute("TSLib")] [assembly: System.Reflection.AssemblyTitleAttribute("TSLib")] [assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/Splamy/TS3AudioBot.git")] // 由 MSBuild WriteCodeFragment 类生成。 ================================================ FILE: TSLib/obj/Debug/netstandard2.1/TSLib.AssemblyInfoInputs.cache ================================================ 2ff3ef079d87000ac18187eaa94cbfde54c93cad ================================================ FILE: TSLib/obj/Debug/netstandard2.1/TSLib.GeneratedMSBuildEditorConfig.editorconfig ================================================ is_global = true build_property.RootNamespace = TSLib build_property.ProjectDir = G:\TS3DEV\TS3AudioBot-master\TSLib\ ================================================ FILE: TSLib/obj/Debug/netstandard2.1/TSLib.csproj.CoreCompileInputs.cache ================================================ f8cbaf6212d4764a126254fb61ee67b84cf27574 ================================================ FILE: TSLib/obj/Debug/netstandard2.1/TSLib.csproj.FileListAbsolute.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netstandard2.1\TSLib.deps.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netstandard2.1\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netstandard2.1\TSLib.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.csproj.AssemblyReference.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.GeneratedMSBuildEditorConfig.editorconfig C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.AssemblyInfoInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.AssemblyInfo.cs C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.csproj.CoreCompileInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.pdb G:\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netstandard2.1\TSLib.deps.json G:\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netstandard2.1\TSLib.dll G:\TS3DEV\TS3AudioBot-master\TSLib\bin\Debug\netstandard2.1\TSLib.pdb G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.csproj.AssemblyReference.cache G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.GeneratedMSBuildEditorConfig.editorconfig G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.AssemblyInfoInputs.cache G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.AssemblyInfo.cs G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.csproj.CoreCompileInputs.cache G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.dll G:\TS3DEV\TS3AudioBot-master\TSLib\obj\Debug\netstandard2.1\TSLib.pdb ================================================ FILE: TSLib/obj/Release/netcoreapp3.1/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs ================================================ // using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v3.1", FrameworkDisplayName = ".NET Core 3.1")] ================================================ FILE: TSLib/obj/Release/netcoreapp3.1/TSLib.AssemblyInfo.cs ================================================ //------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("TSLib")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyCopyrightAttribute("Splamy, Flakebi, TSLib Contributors")] [assembly: System.Reflection.AssemblyDescriptionAttribute("\n A free and open source TeamSpeak 3 and 5 client library.\n Can connect" + " as normal voice or query client and is optimized for performance.\n ")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] [assembly: System.Reflection.AssemblyProductAttribute("TSLib")] [assembly: System.Reflection.AssemblyTitleAttribute("TSLib")] [assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/Splamy/TS3AudioBot.git")] // 由 MSBuild WriteCodeFragment 类生成。 ================================================ FILE: TSLib/obj/Release/netcoreapp3.1/TSLib.AssemblyInfoInputs.cache ================================================ d05c9d59824d457289a7f8adc4d2a85d4364458f ================================================ FILE: TSLib/obj/Release/netcoreapp3.1/TSLib.GeneratedMSBuildEditorConfig.editorconfig ================================================ is_global = true build_property.RootNamespace = TSLib build_property.ProjectDir = G:\TS3DEV\TS3AudioBot-master\TSLib\ ================================================ FILE: TSLib/obj/Release/netcoreapp3.1/TSLib.csproj.CoreCompileInputs.cache ================================================ 2c1b64bc0bb50d2247d91321b7ba02226ea6861a ================================================ FILE: TSLib/obj/Release/netcoreapp3.1/TSLib.csproj.FileListAbsolute.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Release\netcoreapp3.1\TSLib.deps.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Release\netcoreapp3.1\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Release\netcoreapp3.1\TSLib.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netcoreapp3.1\TSLib.csproj.AssemblyReference.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netcoreapp3.1\TSLib.GeneratedMSBuildEditorConfig.editorconfig C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netcoreapp3.1\TSLib.AssemblyInfoInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netcoreapp3.1\TSLib.AssemblyInfo.cs C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netcoreapp3.1\TSLib.csproj.CoreCompileInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netcoreapp3.1\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netcoreapp3.1\TSLib.pdb ================================================ FILE: TSLib/obj/Release/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.cs ================================================ // using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] ================================================ FILE: TSLib/obj/Release/netstandard2.0/NuGet/2C8E6E8C03FF0327F78E3CB90559803756F36314/Nullable/1.2.1/Nullable/NullableAttributes.cs ================================================ // // This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable). // Please see https://github.com/manuelroemer/Nullable for more information. // // IMPORTANT: // DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references. // Consider migrating to PackageReferences instead: // https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference // Migrating brings the following benefits: // * The "Nullable" folder and the "NullableAttributes.cs" files don't appear in your project. // * The added files are immutable and can therefore not be modified by coincidence. // * Updating/Uninstalling the package will work flawlessly. // #region License // MIT License // // Copyright (c) 2019 Manuel Römer // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #endregion #if !NULLABLE_ATTRIBUTES_DISABLE #nullable enable #pragma warning disable namespace System.Diagnostics.CodeAnalysis { using global::System; #if DEBUG /// /// Specifies that is allowed as an input even if the /// corresponding type disallows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class AllowNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public AllowNullAttribute() { } } #if DEBUG /// /// Specifies that is disallowed as an input even if the /// corresponding type allows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class DisallowNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public DisallowNullAttribute() { } } #if DEBUG /// /// Specifies that a method that will never return under any circumstance. /// #endif [AttributeUsage(AttributeTargets.Method, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class DoesNotReturnAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// /// #endif public DoesNotReturnAttribute() { } } #if DEBUG /// /// Specifies that the method will not return if the associated /// parameter is passed the specified value. /// #endif [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class DoesNotReturnIfAttribute : Attribute { #if DEBUG /// /// Gets the condition parameter value. /// Code after the method is considered unreachable by diagnostics if the argument /// to the associated parameter matches this value. /// #endif public bool ParameterValue { get; } #if DEBUG /// /// Initializes a new instance of the /// class with the specified parameter value. /// /// /// The condition parameter value. /// Code after the method is considered unreachable by diagnostics if the argument /// to the associated parameter matches this value. /// #endif public DoesNotReturnIfAttribute(bool parameterValue) { ParameterValue = parameterValue; } } #if DEBUG /// /// Specifies that an output may be even if the /// corresponding type disallows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class MaybeNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public MaybeNullAttribute() { } } #if DEBUG /// /// Specifies that when a method returns , /// the parameter may be even if the corresponding type disallows it. /// #endif [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class MaybeNullWhenAttribute : Attribute { #if DEBUG /// /// Gets the return value condition. /// If the method returns this value, the associated parameter may be . /// #endif public bool ReturnValue { get; } #if DEBUG /// /// Initializes the attribute with the specified return value condition. /// /// /// The return value condition. /// If the method returns this value, the associated parameter may be . /// #endif public MaybeNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } #if DEBUG /// /// Specifies that an output is not even if the /// corresponding type allows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class NotNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public NotNullAttribute() { } } #if DEBUG /// /// Specifies that the output will be non- if the /// named parameter is non-. /// #endif [AttributeUsage( AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, AllowMultiple = true, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class NotNullIfNotNullAttribute : Attribute { #if DEBUG /// /// Gets the associated parameter name. /// The output will be non- if the argument to the /// parameter specified is non-. /// #endif public string ParameterName { get; } #if DEBUG /// /// Initializes the attribute with the associated parameter name. /// /// /// The associated parameter name. /// The output will be non- if the argument to the /// parameter specified is non-. /// #endif public NotNullIfNotNullAttribute(string parameterName) { // .NET Core 3.0 doesn't throw an ArgumentNullException, even though this is // tagged as non-null. // Follow this behavior here. ParameterName = parameterName; } } #if DEBUG /// /// Specifies that when a method returns , /// the parameter will not be even if the corresponding type allows it. /// #endif [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class NotNullWhenAttribute : Attribute { #if DEBUG /// /// Gets the return value condition. /// If the method returns this value, the associated parameter will not be . /// #endif public bool ReturnValue { get; } #if DEBUG /// /// Initializes the attribute with the specified return value condition. /// /// /// The return value condition. /// If the method returns this value, the associated parameter will not be . /// #endif public NotNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } } #pragma warning enable #nullable restore #endif // NULLABLE_ATTRIBUTES_DISABLE ================================================ FILE: TSLib/obj/Release/netstandard2.0/NuGet/7BA94E4E53727142735FA3B08F79617CD03664FD/Nullable/1.2.1/Nullable/NullableAttributes.cs ================================================ // // This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable). // Please see https://github.com/manuelroemer/Nullable for more information. // // IMPORTANT: // DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references. // Consider migrating to PackageReferences instead: // https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference // Migrating brings the following benefits: // * The "Nullable" folder and the "NullableAttributes.cs" files don't appear in your project. // * The added files are immutable and can therefore not be modified by coincidence. // * Updating/Uninstalling the package will work flawlessly. // #region License // MIT License // // Copyright (c) 2019 Manuel Römer // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #endregion #if !NULLABLE_ATTRIBUTES_DISABLE #nullable enable #pragma warning disable namespace System.Diagnostics.CodeAnalysis { using global::System; #if DEBUG /// /// Specifies that is allowed as an input even if the /// corresponding type disallows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class AllowNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public AllowNullAttribute() { } } #if DEBUG /// /// Specifies that is disallowed as an input even if the /// corresponding type allows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class DisallowNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public DisallowNullAttribute() { } } #if DEBUG /// /// Specifies that a method that will never return under any circumstance. /// #endif [AttributeUsage(AttributeTargets.Method, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class DoesNotReturnAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// /// #endif public DoesNotReturnAttribute() { } } #if DEBUG /// /// Specifies that the method will not return if the associated /// parameter is passed the specified value. /// #endif [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class DoesNotReturnIfAttribute : Attribute { #if DEBUG /// /// Gets the condition parameter value. /// Code after the method is considered unreachable by diagnostics if the argument /// to the associated parameter matches this value. /// #endif public bool ParameterValue { get; } #if DEBUG /// /// Initializes a new instance of the /// class with the specified parameter value. /// /// /// The condition parameter value. /// Code after the method is considered unreachable by diagnostics if the argument /// to the associated parameter matches this value. /// #endif public DoesNotReturnIfAttribute(bool parameterValue) { ParameterValue = parameterValue; } } #if DEBUG /// /// Specifies that an output may be even if the /// corresponding type disallows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class MaybeNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public MaybeNullAttribute() { } } #if DEBUG /// /// Specifies that when a method returns , /// the parameter may be even if the corresponding type disallows it. /// #endif [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class MaybeNullWhenAttribute : Attribute { #if DEBUG /// /// Gets the return value condition. /// If the method returns this value, the associated parameter may be . /// #endif public bool ReturnValue { get; } #if DEBUG /// /// Initializes the attribute with the specified return value condition. /// /// /// The return value condition. /// If the method returns this value, the associated parameter may be . /// #endif public MaybeNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } #if DEBUG /// /// Specifies that an output is not even if the /// corresponding type allows it. /// #endif [AttributeUsage( AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class NotNullAttribute : Attribute { #if DEBUG /// /// Initializes a new instance of the class. /// #endif public NotNullAttribute() { } } #if DEBUG /// /// Specifies that the output will be non- if the /// named parameter is non-. /// #endif [AttributeUsage( AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, AllowMultiple = true, Inherited = false )] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class NotNullIfNotNullAttribute : Attribute { #if DEBUG /// /// Gets the associated parameter name. /// The output will be non- if the argument to the /// parameter specified is non-. /// #endif public string ParameterName { get; } #if DEBUG /// /// Initializes the attribute with the associated parameter name. /// /// /// The associated parameter name. /// The output will be non- if the argument to the /// parameter specified is non-. /// #endif public NotNullIfNotNullAttribute(string parameterName) { // .NET Core 3.0 doesn't throw an ArgumentNullException, even though this is // tagged as non-null. // Follow this behavior here. ParameterName = parameterName; } } #if DEBUG /// /// Specifies that when a method returns , /// the parameter will not be even if the corresponding type allows it. /// #endif [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] #if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE [ExcludeFromCodeCoverage, DebuggerNonUserCode] #endif internal sealed class NotNullWhenAttribute : Attribute { #if DEBUG /// /// Gets the return value condition. /// If the method returns this value, the associated parameter will not be . /// #endif public bool ReturnValue { get; } #if DEBUG /// /// Initializes the attribute with the specified return value condition. /// /// /// The return value condition. /// If the method returns this value, the associated parameter will not be . /// #endif public NotNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } } #pragma warning enable #nullable restore #endif // NULLABLE_ATTRIBUTES_DISABLE ================================================ FILE: TSLib/obj/Release/netstandard2.0/TSLib.AssemblyInfo.cs ================================================ //------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("TSLib")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyCopyrightAttribute("Splamy, Flakebi, TSLib Contributors")] [assembly: System.Reflection.AssemblyDescriptionAttribute("\n A free and open source TeamSpeak 3 and 5 client library.\n Can connect" + " as normal voice or query client and is optimized for performance.\n ")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] [assembly: System.Reflection.AssemblyProductAttribute("TSLib")] [assembly: System.Reflection.AssemblyTitleAttribute("TSLib")] [assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/Splamy/TS3AudioBot.git")] // 由 MSBuild WriteCodeFragment 类生成。 ================================================ FILE: TSLib/obj/Release/netstandard2.0/TSLib.AssemblyInfoInputs.cache ================================================ d05c9d59824d457289a7f8adc4d2a85d4364458f ================================================ FILE: TSLib/obj/Release/netstandard2.0/TSLib.GeneratedMSBuildEditorConfig.editorconfig ================================================ is_global = true build_property.RootNamespace = TSLib build_property.ProjectDir = G:\TS3DEV\TS3AudioBot-master\TSLib\ ================================================ FILE: TSLib/obj/Release/netstandard2.0/TSLib.csproj.CoreCompileInputs.cache ================================================ 762be8033dcfe89c4c681d66484f55153f94a449 ================================================ FILE: TSLib/obj/Release/netstandard2.0/TSLib.csproj.FileListAbsolute.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Release\netstandard2.0\TSLib.deps.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Release\netstandard2.0\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Release\netstandard2.0\TSLib.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.0\NuGet\2C8E6E8C03FF0327F78E3CB90559803756F36314\Nullable\1.2.1\Nullable\NullableAttributes.cs C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.0\TSLib.csproj.AssemblyReference.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.0\TSLib.GeneratedMSBuildEditorConfig.editorconfig C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.0\TSLib.AssemblyInfoInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.0\TSLib.AssemblyInfo.cs C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.0\TSLib.csproj.CoreCompileInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.0\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.0\TSLib.pdb ================================================ FILE: TSLib/obj/Release/netstandard2.1/.NETStandard,Version=v2.1.AssemblyAttributes.cs ================================================ // using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] ================================================ FILE: TSLib/obj/Release/netstandard2.1/TSLib.AssemblyInfo.cs ================================================ //------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("TSLib")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyCopyrightAttribute("Splamy, Flakebi, TSLib Contributors")] [assembly: System.Reflection.AssemblyDescriptionAttribute("\n A free and open source TeamSpeak 3 and 5 client library.\n Can connect" + " as normal voice or query client and is optimized for performance.\n ")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] [assembly: System.Reflection.AssemblyProductAttribute("TSLib")] [assembly: System.Reflection.AssemblyTitleAttribute("TSLib")] [assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/Splamy/TS3AudioBot.git")] // 由 MSBuild WriteCodeFragment 类生成。 ================================================ FILE: TSLib/obj/Release/netstandard2.1/TSLib.AssemblyInfoInputs.cache ================================================ d05c9d59824d457289a7f8adc4d2a85d4364458f ================================================ FILE: TSLib/obj/Release/netstandard2.1/TSLib.GeneratedMSBuildEditorConfig.editorconfig ================================================ is_global = true build_property.RootNamespace = TSLib build_property.ProjectDir = G:\TS3DEV\TS3AudioBot-master\TSLib\ ================================================ FILE: TSLib/obj/Release/netstandard2.1/TSLib.csproj.CoreCompileInputs.cache ================================================ 5118785d175062d06e24b2dfada985f027f63aa7 ================================================ FILE: TSLib/obj/Release/netstandard2.1/TSLib.csproj.FileListAbsolute.txt ================================================ C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Release\netstandard2.1\TSLib.deps.json C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Release\netstandard2.1\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\bin\Release\netstandard2.1\TSLib.pdb C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.1\TSLib.csproj.AssemblyReference.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.1\TSLib.GeneratedMSBuildEditorConfig.editorconfig C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.1\TSLib.AssemblyInfoInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.1\TSLib.AssemblyInfo.cs C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.1\TSLib.csproj.CoreCompileInputs.cache C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.1\TSLib.dll C:\Users\13336\OneDrive\桌面\TS3DEV\TS3AudioBot-master\TSLib\obj\Release\netstandard2.1\TSLib.pdb ================================================ FILE: TSLib/obj/TSLib.csproj.nuget.dgspec.json ================================================ { "format": 1, "restore": { "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": {} }, "projects": { "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "version": "1.1.0", "restore": { "projectUniqueName": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "projectName": "Splamy.TSLib", "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "packagesPath": "C:\\Users\\Saopig\\.nuget\\packages\\", "outputPath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\", "projectStyle": "PackageReference", "crossTargeting": true, "configFilePaths": [ "C:\\Users\\Saopig\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1", "netstandard2.0", "netstandard2.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": {} }, "netstandard2.0": { "targetAlias": "netstandard2.0", "projectReferences": {} }, "netstandard2.1": { "targetAlias": "netstandard2.1", "projectReferences": {} } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" }, "netstandard2.0": { "targetAlias": "netstandard2.0", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NETStandard.Library": { "suppressParent": "All", "target": "Package", "version": "[2.0.3, )", "autoReferenced": true }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" }, "System.Memory": { "target": "Package", "version": "[4.5.4, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" }, "netstandard2.1": { "targetAlias": "netstandard2.1", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "NETStandard.Library": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" } } } } } ================================================ FILE: TSLib/obj/TSLib.csproj.nuget.g.props ================================================  True NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ C:\Users\Saopig\.nuget\packages\ PackageReference 5.11.4 $(MSBuildAllProjects);$(MSBuildThisFileFullPath) ================================================ FILE: TSLib/obj/TSLib.csproj.nuget.g.targets ================================================  $(MSBuildAllProjects);$(MSBuildThisFileFullPath) ================================================ FILE: TSLib/obj/project.assets.json ================================================ { "version": 3, "targets": { ".NETCoreApp,Version=v3.1": { "Heijden.Dns.Portable/2.0.19": { "type": "package", "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "compile": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} } }, "Microsoft.NETCore.Platforms/1.1.0": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "Newtonsoft.Json/12.0.3": { "type": "package", "compile": { "lib/netstandard2.0/Newtonsoft.Json.dll": {} }, "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": {} } }, "NLog/4.7.3": { "type": "package", "compile": { "lib/netstandard2.0/NLog.dll": {} }, "runtime": { "lib/netstandard2.0/NLog.dll": {} } }, "Nullable/1.2.1": { "type": "package", "contentFiles": { "contentFiles/cs/netstandard2.1/_._": { "buildAction": "None", "codeLanguage": "cs", "copyToOutput": false } } }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "compile": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": {} }, "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": {} } }, "runtime.native.System/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "compile": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} }, "runtime": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} } }, "System.Collections/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Globalization/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.IO/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.5/System.IO.dll": {} } }, "System.IO.FileSystem/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} } }, "System.IO.Pipelines/4.7.2": { "type": "package", "compile": { "ref/netcoreapp2.0/System.IO.Pipelines.dll": {} }, "runtime": { "lib/netcoreapp3.0/System.IO.Pipelines.dll": {} } }, "System.Linq/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" }, "compile": { "ref/netstandard1.6/_._": {} }, "runtime": { "lib/netstandard1.6/System.Linq.dll": {} } }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.NetworkInformation.dll": {} }, "runtimeTargets": { "runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "linux" }, "runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "osx" }, "runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Net.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Primitives.dll": {} } }, "System.Net.Sockets/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Sockets.dll": {} } }, "System.Reflection/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Reflection.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": {} } }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": {} } }, "System.Runtime/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "ref/netstandard1.5/System.Runtime.dll": {} } }, "System.Runtime.Extensions/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Runtime.Handles/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Runtime.Handles.dll": {} } }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netcoreapp1.1/_._": {} } }, "System.Security.Claims/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Security.Claims.dll": {} } }, "System.Security.Principal/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/System.Security.Principal.dll": {} } }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Text.Encoding/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Text.Encoding.dll": {} } }, "System.Threading/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.dll": {} } }, "System.Threading.Overlapped/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Threading.Tasks/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Threading.Tasks.dll": {} } }, "System.Threading.Thread/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.Thread.dll": {} } }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.ThreadPool.dll": {} } } }, ".NETStandard,Version=v2.0": { "Heijden.Dns.Portable/2.0.19": { "type": "package", "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "compile": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} } }, "Microsoft.NETCore.Platforms/1.1.0": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "NETStandard.Library/2.0.3": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} }, "build": { "build/netstandard2.0/NETStandard.Library.targets": {} } }, "Newtonsoft.Json/12.0.3": { "type": "package", "compile": { "lib/netstandard2.0/Newtonsoft.Json.dll": {} }, "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": {} } }, "NLog/4.7.3": { "type": "package", "compile": { "lib/netstandard2.0/NLog.dll": {} }, "runtime": { "lib/netstandard2.0/NLog.dll": {} } }, "Nullable/1.2.1": { "type": "package", "contentFiles": { "contentFiles/cs/netstandard2.0/Nullable/NullableAttributes.cs.pp": { "buildAction": "Compile", "codeLanguage": "cs", "copyToOutput": false, "ppOutputPath": "Nullable/NullableAttributes.cs" } } }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "compile": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": {} }, "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": {} } }, "runtime.native.System/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "dependencies": { "System.Memory": "4.5.0" }, "compile": { "lib/netstandard2.0/Chaos.NaCl.dll": {} }, "runtime": { "lib/netstandard2.0/Chaos.NaCl.dll": {} } }, "System.Buffers/4.5.1": { "type": "package", "compile": { "ref/netstandard2.0/System.Buffers.dll": {} }, "runtime": { "lib/netstandard2.0/System.Buffers.dll": {} } }, "System.Collections/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Globalization/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.IO/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.5/System.IO.dll": {} } }, "System.IO.FileSystem/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} } }, "System.IO.Pipelines/4.7.2": { "type": "package", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.4", "System.Threading.Tasks.Extensions": "4.5.4" }, "compile": { "lib/netstandard2.0/System.IO.Pipelines.dll": {} }, "runtime": { "lib/netstandard2.0/System.IO.Pipelines.dll": {} } }, "System.Linq/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" }, "compile": { "ref/netstandard1.6/_._": {} }, "runtime": { "lib/netstandard1.6/System.Linq.dll": {} } }, "System.Memory/4.5.4": { "type": "package", "dependencies": { "System.Buffers": "4.5.1", "System.Numerics.Vectors": "4.4.0", "System.Runtime.CompilerServices.Unsafe": "4.5.3" }, "compile": { "lib/netstandard2.0/System.Memory.dll": {} }, "runtime": { "lib/netstandard2.0/System.Memory.dll": {} } }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.NetworkInformation.dll": {} }, "runtimeTargets": { "runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "linux" }, "runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "osx" }, "runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Net.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Primitives.dll": {} } }, "System.Net.Sockets/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Sockets.dll": {} } }, "System.Numerics.Vectors/4.4.0": { "type": "package", "compile": { "ref/netstandard2.0/System.Numerics.Vectors.dll": {} }, "runtime": { "lib/netstandard2.0/System.Numerics.Vectors.dll": {} } }, "System.Reflection/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Reflection.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": {} } }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": {} } }, "System.Runtime/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "ref/netstandard1.5/System.Runtime.dll": {} } }, "System.Runtime.CompilerServices.Unsafe/4.5.3": { "type": "package", "compile": { "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": {} }, "runtime": { "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": {} } }, "System.Runtime.Extensions/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Runtime.Handles/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Runtime.Handles.dll": {} } }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Security.Claims/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Security.Claims.dll": {} } }, "System.Security.Principal/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/System.Security.Principal.dll": {} } }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Text.Encoding/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Text.Encoding.dll": {} } }, "System.Threading/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.dll": {} } }, "System.Threading.Overlapped/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Threading.Tasks/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Threading.Tasks.dll": {} } }, "System.Threading.Tasks.Extensions/4.5.4": { "type": "package", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "4.5.3" }, "compile": { "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll": {} }, "runtime": { "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll": {} } }, "System.Threading.Thread/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.Thread.dll": {} } }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.ThreadPool.dll": {} } } }, ".NETStandard,Version=v2.1": { "Heijden.Dns.Portable/2.0.19": { "type": "package", "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "compile": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} } }, "Microsoft.NETCore.Platforms/1.1.0": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "Newtonsoft.Json/12.0.3": { "type": "package", "compile": { "lib/netstandard2.0/Newtonsoft.Json.dll": {} }, "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": {} } }, "NLog/4.7.3": { "type": "package", "compile": { "lib/netstandard2.0/NLog.dll": {} }, "runtime": { "lib/netstandard2.0/NLog.dll": {} } }, "Nullable/1.2.1": { "type": "package", "contentFiles": { "contentFiles/cs/netstandard2.1/_._": { "buildAction": "None", "codeLanguage": "cs", "copyToOutput": false } } }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "compile": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": {} }, "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": {} } }, "runtime.native.System/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "dependencies": { "System.Memory": "4.5.0" }, "compile": { "lib/netstandard2.0/Chaos.NaCl.dll": {} }, "runtime": { "lib/netstandard2.0/Chaos.NaCl.dll": {} } }, "System.Buffers/4.5.1": { "type": "package", "compile": { "ref/netstandard2.0/System.Buffers.dll": {} }, "runtime": { "lib/netstandard2.0/System.Buffers.dll": {} } }, "System.Collections/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Globalization/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.IO/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.5/System.IO.dll": {} } }, "System.IO.FileSystem/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} } }, "System.IO.Pipelines/4.7.2": { "type": "package", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.4", "System.Threading.Tasks.Extensions": "4.5.4" }, "compile": { "lib/netstandard2.0/System.IO.Pipelines.dll": {} }, "runtime": { "lib/netstandard2.0/System.IO.Pipelines.dll": {} } }, "System.Linq/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" }, "compile": { "ref/netstandard1.6/_._": {} }, "runtime": { "lib/netstandard1.6/System.Linq.dll": {} } }, "System.Memory/4.5.4": { "type": "package", "dependencies": { "System.Buffers": "4.5.1", "System.Numerics.Vectors": "4.4.0", "System.Runtime.CompilerServices.Unsafe": "4.5.3" }, "compile": { "lib/netstandard2.0/System.Memory.dll": {} }, "runtime": { "lib/netstandard2.0/System.Memory.dll": {} } }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.NetworkInformation.dll": {} }, "runtimeTargets": { "runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "linux" }, "runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "osx" }, "runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Net.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Primitives.dll": {} } }, "System.Net.Sockets/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Sockets.dll": {} } }, "System.Numerics.Vectors/4.4.0": { "type": "package", "compile": { "ref/netstandard2.0/System.Numerics.Vectors.dll": {} }, "runtime": { "lib/netstandard2.0/System.Numerics.Vectors.dll": {} } }, "System.Reflection/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Reflection.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": {} } }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": {} } }, "System.Runtime/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "ref/netstandard1.5/System.Runtime.dll": {} } }, "System.Runtime.CompilerServices.Unsafe/4.5.3": { "type": "package", "compile": { "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": {} }, "runtime": { "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": {} } }, "System.Runtime.Extensions/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Runtime.Handles/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Runtime.Handles.dll": {} } }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Security.Claims/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Security.Claims.dll": {} } }, "System.Security.Principal/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/System.Security.Principal.dll": {} } }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Text.Encoding/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Text.Encoding.dll": {} } }, "System.Threading/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.dll": {} } }, "System.Threading.Overlapped/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Threading.Tasks/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Threading.Tasks.dll": {} } }, "System.Threading.Tasks.Extensions/4.5.4": { "type": "package", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "4.5.3" }, "compile": { "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll": {} }, "runtime": { "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll": {} } }, "System.Threading.Thread/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.Thread.dll": {} } }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.ThreadPool.dll": {} } } } }, "libraries": { "Heijden.Dns.Portable/2.0.19": { "sha512": "i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==", "type": "package", "path": "heijden.dns.portable/2.0.19", "files": [ ".nupkg.metadata", ".signature.p7s", "heijden.dns.portable.2.0.19.nupkg.sha512", "heijden.dns.portable.nuspec", "lib/netstandard1.3/Heijden.Dns.Portable.dll" ] }, "Microsoft.NETCore.Platforms/1.1.0": { "sha512": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", "type": "package", "path": "microsoft.netcore.platforms/1.1.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "microsoft.netcore.platforms.1.1.0.nupkg.sha512", "microsoft.netcore.platforms.nuspec", "runtime.json" ] }, "Microsoft.NETCore.Targets/1.1.0": { "sha512": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "type": "package", "path": "microsoft.netcore.targets/1.1.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "microsoft.netcore.targets.1.1.0.nupkg.sha512", "microsoft.netcore.targets.nuspec", "runtime.json" ] }, "Microsoft.Win32.Primitives/4.3.0": { "sha512": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "type": "package", "path": "microsoft.win32.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/Microsoft.Win32.Primitives.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "microsoft.win32.primitives.4.3.0.nupkg.sha512", "microsoft.win32.primitives.nuspec", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/Microsoft.Win32.Primitives.dll", "ref/netstandard1.3/Microsoft.Win32.Primitives.dll", "ref/netstandard1.3/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "NETStandard.Library/2.0.3": { "sha512": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", "type": "package", "path": "netstandard.library/2.0.3", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "build/netstandard2.0/NETStandard.Library.targets", "build/netstandard2.0/ref/Microsoft.Win32.Primitives.dll", "build/netstandard2.0/ref/System.AppContext.dll", "build/netstandard2.0/ref/System.Collections.Concurrent.dll", "build/netstandard2.0/ref/System.Collections.NonGeneric.dll", "build/netstandard2.0/ref/System.Collections.Specialized.dll", "build/netstandard2.0/ref/System.Collections.dll", "build/netstandard2.0/ref/System.ComponentModel.Composition.dll", "build/netstandard2.0/ref/System.ComponentModel.EventBasedAsync.dll", "build/netstandard2.0/ref/System.ComponentModel.Primitives.dll", "build/netstandard2.0/ref/System.ComponentModel.TypeConverter.dll", "build/netstandard2.0/ref/System.ComponentModel.dll", "build/netstandard2.0/ref/System.Console.dll", "build/netstandard2.0/ref/System.Core.dll", "build/netstandard2.0/ref/System.Data.Common.dll", "build/netstandard2.0/ref/System.Data.dll", "build/netstandard2.0/ref/System.Diagnostics.Contracts.dll", "build/netstandard2.0/ref/System.Diagnostics.Debug.dll", "build/netstandard2.0/ref/System.Diagnostics.FileVersionInfo.dll", "build/netstandard2.0/ref/System.Diagnostics.Process.dll", "build/netstandard2.0/ref/System.Diagnostics.StackTrace.dll", "build/netstandard2.0/ref/System.Diagnostics.TextWriterTraceListener.dll", "build/netstandard2.0/ref/System.Diagnostics.Tools.dll", "build/netstandard2.0/ref/System.Diagnostics.TraceSource.dll", "build/netstandard2.0/ref/System.Diagnostics.Tracing.dll", "build/netstandard2.0/ref/System.Drawing.Primitives.dll", "build/netstandard2.0/ref/System.Drawing.dll", "build/netstandard2.0/ref/System.Dynamic.Runtime.dll", "build/netstandard2.0/ref/System.Globalization.Calendars.dll", "build/netstandard2.0/ref/System.Globalization.Extensions.dll", "build/netstandard2.0/ref/System.Globalization.dll", "build/netstandard2.0/ref/System.IO.Compression.FileSystem.dll", "build/netstandard2.0/ref/System.IO.Compression.ZipFile.dll", "build/netstandard2.0/ref/System.IO.Compression.dll", "build/netstandard2.0/ref/System.IO.FileSystem.DriveInfo.dll", "build/netstandard2.0/ref/System.IO.FileSystem.Primitives.dll", "build/netstandard2.0/ref/System.IO.FileSystem.Watcher.dll", "build/netstandard2.0/ref/System.IO.FileSystem.dll", "build/netstandard2.0/ref/System.IO.IsolatedStorage.dll", "build/netstandard2.0/ref/System.IO.MemoryMappedFiles.dll", "build/netstandard2.0/ref/System.IO.Pipes.dll", "build/netstandard2.0/ref/System.IO.UnmanagedMemoryStream.dll", "build/netstandard2.0/ref/System.IO.dll", "build/netstandard2.0/ref/System.Linq.Expressions.dll", "build/netstandard2.0/ref/System.Linq.Parallel.dll", "build/netstandard2.0/ref/System.Linq.Queryable.dll", "build/netstandard2.0/ref/System.Linq.dll", "build/netstandard2.0/ref/System.Net.Http.dll", "build/netstandard2.0/ref/System.Net.NameResolution.dll", "build/netstandard2.0/ref/System.Net.NetworkInformation.dll", "build/netstandard2.0/ref/System.Net.Ping.dll", "build/netstandard2.0/ref/System.Net.Primitives.dll", "build/netstandard2.0/ref/System.Net.Requests.dll", "build/netstandard2.0/ref/System.Net.Security.dll", "build/netstandard2.0/ref/System.Net.Sockets.dll", "build/netstandard2.0/ref/System.Net.WebHeaderCollection.dll", "build/netstandard2.0/ref/System.Net.WebSockets.Client.dll", "build/netstandard2.0/ref/System.Net.WebSockets.dll", "build/netstandard2.0/ref/System.Net.dll", "build/netstandard2.0/ref/System.Numerics.dll", "build/netstandard2.0/ref/System.ObjectModel.dll", "build/netstandard2.0/ref/System.Reflection.Extensions.dll", "build/netstandard2.0/ref/System.Reflection.Primitives.dll", "build/netstandard2.0/ref/System.Reflection.dll", "build/netstandard2.0/ref/System.Resources.Reader.dll", "build/netstandard2.0/ref/System.Resources.ResourceManager.dll", "build/netstandard2.0/ref/System.Resources.Writer.dll", "build/netstandard2.0/ref/System.Runtime.CompilerServices.VisualC.dll", "build/netstandard2.0/ref/System.Runtime.Extensions.dll", "build/netstandard2.0/ref/System.Runtime.Handles.dll", "build/netstandard2.0/ref/System.Runtime.InteropServices.RuntimeInformation.dll", "build/netstandard2.0/ref/System.Runtime.InteropServices.dll", "build/netstandard2.0/ref/System.Runtime.Numerics.dll", "build/netstandard2.0/ref/System.Runtime.Serialization.Formatters.dll", "build/netstandard2.0/ref/System.Runtime.Serialization.Json.dll", "build/netstandard2.0/ref/System.Runtime.Serialization.Primitives.dll", "build/netstandard2.0/ref/System.Runtime.Serialization.Xml.dll", "build/netstandard2.0/ref/System.Runtime.Serialization.dll", "build/netstandard2.0/ref/System.Runtime.dll", "build/netstandard2.0/ref/System.Security.Claims.dll", "build/netstandard2.0/ref/System.Security.Cryptography.Algorithms.dll", "build/netstandard2.0/ref/System.Security.Cryptography.Csp.dll", "build/netstandard2.0/ref/System.Security.Cryptography.Encoding.dll", "build/netstandard2.0/ref/System.Security.Cryptography.Primitives.dll", "build/netstandard2.0/ref/System.Security.Cryptography.X509Certificates.dll", "build/netstandard2.0/ref/System.Security.Principal.dll", "build/netstandard2.0/ref/System.Security.SecureString.dll", "build/netstandard2.0/ref/System.ServiceModel.Web.dll", "build/netstandard2.0/ref/System.Text.Encoding.Extensions.dll", "build/netstandard2.0/ref/System.Text.Encoding.dll", "build/netstandard2.0/ref/System.Text.RegularExpressions.dll", "build/netstandard2.0/ref/System.Threading.Overlapped.dll", "build/netstandard2.0/ref/System.Threading.Tasks.Parallel.dll", "build/netstandard2.0/ref/System.Threading.Tasks.dll", "build/netstandard2.0/ref/System.Threading.Thread.dll", "build/netstandard2.0/ref/System.Threading.ThreadPool.dll", "build/netstandard2.0/ref/System.Threading.Timer.dll", "build/netstandard2.0/ref/System.Threading.dll", "build/netstandard2.0/ref/System.Transactions.dll", "build/netstandard2.0/ref/System.ValueTuple.dll", "build/netstandard2.0/ref/System.Web.dll", "build/netstandard2.0/ref/System.Windows.dll", "build/netstandard2.0/ref/System.Xml.Linq.dll", "build/netstandard2.0/ref/System.Xml.ReaderWriter.dll", "build/netstandard2.0/ref/System.Xml.Serialization.dll", "build/netstandard2.0/ref/System.Xml.XDocument.dll", "build/netstandard2.0/ref/System.Xml.XPath.XDocument.dll", "build/netstandard2.0/ref/System.Xml.XPath.dll", "build/netstandard2.0/ref/System.Xml.XmlDocument.dll", "build/netstandard2.0/ref/System.Xml.XmlSerializer.dll", "build/netstandard2.0/ref/System.Xml.dll", "build/netstandard2.0/ref/System.dll", "build/netstandard2.0/ref/mscorlib.dll", "build/netstandard2.0/ref/netstandard.dll", "build/netstandard2.0/ref/netstandard.xml", "lib/netstandard1.0/_._", "netstandard.library.2.0.3.nupkg.sha512", "netstandard.library.nuspec" ] }, "Newtonsoft.Json/12.0.3": { "sha512": "6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==", "type": "package", "path": "newtonsoft.json/12.0.3", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.md", "lib/net20/Newtonsoft.Json.dll", "lib/net20/Newtonsoft.Json.xml", "lib/net35/Newtonsoft.Json.dll", "lib/net35/Newtonsoft.Json.xml", "lib/net40/Newtonsoft.Json.dll", "lib/net40/Newtonsoft.Json.xml", "lib/net45/Newtonsoft.Json.dll", "lib/net45/Newtonsoft.Json.xml", "lib/netstandard1.0/Newtonsoft.Json.dll", "lib/netstandard1.0/Newtonsoft.Json.xml", "lib/netstandard1.3/Newtonsoft.Json.dll", "lib/netstandard1.3/Newtonsoft.Json.xml", "lib/netstandard2.0/Newtonsoft.Json.dll", "lib/netstandard2.0/Newtonsoft.Json.xml", "lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.dll", "lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.xml", "lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.dll", "lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.xml", "newtonsoft.json.12.0.3.nupkg.sha512", "newtonsoft.json.nuspec", "packageIcon.png" ] }, "NLog/4.7.3": { "sha512": "3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==", "type": "package", "path": "nlog/4.7.3", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/monoandroid44/NLog.dll", "lib/monoandroid44/NLog.xml", "lib/net35/NLog.dll", "lib/net35/NLog.xml", "lib/net40-client/NLog.dll", "lib/net40-client/NLog.xml", "lib/net45/NLog.dll", "lib/net45/NLog.xml", "lib/netstandard1.3/NLog.dll", "lib/netstandard1.3/NLog.xml", "lib/netstandard1.5/NLog.dll", "lib/netstandard1.5/NLog.xml", "lib/netstandard2.0/NLog.dll", "lib/netstandard2.0/NLog.xml", "lib/sl4/NLog.dll", "lib/sl4/NLog.xml", "lib/sl5/NLog.dll", "lib/sl5/NLog.xml", "lib/wp8/NLog.dll", "lib/wp8/NLog.xml", "lib/xamarinios10/NLog.dll", "lib/xamarinios10/NLog.xml", "nlog.4.7.3.nupkg.sha512", "nlog.nuspec" ] }, "Nullable/1.2.1": { "sha512": "rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==", "type": "package", "path": "nullable/1.2.1", "files": [ ".nupkg.metadata", ".signature.p7s", "content/net20/Nullable/NullableAttributes.cs.pp", "content/net40/Nullable/NullableAttributes.cs.pp", "content/netstandard1.0/Nullable/NullableAttributes.cs.pp", "content/netstandard2.0/Nullable/NullableAttributes.cs.pp", "content/netstandard2.1/_._", "contentFiles/cs/net20/Nullable/NullableAttributes.cs.pp", "contentFiles/cs/net40/Nullable/NullableAttributes.cs.pp", "contentFiles/cs/netstandard1.0/Nullable/NullableAttributes.cs.pp", "contentFiles/cs/netstandard2.0/Nullable/NullableAttributes.cs.pp", "contentFiles/cs/netstandard2.1/_._", "icon.png", "nullable.1.2.1.nupkg.sha512", "nullable.nuspec" ] }, "Portable.BouncyCastle/1.8.6.7": { "sha512": "RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==", "type": "package", "path": "portable.bouncycastle/1.8.6.7", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net40/BouncyCastle.Crypto.dll", "lib/net40/BouncyCastle.Crypto.xml", "lib/netstandard2.0/BouncyCastle.Crypto.dll", "lib/netstandard2.0/BouncyCastle.Crypto.xml", "portable.bouncycastle.1.8.6.7.nupkg.sha512", "portable.bouncycastle.nuspec" ] }, "runtime.native.System/4.3.0": { "sha512": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", "type": "package", "path": "runtime.native.system/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "runtime.native.system.4.3.0.nupkg.sha512", "runtime.native.system.nuspec" ] }, "Splamy.Ed25519.Toolkit/1.0.3": { "sha512": "Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==", "type": "package", "path": "splamy.ed25519.toolkit/1.0.3", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net46/Chaos.NaCl.dll", "lib/netcoreapp2.0/Chaos.NaCl.dll", "lib/netcoreapp2.1/Chaos.NaCl.dll", "lib/netstandard1.1/Chaos.NaCl.dll", "lib/netstandard2.0/Chaos.NaCl.dll", "splamy.ed25519.toolkit.1.0.3.nupkg.sha512", "splamy.ed25519.toolkit.nuspec" ] }, "System.Buffers/4.5.1": { "sha512": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==", "type": "package", "path": "system.buffers/4.5.1", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net461/System.Buffers.dll", "lib/net461/System.Buffers.xml", "lib/netcoreapp2.0/_._", "lib/netstandard1.1/System.Buffers.dll", "lib/netstandard1.1/System.Buffers.xml", "lib/netstandard2.0/System.Buffers.dll", "lib/netstandard2.0/System.Buffers.xml", "lib/uap10.0.16299/_._", "ref/net45/System.Buffers.dll", "ref/net45/System.Buffers.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.1/System.Buffers.dll", "ref/netstandard1.1/System.Buffers.xml", "ref/netstandard2.0/System.Buffers.dll", "ref/netstandard2.0/System.Buffers.xml", "ref/uap10.0.16299/_._", "system.buffers.4.5.1.nupkg.sha512", "system.buffers.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Collections/4.3.0": { "sha512": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "type": "package", "path": "system.collections/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Collections.dll", "ref/netcore50/System.Collections.xml", "ref/netcore50/de/System.Collections.xml", "ref/netcore50/es/System.Collections.xml", "ref/netcore50/fr/System.Collections.xml", "ref/netcore50/it/System.Collections.xml", "ref/netcore50/ja/System.Collections.xml", "ref/netcore50/ko/System.Collections.xml", "ref/netcore50/ru/System.Collections.xml", "ref/netcore50/zh-hans/System.Collections.xml", "ref/netcore50/zh-hant/System.Collections.xml", "ref/netstandard1.0/System.Collections.dll", "ref/netstandard1.0/System.Collections.xml", "ref/netstandard1.0/de/System.Collections.xml", "ref/netstandard1.0/es/System.Collections.xml", "ref/netstandard1.0/fr/System.Collections.xml", "ref/netstandard1.0/it/System.Collections.xml", "ref/netstandard1.0/ja/System.Collections.xml", "ref/netstandard1.0/ko/System.Collections.xml", "ref/netstandard1.0/ru/System.Collections.xml", "ref/netstandard1.0/zh-hans/System.Collections.xml", "ref/netstandard1.0/zh-hant/System.Collections.xml", "ref/netstandard1.3/System.Collections.dll", "ref/netstandard1.3/System.Collections.xml", "ref/netstandard1.3/de/System.Collections.xml", "ref/netstandard1.3/es/System.Collections.xml", "ref/netstandard1.3/fr/System.Collections.xml", "ref/netstandard1.3/it/System.Collections.xml", "ref/netstandard1.3/ja/System.Collections.xml", "ref/netstandard1.3/ko/System.Collections.xml", "ref/netstandard1.3/ru/System.Collections.xml", "ref/netstandard1.3/zh-hans/System.Collections.xml", "ref/netstandard1.3/zh-hant/System.Collections.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.collections.4.3.0.nupkg.sha512", "system.collections.nuspec" ] }, "System.Diagnostics.Debug/4.3.0": { "sha512": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "type": "package", "path": "system.diagnostics.debug/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Diagnostics.Debug.dll", "ref/netcore50/System.Diagnostics.Debug.xml", "ref/netcore50/de/System.Diagnostics.Debug.xml", "ref/netcore50/es/System.Diagnostics.Debug.xml", "ref/netcore50/fr/System.Diagnostics.Debug.xml", "ref/netcore50/it/System.Diagnostics.Debug.xml", "ref/netcore50/ja/System.Diagnostics.Debug.xml", "ref/netcore50/ko/System.Diagnostics.Debug.xml", "ref/netcore50/ru/System.Diagnostics.Debug.xml", "ref/netcore50/zh-hans/System.Diagnostics.Debug.xml", "ref/netcore50/zh-hant/System.Diagnostics.Debug.xml", "ref/netstandard1.0/System.Diagnostics.Debug.dll", "ref/netstandard1.0/System.Diagnostics.Debug.xml", "ref/netstandard1.0/de/System.Diagnostics.Debug.xml", "ref/netstandard1.0/es/System.Diagnostics.Debug.xml", "ref/netstandard1.0/fr/System.Diagnostics.Debug.xml", "ref/netstandard1.0/it/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ja/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ko/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ru/System.Diagnostics.Debug.xml", "ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml", "ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml", "ref/netstandard1.3/System.Diagnostics.Debug.dll", "ref/netstandard1.3/System.Diagnostics.Debug.xml", "ref/netstandard1.3/de/System.Diagnostics.Debug.xml", "ref/netstandard1.3/es/System.Diagnostics.Debug.xml", "ref/netstandard1.3/fr/System.Diagnostics.Debug.xml", "ref/netstandard1.3/it/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ja/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ko/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ru/System.Diagnostics.Debug.xml", "ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml", "ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.diagnostics.debug.4.3.0.nupkg.sha512", "system.diagnostics.debug.nuspec" ] }, "System.Diagnostics.Tracing/4.3.0": { "sha512": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "type": "package", "path": "system.diagnostics.tracing/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Diagnostics.Tracing.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Diagnostics.Tracing.dll", "ref/netcore50/System.Diagnostics.Tracing.dll", "ref/netcore50/System.Diagnostics.Tracing.xml", "ref/netcore50/de/System.Diagnostics.Tracing.xml", "ref/netcore50/es/System.Diagnostics.Tracing.xml", "ref/netcore50/fr/System.Diagnostics.Tracing.xml", "ref/netcore50/it/System.Diagnostics.Tracing.xml", "ref/netcore50/ja/System.Diagnostics.Tracing.xml", "ref/netcore50/ko/System.Diagnostics.Tracing.xml", "ref/netcore50/ru/System.Diagnostics.Tracing.xml", "ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml", "ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/System.Diagnostics.Tracing.dll", "ref/netstandard1.1/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/System.Diagnostics.Tracing.dll", "ref/netstandard1.2/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/System.Diagnostics.Tracing.dll", "ref/netstandard1.3/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/System.Diagnostics.Tracing.dll", "ref/netstandard1.5/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.diagnostics.tracing.4.3.0.nupkg.sha512", "system.diagnostics.tracing.nuspec" ] }, "System.Globalization/4.3.0": { "sha512": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "type": "package", "path": "system.globalization/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Globalization.dll", "ref/netcore50/System.Globalization.xml", "ref/netcore50/de/System.Globalization.xml", "ref/netcore50/es/System.Globalization.xml", "ref/netcore50/fr/System.Globalization.xml", "ref/netcore50/it/System.Globalization.xml", "ref/netcore50/ja/System.Globalization.xml", "ref/netcore50/ko/System.Globalization.xml", "ref/netcore50/ru/System.Globalization.xml", "ref/netcore50/zh-hans/System.Globalization.xml", "ref/netcore50/zh-hant/System.Globalization.xml", "ref/netstandard1.0/System.Globalization.dll", "ref/netstandard1.0/System.Globalization.xml", "ref/netstandard1.0/de/System.Globalization.xml", "ref/netstandard1.0/es/System.Globalization.xml", "ref/netstandard1.0/fr/System.Globalization.xml", "ref/netstandard1.0/it/System.Globalization.xml", "ref/netstandard1.0/ja/System.Globalization.xml", "ref/netstandard1.0/ko/System.Globalization.xml", "ref/netstandard1.0/ru/System.Globalization.xml", "ref/netstandard1.0/zh-hans/System.Globalization.xml", "ref/netstandard1.0/zh-hant/System.Globalization.xml", "ref/netstandard1.3/System.Globalization.dll", "ref/netstandard1.3/System.Globalization.xml", "ref/netstandard1.3/de/System.Globalization.xml", "ref/netstandard1.3/es/System.Globalization.xml", "ref/netstandard1.3/fr/System.Globalization.xml", "ref/netstandard1.3/it/System.Globalization.xml", "ref/netstandard1.3/ja/System.Globalization.xml", "ref/netstandard1.3/ko/System.Globalization.xml", "ref/netstandard1.3/ru/System.Globalization.xml", "ref/netstandard1.3/zh-hans/System.Globalization.xml", "ref/netstandard1.3/zh-hant/System.Globalization.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.globalization.4.3.0.nupkg.sha512", "system.globalization.nuspec" ] }, "System.IO/4.3.0": { "sha512": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "type": "package", "path": "system.io/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.IO.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.IO.dll", "ref/netcore50/System.IO.dll", "ref/netcore50/System.IO.xml", "ref/netcore50/de/System.IO.xml", "ref/netcore50/es/System.IO.xml", "ref/netcore50/fr/System.IO.xml", "ref/netcore50/it/System.IO.xml", "ref/netcore50/ja/System.IO.xml", "ref/netcore50/ko/System.IO.xml", "ref/netcore50/ru/System.IO.xml", "ref/netcore50/zh-hans/System.IO.xml", "ref/netcore50/zh-hant/System.IO.xml", "ref/netstandard1.0/System.IO.dll", "ref/netstandard1.0/System.IO.xml", "ref/netstandard1.0/de/System.IO.xml", "ref/netstandard1.0/es/System.IO.xml", "ref/netstandard1.0/fr/System.IO.xml", "ref/netstandard1.0/it/System.IO.xml", "ref/netstandard1.0/ja/System.IO.xml", "ref/netstandard1.0/ko/System.IO.xml", "ref/netstandard1.0/ru/System.IO.xml", "ref/netstandard1.0/zh-hans/System.IO.xml", "ref/netstandard1.0/zh-hant/System.IO.xml", "ref/netstandard1.3/System.IO.dll", "ref/netstandard1.3/System.IO.xml", "ref/netstandard1.3/de/System.IO.xml", "ref/netstandard1.3/es/System.IO.xml", "ref/netstandard1.3/fr/System.IO.xml", "ref/netstandard1.3/it/System.IO.xml", "ref/netstandard1.3/ja/System.IO.xml", "ref/netstandard1.3/ko/System.IO.xml", "ref/netstandard1.3/ru/System.IO.xml", "ref/netstandard1.3/zh-hans/System.IO.xml", "ref/netstandard1.3/zh-hant/System.IO.xml", "ref/netstandard1.5/System.IO.dll", "ref/netstandard1.5/System.IO.xml", "ref/netstandard1.5/de/System.IO.xml", "ref/netstandard1.5/es/System.IO.xml", "ref/netstandard1.5/fr/System.IO.xml", "ref/netstandard1.5/it/System.IO.xml", "ref/netstandard1.5/ja/System.IO.xml", "ref/netstandard1.5/ko/System.IO.xml", "ref/netstandard1.5/ru/System.IO.xml", "ref/netstandard1.5/zh-hans/System.IO.xml", "ref/netstandard1.5/zh-hant/System.IO.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.4.3.0.nupkg.sha512", "system.io.nuspec" ] }, "System.IO.FileSystem/4.3.0": { "sha512": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "type": "package", "path": "system.io.filesystem/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.IO.FileSystem.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.IO.FileSystem.dll", "ref/netstandard1.3/System.IO.FileSystem.dll", "ref/netstandard1.3/System.IO.FileSystem.xml", "ref/netstandard1.3/de/System.IO.FileSystem.xml", "ref/netstandard1.3/es/System.IO.FileSystem.xml", "ref/netstandard1.3/fr/System.IO.FileSystem.xml", "ref/netstandard1.3/it/System.IO.FileSystem.xml", "ref/netstandard1.3/ja/System.IO.FileSystem.xml", "ref/netstandard1.3/ko/System.IO.FileSystem.xml", "ref/netstandard1.3/ru/System.IO.FileSystem.xml", "ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml", "ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.filesystem.4.3.0.nupkg.sha512", "system.io.filesystem.nuspec" ] }, "System.IO.FileSystem.Primitives/4.3.0": { "sha512": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "type": "package", "path": "system.io.filesystem.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.IO.FileSystem.Primitives.dll", "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.IO.FileSystem.Primitives.dll", "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll", "ref/netstandard1.3/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.filesystem.primitives.4.3.0.nupkg.sha512", "system.io.filesystem.primitives.nuspec" ] }, "System.IO.Pipelines/4.7.2": { "sha512": "rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==", "type": "package", "path": "system.io.pipelines/4.7.2", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net461/System.IO.Pipelines.dll", "lib/net461/System.IO.Pipelines.xml", "lib/netcoreapp3.0/System.IO.Pipelines.dll", "lib/netcoreapp3.0/System.IO.Pipelines.xml", "lib/netstandard1.3/System.IO.Pipelines.dll", "lib/netstandard1.3/System.IO.Pipelines.xml", "lib/netstandard2.0/System.IO.Pipelines.dll", "lib/netstandard2.0/System.IO.Pipelines.xml", "ref/net461/System.IO.Pipelines.dll", "ref/net461/System.IO.Pipelines.xml", "ref/netcoreapp2.0/System.IO.Pipelines.dll", "ref/netcoreapp2.0/System.IO.Pipelines.xml", "system.io.pipelines.4.7.2.nupkg.sha512", "system.io.pipelines.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Linq/4.3.0": { "sha512": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "type": "package", "path": "system.linq/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net463/System.Linq.dll", "lib/netcore50/System.Linq.dll", "lib/netstandard1.6/System.Linq.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net463/System.Linq.dll", "ref/netcore50/System.Linq.dll", "ref/netcore50/System.Linq.xml", "ref/netcore50/de/System.Linq.xml", "ref/netcore50/es/System.Linq.xml", "ref/netcore50/fr/System.Linq.xml", "ref/netcore50/it/System.Linq.xml", "ref/netcore50/ja/System.Linq.xml", "ref/netcore50/ko/System.Linq.xml", "ref/netcore50/ru/System.Linq.xml", "ref/netcore50/zh-hans/System.Linq.xml", "ref/netcore50/zh-hant/System.Linq.xml", "ref/netstandard1.0/System.Linq.dll", "ref/netstandard1.0/System.Linq.xml", "ref/netstandard1.0/de/System.Linq.xml", "ref/netstandard1.0/es/System.Linq.xml", "ref/netstandard1.0/fr/System.Linq.xml", "ref/netstandard1.0/it/System.Linq.xml", "ref/netstandard1.0/ja/System.Linq.xml", "ref/netstandard1.0/ko/System.Linq.xml", "ref/netstandard1.0/ru/System.Linq.xml", "ref/netstandard1.0/zh-hans/System.Linq.xml", "ref/netstandard1.0/zh-hant/System.Linq.xml", "ref/netstandard1.6/System.Linq.dll", "ref/netstandard1.6/System.Linq.xml", "ref/netstandard1.6/de/System.Linq.xml", "ref/netstandard1.6/es/System.Linq.xml", "ref/netstandard1.6/fr/System.Linq.xml", "ref/netstandard1.6/it/System.Linq.xml", "ref/netstandard1.6/ja/System.Linq.xml", "ref/netstandard1.6/ko/System.Linq.xml", "ref/netstandard1.6/ru/System.Linq.xml", "ref/netstandard1.6/zh-hans/System.Linq.xml", "ref/netstandard1.6/zh-hant/System.Linq.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.linq.4.3.0.nupkg.sha512", "system.linq.nuspec" ] }, "System.Memory/4.5.4": { "sha512": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", "type": "package", "path": "system.memory/4.5.4", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net461/System.Memory.dll", "lib/net461/System.Memory.xml", "lib/netcoreapp2.1/_._", "lib/netstandard1.1/System.Memory.dll", "lib/netstandard1.1/System.Memory.xml", "lib/netstandard2.0/System.Memory.dll", "lib/netstandard2.0/System.Memory.xml", "ref/netcoreapp2.1/_._", "system.memory.4.5.4.nupkg.sha512", "system.memory.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Net.NetworkInformation/4.3.0": { "sha512": "zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==", "type": "package", "path": "system.net.networkinformation/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net46/System.Net.NetworkInformation.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net46/System.Net.NetworkInformation.dll", "ref/netcore50/System.Net.NetworkInformation.dll", "ref/netcore50/System.Net.NetworkInformation.xml", "ref/netcore50/de/System.Net.NetworkInformation.xml", "ref/netcore50/es/System.Net.NetworkInformation.xml", "ref/netcore50/fr/System.Net.NetworkInformation.xml", "ref/netcore50/it/System.Net.NetworkInformation.xml", "ref/netcore50/ja/System.Net.NetworkInformation.xml", "ref/netcore50/ko/System.Net.NetworkInformation.xml", "ref/netcore50/ru/System.Net.NetworkInformation.xml", "ref/netcore50/zh-hans/System.Net.NetworkInformation.xml", "ref/netcore50/zh-hant/System.Net.NetworkInformation.xml", "ref/netstandard1.0/System.Net.NetworkInformation.dll", "ref/netstandard1.0/System.Net.NetworkInformation.xml", "ref/netstandard1.0/de/System.Net.NetworkInformation.xml", "ref/netstandard1.0/es/System.Net.NetworkInformation.xml", "ref/netstandard1.0/fr/System.Net.NetworkInformation.xml", "ref/netstandard1.0/it/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ja/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ko/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ru/System.Net.NetworkInformation.xml", "ref/netstandard1.0/zh-hans/System.Net.NetworkInformation.xml", "ref/netstandard1.0/zh-hant/System.Net.NetworkInformation.xml", "ref/netstandard1.3/System.Net.NetworkInformation.dll", "ref/netstandard1.3/System.Net.NetworkInformation.xml", "ref/netstandard1.3/de/System.Net.NetworkInformation.xml", "ref/netstandard1.3/es/System.Net.NetworkInformation.xml", "ref/netstandard1.3/fr/System.Net.NetworkInformation.xml", "ref/netstandard1.3/it/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ja/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ko/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ru/System.Net.NetworkInformation.xml", "ref/netstandard1.3/zh-hans/System.Net.NetworkInformation.xml", "ref/netstandard1.3/zh-hant/System.Net.NetworkInformation.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll", "runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll", "runtimes/win/lib/net46/System.Net.NetworkInformation.dll", "runtimes/win/lib/netcore50/System.Net.NetworkInformation.dll", "runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll", "system.net.networkinformation.4.3.0.nupkg.sha512", "system.net.networkinformation.nuspec" ] }, "System.Net.Primitives/4.3.0": { "sha512": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "type": "package", "path": "system.net.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Net.Primitives.dll", "ref/netcore50/System.Net.Primitives.xml", "ref/netcore50/de/System.Net.Primitives.xml", "ref/netcore50/es/System.Net.Primitives.xml", "ref/netcore50/fr/System.Net.Primitives.xml", "ref/netcore50/it/System.Net.Primitives.xml", "ref/netcore50/ja/System.Net.Primitives.xml", "ref/netcore50/ko/System.Net.Primitives.xml", "ref/netcore50/ru/System.Net.Primitives.xml", "ref/netcore50/zh-hans/System.Net.Primitives.xml", "ref/netcore50/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.0/System.Net.Primitives.dll", "ref/netstandard1.0/System.Net.Primitives.xml", "ref/netstandard1.0/de/System.Net.Primitives.xml", "ref/netstandard1.0/es/System.Net.Primitives.xml", "ref/netstandard1.0/fr/System.Net.Primitives.xml", "ref/netstandard1.0/it/System.Net.Primitives.xml", "ref/netstandard1.0/ja/System.Net.Primitives.xml", "ref/netstandard1.0/ko/System.Net.Primitives.xml", "ref/netstandard1.0/ru/System.Net.Primitives.xml", "ref/netstandard1.0/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.0/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.1/System.Net.Primitives.dll", "ref/netstandard1.1/System.Net.Primitives.xml", "ref/netstandard1.1/de/System.Net.Primitives.xml", "ref/netstandard1.1/es/System.Net.Primitives.xml", "ref/netstandard1.1/fr/System.Net.Primitives.xml", "ref/netstandard1.1/it/System.Net.Primitives.xml", "ref/netstandard1.1/ja/System.Net.Primitives.xml", "ref/netstandard1.1/ko/System.Net.Primitives.xml", "ref/netstandard1.1/ru/System.Net.Primitives.xml", "ref/netstandard1.1/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.1/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.3/System.Net.Primitives.dll", "ref/netstandard1.3/System.Net.Primitives.xml", "ref/netstandard1.3/de/System.Net.Primitives.xml", "ref/netstandard1.3/es/System.Net.Primitives.xml", "ref/netstandard1.3/fr/System.Net.Primitives.xml", "ref/netstandard1.3/it/System.Net.Primitives.xml", "ref/netstandard1.3/ja/System.Net.Primitives.xml", "ref/netstandard1.3/ko/System.Net.Primitives.xml", "ref/netstandard1.3/ru/System.Net.Primitives.xml", "ref/netstandard1.3/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.3/zh-hant/System.Net.Primitives.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.net.primitives.4.3.0.nupkg.sha512", "system.net.primitives.nuspec" ] }, "System.Net.Sockets/4.3.0": { "sha512": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "type": "package", "path": "system.net.sockets/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Net.Sockets.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Net.Sockets.dll", "ref/netstandard1.3/System.Net.Sockets.dll", "ref/netstandard1.3/System.Net.Sockets.xml", "ref/netstandard1.3/de/System.Net.Sockets.xml", "ref/netstandard1.3/es/System.Net.Sockets.xml", "ref/netstandard1.3/fr/System.Net.Sockets.xml", "ref/netstandard1.3/it/System.Net.Sockets.xml", "ref/netstandard1.3/ja/System.Net.Sockets.xml", "ref/netstandard1.3/ko/System.Net.Sockets.xml", "ref/netstandard1.3/ru/System.Net.Sockets.xml", "ref/netstandard1.3/zh-hans/System.Net.Sockets.xml", "ref/netstandard1.3/zh-hant/System.Net.Sockets.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.net.sockets.4.3.0.nupkg.sha512", "system.net.sockets.nuspec" ] }, "System.Numerics.Vectors/4.4.0": { "sha512": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==", "type": "package", "path": "system.numerics.vectors/4.4.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Numerics.Vectors.dll", "lib/net46/System.Numerics.Vectors.xml", "lib/netcoreapp2.0/_._", "lib/netstandard1.0/System.Numerics.Vectors.dll", "lib/netstandard1.0/System.Numerics.Vectors.xml", "lib/netstandard2.0/System.Numerics.Vectors.dll", "lib/netstandard2.0/System.Numerics.Vectors.xml", "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.dll", "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.xml", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Numerics.Vectors.dll", "ref/net46/System.Numerics.Vectors.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.0/System.Numerics.Vectors.dll", "ref/netstandard1.0/System.Numerics.Vectors.xml", "ref/netstandard2.0/System.Numerics.Vectors.dll", "ref/netstandard2.0/System.Numerics.Vectors.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.numerics.vectors.4.4.0.nupkg.sha512", "system.numerics.vectors.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Reflection/4.3.0": { "sha512": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "type": "package", "path": "system.reflection/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Reflection.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Reflection.dll", "ref/netcore50/System.Reflection.dll", "ref/netcore50/System.Reflection.xml", "ref/netcore50/de/System.Reflection.xml", "ref/netcore50/es/System.Reflection.xml", "ref/netcore50/fr/System.Reflection.xml", "ref/netcore50/it/System.Reflection.xml", "ref/netcore50/ja/System.Reflection.xml", "ref/netcore50/ko/System.Reflection.xml", "ref/netcore50/ru/System.Reflection.xml", "ref/netcore50/zh-hans/System.Reflection.xml", "ref/netcore50/zh-hant/System.Reflection.xml", "ref/netstandard1.0/System.Reflection.dll", "ref/netstandard1.0/System.Reflection.xml", "ref/netstandard1.0/de/System.Reflection.xml", "ref/netstandard1.0/es/System.Reflection.xml", "ref/netstandard1.0/fr/System.Reflection.xml", "ref/netstandard1.0/it/System.Reflection.xml", "ref/netstandard1.0/ja/System.Reflection.xml", "ref/netstandard1.0/ko/System.Reflection.xml", "ref/netstandard1.0/ru/System.Reflection.xml", "ref/netstandard1.0/zh-hans/System.Reflection.xml", "ref/netstandard1.0/zh-hant/System.Reflection.xml", "ref/netstandard1.3/System.Reflection.dll", "ref/netstandard1.3/System.Reflection.xml", "ref/netstandard1.3/de/System.Reflection.xml", "ref/netstandard1.3/es/System.Reflection.xml", "ref/netstandard1.3/fr/System.Reflection.xml", "ref/netstandard1.3/it/System.Reflection.xml", "ref/netstandard1.3/ja/System.Reflection.xml", "ref/netstandard1.3/ko/System.Reflection.xml", "ref/netstandard1.3/ru/System.Reflection.xml", "ref/netstandard1.3/zh-hans/System.Reflection.xml", "ref/netstandard1.3/zh-hant/System.Reflection.xml", "ref/netstandard1.5/System.Reflection.dll", "ref/netstandard1.5/System.Reflection.xml", "ref/netstandard1.5/de/System.Reflection.xml", "ref/netstandard1.5/es/System.Reflection.xml", "ref/netstandard1.5/fr/System.Reflection.xml", "ref/netstandard1.5/it/System.Reflection.xml", "ref/netstandard1.5/ja/System.Reflection.xml", "ref/netstandard1.5/ko/System.Reflection.xml", "ref/netstandard1.5/ru/System.Reflection.xml", "ref/netstandard1.5/zh-hans/System.Reflection.xml", "ref/netstandard1.5/zh-hant/System.Reflection.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.reflection.4.3.0.nupkg.sha512", "system.reflection.nuspec" ] }, "System.Reflection.Primitives/4.3.0": { "sha512": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "type": "package", "path": "system.reflection.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Reflection.Primitives.dll", "ref/netcore50/System.Reflection.Primitives.xml", "ref/netcore50/de/System.Reflection.Primitives.xml", "ref/netcore50/es/System.Reflection.Primitives.xml", "ref/netcore50/fr/System.Reflection.Primitives.xml", "ref/netcore50/it/System.Reflection.Primitives.xml", "ref/netcore50/ja/System.Reflection.Primitives.xml", "ref/netcore50/ko/System.Reflection.Primitives.xml", "ref/netcore50/ru/System.Reflection.Primitives.xml", "ref/netcore50/zh-hans/System.Reflection.Primitives.xml", "ref/netcore50/zh-hant/System.Reflection.Primitives.xml", "ref/netstandard1.0/System.Reflection.Primitives.dll", "ref/netstandard1.0/System.Reflection.Primitives.xml", "ref/netstandard1.0/de/System.Reflection.Primitives.xml", "ref/netstandard1.0/es/System.Reflection.Primitives.xml", "ref/netstandard1.0/fr/System.Reflection.Primitives.xml", "ref/netstandard1.0/it/System.Reflection.Primitives.xml", "ref/netstandard1.0/ja/System.Reflection.Primitives.xml", "ref/netstandard1.0/ko/System.Reflection.Primitives.xml", "ref/netstandard1.0/ru/System.Reflection.Primitives.xml", "ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml", "ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.reflection.primitives.4.3.0.nupkg.sha512", "system.reflection.primitives.nuspec" ] }, "System.Resources.ResourceManager/4.3.0": { "sha512": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "type": "package", "path": "system.resources.resourcemanager/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Resources.ResourceManager.dll", "ref/netcore50/System.Resources.ResourceManager.xml", "ref/netcore50/de/System.Resources.ResourceManager.xml", "ref/netcore50/es/System.Resources.ResourceManager.xml", "ref/netcore50/fr/System.Resources.ResourceManager.xml", "ref/netcore50/it/System.Resources.ResourceManager.xml", "ref/netcore50/ja/System.Resources.ResourceManager.xml", "ref/netcore50/ko/System.Resources.ResourceManager.xml", "ref/netcore50/ru/System.Resources.ResourceManager.xml", "ref/netcore50/zh-hans/System.Resources.ResourceManager.xml", "ref/netcore50/zh-hant/System.Resources.ResourceManager.xml", "ref/netstandard1.0/System.Resources.ResourceManager.dll", "ref/netstandard1.0/System.Resources.ResourceManager.xml", "ref/netstandard1.0/de/System.Resources.ResourceManager.xml", "ref/netstandard1.0/es/System.Resources.ResourceManager.xml", "ref/netstandard1.0/fr/System.Resources.ResourceManager.xml", "ref/netstandard1.0/it/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ja/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ko/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ru/System.Resources.ResourceManager.xml", "ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml", "ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.resources.resourcemanager.4.3.0.nupkg.sha512", "system.resources.resourcemanager.nuspec" ] }, "System.Runtime/4.3.0": { "sha512": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "type": "package", "path": "system.runtime/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.dll", "lib/portable-net45+win8+wp80+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.dll", "ref/netcore50/System.Runtime.dll", "ref/netcore50/System.Runtime.xml", "ref/netcore50/de/System.Runtime.xml", "ref/netcore50/es/System.Runtime.xml", "ref/netcore50/fr/System.Runtime.xml", "ref/netcore50/it/System.Runtime.xml", "ref/netcore50/ja/System.Runtime.xml", "ref/netcore50/ko/System.Runtime.xml", "ref/netcore50/ru/System.Runtime.xml", "ref/netcore50/zh-hans/System.Runtime.xml", "ref/netcore50/zh-hant/System.Runtime.xml", "ref/netstandard1.0/System.Runtime.dll", "ref/netstandard1.0/System.Runtime.xml", "ref/netstandard1.0/de/System.Runtime.xml", "ref/netstandard1.0/es/System.Runtime.xml", "ref/netstandard1.0/fr/System.Runtime.xml", "ref/netstandard1.0/it/System.Runtime.xml", "ref/netstandard1.0/ja/System.Runtime.xml", "ref/netstandard1.0/ko/System.Runtime.xml", "ref/netstandard1.0/ru/System.Runtime.xml", "ref/netstandard1.0/zh-hans/System.Runtime.xml", "ref/netstandard1.0/zh-hant/System.Runtime.xml", "ref/netstandard1.2/System.Runtime.dll", "ref/netstandard1.2/System.Runtime.xml", "ref/netstandard1.2/de/System.Runtime.xml", "ref/netstandard1.2/es/System.Runtime.xml", "ref/netstandard1.2/fr/System.Runtime.xml", "ref/netstandard1.2/it/System.Runtime.xml", "ref/netstandard1.2/ja/System.Runtime.xml", "ref/netstandard1.2/ko/System.Runtime.xml", "ref/netstandard1.2/ru/System.Runtime.xml", "ref/netstandard1.2/zh-hans/System.Runtime.xml", "ref/netstandard1.2/zh-hant/System.Runtime.xml", "ref/netstandard1.3/System.Runtime.dll", "ref/netstandard1.3/System.Runtime.xml", "ref/netstandard1.3/de/System.Runtime.xml", "ref/netstandard1.3/es/System.Runtime.xml", "ref/netstandard1.3/fr/System.Runtime.xml", "ref/netstandard1.3/it/System.Runtime.xml", "ref/netstandard1.3/ja/System.Runtime.xml", "ref/netstandard1.3/ko/System.Runtime.xml", "ref/netstandard1.3/ru/System.Runtime.xml", "ref/netstandard1.3/zh-hans/System.Runtime.xml", "ref/netstandard1.3/zh-hant/System.Runtime.xml", "ref/netstandard1.5/System.Runtime.dll", "ref/netstandard1.5/System.Runtime.xml", "ref/netstandard1.5/de/System.Runtime.xml", "ref/netstandard1.5/es/System.Runtime.xml", "ref/netstandard1.5/fr/System.Runtime.xml", "ref/netstandard1.5/it/System.Runtime.xml", "ref/netstandard1.5/ja/System.Runtime.xml", "ref/netstandard1.5/ko/System.Runtime.xml", "ref/netstandard1.5/ru/System.Runtime.xml", "ref/netstandard1.5/zh-hans/System.Runtime.xml", "ref/netstandard1.5/zh-hant/System.Runtime.xml", "ref/portable-net45+win8+wp80+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.4.3.0.nupkg.sha512", "system.runtime.nuspec" ] }, "System.Runtime.CompilerServices.Unsafe/4.5.3": { "sha512": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==", "type": "package", "path": "system.runtime.compilerservices.unsafe/4.5.3", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net461/System.Runtime.CompilerServices.Unsafe.dll", "lib/net461/System.Runtime.CompilerServices.Unsafe.xml", "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.xml", "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml", "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", "ref/net461/System.Runtime.CompilerServices.Unsafe.dll", "ref/net461/System.Runtime.CompilerServices.Unsafe.xml", "ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", "ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml", "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", "system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512", "system.runtime.compilerservices.unsafe.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Runtime.Extensions/4.3.0": { "sha512": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "type": "package", "path": "system.runtime.extensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.Extensions.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.Extensions.dll", "ref/netcore50/System.Runtime.Extensions.dll", "ref/netcore50/System.Runtime.Extensions.xml", "ref/netcore50/de/System.Runtime.Extensions.xml", "ref/netcore50/es/System.Runtime.Extensions.xml", "ref/netcore50/fr/System.Runtime.Extensions.xml", "ref/netcore50/it/System.Runtime.Extensions.xml", "ref/netcore50/ja/System.Runtime.Extensions.xml", "ref/netcore50/ko/System.Runtime.Extensions.xml", "ref/netcore50/ru/System.Runtime.Extensions.xml", "ref/netcore50/zh-hans/System.Runtime.Extensions.xml", "ref/netcore50/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.0/System.Runtime.Extensions.dll", "ref/netstandard1.0/System.Runtime.Extensions.xml", "ref/netstandard1.0/de/System.Runtime.Extensions.xml", "ref/netstandard1.0/es/System.Runtime.Extensions.xml", "ref/netstandard1.0/fr/System.Runtime.Extensions.xml", "ref/netstandard1.0/it/System.Runtime.Extensions.xml", "ref/netstandard1.0/ja/System.Runtime.Extensions.xml", "ref/netstandard1.0/ko/System.Runtime.Extensions.xml", "ref/netstandard1.0/ru/System.Runtime.Extensions.xml", "ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.3/System.Runtime.Extensions.dll", "ref/netstandard1.3/System.Runtime.Extensions.xml", "ref/netstandard1.3/de/System.Runtime.Extensions.xml", "ref/netstandard1.3/es/System.Runtime.Extensions.xml", "ref/netstandard1.3/fr/System.Runtime.Extensions.xml", "ref/netstandard1.3/it/System.Runtime.Extensions.xml", "ref/netstandard1.3/ja/System.Runtime.Extensions.xml", "ref/netstandard1.3/ko/System.Runtime.Extensions.xml", "ref/netstandard1.3/ru/System.Runtime.Extensions.xml", "ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.5/System.Runtime.Extensions.dll", "ref/netstandard1.5/System.Runtime.Extensions.xml", "ref/netstandard1.5/de/System.Runtime.Extensions.xml", "ref/netstandard1.5/es/System.Runtime.Extensions.xml", "ref/netstandard1.5/fr/System.Runtime.Extensions.xml", "ref/netstandard1.5/it/System.Runtime.Extensions.xml", "ref/netstandard1.5/ja/System.Runtime.Extensions.xml", "ref/netstandard1.5/ko/System.Runtime.Extensions.xml", "ref/netstandard1.5/ru/System.Runtime.Extensions.xml", "ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.extensions.4.3.0.nupkg.sha512", "system.runtime.extensions.nuspec" ] }, "System.Runtime.Handles/4.3.0": { "sha512": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "type": "package", "path": "system.runtime.handles/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/_._", "ref/netstandard1.3/System.Runtime.Handles.dll", "ref/netstandard1.3/System.Runtime.Handles.xml", "ref/netstandard1.3/de/System.Runtime.Handles.xml", "ref/netstandard1.3/es/System.Runtime.Handles.xml", "ref/netstandard1.3/fr/System.Runtime.Handles.xml", "ref/netstandard1.3/it/System.Runtime.Handles.xml", "ref/netstandard1.3/ja/System.Runtime.Handles.xml", "ref/netstandard1.3/ko/System.Runtime.Handles.xml", "ref/netstandard1.3/ru/System.Runtime.Handles.xml", "ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml", "ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.handles.4.3.0.nupkg.sha512", "system.runtime.handles.nuspec" ] }, "System.Runtime.InteropServices/4.3.0": { "sha512": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "type": "package", "path": "system.runtime.interopservices/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.InteropServices.dll", "lib/net463/System.Runtime.InteropServices.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.InteropServices.dll", "ref/net463/System.Runtime.InteropServices.dll", "ref/netcore50/System.Runtime.InteropServices.dll", "ref/netcore50/System.Runtime.InteropServices.xml", "ref/netcore50/de/System.Runtime.InteropServices.xml", "ref/netcore50/es/System.Runtime.InteropServices.xml", "ref/netcore50/fr/System.Runtime.InteropServices.xml", "ref/netcore50/it/System.Runtime.InteropServices.xml", "ref/netcore50/ja/System.Runtime.InteropServices.xml", "ref/netcore50/ko/System.Runtime.InteropServices.xml", "ref/netcore50/ru/System.Runtime.InteropServices.xml", "ref/netcore50/zh-hans/System.Runtime.InteropServices.xml", "ref/netcore50/zh-hant/System.Runtime.InteropServices.xml", "ref/netcoreapp1.1/System.Runtime.InteropServices.dll", "ref/netstandard1.1/System.Runtime.InteropServices.dll", "ref/netstandard1.1/System.Runtime.InteropServices.xml", "ref/netstandard1.1/de/System.Runtime.InteropServices.xml", "ref/netstandard1.1/es/System.Runtime.InteropServices.xml", "ref/netstandard1.1/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.1/it/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.2/System.Runtime.InteropServices.dll", "ref/netstandard1.2/System.Runtime.InteropServices.xml", "ref/netstandard1.2/de/System.Runtime.InteropServices.xml", "ref/netstandard1.2/es/System.Runtime.InteropServices.xml", "ref/netstandard1.2/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.2/it/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.3/System.Runtime.InteropServices.dll", "ref/netstandard1.3/System.Runtime.InteropServices.xml", "ref/netstandard1.3/de/System.Runtime.InteropServices.xml", "ref/netstandard1.3/es/System.Runtime.InteropServices.xml", "ref/netstandard1.3/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.3/it/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.5/System.Runtime.InteropServices.dll", "ref/netstandard1.5/System.Runtime.InteropServices.xml", "ref/netstandard1.5/de/System.Runtime.InteropServices.xml", "ref/netstandard1.5/es/System.Runtime.InteropServices.xml", "ref/netstandard1.5/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.5/it/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.interopservices.4.3.0.nupkg.sha512", "system.runtime.interopservices.nuspec" ] }, "System.Security.Claims/4.3.0": { "sha512": "P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "type": "package", "path": "system.security.claims/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Claims.dll", "lib/netstandard1.3/System.Security.Claims.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Claims.dll", "ref/netstandard1.3/System.Security.Claims.dll", "ref/netstandard1.3/System.Security.Claims.xml", "ref/netstandard1.3/de/System.Security.Claims.xml", "ref/netstandard1.3/es/System.Security.Claims.xml", "ref/netstandard1.3/fr/System.Security.Claims.xml", "ref/netstandard1.3/it/System.Security.Claims.xml", "ref/netstandard1.3/ja/System.Security.Claims.xml", "ref/netstandard1.3/ko/System.Security.Claims.xml", "ref/netstandard1.3/ru/System.Security.Claims.xml", "ref/netstandard1.3/zh-hans/System.Security.Claims.xml", "ref/netstandard1.3/zh-hant/System.Security.Claims.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.security.claims.4.3.0.nupkg.sha512", "system.security.claims.nuspec" ] }, "System.Security.Principal/4.3.0": { "sha512": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "type": "package", "path": "system.security.principal/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Security.Principal.dll", "lib/netstandard1.0/System.Security.Principal.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Security.Principal.dll", "ref/netcore50/System.Security.Principal.xml", "ref/netcore50/de/System.Security.Principal.xml", "ref/netcore50/es/System.Security.Principal.xml", "ref/netcore50/fr/System.Security.Principal.xml", "ref/netcore50/it/System.Security.Principal.xml", "ref/netcore50/ja/System.Security.Principal.xml", "ref/netcore50/ko/System.Security.Principal.xml", "ref/netcore50/ru/System.Security.Principal.xml", "ref/netcore50/zh-hans/System.Security.Principal.xml", "ref/netcore50/zh-hant/System.Security.Principal.xml", "ref/netstandard1.0/System.Security.Principal.dll", "ref/netstandard1.0/System.Security.Principal.xml", "ref/netstandard1.0/de/System.Security.Principal.xml", "ref/netstandard1.0/es/System.Security.Principal.xml", "ref/netstandard1.0/fr/System.Security.Principal.xml", "ref/netstandard1.0/it/System.Security.Principal.xml", "ref/netstandard1.0/ja/System.Security.Principal.xml", "ref/netstandard1.0/ko/System.Security.Principal.xml", "ref/netstandard1.0/ru/System.Security.Principal.xml", "ref/netstandard1.0/zh-hans/System.Security.Principal.xml", "ref/netstandard1.0/zh-hant/System.Security.Principal.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.security.principal.4.3.0.nupkg.sha512", "system.security.principal.nuspec" ] }, "System.Security.Principal.Windows/4.3.0": { "sha512": "HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", "type": "package", "path": "system.security.principal.windows/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Security.Principal.Windows.dll", "ref/net46/System.Security.Principal.Windows.dll", "ref/netstandard1.3/System.Security.Principal.Windows.dll", "ref/netstandard1.3/System.Security.Principal.Windows.xml", "ref/netstandard1.3/de/System.Security.Principal.Windows.xml", "ref/netstandard1.3/es/System.Security.Principal.Windows.xml", "ref/netstandard1.3/fr/System.Security.Principal.Windows.xml", "ref/netstandard1.3/it/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ja/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ko/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ru/System.Security.Principal.Windows.xml", "ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml", "ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml", "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll", "runtimes/win/lib/net46/System.Security.Principal.Windows.dll", "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll", "system.security.principal.windows.4.3.0.nupkg.sha512", "system.security.principal.windows.nuspec" ] }, "System.Text.Encoding/4.3.0": { "sha512": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "type": "package", "path": "system.text.encoding/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Text.Encoding.dll", "ref/netcore50/System.Text.Encoding.xml", "ref/netcore50/de/System.Text.Encoding.xml", "ref/netcore50/es/System.Text.Encoding.xml", "ref/netcore50/fr/System.Text.Encoding.xml", "ref/netcore50/it/System.Text.Encoding.xml", "ref/netcore50/ja/System.Text.Encoding.xml", "ref/netcore50/ko/System.Text.Encoding.xml", "ref/netcore50/ru/System.Text.Encoding.xml", "ref/netcore50/zh-hans/System.Text.Encoding.xml", "ref/netcore50/zh-hant/System.Text.Encoding.xml", "ref/netstandard1.0/System.Text.Encoding.dll", "ref/netstandard1.0/System.Text.Encoding.xml", "ref/netstandard1.0/de/System.Text.Encoding.xml", "ref/netstandard1.0/es/System.Text.Encoding.xml", "ref/netstandard1.0/fr/System.Text.Encoding.xml", "ref/netstandard1.0/it/System.Text.Encoding.xml", "ref/netstandard1.0/ja/System.Text.Encoding.xml", "ref/netstandard1.0/ko/System.Text.Encoding.xml", "ref/netstandard1.0/ru/System.Text.Encoding.xml", "ref/netstandard1.0/zh-hans/System.Text.Encoding.xml", "ref/netstandard1.0/zh-hant/System.Text.Encoding.xml", "ref/netstandard1.3/System.Text.Encoding.dll", "ref/netstandard1.3/System.Text.Encoding.xml", "ref/netstandard1.3/de/System.Text.Encoding.xml", "ref/netstandard1.3/es/System.Text.Encoding.xml", "ref/netstandard1.3/fr/System.Text.Encoding.xml", "ref/netstandard1.3/it/System.Text.Encoding.xml", "ref/netstandard1.3/ja/System.Text.Encoding.xml", "ref/netstandard1.3/ko/System.Text.Encoding.xml", "ref/netstandard1.3/ru/System.Text.Encoding.xml", "ref/netstandard1.3/zh-hans/System.Text.Encoding.xml", "ref/netstandard1.3/zh-hant/System.Text.Encoding.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.text.encoding.4.3.0.nupkg.sha512", "system.text.encoding.nuspec" ] }, "System.Threading/4.3.0": { "sha512": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "type": "package", "path": "system.threading/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Threading.dll", "lib/netstandard1.3/System.Threading.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Threading.dll", "ref/netcore50/System.Threading.xml", "ref/netcore50/de/System.Threading.xml", "ref/netcore50/es/System.Threading.xml", "ref/netcore50/fr/System.Threading.xml", "ref/netcore50/it/System.Threading.xml", "ref/netcore50/ja/System.Threading.xml", "ref/netcore50/ko/System.Threading.xml", "ref/netcore50/ru/System.Threading.xml", "ref/netcore50/zh-hans/System.Threading.xml", "ref/netcore50/zh-hant/System.Threading.xml", "ref/netstandard1.0/System.Threading.dll", "ref/netstandard1.0/System.Threading.xml", "ref/netstandard1.0/de/System.Threading.xml", "ref/netstandard1.0/es/System.Threading.xml", "ref/netstandard1.0/fr/System.Threading.xml", "ref/netstandard1.0/it/System.Threading.xml", "ref/netstandard1.0/ja/System.Threading.xml", "ref/netstandard1.0/ko/System.Threading.xml", "ref/netstandard1.0/ru/System.Threading.xml", "ref/netstandard1.0/zh-hans/System.Threading.xml", "ref/netstandard1.0/zh-hant/System.Threading.xml", "ref/netstandard1.3/System.Threading.dll", "ref/netstandard1.3/System.Threading.xml", "ref/netstandard1.3/de/System.Threading.xml", "ref/netstandard1.3/es/System.Threading.xml", "ref/netstandard1.3/fr/System.Threading.xml", "ref/netstandard1.3/it/System.Threading.xml", "ref/netstandard1.3/ja/System.Threading.xml", "ref/netstandard1.3/ko/System.Threading.xml", "ref/netstandard1.3/ru/System.Threading.xml", "ref/netstandard1.3/zh-hans/System.Threading.xml", "ref/netstandard1.3/zh-hant/System.Threading.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Threading.dll", "system.threading.4.3.0.nupkg.sha512", "system.threading.nuspec" ] }, "System.Threading.Overlapped/4.3.0": { "sha512": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", "type": "package", "path": "system.threading.overlapped/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Threading.Overlapped.dll", "ref/net46/System.Threading.Overlapped.dll", "ref/netstandard1.3/System.Threading.Overlapped.dll", "ref/netstandard1.3/System.Threading.Overlapped.xml", "ref/netstandard1.3/de/System.Threading.Overlapped.xml", "ref/netstandard1.3/es/System.Threading.Overlapped.xml", "ref/netstandard1.3/fr/System.Threading.Overlapped.xml", "ref/netstandard1.3/it/System.Threading.Overlapped.xml", "ref/netstandard1.3/ja/System.Threading.Overlapped.xml", "ref/netstandard1.3/ko/System.Threading.Overlapped.xml", "ref/netstandard1.3/ru/System.Threading.Overlapped.xml", "ref/netstandard1.3/zh-hans/System.Threading.Overlapped.xml", "ref/netstandard1.3/zh-hant/System.Threading.Overlapped.xml", "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll", "runtimes/win/lib/net46/System.Threading.Overlapped.dll", "runtimes/win/lib/netcore50/System.Threading.Overlapped.dll", "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll", "system.threading.overlapped.4.3.0.nupkg.sha512", "system.threading.overlapped.nuspec" ] }, "System.Threading.Tasks/4.3.0": { "sha512": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "type": "package", "path": "system.threading.tasks/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Threading.Tasks.dll", "ref/netcore50/System.Threading.Tasks.xml", "ref/netcore50/de/System.Threading.Tasks.xml", "ref/netcore50/es/System.Threading.Tasks.xml", "ref/netcore50/fr/System.Threading.Tasks.xml", "ref/netcore50/it/System.Threading.Tasks.xml", "ref/netcore50/ja/System.Threading.Tasks.xml", "ref/netcore50/ko/System.Threading.Tasks.xml", "ref/netcore50/ru/System.Threading.Tasks.xml", "ref/netcore50/zh-hans/System.Threading.Tasks.xml", "ref/netcore50/zh-hant/System.Threading.Tasks.xml", "ref/netstandard1.0/System.Threading.Tasks.dll", "ref/netstandard1.0/System.Threading.Tasks.xml", "ref/netstandard1.0/de/System.Threading.Tasks.xml", "ref/netstandard1.0/es/System.Threading.Tasks.xml", "ref/netstandard1.0/fr/System.Threading.Tasks.xml", "ref/netstandard1.0/it/System.Threading.Tasks.xml", "ref/netstandard1.0/ja/System.Threading.Tasks.xml", "ref/netstandard1.0/ko/System.Threading.Tasks.xml", "ref/netstandard1.0/ru/System.Threading.Tasks.xml", "ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml", "ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml", "ref/netstandard1.3/System.Threading.Tasks.dll", "ref/netstandard1.3/System.Threading.Tasks.xml", "ref/netstandard1.3/de/System.Threading.Tasks.xml", "ref/netstandard1.3/es/System.Threading.Tasks.xml", "ref/netstandard1.3/fr/System.Threading.Tasks.xml", "ref/netstandard1.3/it/System.Threading.Tasks.xml", "ref/netstandard1.3/ja/System.Threading.Tasks.xml", "ref/netstandard1.3/ko/System.Threading.Tasks.xml", "ref/netstandard1.3/ru/System.Threading.Tasks.xml", "ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml", "ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.tasks.4.3.0.nupkg.sha512", "system.threading.tasks.nuspec" ] }, "System.Threading.Tasks.Extensions/4.5.4": { "sha512": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", "type": "package", "path": "system.threading.tasks.extensions/4.5.4", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net461/System.Threading.Tasks.Extensions.dll", "lib/net461/System.Threading.Tasks.Extensions.xml", "lib/netcoreapp2.1/_._", "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll", "lib/netstandard1.0/System.Threading.Tasks.Extensions.xml", "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll", "lib/netstandard2.0/System.Threading.Tasks.Extensions.xml", "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll", "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/netcoreapp2.1/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.tasks.extensions.4.5.4.nupkg.sha512", "system.threading.tasks.extensions.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Threading.Thread/4.3.0": { "sha512": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", "type": "package", "path": "system.threading.thread/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Threading.Thread.dll", "lib/netcore50/_._", "lib/netstandard1.3/System.Threading.Thread.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Threading.Thread.dll", "ref/netstandard1.3/System.Threading.Thread.dll", "ref/netstandard1.3/System.Threading.Thread.xml", "ref/netstandard1.3/de/System.Threading.Thread.xml", "ref/netstandard1.3/es/System.Threading.Thread.xml", "ref/netstandard1.3/fr/System.Threading.Thread.xml", "ref/netstandard1.3/it/System.Threading.Thread.xml", "ref/netstandard1.3/ja/System.Threading.Thread.xml", "ref/netstandard1.3/ko/System.Threading.Thread.xml", "ref/netstandard1.3/ru/System.Threading.Thread.xml", "ref/netstandard1.3/zh-hans/System.Threading.Thread.xml", "ref/netstandard1.3/zh-hant/System.Threading.Thread.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.thread.4.3.0.nupkg.sha512", "system.threading.thread.nuspec" ] }, "System.Threading.ThreadPool/4.3.0": { "sha512": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", "type": "package", "path": "system.threading.threadpool/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Threading.ThreadPool.dll", "lib/netcore50/_._", "lib/netstandard1.3/System.Threading.ThreadPool.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Threading.ThreadPool.dll", "ref/netstandard1.3/System.Threading.ThreadPool.dll", "ref/netstandard1.3/System.Threading.ThreadPool.xml", "ref/netstandard1.3/de/System.Threading.ThreadPool.xml", "ref/netstandard1.3/es/System.Threading.ThreadPool.xml", "ref/netstandard1.3/fr/System.Threading.ThreadPool.xml", "ref/netstandard1.3/it/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ja/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ko/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ru/System.Threading.ThreadPool.xml", "ref/netstandard1.3/zh-hans/System.Threading.ThreadPool.xml", "ref/netstandard1.3/zh-hant/System.Threading.ThreadPool.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.threadpool.4.3.0.nupkg.sha512", "system.threading.threadpool.nuspec" ] } }, "projectFileDependencyGroups": { ".NETCoreApp,Version=v3.1": [ "Heijden.Dns.Portable >= 2.0.19", "NLog >= 4.7.3", "Newtonsoft.Json >= 12.0.3", "Nullable >= 1.2.1", "Portable.BouncyCastle >= 1.8.6.7", "Splamy.Ed25519.Toolkit >= 1.0.3", "System.IO.Pipelines >= 4.7.2" ], ".NETStandard,Version=v2.0": [ "Heijden.Dns.Portable >= 2.0.19", "NETStandard.Library >= 2.0.3", "NLog >= 4.7.3", "Newtonsoft.Json >= 12.0.3", "Nullable >= 1.2.1", "Portable.BouncyCastle >= 1.8.6.7", "Splamy.Ed25519.Toolkit >= 1.0.3", "System.IO.Pipelines >= 4.7.2", "System.Memory >= 4.5.4" ], ".NETStandard,Version=v2.1": [ "Heijden.Dns.Portable >= 2.0.19", "NLog >= 4.7.3", "Newtonsoft.Json >= 12.0.3", "Nullable >= 1.2.1", "Portable.BouncyCastle >= 1.8.6.7", "Splamy.Ed25519.Toolkit >= 1.0.3", "System.IO.Pipelines >= 4.7.2" ] }, "packageFolders": { "C:\\Users\\Saopig\\.nuget\\packages\\": {} }, "project": { "version": "1.1.0", "restore": { "projectUniqueName": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "projectName": "Splamy.TSLib", "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "packagesPath": "C:\\Users\\Saopig\\.nuget\\packages\\", "outputPath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\", "projectStyle": "PackageReference", "crossTargeting": true, "configFilePaths": [ "C:\\Users\\Saopig\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1", "netstandard2.0", "netstandard2.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": {} }, "netstandard2.0": { "targetAlias": "netstandard2.0", "projectReferences": {} }, "netstandard2.1": { "targetAlias": "netstandard2.1", "projectReferences": {} } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" }, "netstandard2.0": { "targetAlias": "netstandard2.0", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NETStandard.Library": { "suppressParent": "All", "target": "Package", "version": "[2.0.3, )", "autoReferenced": true }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" }, "System.Memory": { "target": "Package", "version": "[4.5.4, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" }, "netstandard2.1": { "targetAlias": "netstandard2.1", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "NETStandard.Library": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" } } } } ================================================ FILE: TSLib/obj/project.nuget.cache ================================================ { "version": 2, "dgSpecHash": "gzDxPutRi2zFvilYnwsXJdGmFGc+JCEyUEpFzyB993VplkBs3Ll4ddgmBxLDrc7Ev6bT0PDIWWdiZgu8wFRpwg==", "success": true, "projectFilePath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "expectedPackageFiles": [ "C:\\Users\\Saopig\\.nuget\\packages\\heijden.dns.portable\\2.0.19\\heijden.dns.portable.2.0.19.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.netcore.platforms\\1.1.0\\microsoft.netcore.platforms.1.1.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.netcore.targets\\1.1.0\\microsoft.netcore.targets.1.1.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.win32.primitives\\4.3.0\\microsoft.win32.primitives.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\netstandard.library\\2.0.3\\netstandard.library.2.0.3.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\newtonsoft.json\\12.0.3\\newtonsoft.json.12.0.3.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\nlog\\4.7.3\\nlog.4.7.3.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\nullable\\1.2.1\\nullable.1.2.1.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\portable.bouncycastle\\1.8.6.7\\portable.bouncycastle.1.8.6.7.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\runtime.native.system\\4.3.0\\runtime.native.system.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\splamy.ed25519.toolkit\\1.0.3\\splamy.ed25519.toolkit.1.0.3.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.buffers\\4.5.1\\system.buffers.4.5.1.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.collections\\4.3.0\\system.collections.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.diagnostics.debug\\4.3.0\\system.diagnostics.debug.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.diagnostics.tracing\\4.3.0\\system.diagnostics.tracing.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.globalization\\4.3.0\\system.globalization.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.io\\4.3.0\\system.io.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.io.filesystem\\4.3.0\\system.io.filesystem.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.io.filesystem.primitives\\4.3.0\\system.io.filesystem.primitives.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.io.pipelines\\4.7.2\\system.io.pipelines.4.7.2.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.linq\\4.3.0\\system.linq.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.memory\\4.5.4\\system.memory.4.5.4.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.net.networkinformation\\4.3.0\\system.net.networkinformation.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.net.primitives\\4.3.0\\system.net.primitives.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.net.sockets\\4.3.0\\system.net.sockets.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.numerics.vectors\\4.4.0\\system.numerics.vectors.4.4.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.reflection\\4.3.0\\system.reflection.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.reflection.primitives\\4.3.0\\system.reflection.primitives.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.resources.resourcemanager\\4.3.0\\system.resources.resourcemanager.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime\\4.3.0\\system.runtime.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\4.5.3\\system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime.extensions\\4.3.0\\system.runtime.extensions.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime.handles\\4.3.0\\system.runtime.handles.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime.interopservices\\4.3.0\\system.runtime.interopservices.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.security.claims\\4.3.0\\system.security.claims.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.security.principal\\4.3.0\\system.security.principal.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.security.principal.windows\\4.3.0\\system.security.principal.windows.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.text.encoding\\4.3.0\\system.text.encoding.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading\\4.3.0\\system.threading.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.overlapped\\4.3.0\\system.threading.overlapped.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.tasks\\4.3.0\\system.threading.tasks.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.tasks.extensions\\4.5.4\\system.threading.tasks.extensions.4.5.4.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.thread\\4.3.0\\system.threading.thread.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.threadpool\\4.3.0\\system.threading.threadpool.4.3.0.nupkg.sha512" ], "logs": [] } ================================================ FILE: YunBot.cs ================================================ using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Numerics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Text; using System.Text.Json; using System.Threading; using System.Threading.Tasks; using TS3AudioBot; using TS3AudioBot.Audio; using TS3AudioBot.CommandSystem; using TS3AudioBot.Playlists; using TS3AudioBot.Plugins; using TS3AudioBot.ResourceFactories; using TS3AudioBot.Sessions; using TSLib.Full; //{ get; set; } public class ArtistsItem { /// /// /// public long id; /// /// /// public string name; /// /// /// public string picUrl; /// /// /// public List @alias; /// /// /// public long albumSize; /// /// /// public long picId; /// /// /// public string fansGroup; /// /// /// public string img1v1Url; /// /// /// public long img1v1; /// /// /// public string trans; } public class Artist { /// /// /// public long id; /// /// /// public string name; /// /// /// public string picUrl; /// /// /// public List @alias; /// /// /// public long albumSize; /// /// /// public long picId; /// /// /// public string fansGroup; /// /// /// public string img1v1Url; /// /// /// public long img1v1; /// /// /// public string trans; } public class Album { /// /// /// public long id; /// /// 海阔天空 /// public string name; /// /// /// public Artist artist; /// /// /// public long publishTime; /// /// /// public long size; /// /// /// public long copyrightId; /// /// /// public long status; /// /// /// public long picId; /// /// /// public long mark; } public class SongsItem { /// /// /// public long id { get; set; } /// /// 海阔天空 /// public string name { get; set; } /// /// /// public List artists; /// /// /// public Album album; /// /// /// public long duration; /// /// /// public long copyrightId; /// /// /// public long status; /// /// /// public List @alias; /// /// /// public long rtype; /// /// /// public long ftype; /// /// /// public long mvid; /// /// /// public long fee; /// /// /// public string rUrl; /// /// /// public long mark; } public class Result { /// /// /// public List songs { get; set; } /// /// /// public bool hasMore; /// /// /// public long songCount; } public class yunSearchSong { /// /// /// public Result result { get; set; } /// /// /// public long code; } public class FreeTrialInfo { /// /// /// public long start; /// /// /// public long end; } public class FreeTrialPrivilege { /// /// /// public bool resConsumable; /// /// /// public bool userConsumable; /// /// /// public string listenType; /// /// /// public string cannotListenReason; } public class FreeTimeTrialPrivilege { /// /// /// public bool resConsumable; /// /// /// public bool userConsumable; /// /// /// public long type; /// /// /// public long remalongime; } public class DataItem { /// /// /// public long id; /// /// /// public string url { get; set; } /// /// /// public long br; /// /// /// public long size; /// /// /// public string md5; /// /// /// public long code; /// /// /// public long expi; /// /// /// public string type; /// /// /// public double gain; /// /// /// public double peak; /// /// /// public long fee; /// /// /// public string uf; /// /// /// public long payed; /// /// /// public long flag; /// /// /// public bool canExtend; /// /// /// public FreeTrialInfo freeTrialInfo; /// /// /// public string level; /// /// /// public string encodeType; /// /// /// public FreeTrialPrivilege freeTrialPrivilege; /// /// /// public FreeTimeTrialPrivilege freeTimeTrialPrivilege; /// /// /// public long urlSource; /// /// /// public long rightSource; /// /// /// public string podcastCtrp; /// /// /// public string effectTypes; /// /// /// public long time; } public class musicURL { /// /// /// public List data { get; set; } /// /// /// public long code { get; set; } } public class ArItem { /// /// /// public long id; /// /// /// public string name; /// /// /// public List tns; /// /// /// public List @alias; } public class Al { /// /// /// public long id; /// /// /// public string name; /// /// /// public string picUrl; /// /// /// public List tns; /// /// /// public long pic; } public class H { /// /// /// public long br; /// /// /// public long fid; /// /// /// public long size; /// /// /// public long vd; /// /// /// public long sr; } public class M { /// /// /// public long br; /// /// /// public long fid; /// /// /// public long size; /// /// /// public long vd; /// /// /// public long sr; } public class L { /// /// /// public long br; /// /// /// public long fid; /// /// /// public long size; /// /// /// public long vd; /// /// /// public long sr; } public class SongsItems { /// /// /// public string name { get; set; } /// /// /// public long id { get; set; } /// /// /// public long pst; /// /// /// public long t; /// /// /// public List ar; /// /// /// public List alia; /// /// /// public long pop; /// /// /// public long st; /// /// /// public string rt; /// /// /// public long fee; /// /// /// public long v; /// /// /// public string crbt; /// /// /// public string cf; /// /// /// public Al al; /// /// /// public long dt; /// /// /// public H h; /// /// /// public M m; /// /// /// public L l; /// /// /// public string? sq; /// /// /// public string? hr; /// /// /// public string? a; /// /// /// public string cd; /// /// /// public long no; /// /// /// public string? rtUrl; /// /// /// public long ftype; /// /// /// public List rtUrls; /// /// /// public long djId; /// /// /// public long copyright; /// /// /// public long s_id; /// /// /// public long mark; /// /// /// public long originCoverType; /// /// /// public string? originSongSimpleData; /// /// /// public string? tagPicList; /// /// /// public bool resourceState; /// /// /// public long version; /// /// /// public string? songJumpInfo; /// /// /// public string? entertainmentTags; /// /// /// public string? awardTags; /// /// /// public long single; /// /// /// public bool noCopyrightRcmd; /// /// /// public long mst; /// /// /// public long cp; /// /// /// public long rtype; /// /// /// public string? rurl; /// /// /// public long mv; /// /// /// public long publishTime; } public class FreeTrial { /// /// /// public bool resConsumable; /// /// /// public bool userConsumable; /// /// /// public string listenType; } public class ChargeInfoListItem { /// /// /// public long rate; /// /// /// public string chargeUrl; /// /// /// public string chargeMessage; /// /// /// public long chargeType; } public class PrivilegesItem { /// /// /// public long id; /// /// /// public long fee; /// /// /// public long payed; /// /// /// public long st; /// /// /// public long pl; /// /// /// public long dl; /// /// /// public long sp; /// /// /// public long cp; /// /// /// public long subp; /// /// /// public bool cs; /// /// /// public long maxbr; /// /// /// public long fl; /// /// /// public bool toast; /// /// /// public long flag; /// /// /// public bool preSell; /// /// /// public long playMaxbr; /// /// /// public long downloadMaxbr; /// /// /// public string maxBrLevel; /// /// /// public string playMaxBrLevel; /// /// /// public string downloadMaxBrLevel; /// /// /// public string plLevel; /// /// /// public string dlLevel; /// /// /// public string flLevel; /// /// /// public string rscl; /// /// /// public FreeTrial freeTrialPrivilege; /// /// /// public List chargeInfoList; } public class GeDan { /// /// /// public List songs { get; set; } /// /// /// public List privileges; /// /// /// public long code; } public class Creator { /// /// 淋雨丶伞 /// public string nickname; /// /// /// public long userId; /// /// /// public long userType; /// /// /// public string avatarUrl; /// /// /// public long authStatus; /// /// /// public string expertTags; /// /// /// public string experts; } public class ArtistsItems { /// /// /// public string name; /// /// /// public long id; /// /// /// public long picId; /// /// /// public long img1v1Id; /// /// /// public string briefDesc; /// /// /// public string picUrl; /// /// /// public string img1v1Url; /// /// /// public long albumSize; /// /// /// public List @alias; /// /// /// public string trans; /// /// /// public long musicSize; } public class Artists { /// /// /// public string name; /// /// /// public long id; /// /// /// public long picId; /// /// /// public long img1v1Id; /// /// /// public string briefDesc; /// /// /// public string picUrl; /// /// /// public string img1v1Url; /// /// /// public long albumSize; /// /// /// public List @alias; /// /// /// public string trans; /// /// /// public long musicSize; } public class ArtistsItemss { /// /// /// public string name; /// /// /// public long id; /// /// /// public long picId; /// /// /// public long img1v1Id; /// /// /// public string briefDesc; /// /// /// public string picUrl; /// /// /// public string img1v1Url; /// /// /// public long albumSize; /// /// /// public List @alias; /// /// /// public string trans; /// /// /// public long musicSize; } public class Albums { /// /// /// public string name; /// /// /// public long id; /// /// /// public string idStr; /// /// 专辑 /// public string type; /// /// /// public long size; /// /// /// public long picId; /// /// /// public string blurPicUrl; /// /// /// public long companyId; /// /// /// public long pic; /// /// /// public string picUrl; /// /// /// public long publishTime; /// /// /// public string description; /// /// /// public string tags; /// /// 独立发行 /// public string company; /// /// /// public string briefDesc; /// /// /// public Artist artist; /// /// /// public List songs; /// /// /// public List @alias; /// /// /// public long status; /// /// /// public long copyrightId; /// /// /// public string commentThreadId; /// /// /// public List artists; } public class BMusic { /// /// /// public string name; /// /// /// public long id; /// /// /// public long size; /// /// /// public string extension; /// /// /// public long sr; /// /// /// public long dfsId; /// /// /// public long bitrate; /// /// /// public long playTime; /// /// /// public long volumeDelta; } public class HMusic { /// /// /// public string name; /// /// /// public long id; /// /// /// public long size; /// /// /// public string extension; /// /// /// public long sr; /// /// /// public long dfsId; /// /// /// public long bitrate; /// /// /// public long playTime; /// /// /// public long volumeDelta; } public class MMusic { /// /// /// public string name; /// /// /// public long id; /// /// /// public long size; /// /// /// public string extension; /// /// /// public long sr; /// /// /// public long dfsId; /// /// /// public long bitrate; /// /// /// public long playTime; /// /// /// public long volumeDelta; } public class LMusic { /// /// /// public string name; /// /// /// public long id; /// /// /// public long size; /// /// /// public string extension; /// /// /// public long sr; /// /// /// public long dfsId; /// /// /// public long bitrate; /// /// /// public long playTime; /// /// /// public long volumeDelta; } public class Track { /// /// /// public string name; /// /// /// public long id; /// /// /// public long position; /// /// /// public List @alias; /// /// /// public long status; /// /// /// public long fee; /// /// /// public long copyrightId; /// /// /// public string disc; /// /// /// public long no; /// /// /// public List artists; /// /// /// public Albums album; /// /// /// public bool starred; /// /// /// public long popularity; /// /// /// public long score; /// /// /// public long starredNum; /// /// /// public long duration; /// /// /// public long playedNum; /// /// /// public long dayPlays; /// /// /// public long hearTime; /// /// /// public string ringtone; /// /// /// public string crbt; /// /// /// public string audition; /// /// /// public string copyFrom; /// /// /// public string commentThreadId; /// /// /// public string rtUrl; /// /// /// public long ftype; /// /// /// public List rtUrls; /// /// /// public long copyright; /// /// /// public long rtype; /// /// /// public string rurl; /// /// /// public BMusic bMusic; /// /// /// public string mp3Url; /// /// /// public long mvid; /// /// /// public HMusic hMusic; /// /// /// public MMusic mMusic; /// /// /// public LMusic lMusic; } public class PlaylistsItem { /// /// /// public long id { get; set; } /// /// 『纯音乐』有些歌只能一个人戴耳机听 /// public string name; /// /// /// public string coverImgUrl; /// /// /// public Creator creator; /// /// /// public bool subscribed; /// /// /// public long trackCount; /// /// /// public long userId; /// /// /// public long playCount; /// /// /// public long bookCount; /// /// /// public long specialType; /// /// /// public List officialTags; /// /// /// public string action; /// /// /// public string actionType; /// /// /// public string recommendText; /// /// /// public string score; /// /// 平时收集的一些纯音乐做了整理,希望大家喜欢 /// public string description; /// /// /// public bool highQuality; /// /// /// public Track track; /// /// alg_search_rec_playlist_tab_basic_rewrite_{"hit":"Name","id":"有些歌只能一个人戴耳机听","type":"basic"} /// public string alg; } public class Results { /// /// /// public List playlists { get; set; } /// /// /// public bool hasMore; /// /// /// public List hlWords; /// /// /// public long playlistCount; /// /// /// public string searchQcReminder; } public class SearchGedan { /// /// /// public Results result { get; set; } /// /// /// public long code; } public class Data { /// /// /// public int code; /// /// /// public string unikey { get; set; } } public class LoginKey { /// /// /// public Data data { get; set; } /// /// /// public int code; } public class Datas { /// /// /// public string qrurl; /// /// /// public string qrimg { get; set; } } public class LoginImg { /// /// /// public int code; /// /// /// public Datas data { get; set; } } public class Status1 { /// /// /// public long code { get; set; } /// /// 等待扫码 /// public string? message { get; set; } /// /// /// public string? cookie { get; set; } } //如果好用,请收藏地址,帮忙分享。 public class SubscribersItem { /// /// /// public string defaultAvatar; /// /// /// public int province; /// /// /// public int authStatus; /// /// /// public string followed; /// /// /// public string avatarUrl; /// /// /// public int accountStatus; /// /// /// public int gender; /// /// /// public int city; /// /// /// public int birthday; /// /// /// public long userId; /// /// /// public int userType; /// /// 神明懿2104 /// public string nickname; /// /// /// public string signature; /// /// /// public string description; /// /// /// public string detailDescription; /// /// /// public int avatarImgId; /// /// /// public int backgroundImgId; /// /// /// public string backgroundUrl; /// /// /// public int authority; /// /// /// public string mutual; /// /// /// public string expertTags; /// /// /// public string experts; /// /// /// public int djStatus; /// /// /// public int vipType; /// /// /// public string remarkName; /// /// /// public int authenticationTypes; /// /// /// public string avatarDetail; /// /// /// public string avatarImgIdStr; /// /// /// public string backgroundImgIdStr; /// /// /// public string anchor; /// /// /// public string avatarImgId_str; } public class AvatarDetail { /// /// /// public int userType; /// /// /// public int identityLevel; /// /// /// public string identityIconUrl; } public class Creators { /// /// /// public string defaultAvatar; /// /// /// public int province; /// /// /// public int authStatus; /// /// /// public string followed; /// /// /// public string avatarUrl; /// /// /// public int accountStatus; /// /// /// public int gender; /// /// /// public int city; /// /// /// public int birthday; /// /// /// public long userId; /// /// /// public int userType; /// /// 岩酱岩酱岩酱 /// public string nickname; /// /// 这里是岩酱 /// public string signature; /// /// /// public string description; /// /// /// public string detailDescription; /// /// /// public int avatarImgId; /// /// /// public int backgroundImgId; /// /// /// public string backgroundUrl; /// /// /// public int authority; /// /// /// public string mutual; /// /// /// public string expertTags; /// /// /// public string experts; /// /// /// public int djStatus; /// /// /// public int vipType; /// /// /// public string remarkName; /// /// /// public int authenticationTypes; /// /// /// public AvatarDetail avatarDetail; /// /// /// public string avatarImgIdStr; /// /// /// public string backgroundImgIdStr; /// /// /// public string anchor; /// /// /// public string avatarImgId_str; } public class Sq { /// /// /// public int br; /// /// /// public int fid; /// /// /// public int size; /// /// /// public int vd; /// /// /// public int sr; } public class TracksItem { /// /// Reunion In The Wind(重逢风中) /// public string name; /// /// /// public int id; /// /// /// public int pst; /// /// /// public int t; /// /// /// public List ar; /// /// /// public List alia; /// /// /// public int pop; /// /// /// public int st; /// /// /// public string rt; /// /// /// public int fee; /// /// /// public int v; /// /// /// public string crbt; /// /// /// public string cf; /// /// /// public Al al; /// /// /// public int dt; /// /// /// public H h; /// /// /// public M m; /// /// /// public L l; /// /// /// public Sq sq; /// /// /// public string hr; /// /// /// public string a; /// /// /// public string cd; /// /// /// public int no; /// /// /// public string rtUrl; /// /// /// public int ftype; /// /// /// public List rtUrls; /// /// /// public int djId; /// /// /// public int copyright; /// /// /// public int s_id; /// /// /// public int mark; /// /// /// public int originCoverType; /// /// /// public string originSongSimpleData; /// /// /// public string tagPicList; /// /// /// public bool resourceState; /// /// /// public int version; /// /// /// public string songJumpInfo; /// /// /// public string entertainmentTags; /// /// /// public int single; /// /// /// public string noCopyrightRcmd; /// /// /// public string rurl; /// /// /// public int mst; /// /// /// public int cp; /// /// /// public int mv; /// /// /// public int rtype; /// /// /// public long publishTime; } public class TrackIdsItem { /// /// /// public int id; /// /// /// public int v; /// /// /// public int t; /// /// /// public int at; /// /// /// public string alg; /// /// /// public int uid; /// /// /// public string rcmdReason; /// /// /// public string sc; /// /// /// public string f; /// /// /// public string sr; } public class Playlist { /// /// /// public long id; /// /// 睡觉听的纯音乐(与君梦中相会) /// public string name { get; set; } /// /// /// public long coverImgId; /// /// /// public string coverImgUrl { get; set; } /// /// /// public string coverImgId_str; /// /// /// public int adType; /// /// /// public long userId; /// /// /// public int createTime; /// /// /// public int status; /// /// /// public bool opRecommend; /// /// /// public bool highQuality; /// /// /// public bool newImported; /// /// /// public int updateTime; /// /// /// public int trackCount; /// /// /// public int specialType; /// /// /// public int privacy; /// /// /// public int trackUpdateTime; /// /// /// public string commentThreadId; /// /// /// public int playCount; /// /// /// public long trackNumberUpdateTime; /// /// /// public int subscribedCount; /// /// /// public int cloudTrackCount; /// /// /// public bool ordered; /// /// /// public string description; /// /// /// public List tags; /// /// /// public string updateFrequency; /// /// /// public int backgroundCoverId; /// /// /// public string backgroundCoverUrl; /// /// /// public int titleImage; /// /// /// public string titleImageUrl; /// /// /// public string englishTitle; /// /// /// public string officialPlaylistType; /// /// /// public bool copied; /// /// /// public string relateResType; /// /// /// public List subscribers; /// /// /// public bool subscribed; /// /// /// public Creators creator; /// /// /// public List tracks; /// /// /// public string videoIds; /// /// /// public string videos; /// /// /// public List trackIds; /// /// /// public string bannedTrackIds; /// /// /// public string mvResourceInfos; /// /// /// public int shareCount; /// /// /// public int commentCount; /// /// /// public string remixVideo; /// /// /// public string sharedUsers; /// /// /// public string historySharedUsers; /// /// /// public string gradeStatus; /// /// /// public string score; /// /// /// public string algTags; } public class FreeTrialPrivileges { /// /// /// public string resConsumable; /// /// /// public string userConsumable; /// /// /// public string listenType; } public class ChargeInfoListItems { /// /// /// public int rate; /// /// /// public string chargeUrl; /// /// /// public string chargeMessage; /// /// /// public int chargeType; } public class PrivilegesItems { /// /// /// public int id; /// /// /// public int fee; /// /// /// public int payed; /// /// /// public int realPayed; /// /// /// public int st; /// /// /// public int pl; /// /// /// public int dl; /// /// /// public int sp; /// /// /// public int cp; /// /// /// public int subp; /// /// /// public string cs; /// /// /// public int maxbr; /// /// /// public int fl; /// /// /// public string pc; /// /// /// public string toast; /// /// /// public int flag; /// /// /// public string paidBigBang; /// /// /// public string preSell; /// /// /// public int playMaxbr; /// /// /// public int downloadMaxbr; /// /// /// public string maxBrLevel; /// /// /// public string playMaxBrLevel; /// /// /// public string downloadMaxBrLevel; /// /// /// public string plLevel; /// /// /// public string dlLevel; /// /// /// public string flLevel; /// /// /// public string rscl; /// /// /// public FreeTrialPrivileges freeTrialPrivilege; /// /// /// public List chargeInfoList; } public class GedanDetail { /// /// /// public long code; /// /// /// public string relatedVideos; /// /// /// public Playlist playlist { get; set; } /// /// /// public string urls; /// /// /// public List privileges; /// /// /// public string sharedPrivilege; /// /// /// public string resEntrance; /// /// /// public string fromUsers; /// /// /// public int fromUserCount; /// /// /// public string songFromUsers; } public class musicCheck { /// /// /// public bool success; /// /// /// public string message; } public class ArItem1 { /// /// /// public int id; /// /// /// public string name; /// /// /// public List tns; /// /// /// public List @alias; } public class Al1 { /// /// /// public int id; /// /// 海阔天空 /// public string name; /// /// /// public string picUrl { get; set; } /// /// /// public List tns; /// /// /// public string pic_str; /// /// /// public long pic; } public class H1 { /// /// /// public int br; /// /// /// public int fid; /// /// /// public int size; /// /// /// public int vd; /// /// /// public int sr; } public class M1 { /// /// /// public int br; /// /// /// public int fid; /// /// /// public int size; /// /// /// public int vd; /// /// /// public int sr; } public class L1 { /// /// /// public int br; /// /// /// public int fid; /// /// /// public int size; /// /// /// public int vd; /// /// /// public int sr; } public class Sq1 { /// /// /// public int br; /// /// /// public int fid; /// /// /// public int size; /// /// /// public int vd; /// /// /// public int sr; } public class SongsItem1 { /// /// 海阔天空 /// public string name { get; set; } /// /// /// public long id; /// /// /// public int pst; /// /// /// public int t; /// /// /// public List ar; /// /// /// public List alia; /// /// /// public int pop; /// /// /// public int st; /// /// /// public string rt; /// /// /// public int fee; /// /// /// public int v; /// /// /// public string crbt; /// /// /// public string cf; /// /// /// public Al1 al { get; set; } /// /// /// public int dt; /// /// /// public H1 h; /// /// /// public M1 m; /// /// /// public L1 l; /// /// /// public Sq1 sq; /// /// /// public string? hr; /// /// /// public string a; /// /// /// public string cd; /// /// /// public int no; /// /// /// public string rtUrl; /// /// /// public int ftype; /// /// /// public List rtUrls; /// /// /// public long djId; /// /// /// public long copyright; /// /// /// public long s_id; /// /// /// public long mark; /// /// /// public int originCoverType; /// /// /// public string originSongSimpleData; /// /// /// public string tagPicList; /// /// /// public string resourceState; /// /// /// public int version; /// /// /// public string songJumpInfo; /// /// /// public string entertainmentTags; /// /// /// public string awardTags; /// /// /// public int single; /// /// /// public string noCopyrightRcmd; /// /// /// public int mv; /// /// /// public int mst; /// /// /// public int cp; /// /// /// public int rtype; /// /// /// public string rurl; /// /// /// public long publishTime; } public class FreeTrialPrivilege1 { /// /// /// public string resConsumable; /// /// /// public string userConsumable; /// /// /// public string listenType; } public class ChargeInfoListItem1 { /// /// /// public long rate; /// /// /// public string chargeUrl; /// /// /// public string chargeMessage; /// /// /// public int chargeType; } public class PrivilegesItem1 { /// /// /// public long id; /// /// /// public int fee; /// /// /// public int payed; /// /// /// public int st; /// /// /// public int pl; /// /// /// public int dl; /// /// /// public int sp; /// /// /// public int cp; /// /// /// public int subp; /// /// /// public string cs; /// /// /// public int maxbr; /// /// /// public int fl; /// /// /// public string toast; /// /// /// public int flag; /// /// /// public string preSell; /// /// /// public int playMaxbr; /// /// /// public int downloadMaxbr; /// /// /// public string maxBrLevel; /// /// /// public string playMaxBrLevel; /// /// /// public string downloadMaxBrLevel; /// /// /// public string plLevel; /// /// /// public string dlLevel; /// /// /// public string flLevel; /// /// /// public string rscl; /// /// /// public FreeTrialPrivilege1 freeTrialPrivilege; /// /// /// public List chargeInfoList; } public class MusicDetail { /// /// /// public List songs { get; set; } /// /// /// public List privileges; /// /// /// public int code; } class IniFile // ini设置文件读取 { string Path; string EXE = Assembly.GetExecutingAssembly().GetName().Name; [DllImport("kernel32", CharSet = CharSet.Unicode)] static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath); [DllImport("kernel32", CharSet = CharSet.Unicode)] static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath); public IniFile(string IniPath = null) { Path = new FileInfo(IniPath ?? EXE + ".ini").FullName; } public string Read(string Key, string Section = null) { var RetVal = new StringBuilder(6000); GetPrivateProfileString(Section ?? EXE, Key, "", RetVal, 6000, Path); return RetVal.ToString(); } public void Write(string Key, string Value, string Section = null) { WritePrivateProfileString(Section ?? EXE, Key, Value, Path); } public void DeleteKey(string Key, string Section = null) { Write(Key, null, Section ?? EXE); } public void DeleteSection(string Section = null) { Write(null, null, Section ?? EXE); } public bool KeyExists(string Key, string Section = null) { return Read(Key, Section).Length > 0; } } public class YunPlgun : IBotPlugin /* or ICorePlugin */ { static IniFile MyIni = new IniFile("plugins/YunSettings.ini"); PlayManager playManager; Ts3Client ts3Client; InvokerData invoker; PlaylistManager playlistManager; ResolveContext resourceFactory; private TsFullClient tsClient; PlayManager tempplayManager; InvokerData tempinvoker; Ts3Client tempts3Client; public static string cookies1; public static bool isEventnotadded = true; public static int playMode; public static int randomPotsition = 0; Player player; public static ArrayList SongQueue = new ArrayList(); SemaphoreSlim slimlock = new SemaphoreSlim(1, 1); public static string WangYiYunAPI_Address; public async void Initialize() { this.playManager = playManager; this.ts3Client = ts3Client; this.playlistManager = playlistManager; this.invoker = invoker; this.resourceFactory = resourceFactory; this.tsClient = tsClient; this.player = player; var playMode_temp = MyIni.Read("playMode"); var cookies1_temp = MyIni.Read("cookies1"); var WangYiYunAPI_Address_temp = MyIni.Read("WangYiYunAPI_Address"); if (playMode_temp == "") { playMode = 0; } else { playMode = int.Parse(MyIni.Read("playMode")); } if (cookies1_temp == "") { cookies1 = ""; } else { cookies1 = MyIni.Read("cookies1"); } if (WangYiYunAPI_Address_temp == "") { WangYiYunAPI_Address = "https://127.0.0.1:3000"; } else { WangYiYunAPI_Address = MyIni.Read("WangYiYunAPI_Address"); } Console.WriteLine("Yun Plugin loaded"); Console.WriteLine(playMode); Console.WriteLine(cookies1); Console.WriteLine(WangYiYunAPI_Address); } public PlayManager GetplayManager() { return this.tempplayManager; } public void setPlplayManager(PlayManager playManager) { this.tempplayManager = playManager; } public InvokerData getinvoker() { return this.tempinvoker; } public void setInvoker(InvokerData invoker) { this.tempinvoker = invoker; } public void setTs3Client(Ts3Client ts3Client) { this.tempts3Client = ts3Client; } public Ts3Client GetTs3Client() { return this.tempts3Client; } public async Task AudioService_Playstoped(object? sender, EventArgs e) //当上一首音乐播放完触发 { await slimlock.WaitAsync(); try { Console.WriteLine("上一首歌结束"); if (playMode == 0) { var invoker = getinvoker(); var playManager = GetplayManager(); var ts3Client = GetTs3Client(); if (SongQueue.Count == 0) { return; } SongQueue.RemoveAt(0); string nextsong = (string)SongQueue[0]; Console.WriteLine(SongQueue.Count.ToString()); Console.WriteLine(nextsong); string musicurl = getMusicUrl(nextsong, true); Console.WriteLine("url:" + musicurl); await MainCommands.CommandPlay(playManager, invoker, musicurl); string musicname = getMusicName(nextsong); ts3Client.SendChannelMessage("正在播放音乐:" + musicname); } if (playMode == 1) { var invoker = getinvoker(); var playManager = GetplayManager(); var ts3Client = GetTs3Client(); if (SongQueue.Count == 0) { return; } string prevSong = (string)SongQueue[0]; SongQueue.RemoveAt(0); string nextsong = (string)SongQueue[0]; SongQueue.Add(prevSong); Console.WriteLine(SongQueue.Count.ToString()); Console.WriteLine(nextsong); string musicurl = getMusicUrl(nextsong, true); Console.WriteLine("url:" + musicurl); await MainCommands.CommandPlay(playManager, invoker, musicurl); string musicname = getMusicName(nextsong); ts3Client.SendChannelMessage("正在播放音乐:" + musicname); } if (playMode == 2) { Random ran = new Random(); var invoker = getinvoker(); var playManager = GetplayManager(); var ts3Client = GetTs3Client(); if (SongQueue.Count == 0) { return; } string prevSong = (string)SongQueue[randomPotsition]; SongQueue.RemoveAt(randomPotsition); randomPotsition = ran.Next(0, SongQueue.Count - 1); string nextsong = (string)SongQueue[randomPotsition]; Console.WriteLine(SongQueue.Count.ToString()); Console.WriteLine(nextsong); string musicurl = getMusicUrl(nextsong, true); Console.WriteLine("url:" + musicurl); await MainCommands.CommandPlay(playManager, invoker, musicurl); string musicname = getMusicName(nextsong); ts3Client.SendChannelMessage("正在播放音乐:" + musicname); } if (playMode == 3) { Random ran = new Random(); var invoker = getinvoker(); var playManager = GetplayManager(); var ts3Client = GetTs3Client(); if (SongQueue.Count == 0) { return; } string prevSong = (string)SongQueue[randomPotsition]; SongQueue.RemoveAt(randomPotsition); randomPotsition = ran.Next(0, SongQueue.Count - 1); string nextsong = (string)SongQueue[randomPotsition]; SongQueue.Add(prevSong); Console.WriteLine(SongQueue.Count.ToString()); Console.WriteLine(nextsong); string musicurl = getMusicUrl(nextsong, true); Console.WriteLine("url:" + musicurl); await MainCommands.CommandPlay(playManager, invoker, musicurl); string musicname = getMusicName(nextsong); ts3Client.SendChannelMessage("正在播放音乐:" + musicname); } } finally { slimlock.Release(); } } [Command("yun mode")] public async Task playmode(int mode) { playMode = mode; MyIni.Write("playMode", mode.ToString()); if (mode == 0) { return ("当前播放模式为顺序播放"); } else if (mode == 1) { return ("当前播放模式为顺序循环"); } else if (mode == 2) { return ("当前播放模式为随机播放"); } else if (mode == 3) { return ("当前播放模式为随机循环"); } else { return ("请输入正确的播放模式"); } } [Command("yun gedanid")] public async Task playgedan(long id, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client, Player player) { if (isEventnotadded) { player.OnSongEnd += AudioService_Playstoped; Console.WriteLine("event added"); isEventnotadded = false; } SongQueue.Clear(); setInvoker(invoker); setPlplayManager(playManager); setTs3Client(ts3Client); string strid = id.ToString(); string url = WangYiYunAPI_Address + "/playlist/detail?id=" + strid; string json = HttpGet(url); GedanDetail gedanDetail = JsonSerializer.Deserialize(json); string gedanname = gedanDetail.playlist.name; string imgurl = gedanDetail.playlist.coverImgUrl; MainCommands.CommandBotDescriptionSet(ts3Client, gedanname); MainCommands.CommandBotAvatarSet(ts3Client, imgurl); await genList(id, SongQueue, ts3Client); string firstmusicid; if (playMode == 2 || playMode == 3) { Random ran = new Random(); randomPotsition = ran.Next(0, SongQueue.Count - 1); firstmusicid = (string)SongQueue[randomPotsition]; } else { randomPotsition = 0; firstmusicid = (string)SongQueue[randomPotsition]; } SongQueue.RemoveAt(randomPotsition); string musicurl = getMusicUrl(firstmusicid, true); Console.WriteLine(firstmusicid); await MainCommands.CommandPlay(playManager, invoker, musicurl); ts3Client.SendChannelMessage("正在播放音乐:" + getMusicName(firstmusicid)); return ("开始播放歌单"); } [Command("yun gedan")] public async Task CommandGedan(string name, PlaylistManager playlistManager, ResolveContext resourceFactory, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client, Player player) { string urlSearch = WangYiYunAPI_Address + "/search?keywords=" + name + "&limit=1&type=1000"; string json = HttpGet(urlSearch); SearchGedan searchgedan = JsonSerializer.Deserialize(json); long gedanid = searchgedan.result.playlists[0].id; if (isEventnotadded) { player.OnSongEnd += AudioService_Playstoped; Console.WriteLine("event added"); isEventnotadded = false; } SongQueue.Clear(); setInvoker(invoker); setPlplayManager(playManager); setTs3Client(ts3Client); string strid = gedanid.ToString(); string url = WangYiYunAPI_Address + "/playlist/detail?id=" + strid; string jsons = HttpGet(url); GedanDetail gedanDetail = JsonSerializer.Deserialize(jsons); string gedanname = gedanDetail.playlist.name; string imgurl = gedanDetail.playlist.coverImgUrl; MainCommands.CommandBotDescriptionSet(ts3Client, gedanname); MainCommands.CommandBotAvatarSet(ts3Client, imgurl); await genList(gedanid, SongQueue, ts3Client); string firstmusicid; if (playMode == 2 || playMode == 3) { Random ran = new Random(); randomPotsition = ran.Next(0, SongQueue.Count - 1); firstmusicid = (string)SongQueue[randomPotsition]; } else { randomPotsition = 0; firstmusicid = (string)SongQueue[randomPotsition]; } SongQueue.RemoveAt(randomPotsition); string musicurl = getMusicUrl(firstmusicid, true); Console.WriteLine(firstmusicid); await MainCommands.CommandPlay(playManager, invoker, musicurl); ts3Client.SendChannelMessage("正在播放音乐:" + getMusicName(firstmusicid)); return ("开始播放歌单"); } [Command("yun play")] public async Task CommandYunPlay(string arguments, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client) { setInvoker(invoker); setPlplayManager(playManager); setTs3Client(ts3Client); string urlSearch = WangYiYunAPI_Address + "/search?keywords=" + arguments + "&limit=1"; string Searchjson = HttpGet(urlSearch); yunSearchSong? yunSearchSong = JsonSerializer.Deserialize(Searchjson); long firstmusicid = yunSearchSong.result.songs[0].id; string firstmusicname = yunSearchSong.result.songs[0].name; Console.WriteLine(firstmusicid + firstmusicname); string musicurl = getMusicUrl(firstmusicid, true); string musicdetailurl = WangYiYunAPI_Address + "/song/detail?ids=" + firstmusicid.ToString(); string musicdetailjson = HttpGet(musicdetailurl); MusicDetail musicDetail = JsonSerializer.Deserialize(musicdetailjson); string musicimgurl = musicDetail.songs[0].al.picUrl; string musicname = musicDetail.songs[0].name; MainCommands.CommandBotAvatarSet(ts3Client, musicimgurl); MainCommands.CommandBotDescriptionSet(ts3Client, musicname); Console.WriteLine(musicurl); if (musicurl != "error") { MainCommands.CommandPlay(playManager, invoker, musicurl); MainCommands.CommandBotDescriptionSet(ts3Client, firstmusicname); ts3Client.SendChannelMessage("正在播放音乐:" + firstmusicname); string result = "正在播放音乐:" + firstmusicname; return (result); } return ("发生未知错误"); } [Command("yun playid")] public async Task CommandYunPlayId(long arguments, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client) { setInvoker(invoker); setPlplayManager(playManager); setTs3Client(ts3Client); string musicurl = getMusicUrl(arguments, true); string musicdetailurl = WangYiYunAPI_Address + "/song/detail?ids=" + arguments; string musicdetailjson = HttpGet(musicdetailurl); MusicDetail musicDetail = JsonSerializer.Deserialize(musicdetailjson); string musicimgurl = musicDetail.songs[0].al.picUrl; string musicname = musicDetail.songs[0].name; MainCommands.CommandBotAvatarSet(ts3Client, musicimgurl); MainCommands.CommandBotDescriptionSet(ts3Client, musicname); Console.WriteLine(musicurl); if (musicurl != "error") { MainCommands.CommandPlay(playManager, invoker, musicurl); ts3Client.SendChannelMessage("正在播放音乐id为:" + arguments.ToString()); string result = "正在播放音乐id为:" + arguments.ToString(); return (result); } return ("发生未知错误"); } [Command("yun add")] public async Task CommandYunAdd(string arguments, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client) { setInvoker(invoker); setPlplayManager(playManager); setTs3Client(ts3Client); string urlSearch = WangYiYunAPI_Address + "/search?keywords=" + arguments + "&limit=1"; string Searchjson = HttpGet(urlSearch); yunSearchSong? yunSearchSong = JsonSerializer.Deserialize(Searchjson); long firstmusicid = yunSearchSong.result.songs[0].id; string firstmusicname = yunSearchSong.result.songs[0].name; Console.WriteLine(firstmusicid + firstmusicname); string musicurl = getMusicUrl(firstmusicid, true); string musicdetailurl = WangYiYunAPI_Address + "/song/detail?ids=" + firstmusicid.ToString(); string musicdetailjson = HttpGet(musicdetailurl); MusicDetail musicDetail = JsonSerializer.Deserialize(musicdetailjson); string musicimgurl = musicDetail.songs[0].al.picUrl; string musicname = musicDetail.songs[0].name; MainCommands.CommandBotAvatarSet(ts3Client, musicimgurl); MainCommands.CommandBotDescriptionSet(ts3Client, musicname); Console.WriteLine(musicurl); if (musicurl != "error") { MainCommands.CommandAdd(playManager, invoker, musicurl); MainCommands.CommandBotDescriptionSet(ts3Client, firstmusicname); ts3Client.SendChannelMessage("以下音乐已经添加到播放列表中:" + firstmusicname); string result = "以下音乐已经添加到播放列表中:" + firstmusicname; return (result); } return ("发生未知错误"); } [Command("yun addid")] public async Task CommandYunAddId(long arguments, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client) { setInvoker(invoker); setPlplayManager(playManager); setTs3Client(ts3Client); string musicurl = getMusicUrl(arguments, true); Console.WriteLine(musicurl); string musicdetailurl = WangYiYunAPI_Address + "/song/detail?ids=" + arguments; string musicdetailjson = HttpGet(musicdetailurl); MusicDetail musicDetail = JsonSerializer.Deserialize(musicdetailjson); string musicimgurl = musicDetail.songs[0].al.picUrl; string musicname = musicDetail.songs[0].name; await MainCommands.CommandBotAvatarSet(ts3Client, musicimgurl); await MainCommands.CommandBotDescriptionSet(ts3Client, musicname); if (musicurl != "error") { MainCommands.CommandAdd(playManager, invoker, musicurl); ts3Client.SendChannelMessage("以下id的音乐已经添加到播放列表中:" + arguments.ToString()); string result = "以下id的音乐已经添加到播放列表中:" + arguments.ToString(); return (result); } return ("发生未知错误"); } [Command("yun next")] public async Task CommandYunNext(PlaylistManager playlistManager, ResolveContext resourceFactory, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client) { setInvoker(invoker); setPlplayManager(playManager); setTs3Client(ts3Client); if (playManager.IsPlaying && SongQueue.Count >= 1) { await playManager.Stop(); if (SongQueue.Count == 0) { return ("播放列表为空"); } if (playMode == 2 || playMode == 3) { Random ran = new Random(); randomPotsition = ran.Next(0, SongQueue.Count - 1); string nextsong = (string)SongQueue[randomPotsition]; SongQueue.RemoveAt(randomPotsition); if (playMode == 3) { SongQueue.Add(nextsong); } Console.WriteLine(SongQueue.Count.ToString()); Console.WriteLine(nextsong); string musicurl = getMusicUrl(nextsong, true); string musicname = getMusicName(nextsong); await ts3Client.SendChannelMessage("正在播放音乐:"+musicname); await MainCommands.CommandPlay(playManager, invoker, musicurl); return ("开始播放下一首音乐"); } else { string nextsong = (string)SongQueue[0]; SongQueue.RemoveAt(0); if (playMode == 1) { SongQueue.Add(nextsong); } Console.WriteLine(SongQueue.Count.ToString()); Console.WriteLine(nextsong); string musicurl = getMusicUrl(nextsong, true); string musicname = getMusicName(nextsong); await ts3Client.SendChannelMessage("正在播放音乐:" + musicname); await MainCommands.CommandPlay(playManager, invoker, musicurl); return ("开始播放下一首音乐"); } } else { return ("无法播放下一首音乐"); } } [Command("yun login")] public static async Task CommanloginAsync(Ts3Client ts3Client, TsFullClient tsClient) { string url1 = WangYiYunAPI_Address + "/login/qr/key" + "?timestamp=" + GetTimeStamp(); string json1 = HttpGet(url1); Console.WriteLine(json1); LoginKey loginKey = JsonSerializer.Deserialize(json1); string key = loginKey.data.unikey; string url2 = WangYiYunAPI_Address + "/login/qr/create?key=" + key + "&qrimg=true×tamp=" + GetTimeStamp(); string json2 = HttpGet(url2); LoginImg loginImg = JsonSerializer.Deserialize(json2); string base64String = loginImg.data.qrimg; await ts3Client.SendChannelMessage("正在生成二维码"); await ts3Client.SendChannelMessage(loginImg.data.qrimg); Console.WriteLine(base64String); string[] img = base64String.Split(","); byte[] bytes = Convert.FromBase64String(img[1]); Stream stream = new MemoryStream(bytes); await tsClient.UploadAvatar(stream); await ts3Client.ChangeDescription("请用网易云APP扫描二维码登陆"); int i = 0; long code; string result; while (true) { string url3 = WangYiYunAPI_Address + "/login/qr/check?key=" + key + "×tamp=" + GetTimeStamp(); string json3 = HttpGet(url3); Console.WriteLine(json3); Status1 status1 = JsonSerializer.Deserialize(json3); code = status1.code; cookies1 = getCookies(); cookies1 = status1.cookie; changeCookies(cookies1); i = i + 1; Thread.Sleep(1000); if (i == 120) { result = "登陆失败或者超时"; await ts3Client.SendChannelMessage("登陆失败或者超时"); break; } if (code == 803) { result = "登陆成功"; await ts3Client.SendChannelMessage("登陆成功"); break; } } await tsClient.DeleteAvatar(); changeCookies(cookies1); MyIni.Write("cookies1", cookies1); return result; } //以下全是功能性函数 public static string getMusicUrl(long id, bool usingcookie = false) //获得歌曲URL { string cookie = getCookies(); string url; if (usingcookie && cookie != "") { url = WangYiYunAPI_Address + "/song/url?id=" + id.ToString() + "&cookie=" + cookie; } else { url = WangYiYunAPI_Address + "/song/url?id=" + id.ToString(); } string musicurljson = HttpGet(url); musicURL musicurl = JsonSerializer.Deserialize(musicurljson); long code = musicurl.code; string mp3 = musicurl.data[0].url; return mp3; } public static string getMusicUrl(string id, bool usingcookie = false)//获得歌曲URL { string cookie = getCookies(); string url; if (usingcookie && cookie != "") { url = WangYiYunAPI_Address + "/song/url?id=" + id + "&cookie=" + cookie; } else { url = WangYiYunAPI_Address + "/song/url?id=" + id; } string musicurljson = HttpGet(url); musicURL musicurl = JsonSerializer.Deserialize(musicurljson); string mp3 = musicurl.data[0].url; return mp3; } public static string getMusicName(long arguments)//获得歌曲名称 { string musicurl = getMusicUrl(arguments, true); Console.WriteLine(musicurl); string musicdetailurl = WangYiYunAPI_Address + "/song/detail?ids=" + arguments; string musicdetailjson = HttpGet(musicdetailurl); MusicDetail musicDetail = JsonSerializer.Deserialize(musicdetailjson); string musicname = musicDetail.songs[0].name; return musicname; } public static string getMusicName(string arguments)//获得歌曲名称 { string musicurl = getMusicUrl(arguments, true); Console.WriteLine(musicurl); string musicdetailurl = WangYiYunAPI_Address + "/song/detail?ids=" + arguments; string musicdetailjson = HttpGet(musicdetailurl); MusicDetail musicDetail = JsonSerializer.Deserialize(musicdetailjson); string musicname = musicDetail.songs[0].name; return musicname; } public static string HttpGet(string url)//Http请求 { //ServicePolongManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); Encoding encoding = Encoding.UTF8; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.Accept = "text/html, application/xhtml+xml, */*"; request.ContentType = "application/json"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd(); } } public static string getCookies() //读取cookie { return cookies1; } public static void changeCookies(string newcookies) //更改cookie { cookies1 = newcookies; } public static string GetTimeStamp() //获得时间戳 { TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0); return Convert.ToInt64(ts.TotalSeconds).ToString(); } public static async Task genList(long id, ArrayList SongQueue, Ts3Client ts3Client) //生成歌单 { string gedanid = id.ToString(); string url = WangYiYunAPI_Address + "/playlist/track/all?id=" + gedanid; string gedanjson = HttpGet(url); GeDan Gedans = JsonSerializer.Deserialize(gedanjson); long numOfSongs = Gedans.songs.Count(); if (numOfSongs > 100) { Console.WriteLine("警告歌单过大,可能需要一定的时间生成"); } for (int i = 0; i < numOfSongs; i++) { long musicid = Gedans.songs[i].id; if (musicid > 0) { SongQueue.Add(musicid.ToString()); } } } public void Dispose() { SongQueue.Clear(); } } ================================================ FILE: obj/ClassLibrary4.csproj.nuget.dgspec.json ================================================ { "format": 1, "restore": { "C:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\ClassLibrary4.csproj": {} }, "projects": { "C:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\ClassLibrary4.csproj": { "version": "1.0.0", "restore": { "projectUniqueName": "C:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\ClassLibrary4.csproj", "projectName": "YunBot", "projectPath": "C:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\ClassLibrary4.csproj", "packagesPath": "C:\\Users\\Saopig\\.nuget\\packages\\", "outputPath": "C:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\obj\\", "projectStyle": "PackageReference", "configFilePaths": [ "C:\\Users\\Saopig\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": { "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj": { "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj" }, "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj" } } } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" } } }, "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj": { "version": "1.0.0", "restore": { "projectUniqueName": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "projectName": "TS3AudioBot", "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "packagesPath": "C:\\Users\\Saopig\\.nuget\\packages\\", "outputPath": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\", "projectStyle": "PackageReference", "configFilePaths": [ "C:\\Users\\Saopig\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": { "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj" } } } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "dependencies": { "CliWrap": { "target": "Package", "version": "[3.1.0, )" }, "CommandLineParser": { "target": "Package", "version": "[2.8.0, )" }, "LiteDB": { "target": "Package", "version": "[4.1.4, )" }, "Microsoft.AspNetCore.Cors": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.Server.Kestrel": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.AspNetCore.StaticFiles": { "target": "Package", "version": "[2.2.0, )" }, "Microsoft.CodeAnalysis.CSharp": { "include": "Runtime, Compile, Build, Native, ContentFiles, BuildTransitive", "target": "Package", "version": "[3.7.0, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Nett": { "target": "Package", "version": "[0.15.0, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "PlaylistsNET": { "target": "Package", "version": "[1.1.2, )" }, "SixLabors.ImageSharp": { "target": "Package", "version": "[1.0.0, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" } } }, "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "version": "1.1.0", "restore": { "projectUniqueName": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "projectName": "Splamy.TSLib", "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "packagesPath": "C:\\Users\\Saopig\\.nuget\\packages\\", "outputPath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\", "projectStyle": "PackageReference", "crossTargeting": true, "configFilePaths": [ "C:\\Users\\Saopig\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1", "netstandard2.0", "netstandard2.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": {} }, "netstandard2.0": { "targetAlias": "netstandard2.0", "projectReferences": {} }, "netstandard2.1": { "targetAlias": "netstandard2.1", "projectReferences": {} } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" }, "netstandard2.0": { "targetAlias": "netstandard2.0", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NETStandard.Library": { "suppressParent": "All", "target": "Package", "version": "[2.0.3, )", "autoReferenced": true }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" }, "System.Memory": { "target": "Package", "version": "[4.5.4, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" }, "netstandard2.1": { "targetAlias": "netstandard2.1", "dependencies": { "Heijden.Dns.Portable": { "target": "Package", "version": "[2.0.19, )" }, "NLog": { "target": "Package", "version": "[4.7.3, )" }, "Newtonsoft.Json": { "target": "Package", "version": "[12.0.3, )" }, "Nullable": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", "version": "[1.2.1, )" }, "Portable.BouncyCastle": { "target": "Package", "version": "[1.8.6.7, )" }, "Splamy.Ed25519.Toolkit": { "target": "Package", "version": "[1.0.3, )" }, "System.IO.Pipelines": { "target": "Package", "version": "[4.7.2, )" } }, "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "NETStandard.Library": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" } } } } } ================================================ FILE: obj/ClassLibrary4.csproj.nuget.g.props ================================================  True NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ C:\Users\Saopig\.nuget\packages\ PackageReference 5.11.4 $(MSBuildAllProjects);$(MSBuildThisFileFullPath) C:\Users\Saopig\.nuget\packages\microsoft.codeanalysis.analyzers\3.0.0 ================================================ FILE: obj/ClassLibrary4.csproj.nuget.g.targets ================================================  $(MSBuildAllProjects);$(MSBuildThisFileFullPath) ================================================ FILE: obj/Debug/netcoreapp3.0/ClassLibrary4.csproj.FileListAbsolute.txt ================================================ ================================================ FILE: obj/Debug/netcoreapp3.1/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs ================================================ // using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v3.1", FrameworkDisplayName = "")] ================================================ FILE: obj/Debug/netcoreapp3.1/ClassLibrary4.AssemblyInfo.cs ================================================ //------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("YunBot")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] [assembly: System.Reflection.AssemblyProductAttribute("YunBot")] [assembly: System.Reflection.AssemblyTitleAttribute("YunBot")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] // 由 MSBuild WriteCodeFragment 类生成。 ================================================ FILE: obj/Debug/netcoreapp3.1/ClassLibrary4.AssemblyInfoInputs.cache ================================================ bccab723f9c417e391763d19aee94312261e8633 ================================================ FILE: obj/Debug/netcoreapp3.1/ClassLibrary4.GeneratedMSBuildEditorConfig.editorconfig ================================================ is_global = true build_property.RootNamespace = ClassLibrary4 build_property.ProjectDir = C:\Users\Saopig\source\repos\ClassLibrary4\ ================================================ FILE: obj/Debug/netcoreapp3.1/ClassLibrary4.csproj.CopyComplete ================================================ ================================================ FILE: obj/Debug/netcoreapp3.1/ClassLibrary4.csproj.CoreCompileInputs.cache ================================================ d73a8a7dbbf58e381775d4094925e5bb305ad7f3 ================================================ FILE: obj/Debug/netcoreapp3.1/ClassLibrary4.csproj.FileListAbsolute.txt ================================================ C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\TS3AudioBot.deps.json C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\TS3AudioBot.runtimeconfig.json C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\TS3AudioBot.runtimeconfig.dev.json C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\TS3AudioBot.exe C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\lib\x64\libopus.dll C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\lib\x86\libopus.dll C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\YunBot.deps.json C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\YunBot.dll C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\YunBot.pdb C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\TS3AudioBot.dll C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\TSLib.dll C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\TS3AudioBot.pdb C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\TS3AudioBot.dll.config C:\Users\Saopig\source\repos\ClassLibrary4\bin\Debug\netcoreapp3.1\TSLib.pdb C:\Users\Saopig\source\repos\ClassLibrary4\obj\Debug\netcoreapp3.1\ClassLibrary4.csproj.AssemblyReference.cache C:\Users\Saopig\source\repos\ClassLibrary4\obj\Debug\netcoreapp3.1\ClassLibrary4.GeneratedMSBuildEditorConfig.editorconfig C:\Users\Saopig\source\repos\ClassLibrary4\obj\Debug\netcoreapp3.1\ClassLibrary4.AssemblyInfoInputs.cache C:\Users\Saopig\source\repos\ClassLibrary4\obj\Debug\netcoreapp3.1\ClassLibrary4.AssemblyInfo.cs C:\Users\Saopig\source\repos\ClassLibrary4\obj\Debug\netcoreapp3.1\ClassLibrary4.csproj.CoreCompileInputs.cache C:\Users\Saopig\source\repos\ClassLibrary4\obj\Debug\netcoreapp3.1\ClassLibrary4.csproj.CopyComplete C:\Users\Saopig\source\repos\ClassLibrary4\obj\Debug\netcoreapp3.1\YunBot.dll C:\Users\Saopig\source\repos\ClassLibrary4\obj\Debug\netcoreapp3.1\YunBot.pdb ================================================ FILE: obj/project.assets.json ================================================ { "version": 3, "targets": { ".NETCoreApp,Version=v3.1": { "CliWrap/3.1.0": { "type": "package", "compile": { "lib/netcoreapp3.0/CliWrap.dll": {} }, "runtime": { "lib/netcoreapp3.0/CliWrap.dll": {} } }, "CommandLineParser/2.8.0": { "type": "package", "compile": { "lib/netstandard2.0/CommandLine.dll": {} }, "runtime": { "lib/netstandard2.0/CommandLine.dll": {} } }, "Heijden.Dns.Portable/2.0.19": { "type": "package", "dependencies": { "System.Net.NetworkInformation": "4.3.0", "System.Net.Sockets": "4.3.0" }, "compile": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} }, "runtime": { "lib/netstandard1.3/Heijden.Dns.Portable.dll": {} } }, "LiteDB/4.1.4": { "type": "package", "dependencies": { "System.Reflection": "4.3.0", "System.Reflection.TypeExtensions": "4.3.0" }, "compile": { "lib/netstandard2.0/LiteDB.dll": {} }, "runtime": { "lib/netstandard2.0/LiteDB.dll": {} } }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.IO.Pipelines": "4.5.2" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll": {} } }, "Microsoft.AspNetCore.Cors/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll": {} } }, "Microsoft.AspNetCore.Hosting/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.Configuration.EnvironmentVariables": "2.2.0", "Microsoft.Extensions.Configuration.FileExtensions": "2.2.0", "Microsoft.Extensions.DependencyInjection": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0", "Microsoft.Extensions.Logging": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Diagnostics.DiagnosticSource": "4.5.0", "System.Reflection.Metadata": "1.6.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll": {} } }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Server.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.Hosting.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll": {} } }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": {} } }, "Microsoft.AspNetCore.Http/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.ObjectPool": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll": {} } }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Features": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll": {} } }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Buffers": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll": {} } }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll": {} } }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Https": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll": {} } }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.AspNetCore.WebUtilities": "2.2.0", "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "Microsoft.Net.Http.Headers": "2.2.0", "System.Memory": "4.5.1", "System.Numerics.Vectors": "4.5.0", "System.Runtime.CompilerServices.Unsafe": "4.5.1", "System.Security.Cryptography.Cng": "4.5.0", "System.Threading.Tasks.Extensions": "4.5.1" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": {} }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll": {} } }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Core": "2.2.0" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": {} }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll": {} } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Connections.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll": {} } }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": {} }, "runtime": { "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll": {} } }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "type": "package", "dependencies": { "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", "Microsoft.AspNetCore.Http.Extensions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.WebEncoders": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll": {} } }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "type": "package", "dependencies": { "Microsoft.Net.Http.Headers": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll": {} } }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": { "type": "package", "build": { "build/_._": {} } }, "Microsoft.CodeAnalysis.Common/3.7.0": { "type": "package", "dependencies": { "Microsoft.CodeAnalysis.Analyzers": "3.0.0", "System.Collections.Immutable": "1.5.0", "System.Memory": "4.5.4", "System.Reflection.Metadata": "1.6.0", "System.Runtime.CompilerServices.Unsafe": "4.7.0", "System.Text.Encoding.CodePages": "4.5.1", "System.Threading.Tasks.Extensions": "4.5.3" }, "compile": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": {} }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": {} }, "resource": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "type": "package", "dependencies": { "Microsoft.CodeAnalysis.Common": "[3.7.0]" }, "compile": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": {} }, "runtime": { "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": {} }, "resource": { "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "cs" }, "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "de" }, "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "es" }, "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "fr" }, "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "it" }, "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ja" }, "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ko" }, "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pl" }, "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "pt-BR" }, "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "ru" }, "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "tr" }, "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hans" }, "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": { "locale": "zh-Hant" } } }, "Microsoft.Extensions.Configuration/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": {} } }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": {} } }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": {} } }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": {} } }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration": "2.2.0", "Microsoft.Extensions.FileProviders.Physical": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": {} } }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0" }, "compile": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": {} }, "runtime": { "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll": {} } }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {} } }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll": {} } }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.FileSystemGlobbing": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll": {} } }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll": {} } }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll": {} } }, "Microsoft.Extensions.Logging/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Configuration.Binder": "2.2.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": {} } }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": {} } }, "Microsoft.Extensions.ObjectPool/2.2.0": { "type": "package", "compile": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": {} } }, "Microsoft.Extensions.Options/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Primitives": "2.2.0", "System.ComponentModel.Annotations": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Options.dll": {} } }, "Microsoft.Extensions.Primitives/2.2.0": { "type": "package", "dependencies": { "System.Memory": "4.5.1", "System.Runtime.CompilerServices.Unsafe": "4.5.1" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": {} } }, "Microsoft.Extensions.WebEncoders/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0", "System.Text.Encodings.Web": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll": {} } }, "Microsoft.Net.Http.Headers/2.2.0": { "type": "package", "dependencies": { "Microsoft.Extensions.Primitives": "2.2.0", "System.Buffers": "4.5.0" }, "compile": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": {} }, "runtime": { "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll": {} } }, "Microsoft.NETCore.Platforms/2.1.2": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "Nett/0.15.0": { "type": "package", "compile": { "lib/netstandard2.0/Nett.dll": {} }, "runtime": { "lib/netstandard2.0/Nett.dll": {} } }, "Newtonsoft.Json/12.0.3": { "type": "package", "compile": { "lib/netstandard2.0/Newtonsoft.Json.dll": {} }, "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": {} } }, "NLog/4.7.3": { "type": "package", "compile": { "lib/netstandard2.0/NLog.dll": {} }, "runtime": { "lib/netstandard2.0/NLog.dll": {} } }, "PlaylistsNET/1.1.2": { "type": "package", "compile": { "lib/netstandard2.0/PlaylistsNET.dll": {} }, "runtime": { "lib/netstandard2.0/PlaylistsNET.dll": {} } }, "Portable.BouncyCastle/1.8.6.7": { "type": "package", "compile": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": {} }, "runtime": { "lib/netstandard2.0/BouncyCastle.Crypto.dll": {} } }, "runtime.native.System/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "SixLabors.ImageSharp/1.0.0": { "type": "package", "compile": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": {} }, "runtime": { "lib/netcoreapp3.1/SixLabors.ImageSharp.dll": {} } }, "Splamy.Ed25519.Toolkit/1.0.3": { "type": "package", "compile": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} }, "runtime": { "lib/netcoreapp2.1/Chaos.NaCl.dll": {} } }, "System.Buffers/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Collections/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.Collections.Immutable/1.5.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Collections.Immutable.dll": {} }, "runtime": { "lib/netstandard2.0/System.Collections.Immutable.dll": {} } }, "System.ComponentModel.Annotations/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.Diagnostics.DiagnosticSource/4.5.0": { "type": "package", "compile": { "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": {} }, "runtime": { "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": {} } }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Globalization/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.IO/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.5/System.IO.dll": {} } }, "System.IO.FileSystem/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} } }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} } }, "System.IO.Pipelines/4.7.2": { "type": "package", "compile": { "ref/netcoreapp2.0/System.IO.Pipelines.dll": {} }, "runtime": { "lib/netcoreapp3.0/System.IO.Pipelines.dll": {} } }, "System.Linq/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0" }, "compile": { "ref/netstandard1.6/_._": {} }, "runtime": { "lib/netstandard1.6/System.Linq.dll": {} } }, "System.Memory/4.5.4": { "type": "package", "compile": { "ref/netcoreapp2.1/_._": {} }, "runtime": { "lib/netcoreapp2.1/_._": {} } }, "System.Net.NetworkInformation/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Tracing": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.IO.FileSystem": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", "System.Linq": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Net.Sockets": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Principal.Windows": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Overlapped": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", "runtime.native.System": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.NetworkInformation.dll": {} }, "runtimeTargets": { "runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "linux" }, "runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "osx" }, "runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Net.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Primitives.dll": {} } }, "System.Net.Sockets/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Net.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Net.Sockets.dll": {} } }, "System.Numerics.Vectors/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.0/_._": {} }, "runtime": { "lib/netcoreapp2.0/_._": {} } }, "System.Reflection/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.IO": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Reflection.dll": {} } }, "System.Reflection.Metadata/1.6.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Reflection.Metadata.dll": {} }, "runtime": { "lib/netstandard2.0/System.Reflection.Metadata.dll": {} } }, "System.Reflection.Primitives/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/System.Reflection.Primitives.dll": {} } }, "System.Reflection.TypeExtensions/4.3.0": { "type": "package", "dependencies": { "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/System.Reflection.TypeExtensions.dll": {} }, "runtime": { "lib/netstandard1.5/System.Reflection.TypeExtensions.dll": {} } }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Globalization": "4.3.0", "System.Reflection": "4.3.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": {} } }, "System.Runtime/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0" }, "compile": { "ref/netstandard1.5/System.Runtime.dll": {} } }, "System.Runtime.CompilerServices.Unsafe/4.7.0": { "type": "package", "compile": { "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": {} }, "runtime": { "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll": {} } }, "System.Runtime.Extensions/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.5/_._": {} } }, "System.Runtime.Handles/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Runtime.Handles.dll": {} } }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Reflection": "4.3.0", "System.Reflection.Primitives": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netcoreapp1.1/_._": {} } }, "System.Security.Claims/4.3.0": { "type": "package", "dependencies": { "System.Collections": "4.3.0", "System.Globalization": "4.3.0", "System.IO": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Security.Principal": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Security.Claims.dll": {} } }, "System.Security.Cryptography.Cng/4.5.0": { "type": "package", "compile": { "ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll": {} }, "runtime": { "lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll": {} }, "runtimeTargets": { "runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Security.Principal/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/System.Security.Principal.dll": {} } }, "System.Security.Principal.Windows/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.Collections": "4.3.0", "System.Diagnostics.Debug": "4.3.0", "System.Reflection": "4.3.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Extensions": "4.3.0", "System.Runtime.Handles": "4.3.0", "System.Runtime.InteropServices": "4.3.0", "System.Security.Claims": "4.3.0", "System.Security.Principal": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Threading": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Text.Encoding/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Text.Encoding.dll": {} } }, "System.Text.Encoding.CodePages/4.5.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "2.1.2", "System.Runtime.CompilerServices.Unsafe": "4.5.2" }, "compile": { "lib/netstandard2.0/System.Text.Encoding.CodePages.dll": {} }, "runtime": { "lib/netstandard2.0/System.Text.Encoding.CodePages.dll": {} }, "runtimeTargets": { "runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Text.Encodings.Web/4.5.0": { "type": "package", "compile": { "lib/netstandard2.0/System.Text.Encodings.Web.dll": {} }, "runtime": { "lib/netstandard2.0/System.Text.Encodings.Web.dll": {} } }, "System.Threading/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Threading.Tasks": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.dll": {} } }, "System.Threading.Overlapped/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "System.Resources.ResourceManager": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Threading.Tasks/4.3.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/System.Threading.Tasks.dll": {} } }, "System.Threading.Tasks.Extensions/4.5.3": { "type": "package", "compile": { "ref/netcoreapp2.1/_._": {} }, "runtime": { "lib/netcoreapp2.1/_._": {} } }, "System.Threading.Thread/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.Thread.dll": {} } }, "System.Threading.ThreadPool/4.3.0": { "type": "package", "dependencies": { "System.Runtime": "4.3.0", "System.Runtime.Handles": "4.3.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Threading.ThreadPool.dll": {} } }, "Splamy.TSLib/1.1.0": { "type": "project", "framework": ".NETCoreApp,Version=v3.1", "dependencies": { "Heijden.Dns.Portable": "2.0.19", "NLog": "4.7.3", "Newtonsoft.Json": "12.0.3", "Portable.BouncyCastle": "1.8.6.7", "Splamy.Ed25519.Toolkit": "1.0.3", "System.IO.Pipelines": "4.7.2" }, "compile": { "bin/placeholder/Splamy.TSLib.dll": {} }, "runtime": { "bin/placeholder/Splamy.TSLib.dll": {} } }, "TS3AudioBot/1.0.0": { "type": "project", "framework": ".NETCoreApp,Version=v3.1", "dependencies": { "CliWrap": "3.1.0", "CommandLineParser": "2.8.0", "LiteDB": "4.1.4", "Microsoft.AspNetCore.Cors": "2.2.0", "Microsoft.AspNetCore.Server.Kestrel": "2.2.0", "Microsoft.AspNetCore.StaticFiles": "2.2.0", "Microsoft.CodeAnalysis.CSharp": "3.7.0", "NLog": "4.7.3", "Nett": "0.15.0", "Newtonsoft.Json": "12.0.3", "PlaylistsNET": "1.1.2", "SixLabors.ImageSharp": "1.0.0", "Splamy.TSLib": "1.1.0" }, "compile": { "bin/placeholder/TS3AudioBot.dll": {} }, "runtime": { "bin/placeholder/TS3AudioBot.dll": {} } } } }, "libraries": { "CliWrap/3.1.0": { "sha512": "vbQ+rpxRgdkWBHmZXl8De4PYzKTOxa37Tfz6Zb01OP8f7eFBOjCj5IY2+Ghb81pPMA6rCDPrYEbod1EzbcFG2w==", "type": "package", "path": "cliwrap/3.1.0", "files": [ ".nupkg.metadata", ".signature.p7s", "cliwrap.3.1.0.nupkg.sha512", "cliwrap.nuspec", "favicon.png", "lib/net461/CliWrap.dll", "lib/net461/CliWrap.xml", "lib/netcoreapp3.0/CliWrap.dll", "lib/netcoreapp3.0/CliWrap.xml", "lib/netstandard2.0/CliWrap.dll", "lib/netstandard2.0/CliWrap.xml", "lib/netstandard2.1/CliWrap.dll", "lib/netstandard2.1/CliWrap.xml" ] }, "CommandLineParser/2.8.0": { "sha512": "eco2HlKQBY4Joz9odHigzGpVzv6pjsXnY5lziioMveQxr+i2Z7xYcIOMeZTgYiqnMtMAbXMXsVhrNfWO5vJS8Q==", "type": "package", "path": "commandlineparser/2.8.0", "files": [ ".nupkg.metadata", ".signature.p7s", "CommandLine20.png", "License.md", "README.md", "commandlineparser.2.8.0.nupkg.sha512", "commandlineparser.nuspec", "lib/net40/CommandLine.dll", "lib/net40/CommandLine.xml", "lib/net45/CommandLine.dll", "lib/net45/CommandLine.xml", "lib/net461/CommandLine.dll", "lib/net461/CommandLine.xml", "lib/netstandard2.0/CommandLine.dll", "lib/netstandard2.0/CommandLine.xml" ] }, "Heijden.Dns.Portable/2.0.19": { "sha512": "i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==", "type": "package", "path": "heijden.dns.portable/2.0.19", "files": [ ".nupkg.metadata", ".signature.p7s", "heijden.dns.portable.2.0.19.nupkg.sha512", "heijden.dns.portable.nuspec", "lib/netstandard1.3/Heijden.Dns.Portable.dll" ] }, "LiteDB/4.1.4": { "sha512": "g4g9JlHzRBZl+Gd2UbiRdszZ7t8wozU2wX7+5xY5uE79tmcgcDhha+ubAP84G1VLbwQmhBGCzRfIx+epLmJciQ==", "type": "package", "path": "litedb/4.1.4", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net35/LiteDB.dll", "lib/net35/LiteDB.xml", "lib/net40/LiteDB.dll", "lib/net40/LiteDB.xml", "lib/netstandard1.3/LiteDB.dll", "lib/netstandard1.3/LiteDB.xml", "lib/netstandard2.0/LiteDB.dll", "lib/netstandard2.0/LiteDB.xml", "litedb.4.1.4.nupkg.sha512", "litedb.nuspec" ] }, "Microsoft.AspNetCore.Connections.Abstractions/2.2.0": { "sha512": "Aqr/16Cu5XmGv7mLKJvXRxhhd05UJ7cTTSaUV4MZ3ynAzfgWjsAdpIU8FWuxwAjmVdmI8oOWuVDrbs+sRkhKnA==", "type": "package", "path": "microsoft.aspnetcore.connections.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.xml", "microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.connections.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Cors/2.2.0": { "sha512": "LFlTM3ThS3ZCILuKnjy8HyK9/IlDh3opogdbCVx6tMGyDzTQBgMPXLjGDLtMk5QmLDCcP3l1TO3z/+1viA8GUg==", "type": "package", "path": "microsoft.aspnetcore.cors/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Cors.xml", "microsoft.aspnetcore.cors.2.2.0.nupkg.sha512", "microsoft.aspnetcore.cors.nuspec" ] }, "Microsoft.AspNetCore.Hosting/2.2.0": { "sha512": "7t4RbUGugpHtQmzAkc9fpDdYJg6t/jcB2VVnjensVYbZFnLDU8pNrG0hrekk1DQG7P2UzpSqKLzDsFF0/lkkbw==", "type": "package", "path": "microsoft.aspnetcore.hosting/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.xml", "microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512", "microsoft.aspnetcore.hosting.nuspec" ] }, "Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": { "sha512": "ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==", "type": "package", "path": "microsoft.aspnetcore.hosting.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.xml", "microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.hosting.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": { "sha512": "1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==", "type": "package", "path": "microsoft.aspnetcore.hosting.server.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.xml", "microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.hosting.server.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Http/2.2.0": { "sha512": "YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==", "type": "package", "path": "microsoft.aspnetcore.http/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.xml", "microsoft.aspnetcore.http.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.nuspec" ] }, "Microsoft.AspNetCore.Http.Abstractions/2.2.0": { "sha512": "Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==", "type": "package", "path": "microsoft.aspnetcore.http.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.xml", "microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Http.Extensions/2.2.0": { "sha512": "2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==", "type": "package", "path": "microsoft.aspnetcore.http.extensions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.xml", "microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.extensions.nuspec" ] }, "Microsoft.AspNetCore.Http.Features/2.2.0": { "sha512": "ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==", "type": "package", "path": "microsoft.aspnetcore.http.features/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.xml", "microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512", "microsoft.aspnetcore.http.features.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel/2.2.0": { "sha512": "D0vGB8Tp0UNMiAhT+pwAVeqDDx2OFrfpu/plwm0WhA+1DZvTLc99eDwGISL6LAY8x7a12lhl9w7/m+VdoyDu8Q==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.xml", "microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0": { "sha512": "F6/Vesd3ODq/ISbHfcvfRf7IzRtTvrNX8VA36Knm5e7bteJhoRA2GKQUVQ+neoO1njLvaQKnjcA3rdCZ6AF6cg==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.core/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.xml", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.xml", "microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.core.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0": { "sha512": "nEH5mU6idUYS3/+9BKw2stMOM25ZdGwIH4P4kyj6PVkMPgQUTkBQ7l/ScPkepdhejcOlPa+g3+M4dYsSYPUJ8g==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.https/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.xml", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.xml", "microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.https.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0": { "sha512": "j1ai2CG8BGp4mYf2TWSFjjy1pRgW9XbqhdR4EOVvrlFVbcpEPfXNIPEdjkcgK+txWCupGzkFnFF8oZsASMtmyw==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.transport.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.xml", "microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.transport.abstractions.nuspec" ] }, "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0": { "sha512": "qTACI0wePgAKCH+YKrMgChyfqJpjwgGZEtSuwBw6TjWLQ66THGasleia/7EZz2t2eAjwWxw8RA/D8ODrBqpj9A==", "type": "package", "path": "microsoft.aspnetcore.server.kestrel.transport.sockets/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll", "lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll", "lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml", "microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512", "microsoft.aspnetcore.server.kestrel.transport.sockets.nuspec" ] }, "Microsoft.AspNetCore.StaticFiles/2.2.0": { "sha512": "byZDrjir6Co5EoWbraQyG0qbPCUG6XgGYQstipMF9lucOAjq/mqnIyt8B8iMWnin/ghZoOln9Y01af4rUAwOhA==", "type": "package", "path": "microsoft.aspnetcore.staticfiles/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll", "lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.xml", "microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512", "microsoft.aspnetcore.staticfiles.nuspec" ] }, "Microsoft.AspNetCore.WebUtilities/2.2.0": { "sha512": "9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==", "type": "package", "path": "microsoft.aspnetcore.webutilities/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll", "lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.xml", "microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512", "microsoft.aspnetcore.webutilities.nuspec" ] }, "Microsoft.CodeAnalysis.Analyzers/3.0.0": { "sha512": "ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g==", "type": "package", "path": "microsoft.codeanalysis.analyzers/3.0.0", "hasTools": true, "files": [ ".nupkg.metadata", ".signature.p7s", "EULA.rtf", "ThirdPartyNotices.rtf", "analyzers/dotnet/cs/Microsoft.CodeAnalysis.Analyzers.dll", "analyzers/dotnet/cs/Microsoft.CodeAnalysis.CSharp.Analyzers.dll", "analyzers/dotnet/cs/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/de/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/es/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/it/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/cs/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/Microsoft.CodeAnalysis.Analyzers.dll", "analyzers/dotnet/vb/Microsoft.CodeAnalysis.VisualBasic.Analyzers.dll", "analyzers/dotnet/vb/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/de/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/es/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/it/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll", "analyzers/dotnet/vb/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll", "build/Microsoft.CodeAnalysis.Analyzers.props", "build/Microsoft.CodeAnalysis.Analyzers.targets", "documentation/Analyzer Configuration.md", "documentation/Microsoft.CodeAnalysis.Analyzers.md", "documentation/Microsoft.CodeAnalysis.Analyzers.sarif", "editorconfig/AllRulesDefault/.editorconfig", "editorconfig/AllRulesDisabled/.editorconfig", "editorconfig/AllRulesEnabled/.editorconfig", "editorconfig/CorrectnessRulesDefault/.editorconfig", "editorconfig/CorrectnessRulesEnabled/.editorconfig", "editorconfig/DataflowRulesDefault/.editorconfig", "editorconfig/DataflowRulesEnabled/.editorconfig", "editorconfig/LibraryRulesDefault/.editorconfig", "editorconfig/LibraryRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCompatibilityRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCompatibilityRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCorrectnessRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisCorrectnessRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDesignRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDesignRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDocumentationRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisDocumentationRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisLocalizationRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisLocalizationRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisPerformanceRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisPerformanceRulesEnabled/.editorconfig", "editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesDefault/.editorconfig", "editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled/.editorconfig", "editorconfig/PortedFromFxCopRulesDefault/.editorconfig", "editorconfig/PortedFromFxCopRulesEnabled/.editorconfig", "microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512", "microsoft.codeanalysis.analyzers.nuspec", "rulesets/AllRulesDefault.ruleset", "rulesets/AllRulesDisabled.ruleset", "rulesets/AllRulesEnabled.ruleset", "rulesets/CorrectnessRulesDefault.ruleset", "rulesets/CorrectnessRulesEnabled.ruleset", "rulesets/DataflowRulesDefault.ruleset", "rulesets/DataflowRulesEnabled.ruleset", "rulesets/LibraryRulesDefault.ruleset", "rulesets/LibraryRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisCompatibilityRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisCompatibilityRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisCorrectnessRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisCorrectnessRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisDesignRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisDesignRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisDocumentationRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisDocumentationRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisLocalizationRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisLocalizationRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisPerformanceRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisPerformanceRulesEnabled.ruleset", "rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesDefault.ruleset", "rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled.ruleset", "rulesets/PortedFromFxCopRulesDefault.ruleset", "rulesets/PortedFromFxCopRulesEnabled.ruleset", "tools/install.ps1", "tools/uninstall.ps1" ] }, "Microsoft.CodeAnalysis.Common/3.7.0": { "sha512": "SFEdnbw8204hTlde3JePYSIpNX58h/MMXa7LctUsUDigWMR8Ar9gE8LnsLqAIFM0O33JEuQbJ0G4Sat+cPGldw==", "type": "package", "path": "microsoft.codeanalysis.common/3.7.0", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "ThirdPartyNotices.rtf", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.pdb", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.xml", "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll", "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.pdb", "lib/netstandard2.0/Microsoft.CodeAnalysis.xml", "lib/netstandard2.0/cs/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/de/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/es/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/fr/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/it/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/ja/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/ko/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/pl/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/ru/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/tr/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll", "lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll", "microsoft.codeanalysis.common.3.7.0.nupkg.sha512", "microsoft.codeanalysis.common.nuspec" ] }, "Microsoft.CodeAnalysis.CSharp/3.7.0": { "sha512": "sKi5PIVy9nVDerkbplY6OQhJBNzEO4XJsMGrnmb6KFEa6K1ulGCHIv6NtDjdUQ/dGrouU3OExc3yzww0COD76w==", "type": "package", "path": "microsoft.codeanalysis.csharp/3.7.0", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "ThirdPartyNotices.rtf", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.pdb", "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.xml", "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.dll", "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.pdb", "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.xml", "lib/netstandard2.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll", "lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll", "microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512", "microsoft.codeanalysis.csharp.nuspec" ] }, "Microsoft.Extensions.Configuration/2.2.0": { "sha512": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==", "type": "package", "path": "microsoft.extensions.configuration/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.xml", "microsoft.extensions.configuration.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.nuspec" ] }, "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { "sha512": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", "type": "package", "path": "microsoft.extensions.configuration.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.xml", "microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.abstractions.nuspec" ] }, "Microsoft.Extensions.Configuration.Binder/2.2.0": { "sha512": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==", "type": "package", "path": "microsoft.extensions.configuration.binder/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.xml", "microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.binder.nuspec" ] }, "Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0": { "sha512": "gIqt9PkKO01hZ0zmHnWrZ1E45MDreZTVoyDbL1kMWKtDgxxWTJpYtESTEcgpvR1uB1iex1zKGYzJpOMgmuP5TQ==", "type": "package", "path": "microsoft.extensions.configuration.environmentvariables/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.xml", "microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.environmentvariables.nuspec" ] }, "Microsoft.Extensions.Configuration.FileExtensions/2.2.0": { "sha512": "H1qCpWBC8Ed4tguTR/qYkbb3F6DI5Su3t8xyFo3/5MzAd8PwPpHzgX8X04KbBxKmk173Pb64x7xMHarczVFQUA==", "type": "package", "path": "microsoft.extensions.configuration.fileextensions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.xml", "microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512", "microsoft.extensions.configuration.fileextensions.nuspec" ] }, "Microsoft.Extensions.DependencyInjection/2.2.0": { "sha512": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==", "type": "package", "path": "microsoft.extensions.dependencyinjection/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net461/Microsoft.Extensions.DependencyInjection.dll", "lib/net461/Microsoft.Extensions.DependencyInjection.xml", "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll", "lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.xml", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml", "microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512", "microsoft.extensions.dependencyinjection.nuspec" ] }, "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { "sha512": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==", "type": "package", "path": "microsoft.extensions.dependencyinjection.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", "microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.dependencyinjection.abstractions.nuspec" ] }, "Microsoft.Extensions.FileProviders.Abstractions/2.2.0": { "sha512": "EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==", "type": "package", "path": "microsoft.extensions.fileproviders.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.xml", "microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.fileproviders.abstractions.nuspec" ] }, "Microsoft.Extensions.FileProviders.Physical/2.2.0": { "sha512": "tbDHZnBJkjYd9NjlRZ9ondDiv1Te3KYCTW2RWpR1B0e1Z8+EnFRo7qNnHkkSCixLdlPZzhjlX24d/PixQ7w2dA==", "type": "package", "path": "microsoft.extensions.fileproviders.physical/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll", "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.xml", "microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512", "microsoft.extensions.fileproviders.physical.nuspec" ] }, "Microsoft.Extensions.FileSystemGlobbing/2.2.0": { "sha512": "ZSsHZp3PyW6vk37tDEdypjgGlNtpJ0EixBMOfUod2Thx7GtwfFSAQXUQx8a8BN8vfWKGGMbp7jPWdoHx/At4wQ==", "type": "package", "path": "microsoft.extensions.filesystemglobbing/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll", "lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.xml", "microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512", "microsoft.extensions.filesystemglobbing.nuspec" ] }, "Microsoft.Extensions.Hosting.Abstractions/2.2.0": { "sha512": "+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==", "type": "package", "path": "microsoft.extensions.hosting.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.xml", "microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.hosting.abstractions.nuspec" ] }, "Microsoft.Extensions.Logging/2.2.0": { "sha512": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==", "type": "package", "path": "microsoft.extensions.logging/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Logging.dll", "lib/netstandard2.0/Microsoft.Extensions.Logging.xml", "microsoft.extensions.logging.2.2.0.nupkg.sha512", "microsoft.extensions.logging.nuspec" ] }, "Microsoft.Extensions.Logging.Abstractions/2.2.0": { "sha512": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==", "type": "package", "path": "microsoft.extensions.logging.abstractions/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", "microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512", "microsoft.extensions.logging.abstractions.nuspec" ] }, "Microsoft.Extensions.ObjectPool/2.2.0": { "sha512": "gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==", "type": "package", "path": "microsoft.extensions.objectpool/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll", "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.xml", "microsoft.extensions.objectpool.2.2.0.nupkg.sha512", "microsoft.extensions.objectpool.nuspec" ] }, "Microsoft.Extensions.Options/2.2.0": { "sha512": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==", "type": "package", "path": "microsoft.extensions.options/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Options.dll", "lib/netstandard2.0/Microsoft.Extensions.Options.xml", "microsoft.extensions.options.2.2.0.nupkg.sha512", "microsoft.extensions.options.nuspec" ] }, "Microsoft.Extensions.Primitives/2.2.0": { "sha512": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==", "type": "package", "path": "microsoft.extensions.primitives/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll", "lib/netstandard2.0/Microsoft.Extensions.Primitives.xml", "microsoft.extensions.primitives.2.2.0.nupkg.sha512", "microsoft.extensions.primitives.nuspec" ] }, "Microsoft.Extensions.WebEncoders/2.2.0": { "sha512": "V8XcqYcpcdBAxUhLeyYcuKmxu4CtNQA9IphTnARpQGhkop4A93v2XgM3AtaVVJo3H2cDWxWM6aeO8HxkifREqw==", "type": "package", "path": "microsoft.extensions.webencoders/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll", "lib/netstandard2.0/Microsoft.Extensions.WebEncoders.xml", "microsoft.extensions.webencoders.2.2.0.nupkg.sha512", "microsoft.extensions.webencoders.nuspec" ] }, "Microsoft.Net.Http.Headers/2.2.0": { "sha512": "iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==", "type": "package", "path": "microsoft.net.http.headers/2.2.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/netstandard2.0/Microsoft.Net.Http.Headers.dll", "lib/netstandard2.0/Microsoft.Net.Http.Headers.xml", "microsoft.net.http.headers.2.2.0.nupkg.sha512", "microsoft.net.http.headers.nuspec" ] }, "Microsoft.NETCore.Platforms/2.1.2": { "sha512": "mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==", "type": "package", "path": "microsoft.netcore.platforms/2.1.2", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.0/_._", "microsoft.netcore.platforms.2.1.2.nupkg.sha512", "microsoft.netcore.platforms.nuspec", "runtime.json", "useSharedDesignerContext.txt", "version.txt" ] }, "Microsoft.NETCore.Targets/1.1.0": { "sha512": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "type": "package", "path": "microsoft.netcore.targets/1.1.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "microsoft.netcore.targets.1.1.0.nupkg.sha512", "microsoft.netcore.targets.nuspec", "runtime.json" ] }, "Microsoft.Win32.Primitives/4.3.0": { "sha512": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "type": "package", "path": "microsoft.win32.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/Microsoft.Win32.Primitives.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "microsoft.win32.primitives.4.3.0.nupkg.sha512", "microsoft.win32.primitives.nuspec", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/Microsoft.Win32.Primitives.dll", "ref/netstandard1.3/Microsoft.Win32.Primitives.dll", "ref/netstandard1.3/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "Nett/0.15.0": { "sha512": "/0SoN9ugPKfmLndtKy3gaRxOlzji94/yrNgQLe45/1ZgExj0BaVozbXD+oWD8E6MCLvTs+YWzmn315mQOXGCcw==", "type": "package", "path": "nett/0.15.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net40/Nett.dll", "lib/net40/Nett.xml", "lib/netstandard2.0/Nett.dll", "lib/netstandard2.0/Nett.xml", "nett.0.15.0.nupkg.sha512", "nett.nuspec" ] }, "Newtonsoft.Json/12.0.3": { "sha512": "6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==", "type": "package", "path": "newtonsoft.json/12.0.3", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.md", "lib/net20/Newtonsoft.Json.dll", "lib/net20/Newtonsoft.Json.xml", "lib/net35/Newtonsoft.Json.dll", "lib/net35/Newtonsoft.Json.xml", "lib/net40/Newtonsoft.Json.dll", "lib/net40/Newtonsoft.Json.xml", "lib/net45/Newtonsoft.Json.dll", "lib/net45/Newtonsoft.Json.xml", "lib/netstandard1.0/Newtonsoft.Json.dll", "lib/netstandard1.0/Newtonsoft.Json.xml", "lib/netstandard1.3/Newtonsoft.Json.dll", "lib/netstandard1.3/Newtonsoft.Json.xml", "lib/netstandard2.0/Newtonsoft.Json.dll", "lib/netstandard2.0/Newtonsoft.Json.xml", "lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.dll", "lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.xml", "lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.dll", "lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.xml", "newtonsoft.json.12.0.3.nupkg.sha512", "newtonsoft.json.nuspec", "packageIcon.png" ] }, "NLog/4.7.3": { "sha512": "3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==", "type": "package", "path": "nlog/4.7.3", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/monoandroid44/NLog.dll", "lib/monoandroid44/NLog.xml", "lib/net35/NLog.dll", "lib/net35/NLog.xml", "lib/net40-client/NLog.dll", "lib/net40-client/NLog.xml", "lib/net45/NLog.dll", "lib/net45/NLog.xml", "lib/netstandard1.3/NLog.dll", "lib/netstandard1.3/NLog.xml", "lib/netstandard1.5/NLog.dll", "lib/netstandard1.5/NLog.xml", "lib/netstandard2.0/NLog.dll", "lib/netstandard2.0/NLog.xml", "lib/sl4/NLog.dll", "lib/sl4/NLog.xml", "lib/sl5/NLog.dll", "lib/sl5/NLog.xml", "lib/wp8/NLog.dll", "lib/wp8/NLog.xml", "lib/xamarinios10/NLog.dll", "lib/xamarinios10/NLog.xml", "nlog.4.7.3.nupkg.sha512", "nlog.nuspec" ] }, "PlaylistsNET/1.1.2": { "sha512": "IGzVterTV49b9FjzY7gMUcxnzOvVDj6L07pjB821m+k2iHWazy/OhIvDCvGSMx1cvkY9ZBajXpQO5uUCZY51vw==", "type": "package", "path": "playlistsnet/1.1.2", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net45/PlaylistsNET.dll", "lib/netstandard1.4/PlaylistsNET.dll", "lib/netstandard2.0/PlaylistsNET.dll", "playlistsnet.1.1.2.nupkg.sha512", "playlistsnet.nuspec" ] }, "Portable.BouncyCastle/1.8.6.7": { "sha512": "RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==", "type": "package", "path": "portable.bouncycastle/1.8.6.7", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net40/BouncyCastle.Crypto.dll", "lib/net40/BouncyCastle.Crypto.xml", "lib/netstandard2.0/BouncyCastle.Crypto.dll", "lib/netstandard2.0/BouncyCastle.Crypto.xml", "portable.bouncycastle.1.8.6.7.nupkg.sha512", "portable.bouncycastle.nuspec" ] }, "runtime.native.System/4.3.0": { "sha512": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", "type": "package", "path": "runtime.native.system/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "runtime.native.system.4.3.0.nupkg.sha512", "runtime.native.system.nuspec" ] }, "SixLabors.ImageSharp/1.0.0": { "sha512": "8amvsk8NXnCxZV0lvJppAZJknViWgBOO/2V59IGR6DVoD13mSmG+/Z9eg5IwrHQuRHp5RD9lfXBXDZyk8rTKDg==", "type": "package", "path": "sixlabors.imagesharp/1.0.0", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net472/SixLabors.ImageSharp.dll", "lib/net472/SixLabors.ImageSharp.xml", "lib/netcoreapp2.1/SixLabors.ImageSharp.dll", "lib/netcoreapp2.1/SixLabors.ImageSharp.xml", "lib/netcoreapp3.1/SixLabors.ImageSharp.dll", "lib/netcoreapp3.1/SixLabors.ImageSharp.xml", "lib/netstandard1.3/SixLabors.ImageSharp.dll", "lib/netstandard1.3/SixLabors.ImageSharp.xml", "lib/netstandard2.0/SixLabors.ImageSharp.dll", "lib/netstandard2.0/SixLabors.ImageSharp.xml", "lib/netstandard2.1/SixLabors.ImageSharp.dll", "lib/netstandard2.1/SixLabors.ImageSharp.xml", "sixlabors.imagesharp.1.0.0.nupkg.sha512", "sixlabors.imagesharp.128.png", "sixlabors.imagesharp.nuspec" ] }, "Splamy.Ed25519.Toolkit/1.0.3": { "sha512": "Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==", "type": "package", "path": "splamy.ed25519.toolkit/1.0.3", "files": [ ".nupkg.metadata", ".signature.p7s", "lib/net46/Chaos.NaCl.dll", "lib/netcoreapp2.0/Chaos.NaCl.dll", "lib/netcoreapp2.1/Chaos.NaCl.dll", "lib/netstandard1.1/Chaos.NaCl.dll", "lib/netstandard2.0/Chaos.NaCl.dll", "splamy.ed25519.toolkit.1.0.3.nupkg.sha512", "splamy.ed25519.toolkit.nuspec" ] }, "System.Buffers/4.5.0": { "sha512": "pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==", "type": "package", "path": "system.buffers/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netcoreapp2.0/_._", "lib/netstandard1.1/System.Buffers.dll", "lib/netstandard1.1/System.Buffers.xml", "lib/netstandard2.0/System.Buffers.dll", "lib/netstandard2.0/System.Buffers.xml", "lib/uap10.0.16299/_._", "ref/net45/System.Buffers.dll", "ref/net45/System.Buffers.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.1/System.Buffers.dll", "ref/netstandard1.1/System.Buffers.xml", "ref/netstandard2.0/System.Buffers.dll", "ref/netstandard2.0/System.Buffers.xml", "ref/uap10.0.16299/_._", "system.buffers.4.5.0.nupkg.sha512", "system.buffers.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Collections/4.3.0": { "sha512": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "type": "package", "path": "system.collections/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Collections.dll", "ref/netcore50/System.Collections.xml", "ref/netcore50/de/System.Collections.xml", "ref/netcore50/es/System.Collections.xml", "ref/netcore50/fr/System.Collections.xml", "ref/netcore50/it/System.Collections.xml", "ref/netcore50/ja/System.Collections.xml", "ref/netcore50/ko/System.Collections.xml", "ref/netcore50/ru/System.Collections.xml", "ref/netcore50/zh-hans/System.Collections.xml", "ref/netcore50/zh-hant/System.Collections.xml", "ref/netstandard1.0/System.Collections.dll", "ref/netstandard1.0/System.Collections.xml", "ref/netstandard1.0/de/System.Collections.xml", "ref/netstandard1.0/es/System.Collections.xml", "ref/netstandard1.0/fr/System.Collections.xml", "ref/netstandard1.0/it/System.Collections.xml", "ref/netstandard1.0/ja/System.Collections.xml", "ref/netstandard1.0/ko/System.Collections.xml", "ref/netstandard1.0/ru/System.Collections.xml", "ref/netstandard1.0/zh-hans/System.Collections.xml", "ref/netstandard1.0/zh-hant/System.Collections.xml", "ref/netstandard1.3/System.Collections.dll", "ref/netstandard1.3/System.Collections.xml", "ref/netstandard1.3/de/System.Collections.xml", "ref/netstandard1.3/es/System.Collections.xml", "ref/netstandard1.3/fr/System.Collections.xml", "ref/netstandard1.3/it/System.Collections.xml", "ref/netstandard1.3/ja/System.Collections.xml", "ref/netstandard1.3/ko/System.Collections.xml", "ref/netstandard1.3/ru/System.Collections.xml", "ref/netstandard1.3/zh-hans/System.Collections.xml", "ref/netstandard1.3/zh-hant/System.Collections.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.collections.4.3.0.nupkg.sha512", "system.collections.nuspec" ] }, "System.Collections.Immutable/1.5.0": { "sha512": "EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==", "type": "package", "path": "system.collections.immutable/1.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.0/System.Collections.Immutable.dll", "lib/netstandard1.0/System.Collections.Immutable.xml", "lib/netstandard1.3/System.Collections.Immutable.dll", "lib/netstandard1.3/System.Collections.Immutable.xml", "lib/netstandard2.0/System.Collections.Immutable.dll", "lib/netstandard2.0/System.Collections.Immutable.xml", "lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.dll", "lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.xml", "system.collections.immutable.1.5.0.nupkg.sha512", "system.collections.immutable.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.ComponentModel.Annotations/4.5.0": { "sha512": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==", "type": "package", "path": "system.componentmodel.annotations/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net461/System.ComponentModel.Annotations.dll", "lib/netcore50/System.ComponentModel.Annotations.dll", "lib/netcoreapp2.0/_._", "lib/netstandard1.4/System.ComponentModel.Annotations.dll", "lib/netstandard2.0/System.ComponentModel.Annotations.dll", "lib/portable-net45+win8/_._", "lib/uap10.0.16299/_._", "lib/win8/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net461/System.ComponentModel.Annotations.dll", "ref/net461/System.ComponentModel.Annotations.xml", "ref/netcore50/System.ComponentModel.Annotations.dll", "ref/netcore50/System.ComponentModel.Annotations.xml", "ref/netcore50/de/System.ComponentModel.Annotations.xml", "ref/netcore50/es/System.ComponentModel.Annotations.xml", "ref/netcore50/fr/System.ComponentModel.Annotations.xml", "ref/netcore50/it/System.ComponentModel.Annotations.xml", "ref/netcore50/ja/System.ComponentModel.Annotations.xml", "ref/netcore50/ko/System.ComponentModel.Annotations.xml", "ref/netcore50/ru/System.ComponentModel.Annotations.xml", "ref/netcore50/zh-hans/System.ComponentModel.Annotations.xml", "ref/netcore50/zh-hant/System.ComponentModel.Annotations.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.1/System.ComponentModel.Annotations.dll", "ref/netstandard1.1/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/de/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/es/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/fr/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/it/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/ja/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/ko/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/ru/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/zh-hans/System.ComponentModel.Annotations.xml", "ref/netstandard1.1/zh-hant/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/System.ComponentModel.Annotations.dll", "ref/netstandard1.3/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/de/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/es/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/fr/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/it/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/ja/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/ko/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/ru/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/zh-hans/System.ComponentModel.Annotations.xml", "ref/netstandard1.3/zh-hant/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/System.ComponentModel.Annotations.dll", "ref/netstandard1.4/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/de/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/es/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/fr/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/it/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/ja/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/ko/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/ru/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/zh-hans/System.ComponentModel.Annotations.xml", "ref/netstandard1.4/zh-hant/System.ComponentModel.Annotations.xml", "ref/netstandard2.0/System.ComponentModel.Annotations.dll", "ref/netstandard2.0/System.ComponentModel.Annotations.xml", "ref/portable-net45+win8/_._", "ref/uap10.0.16299/_._", "ref/win8/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.componentmodel.annotations.4.5.0.nupkg.sha512", "system.componentmodel.annotations.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Diagnostics.Debug/4.3.0": { "sha512": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "type": "package", "path": "system.diagnostics.debug/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Diagnostics.Debug.dll", "ref/netcore50/System.Diagnostics.Debug.xml", "ref/netcore50/de/System.Diagnostics.Debug.xml", "ref/netcore50/es/System.Diagnostics.Debug.xml", "ref/netcore50/fr/System.Diagnostics.Debug.xml", "ref/netcore50/it/System.Diagnostics.Debug.xml", "ref/netcore50/ja/System.Diagnostics.Debug.xml", "ref/netcore50/ko/System.Diagnostics.Debug.xml", "ref/netcore50/ru/System.Diagnostics.Debug.xml", "ref/netcore50/zh-hans/System.Diagnostics.Debug.xml", "ref/netcore50/zh-hant/System.Diagnostics.Debug.xml", "ref/netstandard1.0/System.Diagnostics.Debug.dll", "ref/netstandard1.0/System.Diagnostics.Debug.xml", "ref/netstandard1.0/de/System.Diagnostics.Debug.xml", "ref/netstandard1.0/es/System.Diagnostics.Debug.xml", "ref/netstandard1.0/fr/System.Diagnostics.Debug.xml", "ref/netstandard1.0/it/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ja/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ko/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ru/System.Diagnostics.Debug.xml", "ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml", "ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml", "ref/netstandard1.3/System.Diagnostics.Debug.dll", "ref/netstandard1.3/System.Diagnostics.Debug.xml", "ref/netstandard1.3/de/System.Diagnostics.Debug.xml", "ref/netstandard1.3/es/System.Diagnostics.Debug.xml", "ref/netstandard1.3/fr/System.Diagnostics.Debug.xml", "ref/netstandard1.3/it/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ja/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ko/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ru/System.Diagnostics.Debug.xml", "ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml", "ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.diagnostics.debug.4.3.0.nupkg.sha512", "system.diagnostics.debug.nuspec" ] }, "System.Diagnostics.DiagnosticSource/4.5.0": { "sha512": "eIHRELiYDQvsMToML81QFkXEEYXUSUT2F28t1SGrevWqP+epFdw80SyAXIKTXOHrIEXReFOEnEr7XlGiC2GgOg==", "type": "package", "path": "system.diagnostics.diagnosticsource/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net45/System.Diagnostics.DiagnosticSource.dll", "lib/net45/System.Diagnostics.DiagnosticSource.xml", "lib/net46/System.Diagnostics.DiagnosticSource.dll", "lib/net46/System.Diagnostics.DiagnosticSource.xml", "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll", "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml", "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll", "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml", "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll", "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml", "system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512", "system.diagnostics.diagnosticsource.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Diagnostics.Tracing/4.3.0": { "sha512": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "type": "package", "path": "system.diagnostics.tracing/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Diagnostics.Tracing.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Diagnostics.Tracing.dll", "ref/netcore50/System.Diagnostics.Tracing.dll", "ref/netcore50/System.Diagnostics.Tracing.xml", "ref/netcore50/de/System.Diagnostics.Tracing.xml", "ref/netcore50/es/System.Diagnostics.Tracing.xml", "ref/netcore50/fr/System.Diagnostics.Tracing.xml", "ref/netcore50/it/System.Diagnostics.Tracing.xml", "ref/netcore50/ja/System.Diagnostics.Tracing.xml", "ref/netcore50/ko/System.Diagnostics.Tracing.xml", "ref/netcore50/ru/System.Diagnostics.Tracing.xml", "ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml", "ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/System.Diagnostics.Tracing.dll", "ref/netstandard1.1/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/System.Diagnostics.Tracing.dll", "ref/netstandard1.2/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/System.Diagnostics.Tracing.dll", "ref/netstandard1.3/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/System.Diagnostics.Tracing.dll", "ref/netstandard1.5/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.diagnostics.tracing.4.3.0.nupkg.sha512", "system.diagnostics.tracing.nuspec" ] }, "System.Globalization/4.3.0": { "sha512": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "type": "package", "path": "system.globalization/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Globalization.dll", "ref/netcore50/System.Globalization.xml", "ref/netcore50/de/System.Globalization.xml", "ref/netcore50/es/System.Globalization.xml", "ref/netcore50/fr/System.Globalization.xml", "ref/netcore50/it/System.Globalization.xml", "ref/netcore50/ja/System.Globalization.xml", "ref/netcore50/ko/System.Globalization.xml", "ref/netcore50/ru/System.Globalization.xml", "ref/netcore50/zh-hans/System.Globalization.xml", "ref/netcore50/zh-hant/System.Globalization.xml", "ref/netstandard1.0/System.Globalization.dll", "ref/netstandard1.0/System.Globalization.xml", "ref/netstandard1.0/de/System.Globalization.xml", "ref/netstandard1.0/es/System.Globalization.xml", "ref/netstandard1.0/fr/System.Globalization.xml", "ref/netstandard1.0/it/System.Globalization.xml", "ref/netstandard1.0/ja/System.Globalization.xml", "ref/netstandard1.0/ko/System.Globalization.xml", "ref/netstandard1.0/ru/System.Globalization.xml", "ref/netstandard1.0/zh-hans/System.Globalization.xml", "ref/netstandard1.0/zh-hant/System.Globalization.xml", "ref/netstandard1.3/System.Globalization.dll", "ref/netstandard1.3/System.Globalization.xml", "ref/netstandard1.3/de/System.Globalization.xml", "ref/netstandard1.3/es/System.Globalization.xml", "ref/netstandard1.3/fr/System.Globalization.xml", "ref/netstandard1.3/it/System.Globalization.xml", "ref/netstandard1.3/ja/System.Globalization.xml", "ref/netstandard1.3/ko/System.Globalization.xml", "ref/netstandard1.3/ru/System.Globalization.xml", "ref/netstandard1.3/zh-hans/System.Globalization.xml", "ref/netstandard1.3/zh-hant/System.Globalization.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.globalization.4.3.0.nupkg.sha512", "system.globalization.nuspec" ] }, "System.IO/4.3.0": { "sha512": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "type": "package", "path": "system.io/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.IO.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.IO.dll", "ref/netcore50/System.IO.dll", "ref/netcore50/System.IO.xml", "ref/netcore50/de/System.IO.xml", "ref/netcore50/es/System.IO.xml", "ref/netcore50/fr/System.IO.xml", "ref/netcore50/it/System.IO.xml", "ref/netcore50/ja/System.IO.xml", "ref/netcore50/ko/System.IO.xml", "ref/netcore50/ru/System.IO.xml", "ref/netcore50/zh-hans/System.IO.xml", "ref/netcore50/zh-hant/System.IO.xml", "ref/netstandard1.0/System.IO.dll", "ref/netstandard1.0/System.IO.xml", "ref/netstandard1.0/de/System.IO.xml", "ref/netstandard1.0/es/System.IO.xml", "ref/netstandard1.0/fr/System.IO.xml", "ref/netstandard1.0/it/System.IO.xml", "ref/netstandard1.0/ja/System.IO.xml", "ref/netstandard1.0/ko/System.IO.xml", "ref/netstandard1.0/ru/System.IO.xml", "ref/netstandard1.0/zh-hans/System.IO.xml", "ref/netstandard1.0/zh-hant/System.IO.xml", "ref/netstandard1.3/System.IO.dll", "ref/netstandard1.3/System.IO.xml", "ref/netstandard1.3/de/System.IO.xml", "ref/netstandard1.3/es/System.IO.xml", "ref/netstandard1.3/fr/System.IO.xml", "ref/netstandard1.3/it/System.IO.xml", "ref/netstandard1.3/ja/System.IO.xml", "ref/netstandard1.3/ko/System.IO.xml", "ref/netstandard1.3/ru/System.IO.xml", "ref/netstandard1.3/zh-hans/System.IO.xml", "ref/netstandard1.3/zh-hant/System.IO.xml", "ref/netstandard1.5/System.IO.dll", "ref/netstandard1.5/System.IO.xml", "ref/netstandard1.5/de/System.IO.xml", "ref/netstandard1.5/es/System.IO.xml", "ref/netstandard1.5/fr/System.IO.xml", "ref/netstandard1.5/it/System.IO.xml", "ref/netstandard1.5/ja/System.IO.xml", "ref/netstandard1.5/ko/System.IO.xml", "ref/netstandard1.5/ru/System.IO.xml", "ref/netstandard1.5/zh-hans/System.IO.xml", "ref/netstandard1.5/zh-hant/System.IO.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.4.3.0.nupkg.sha512", "system.io.nuspec" ] }, "System.IO.FileSystem/4.3.0": { "sha512": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "type": "package", "path": "system.io.filesystem/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.IO.FileSystem.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.IO.FileSystem.dll", "ref/netstandard1.3/System.IO.FileSystem.dll", "ref/netstandard1.3/System.IO.FileSystem.xml", "ref/netstandard1.3/de/System.IO.FileSystem.xml", "ref/netstandard1.3/es/System.IO.FileSystem.xml", "ref/netstandard1.3/fr/System.IO.FileSystem.xml", "ref/netstandard1.3/it/System.IO.FileSystem.xml", "ref/netstandard1.3/ja/System.IO.FileSystem.xml", "ref/netstandard1.3/ko/System.IO.FileSystem.xml", "ref/netstandard1.3/ru/System.IO.FileSystem.xml", "ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml", "ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.filesystem.4.3.0.nupkg.sha512", "system.io.filesystem.nuspec" ] }, "System.IO.FileSystem.Primitives/4.3.0": { "sha512": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "type": "package", "path": "system.io.filesystem.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.IO.FileSystem.Primitives.dll", "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.IO.FileSystem.Primitives.dll", "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll", "ref/netstandard1.3/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.io.filesystem.primitives.4.3.0.nupkg.sha512", "system.io.filesystem.primitives.nuspec" ] }, "System.IO.Pipelines/4.7.2": { "sha512": "rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==", "type": "package", "path": "system.io.pipelines/4.7.2", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net461/System.IO.Pipelines.dll", "lib/net461/System.IO.Pipelines.xml", "lib/netcoreapp3.0/System.IO.Pipelines.dll", "lib/netcoreapp3.0/System.IO.Pipelines.xml", "lib/netstandard1.3/System.IO.Pipelines.dll", "lib/netstandard1.3/System.IO.Pipelines.xml", "lib/netstandard2.0/System.IO.Pipelines.dll", "lib/netstandard2.0/System.IO.Pipelines.xml", "ref/net461/System.IO.Pipelines.dll", "ref/net461/System.IO.Pipelines.xml", "ref/netcoreapp2.0/System.IO.Pipelines.dll", "ref/netcoreapp2.0/System.IO.Pipelines.xml", "system.io.pipelines.4.7.2.nupkg.sha512", "system.io.pipelines.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Linq/4.3.0": { "sha512": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "type": "package", "path": "system.linq/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net463/System.Linq.dll", "lib/netcore50/System.Linq.dll", "lib/netstandard1.6/System.Linq.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net463/System.Linq.dll", "ref/netcore50/System.Linq.dll", "ref/netcore50/System.Linq.xml", "ref/netcore50/de/System.Linq.xml", "ref/netcore50/es/System.Linq.xml", "ref/netcore50/fr/System.Linq.xml", "ref/netcore50/it/System.Linq.xml", "ref/netcore50/ja/System.Linq.xml", "ref/netcore50/ko/System.Linq.xml", "ref/netcore50/ru/System.Linq.xml", "ref/netcore50/zh-hans/System.Linq.xml", "ref/netcore50/zh-hant/System.Linq.xml", "ref/netstandard1.0/System.Linq.dll", "ref/netstandard1.0/System.Linq.xml", "ref/netstandard1.0/de/System.Linq.xml", "ref/netstandard1.0/es/System.Linq.xml", "ref/netstandard1.0/fr/System.Linq.xml", "ref/netstandard1.0/it/System.Linq.xml", "ref/netstandard1.0/ja/System.Linq.xml", "ref/netstandard1.0/ko/System.Linq.xml", "ref/netstandard1.0/ru/System.Linq.xml", "ref/netstandard1.0/zh-hans/System.Linq.xml", "ref/netstandard1.0/zh-hant/System.Linq.xml", "ref/netstandard1.6/System.Linq.dll", "ref/netstandard1.6/System.Linq.xml", "ref/netstandard1.6/de/System.Linq.xml", "ref/netstandard1.6/es/System.Linq.xml", "ref/netstandard1.6/fr/System.Linq.xml", "ref/netstandard1.6/it/System.Linq.xml", "ref/netstandard1.6/ja/System.Linq.xml", "ref/netstandard1.6/ko/System.Linq.xml", "ref/netstandard1.6/ru/System.Linq.xml", "ref/netstandard1.6/zh-hans/System.Linq.xml", "ref/netstandard1.6/zh-hant/System.Linq.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.linq.4.3.0.nupkg.sha512", "system.linq.nuspec" ] }, "System.Memory/4.5.4": { "sha512": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", "type": "package", "path": "system.memory/4.5.4", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/net461/System.Memory.dll", "lib/net461/System.Memory.xml", "lib/netcoreapp2.1/_._", "lib/netstandard1.1/System.Memory.dll", "lib/netstandard1.1/System.Memory.xml", "lib/netstandard2.0/System.Memory.dll", "lib/netstandard2.0/System.Memory.xml", "ref/netcoreapp2.1/_._", "system.memory.4.5.4.nupkg.sha512", "system.memory.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Net.NetworkInformation/4.3.0": { "sha512": "zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==", "type": "package", "path": "system.net.networkinformation/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net46/System.Net.NetworkInformation.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net46/System.Net.NetworkInformation.dll", "ref/netcore50/System.Net.NetworkInformation.dll", "ref/netcore50/System.Net.NetworkInformation.xml", "ref/netcore50/de/System.Net.NetworkInformation.xml", "ref/netcore50/es/System.Net.NetworkInformation.xml", "ref/netcore50/fr/System.Net.NetworkInformation.xml", "ref/netcore50/it/System.Net.NetworkInformation.xml", "ref/netcore50/ja/System.Net.NetworkInformation.xml", "ref/netcore50/ko/System.Net.NetworkInformation.xml", "ref/netcore50/ru/System.Net.NetworkInformation.xml", "ref/netcore50/zh-hans/System.Net.NetworkInformation.xml", "ref/netcore50/zh-hant/System.Net.NetworkInformation.xml", "ref/netstandard1.0/System.Net.NetworkInformation.dll", "ref/netstandard1.0/System.Net.NetworkInformation.xml", "ref/netstandard1.0/de/System.Net.NetworkInformation.xml", "ref/netstandard1.0/es/System.Net.NetworkInformation.xml", "ref/netstandard1.0/fr/System.Net.NetworkInformation.xml", "ref/netstandard1.0/it/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ja/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ko/System.Net.NetworkInformation.xml", "ref/netstandard1.0/ru/System.Net.NetworkInformation.xml", "ref/netstandard1.0/zh-hans/System.Net.NetworkInformation.xml", "ref/netstandard1.0/zh-hant/System.Net.NetworkInformation.xml", "ref/netstandard1.3/System.Net.NetworkInformation.dll", "ref/netstandard1.3/System.Net.NetworkInformation.xml", "ref/netstandard1.3/de/System.Net.NetworkInformation.xml", "ref/netstandard1.3/es/System.Net.NetworkInformation.xml", "ref/netstandard1.3/fr/System.Net.NetworkInformation.xml", "ref/netstandard1.3/it/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ja/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ko/System.Net.NetworkInformation.xml", "ref/netstandard1.3/ru/System.Net.NetworkInformation.xml", "ref/netstandard1.3/zh-hans/System.Net.NetworkInformation.xml", "ref/netstandard1.3/zh-hant/System.Net.NetworkInformation.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll", "runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll", "runtimes/win/lib/net46/System.Net.NetworkInformation.dll", "runtimes/win/lib/netcore50/System.Net.NetworkInformation.dll", "runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll", "system.net.networkinformation.4.3.0.nupkg.sha512", "system.net.networkinformation.nuspec" ] }, "System.Net.Primitives/4.3.0": { "sha512": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "type": "package", "path": "system.net.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Net.Primitives.dll", "ref/netcore50/System.Net.Primitives.xml", "ref/netcore50/de/System.Net.Primitives.xml", "ref/netcore50/es/System.Net.Primitives.xml", "ref/netcore50/fr/System.Net.Primitives.xml", "ref/netcore50/it/System.Net.Primitives.xml", "ref/netcore50/ja/System.Net.Primitives.xml", "ref/netcore50/ko/System.Net.Primitives.xml", "ref/netcore50/ru/System.Net.Primitives.xml", "ref/netcore50/zh-hans/System.Net.Primitives.xml", "ref/netcore50/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.0/System.Net.Primitives.dll", "ref/netstandard1.0/System.Net.Primitives.xml", "ref/netstandard1.0/de/System.Net.Primitives.xml", "ref/netstandard1.0/es/System.Net.Primitives.xml", "ref/netstandard1.0/fr/System.Net.Primitives.xml", "ref/netstandard1.0/it/System.Net.Primitives.xml", "ref/netstandard1.0/ja/System.Net.Primitives.xml", "ref/netstandard1.0/ko/System.Net.Primitives.xml", "ref/netstandard1.0/ru/System.Net.Primitives.xml", "ref/netstandard1.0/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.0/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.1/System.Net.Primitives.dll", "ref/netstandard1.1/System.Net.Primitives.xml", "ref/netstandard1.1/de/System.Net.Primitives.xml", "ref/netstandard1.1/es/System.Net.Primitives.xml", "ref/netstandard1.1/fr/System.Net.Primitives.xml", "ref/netstandard1.1/it/System.Net.Primitives.xml", "ref/netstandard1.1/ja/System.Net.Primitives.xml", "ref/netstandard1.1/ko/System.Net.Primitives.xml", "ref/netstandard1.1/ru/System.Net.Primitives.xml", "ref/netstandard1.1/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.1/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.3/System.Net.Primitives.dll", "ref/netstandard1.3/System.Net.Primitives.xml", "ref/netstandard1.3/de/System.Net.Primitives.xml", "ref/netstandard1.3/es/System.Net.Primitives.xml", "ref/netstandard1.3/fr/System.Net.Primitives.xml", "ref/netstandard1.3/it/System.Net.Primitives.xml", "ref/netstandard1.3/ja/System.Net.Primitives.xml", "ref/netstandard1.3/ko/System.Net.Primitives.xml", "ref/netstandard1.3/ru/System.Net.Primitives.xml", "ref/netstandard1.3/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.3/zh-hant/System.Net.Primitives.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.net.primitives.4.3.0.nupkg.sha512", "system.net.primitives.nuspec" ] }, "System.Net.Sockets/4.3.0": { "sha512": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "type": "package", "path": "system.net.sockets/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Net.Sockets.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Net.Sockets.dll", "ref/netstandard1.3/System.Net.Sockets.dll", "ref/netstandard1.3/System.Net.Sockets.xml", "ref/netstandard1.3/de/System.Net.Sockets.xml", "ref/netstandard1.3/es/System.Net.Sockets.xml", "ref/netstandard1.3/fr/System.Net.Sockets.xml", "ref/netstandard1.3/it/System.Net.Sockets.xml", "ref/netstandard1.3/ja/System.Net.Sockets.xml", "ref/netstandard1.3/ko/System.Net.Sockets.xml", "ref/netstandard1.3/ru/System.Net.Sockets.xml", "ref/netstandard1.3/zh-hans/System.Net.Sockets.xml", "ref/netstandard1.3/zh-hant/System.Net.Sockets.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.net.sockets.4.3.0.nupkg.sha512", "system.net.sockets.nuspec" ] }, "System.Numerics.Vectors/4.5.0": { "sha512": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==", "type": "package", "path": "system.numerics.vectors/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Numerics.Vectors.dll", "lib/net46/System.Numerics.Vectors.xml", "lib/netcoreapp2.0/_._", "lib/netstandard1.0/System.Numerics.Vectors.dll", "lib/netstandard1.0/System.Numerics.Vectors.xml", "lib/netstandard2.0/System.Numerics.Vectors.dll", "lib/netstandard2.0/System.Numerics.Vectors.xml", "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.dll", "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.xml", "lib/uap10.0.16299/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/System.Numerics.Vectors.dll", "ref/net45/System.Numerics.Vectors.xml", "ref/net46/System.Numerics.Vectors.dll", "ref/net46/System.Numerics.Vectors.xml", "ref/netcoreapp2.0/_._", "ref/netstandard1.0/System.Numerics.Vectors.dll", "ref/netstandard1.0/System.Numerics.Vectors.xml", "ref/netstandard2.0/System.Numerics.Vectors.dll", "ref/netstandard2.0/System.Numerics.Vectors.xml", "ref/uap10.0.16299/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.numerics.vectors.4.5.0.nupkg.sha512", "system.numerics.vectors.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Reflection/4.3.0": { "sha512": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "type": "package", "path": "system.reflection/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Reflection.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Reflection.dll", "ref/netcore50/System.Reflection.dll", "ref/netcore50/System.Reflection.xml", "ref/netcore50/de/System.Reflection.xml", "ref/netcore50/es/System.Reflection.xml", "ref/netcore50/fr/System.Reflection.xml", "ref/netcore50/it/System.Reflection.xml", "ref/netcore50/ja/System.Reflection.xml", "ref/netcore50/ko/System.Reflection.xml", "ref/netcore50/ru/System.Reflection.xml", "ref/netcore50/zh-hans/System.Reflection.xml", "ref/netcore50/zh-hant/System.Reflection.xml", "ref/netstandard1.0/System.Reflection.dll", "ref/netstandard1.0/System.Reflection.xml", "ref/netstandard1.0/de/System.Reflection.xml", "ref/netstandard1.0/es/System.Reflection.xml", "ref/netstandard1.0/fr/System.Reflection.xml", "ref/netstandard1.0/it/System.Reflection.xml", "ref/netstandard1.0/ja/System.Reflection.xml", "ref/netstandard1.0/ko/System.Reflection.xml", "ref/netstandard1.0/ru/System.Reflection.xml", "ref/netstandard1.0/zh-hans/System.Reflection.xml", "ref/netstandard1.0/zh-hant/System.Reflection.xml", "ref/netstandard1.3/System.Reflection.dll", "ref/netstandard1.3/System.Reflection.xml", "ref/netstandard1.3/de/System.Reflection.xml", "ref/netstandard1.3/es/System.Reflection.xml", "ref/netstandard1.3/fr/System.Reflection.xml", "ref/netstandard1.3/it/System.Reflection.xml", "ref/netstandard1.3/ja/System.Reflection.xml", "ref/netstandard1.3/ko/System.Reflection.xml", "ref/netstandard1.3/ru/System.Reflection.xml", "ref/netstandard1.3/zh-hans/System.Reflection.xml", "ref/netstandard1.3/zh-hant/System.Reflection.xml", "ref/netstandard1.5/System.Reflection.dll", "ref/netstandard1.5/System.Reflection.xml", "ref/netstandard1.5/de/System.Reflection.xml", "ref/netstandard1.5/es/System.Reflection.xml", "ref/netstandard1.5/fr/System.Reflection.xml", "ref/netstandard1.5/it/System.Reflection.xml", "ref/netstandard1.5/ja/System.Reflection.xml", "ref/netstandard1.5/ko/System.Reflection.xml", "ref/netstandard1.5/ru/System.Reflection.xml", "ref/netstandard1.5/zh-hans/System.Reflection.xml", "ref/netstandard1.5/zh-hant/System.Reflection.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.reflection.4.3.0.nupkg.sha512", "system.reflection.nuspec" ] }, "System.Reflection.Metadata/1.6.0": { "sha512": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", "type": "package", "path": "system.reflection.metadata/1.6.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.1/System.Reflection.Metadata.dll", "lib/netstandard1.1/System.Reflection.Metadata.xml", "lib/netstandard2.0/System.Reflection.Metadata.dll", "lib/netstandard2.0/System.Reflection.Metadata.xml", "lib/portable-net45+win8/System.Reflection.Metadata.dll", "lib/portable-net45+win8/System.Reflection.Metadata.xml", "system.reflection.metadata.1.6.0.nupkg.sha512", "system.reflection.metadata.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Reflection.Primitives/4.3.0": { "sha512": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "type": "package", "path": "system.reflection.primitives/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Reflection.Primitives.dll", "ref/netcore50/System.Reflection.Primitives.xml", "ref/netcore50/de/System.Reflection.Primitives.xml", "ref/netcore50/es/System.Reflection.Primitives.xml", "ref/netcore50/fr/System.Reflection.Primitives.xml", "ref/netcore50/it/System.Reflection.Primitives.xml", "ref/netcore50/ja/System.Reflection.Primitives.xml", "ref/netcore50/ko/System.Reflection.Primitives.xml", "ref/netcore50/ru/System.Reflection.Primitives.xml", "ref/netcore50/zh-hans/System.Reflection.Primitives.xml", "ref/netcore50/zh-hant/System.Reflection.Primitives.xml", "ref/netstandard1.0/System.Reflection.Primitives.dll", "ref/netstandard1.0/System.Reflection.Primitives.xml", "ref/netstandard1.0/de/System.Reflection.Primitives.xml", "ref/netstandard1.0/es/System.Reflection.Primitives.xml", "ref/netstandard1.0/fr/System.Reflection.Primitives.xml", "ref/netstandard1.0/it/System.Reflection.Primitives.xml", "ref/netstandard1.0/ja/System.Reflection.Primitives.xml", "ref/netstandard1.0/ko/System.Reflection.Primitives.xml", "ref/netstandard1.0/ru/System.Reflection.Primitives.xml", "ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml", "ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.reflection.primitives.4.3.0.nupkg.sha512", "system.reflection.primitives.nuspec" ] }, "System.Reflection.TypeExtensions/4.3.0": { "sha512": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", "type": "package", "path": "system.reflection.typeextensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Reflection.TypeExtensions.dll", "lib/net462/System.Reflection.TypeExtensions.dll", "lib/netcore50/System.Reflection.TypeExtensions.dll", "lib/netstandard1.5/System.Reflection.TypeExtensions.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Reflection.TypeExtensions.dll", "ref/net462/System.Reflection.TypeExtensions.dll", "ref/netstandard1.3/System.Reflection.TypeExtensions.dll", "ref/netstandard1.3/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/System.Reflection.TypeExtensions.dll", "ref/netstandard1.5/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll", "system.reflection.typeextensions.4.3.0.nupkg.sha512", "system.reflection.typeextensions.nuspec" ] }, "System.Resources.ResourceManager/4.3.0": { "sha512": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "type": "package", "path": "system.resources.resourcemanager/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Resources.ResourceManager.dll", "ref/netcore50/System.Resources.ResourceManager.xml", "ref/netcore50/de/System.Resources.ResourceManager.xml", "ref/netcore50/es/System.Resources.ResourceManager.xml", "ref/netcore50/fr/System.Resources.ResourceManager.xml", "ref/netcore50/it/System.Resources.ResourceManager.xml", "ref/netcore50/ja/System.Resources.ResourceManager.xml", "ref/netcore50/ko/System.Resources.ResourceManager.xml", "ref/netcore50/ru/System.Resources.ResourceManager.xml", "ref/netcore50/zh-hans/System.Resources.ResourceManager.xml", "ref/netcore50/zh-hant/System.Resources.ResourceManager.xml", "ref/netstandard1.0/System.Resources.ResourceManager.dll", "ref/netstandard1.0/System.Resources.ResourceManager.xml", "ref/netstandard1.0/de/System.Resources.ResourceManager.xml", "ref/netstandard1.0/es/System.Resources.ResourceManager.xml", "ref/netstandard1.0/fr/System.Resources.ResourceManager.xml", "ref/netstandard1.0/it/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ja/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ko/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ru/System.Resources.ResourceManager.xml", "ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml", "ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.resources.resourcemanager.4.3.0.nupkg.sha512", "system.resources.resourcemanager.nuspec" ] }, "System.Runtime/4.3.0": { "sha512": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "type": "package", "path": "system.runtime/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.dll", "lib/portable-net45+win8+wp80+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.dll", "ref/netcore50/System.Runtime.dll", "ref/netcore50/System.Runtime.xml", "ref/netcore50/de/System.Runtime.xml", "ref/netcore50/es/System.Runtime.xml", "ref/netcore50/fr/System.Runtime.xml", "ref/netcore50/it/System.Runtime.xml", "ref/netcore50/ja/System.Runtime.xml", "ref/netcore50/ko/System.Runtime.xml", "ref/netcore50/ru/System.Runtime.xml", "ref/netcore50/zh-hans/System.Runtime.xml", "ref/netcore50/zh-hant/System.Runtime.xml", "ref/netstandard1.0/System.Runtime.dll", "ref/netstandard1.0/System.Runtime.xml", "ref/netstandard1.0/de/System.Runtime.xml", "ref/netstandard1.0/es/System.Runtime.xml", "ref/netstandard1.0/fr/System.Runtime.xml", "ref/netstandard1.0/it/System.Runtime.xml", "ref/netstandard1.0/ja/System.Runtime.xml", "ref/netstandard1.0/ko/System.Runtime.xml", "ref/netstandard1.0/ru/System.Runtime.xml", "ref/netstandard1.0/zh-hans/System.Runtime.xml", "ref/netstandard1.0/zh-hant/System.Runtime.xml", "ref/netstandard1.2/System.Runtime.dll", "ref/netstandard1.2/System.Runtime.xml", "ref/netstandard1.2/de/System.Runtime.xml", "ref/netstandard1.2/es/System.Runtime.xml", "ref/netstandard1.2/fr/System.Runtime.xml", "ref/netstandard1.2/it/System.Runtime.xml", "ref/netstandard1.2/ja/System.Runtime.xml", "ref/netstandard1.2/ko/System.Runtime.xml", "ref/netstandard1.2/ru/System.Runtime.xml", "ref/netstandard1.2/zh-hans/System.Runtime.xml", "ref/netstandard1.2/zh-hant/System.Runtime.xml", "ref/netstandard1.3/System.Runtime.dll", "ref/netstandard1.3/System.Runtime.xml", "ref/netstandard1.3/de/System.Runtime.xml", "ref/netstandard1.3/es/System.Runtime.xml", "ref/netstandard1.3/fr/System.Runtime.xml", "ref/netstandard1.3/it/System.Runtime.xml", "ref/netstandard1.3/ja/System.Runtime.xml", "ref/netstandard1.3/ko/System.Runtime.xml", "ref/netstandard1.3/ru/System.Runtime.xml", "ref/netstandard1.3/zh-hans/System.Runtime.xml", "ref/netstandard1.3/zh-hant/System.Runtime.xml", "ref/netstandard1.5/System.Runtime.dll", "ref/netstandard1.5/System.Runtime.xml", "ref/netstandard1.5/de/System.Runtime.xml", "ref/netstandard1.5/es/System.Runtime.xml", "ref/netstandard1.5/fr/System.Runtime.xml", "ref/netstandard1.5/it/System.Runtime.xml", "ref/netstandard1.5/ja/System.Runtime.xml", "ref/netstandard1.5/ko/System.Runtime.xml", "ref/netstandard1.5/ru/System.Runtime.xml", "ref/netstandard1.5/zh-hans/System.Runtime.xml", "ref/netstandard1.5/zh-hant/System.Runtime.xml", "ref/portable-net45+win8+wp80+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.4.3.0.nupkg.sha512", "system.runtime.nuspec" ] }, "System.Runtime.CompilerServices.Unsafe/4.7.0": { "sha512": "IpU1lcHz8/09yDr9N+Juc7SCgNUz+RohkCQI+KsWKR67XxpFr8Z6c8t1iENCXZuRuNCc4HBwme/MDHNVCwyAKg==", "type": "package", "path": "system.runtime.compilerservices.unsafe/4.7.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.xml", "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml", "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", "ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", "ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml", "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", "system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512", "system.runtime.compilerservices.unsafe.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Runtime.Extensions/4.3.0": { "sha512": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "type": "package", "path": "system.runtime.extensions/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.Extensions.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.Extensions.dll", "ref/netcore50/System.Runtime.Extensions.dll", "ref/netcore50/System.Runtime.Extensions.xml", "ref/netcore50/de/System.Runtime.Extensions.xml", "ref/netcore50/es/System.Runtime.Extensions.xml", "ref/netcore50/fr/System.Runtime.Extensions.xml", "ref/netcore50/it/System.Runtime.Extensions.xml", "ref/netcore50/ja/System.Runtime.Extensions.xml", "ref/netcore50/ko/System.Runtime.Extensions.xml", "ref/netcore50/ru/System.Runtime.Extensions.xml", "ref/netcore50/zh-hans/System.Runtime.Extensions.xml", "ref/netcore50/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.0/System.Runtime.Extensions.dll", "ref/netstandard1.0/System.Runtime.Extensions.xml", "ref/netstandard1.0/de/System.Runtime.Extensions.xml", "ref/netstandard1.0/es/System.Runtime.Extensions.xml", "ref/netstandard1.0/fr/System.Runtime.Extensions.xml", "ref/netstandard1.0/it/System.Runtime.Extensions.xml", "ref/netstandard1.0/ja/System.Runtime.Extensions.xml", "ref/netstandard1.0/ko/System.Runtime.Extensions.xml", "ref/netstandard1.0/ru/System.Runtime.Extensions.xml", "ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.3/System.Runtime.Extensions.dll", "ref/netstandard1.3/System.Runtime.Extensions.xml", "ref/netstandard1.3/de/System.Runtime.Extensions.xml", "ref/netstandard1.3/es/System.Runtime.Extensions.xml", "ref/netstandard1.3/fr/System.Runtime.Extensions.xml", "ref/netstandard1.3/it/System.Runtime.Extensions.xml", "ref/netstandard1.3/ja/System.Runtime.Extensions.xml", "ref/netstandard1.3/ko/System.Runtime.Extensions.xml", "ref/netstandard1.3/ru/System.Runtime.Extensions.xml", "ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.5/System.Runtime.Extensions.dll", "ref/netstandard1.5/System.Runtime.Extensions.xml", "ref/netstandard1.5/de/System.Runtime.Extensions.xml", "ref/netstandard1.5/es/System.Runtime.Extensions.xml", "ref/netstandard1.5/fr/System.Runtime.Extensions.xml", "ref/netstandard1.5/it/System.Runtime.Extensions.xml", "ref/netstandard1.5/ja/System.Runtime.Extensions.xml", "ref/netstandard1.5/ko/System.Runtime.Extensions.xml", "ref/netstandard1.5/ru/System.Runtime.Extensions.xml", "ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.extensions.4.3.0.nupkg.sha512", "system.runtime.extensions.nuspec" ] }, "System.Runtime.Handles/4.3.0": { "sha512": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "type": "package", "path": "system.runtime.handles/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/_._", "ref/netstandard1.3/System.Runtime.Handles.dll", "ref/netstandard1.3/System.Runtime.Handles.xml", "ref/netstandard1.3/de/System.Runtime.Handles.xml", "ref/netstandard1.3/es/System.Runtime.Handles.xml", "ref/netstandard1.3/fr/System.Runtime.Handles.xml", "ref/netstandard1.3/it/System.Runtime.Handles.xml", "ref/netstandard1.3/ja/System.Runtime.Handles.xml", "ref/netstandard1.3/ko/System.Runtime.Handles.xml", "ref/netstandard1.3/ru/System.Runtime.Handles.xml", "ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml", "ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.handles.4.3.0.nupkg.sha512", "system.runtime.handles.nuspec" ] }, "System.Runtime.InteropServices/4.3.0": { "sha512": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "type": "package", "path": "system.runtime.interopservices/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.InteropServices.dll", "lib/net463/System.Runtime.InteropServices.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.InteropServices.dll", "ref/net463/System.Runtime.InteropServices.dll", "ref/netcore50/System.Runtime.InteropServices.dll", "ref/netcore50/System.Runtime.InteropServices.xml", "ref/netcore50/de/System.Runtime.InteropServices.xml", "ref/netcore50/es/System.Runtime.InteropServices.xml", "ref/netcore50/fr/System.Runtime.InteropServices.xml", "ref/netcore50/it/System.Runtime.InteropServices.xml", "ref/netcore50/ja/System.Runtime.InteropServices.xml", "ref/netcore50/ko/System.Runtime.InteropServices.xml", "ref/netcore50/ru/System.Runtime.InteropServices.xml", "ref/netcore50/zh-hans/System.Runtime.InteropServices.xml", "ref/netcore50/zh-hant/System.Runtime.InteropServices.xml", "ref/netcoreapp1.1/System.Runtime.InteropServices.dll", "ref/netstandard1.1/System.Runtime.InteropServices.dll", "ref/netstandard1.1/System.Runtime.InteropServices.xml", "ref/netstandard1.1/de/System.Runtime.InteropServices.xml", "ref/netstandard1.1/es/System.Runtime.InteropServices.xml", "ref/netstandard1.1/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.1/it/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.2/System.Runtime.InteropServices.dll", "ref/netstandard1.2/System.Runtime.InteropServices.xml", "ref/netstandard1.2/de/System.Runtime.InteropServices.xml", "ref/netstandard1.2/es/System.Runtime.InteropServices.xml", "ref/netstandard1.2/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.2/it/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.3/System.Runtime.InteropServices.dll", "ref/netstandard1.3/System.Runtime.InteropServices.xml", "ref/netstandard1.3/de/System.Runtime.InteropServices.xml", "ref/netstandard1.3/es/System.Runtime.InteropServices.xml", "ref/netstandard1.3/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.3/it/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.5/System.Runtime.InteropServices.dll", "ref/netstandard1.5/System.Runtime.InteropServices.xml", "ref/netstandard1.5/de/System.Runtime.InteropServices.xml", "ref/netstandard1.5/es/System.Runtime.InteropServices.xml", "ref/netstandard1.5/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.5/it/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.runtime.interopservices.4.3.0.nupkg.sha512", "system.runtime.interopservices.nuspec" ] }, "System.Security.Claims/4.3.0": { "sha512": "P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "type": "package", "path": "system.security.claims/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Claims.dll", "lib/netstandard1.3/System.Security.Claims.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Claims.dll", "ref/netstandard1.3/System.Security.Claims.dll", "ref/netstandard1.3/System.Security.Claims.xml", "ref/netstandard1.3/de/System.Security.Claims.xml", "ref/netstandard1.3/es/System.Security.Claims.xml", "ref/netstandard1.3/fr/System.Security.Claims.xml", "ref/netstandard1.3/it/System.Security.Claims.xml", "ref/netstandard1.3/ja/System.Security.Claims.xml", "ref/netstandard1.3/ko/System.Security.Claims.xml", "ref/netstandard1.3/ru/System.Security.Claims.xml", "ref/netstandard1.3/zh-hans/System.Security.Claims.xml", "ref/netstandard1.3/zh-hant/System.Security.Claims.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.security.claims.4.3.0.nupkg.sha512", "system.security.claims.nuspec" ] }, "System.Security.Cryptography.Cng/4.5.0": { "sha512": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==", "type": "package", "path": "system.security.cryptography.cng/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Cryptography.Cng.dll", "lib/net461/System.Security.Cryptography.Cng.dll", "lib/net462/System.Security.Cryptography.Cng.dll", "lib/net47/System.Security.Cryptography.Cng.dll", "lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll", "lib/netstandard1.3/System.Security.Cryptography.Cng.dll", "lib/netstandard1.4/System.Security.Cryptography.Cng.dll", "lib/netstandard1.6/System.Security.Cryptography.Cng.dll", "lib/netstandard2.0/System.Security.Cryptography.Cng.dll", "lib/uap10.0.16299/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Cryptography.Cng.dll", "ref/net461/System.Security.Cryptography.Cng.dll", "ref/net461/System.Security.Cryptography.Cng.xml", "ref/net462/System.Security.Cryptography.Cng.dll", "ref/net462/System.Security.Cryptography.Cng.xml", "ref/net47/System.Security.Cryptography.Cng.dll", "ref/net47/System.Security.Cryptography.Cng.xml", "ref/netcoreapp2.0/System.Security.Cryptography.Cng.dll", "ref/netcoreapp2.0/System.Security.Cryptography.Cng.xml", "ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll", "ref/netcoreapp2.1/System.Security.Cryptography.Cng.xml", "ref/netstandard1.3/System.Security.Cryptography.Cng.dll", "ref/netstandard1.4/System.Security.Cryptography.Cng.dll", "ref/netstandard1.6/System.Security.Cryptography.Cng.dll", "ref/netstandard2.0/System.Security.Cryptography.Cng.dll", "ref/netstandard2.0/System.Security.Cryptography.Cng.xml", "ref/uap10.0.16299/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/win/lib/net46/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net461/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net462/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net47/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netcoreapp2.0/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.4/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/uap10.0.16299/_._", "system.security.cryptography.cng.4.5.0.nupkg.sha512", "system.security.cryptography.cng.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Security.Principal/4.3.0": { "sha512": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "type": "package", "path": "system.security.principal/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Security.Principal.dll", "lib/netstandard1.0/System.Security.Principal.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Security.Principal.dll", "ref/netcore50/System.Security.Principal.xml", "ref/netcore50/de/System.Security.Principal.xml", "ref/netcore50/es/System.Security.Principal.xml", "ref/netcore50/fr/System.Security.Principal.xml", "ref/netcore50/it/System.Security.Principal.xml", "ref/netcore50/ja/System.Security.Principal.xml", "ref/netcore50/ko/System.Security.Principal.xml", "ref/netcore50/ru/System.Security.Principal.xml", "ref/netcore50/zh-hans/System.Security.Principal.xml", "ref/netcore50/zh-hant/System.Security.Principal.xml", "ref/netstandard1.0/System.Security.Principal.dll", "ref/netstandard1.0/System.Security.Principal.xml", "ref/netstandard1.0/de/System.Security.Principal.xml", "ref/netstandard1.0/es/System.Security.Principal.xml", "ref/netstandard1.0/fr/System.Security.Principal.xml", "ref/netstandard1.0/it/System.Security.Principal.xml", "ref/netstandard1.0/ja/System.Security.Principal.xml", "ref/netstandard1.0/ko/System.Security.Principal.xml", "ref/netstandard1.0/ru/System.Security.Principal.xml", "ref/netstandard1.0/zh-hans/System.Security.Principal.xml", "ref/netstandard1.0/zh-hant/System.Security.Principal.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.security.principal.4.3.0.nupkg.sha512", "system.security.principal.nuspec" ] }, "System.Security.Principal.Windows/4.3.0": { "sha512": "HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", "type": "package", "path": "system.security.principal.windows/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Security.Principal.Windows.dll", "ref/net46/System.Security.Principal.Windows.dll", "ref/netstandard1.3/System.Security.Principal.Windows.dll", "ref/netstandard1.3/System.Security.Principal.Windows.xml", "ref/netstandard1.3/de/System.Security.Principal.Windows.xml", "ref/netstandard1.3/es/System.Security.Principal.Windows.xml", "ref/netstandard1.3/fr/System.Security.Principal.Windows.xml", "ref/netstandard1.3/it/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ja/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ko/System.Security.Principal.Windows.xml", "ref/netstandard1.3/ru/System.Security.Principal.Windows.xml", "ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml", "ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml", "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll", "runtimes/win/lib/net46/System.Security.Principal.Windows.dll", "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll", "system.security.principal.windows.4.3.0.nupkg.sha512", "system.security.principal.windows.nuspec" ] }, "System.Text.Encoding/4.3.0": { "sha512": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "type": "package", "path": "system.text.encoding/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Text.Encoding.dll", "ref/netcore50/System.Text.Encoding.xml", "ref/netcore50/de/System.Text.Encoding.xml", "ref/netcore50/es/System.Text.Encoding.xml", "ref/netcore50/fr/System.Text.Encoding.xml", "ref/netcore50/it/System.Text.Encoding.xml", "ref/netcore50/ja/System.Text.Encoding.xml", "ref/netcore50/ko/System.Text.Encoding.xml", "ref/netcore50/ru/System.Text.Encoding.xml", "ref/netcore50/zh-hans/System.Text.Encoding.xml", "ref/netcore50/zh-hant/System.Text.Encoding.xml", "ref/netstandard1.0/System.Text.Encoding.dll", "ref/netstandard1.0/System.Text.Encoding.xml", "ref/netstandard1.0/de/System.Text.Encoding.xml", "ref/netstandard1.0/es/System.Text.Encoding.xml", "ref/netstandard1.0/fr/System.Text.Encoding.xml", "ref/netstandard1.0/it/System.Text.Encoding.xml", "ref/netstandard1.0/ja/System.Text.Encoding.xml", "ref/netstandard1.0/ko/System.Text.Encoding.xml", "ref/netstandard1.0/ru/System.Text.Encoding.xml", "ref/netstandard1.0/zh-hans/System.Text.Encoding.xml", "ref/netstandard1.0/zh-hant/System.Text.Encoding.xml", "ref/netstandard1.3/System.Text.Encoding.dll", "ref/netstandard1.3/System.Text.Encoding.xml", "ref/netstandard1.3/de/System.Text.Encoding.xml", "ref/netstandard1.3/es/System.Text.Encoding.xml", "ref/netstandard1.3/fr/System.Text.Encoding.xml", "ref/netstandard1.3/it/System.Text.Encoding.xml", "ref/netstandard1.3/ja/System.Text.Encoding.xml", "ref/netstandard1.3/ko/System.Text.Encoding.xml", "ref/netstandard1.3/ru/System.Text.Encoding.xml", "ref/netstandard1.3/zh-hans/System.Text.Encoding.xml", "ref/netstandard1.3/zh-hant/System.Text.Encoding.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.text.encoding.4.3.0.nupkg.sha512", "system.text.encoding.nuspec" ] }, "System.Text.Encoding.CodePages/4.5.1": { "sha512": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", "type": "package", "path": "system.text.encoding.codepages/4.5.1", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Text.Encoding.CodePages.dll", "lib/net461/System.Text.Encoding.CodePages.dll", "lib/netstandard1.3/System.Text.Encoding.CodePages.dll", "lib/netstandard2.0/System.Text.Encoding.CodePages.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/win/lib/net461/System.Text.Encoding.CodePages.dll", "runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll", "runtimes/win/lib/netstandard1.3/System.Text.Encoding.CodePages.dll", "runtimes/win/lib/netstandard2.0/System.Text.Encoding.CodePages.dll", "system.text.encoding.codepages.4.5.1.nupkg.sha512", "system.text.encoding.codepages.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Text.Encodings.Web/4.5.0": { "sha512": "Xg4G4Indi4dqP1iuAiMSwpiWS54ZghzR644OtsRCm/m/lBMG8dUBhLVN7hLm8NNrNTR+iGbshCPTwrvxZPlm4g==", "type": "package", "path": "system.text.encodings.web/4.5.0", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/netstandard1.0/System.Text.Encodings.Web.dll", "lib/netstandard1.0/System.Text.Encodings.Web.xml", "lib/netstandard2.0/System.Text.Encodings.Web.dll", "lib/netstandard2.0/System.Text.Encodings.Web.xml", "system.text.encodings.web.4.5.0.nupkg.sha512", "system.text.encodings.web.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Threading/4.3.0": { "sha512": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "type": "package", "path": "system.threading/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Threading.dll", "lib/netstandard1.3/System.Threading.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Threading.dll", "ref/netcore50/System.Threading.xml", "ref/netcore50/de/System.Threading.xml", "ref/netcore50/es/System.Threading.xml", "ref/netcore50/fr/System.Threading.xml", "ref/netcore50/it/System.Threading.xml", "ref/netcore50/ja/System.Threading.xml", "ref/netcore50/ko/System.Threading.xml", "ref/netcore50/ru/System.Threading.xml", "ref/netcore50/zh-hans/System.Threading.xml", "ref/netcore50/zh-hant/System.Threading.xml", "ref/netstandard1.0/System.Threading.dll", "ref/netstandard1.0/System.Threading.xml", "ref/netstandard1.0/de/System.Threading.xml", "ref/netstandard1.0/es/System.Threading.xml", "ref/netstandard1.0/fr/System.Threading.xml", "ref/netstandard1.0/it/System.Threading.xml", "ref/netstandard1.0/ja/System.Threading.xml", "ref/netstandard1.0/ko/System.Threading.xml", "ref/netstandard1.0/ru/System.Threading.xml", "ref/netstandard1.0/zh-hans/System.Threading.xml", "ref/netstandard1.0/zh-hant/System.Threading.xml", "ref/netstandard1.3/System.Threading.dll", "ref/netstandard1.3/System.Threading.xml", "ref/netstandard1.3/de/System.Threading.xml", "ref/netstandard1.3/es/System.Threading.xml", "ref/netstandard1.3/fr/System.Threading.xml", "ref/netstandard1.3/it/System.Threading.xml", "ref/netstandard1.3/ja/System.Threading.xml", "ref/netstandard1.3/ko/System.Threading.xml", "ref/netstandard1.3/ru/System.Threading.xml", "ref/netstandard1.3/zh-hans/System.Threading.xml", "ref/netstandard1.3/zh-hant/System.Threading.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Threading.dll", "system.threading.4.3.0.nupkg.sha512", "system.threading.nuspec" ] }, "System.Threading.Overlapped/4.3.0": { "sha512": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", "type": "package", "path": "system.threading.overlapped/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Threading.Overlapped.dll", "ref/net46/System.Threading.Overlapped.dll", "ref/netstandard1.3/System.Threading.Overlapped.dll", "ref/netstandard1.3/System.Threading.Overlapped.xml", "ref/netstandard1.3/de/System.Threading.Overlapped.xml", "ref/netstandard1.3/es/System.Threading.Overlapped.xml", "ref/netstandard1.3/fr/System.Threading.Overlapped.xml", "ref/netstandard1.3/it/System.Threading.Overlapped.xml", "ref/netstandard1.3/ja/System.Threading.Overlapped.xml", "ref/netstandard1.3/ko/System.Threading.Overlapped.xml", "ref/netstandard1.3/ru/System.Threading.Overlapped.xml", "ref/netstandard1.3/zh-hans/System.Threading.Overlapped.xml", "ref/netstandard1.3/zh-hant/System.Threading.Overlapped.xml", "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll", "runtimes/win/lib/net46/System.Threading.Overlapped.dll", "runtimes/win/lib/netcore50/System.Threading.Overlapped.dll", "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll", "system.threading.overlapped.4.3.0.nupkg.sha512", "system.threading.overlapped.nuspec" ] }, "System.Threading.Tasks/4.3.0": { "sha512": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "type": "package", "path": "system.threading.tasks/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Threading.Tasks.dll", "ref/netcore50/System.Threading.Tasks.xml", "ref/netcore50/de/System.Threading.Tasks.xml", "ref/netcore50/es/System.Threading.Tasks.xml", "ref/netcore50/fr/System.Threading.Tasks.xml", "ref/netcore50/it/System.Threading.Tasks.xml", "ref/netcore50/ja/System.Threading.Tasks.xml", "ref/netcore50/ko/System.Threading.Tasks.xml", "ref/netcore50/ru/System.Threading.Tasks.xml", "ref/netcore50/zh-hans/System.Threading.Tasks.xml", "ref/netcore50/zh-hant/System.Threading.Tasks.xml", "ref/netstandard1.0/System.Threading.Tasks.dll", "ref/netstandard1.0/System.Threading.Tasks.xml", "ref/netstandard1.0/de/System.Threading.Tasks.xml", "ref/netstandard1.0/es/System.Threading.Tasks.xml", "ref/netstandard1.0/fr/System.Threading.Tasks.xml", "ref/netstandard1.0/it/System.Threading.Tasks.xml", "ref/netstandard1.0/ja/System.Threading.Tasks.xml", "ref/netstandard1.0/ko/System.Threading.Tasks.xml", "ref/netstandard1.0/ru/System.Threading.Tasks.xml", "ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml", "ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml", "ref/netstandard1.3/System.Threading.Tasks.dll", "ref/netstandard1.3/System.Threading.Tasks.xml", "ref/netstandard1.3/de/System.Threading.Tasks.xml", "ref/netstandard1.3/es/System.Threading.Tasks.xml", "ref/netstandard1.3/fr/System.Threading.Tasks.xml", "ref/netstandard1.3/it/System.Threading.Tasks.xml", "ref/netstandard1.3/ja/System.Threading.Tasks.xml", "ref/netstandard1.3/ko/System.Threading.Tasks.xml", "ref/netstandard1.3/ru/System.Threading.Tasks.xml", "ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml", "ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.tasks.4.3.0.nupkg.sha512", "system.threading.tasks.nuspec" ] }, "System.Threading.Tasks.Extensions/4.5.3": { "sha512": "+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==", "type": "package", "path": "system.threading.tasks.extensions/4.5.3", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/netcoreapp2.1/_._", "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll", "lib/netstandard1.0/System.Threading.Tasks.Extensions.xml", "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll", "lib/netstandard2.0/System.Threading.Tasks.Extensions.xml", "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll", "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/netcoreapp2.1/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.tasks.extensions.4.5.3.nupkg.sha512", "system.threading.tasks.extensions.nuspec", "useSharedDesignerContext.txt", "version.txt" ] }, "System.Threading.Thread/4.3.0": { "sha512": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", "type": "package", "path": "system.threading.thread/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Threading.Thread.dll", "lib/netcore50/_._", "lib/netstandard1.3/System.Threading.Thread.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Threading.Thread.dll", "ref/netstandard1.3/System.Threading.Thread.dll", "ref/netstandard1.3/System.Threading.Thread.xml", "ref/netstandard1.3/de/System.Threading.Thread.xml", "ref/netstandard1.3/es/System.Threading.Thread.xml", "ref/netstandard1.3/fr/System.Threading.Thread.xml", "ref/netstandard1.3/it/System.Threading.Thread.xml", "ref/netstandard1.3/ja/System.Threading.Thread.xml", "ref/netstandard1.3/ko/System.Threading.Thread.xml", "ref/netstandard1.3/ru/System.Threading.Thread.xml", "ref/netstandard1.3/zh-hans/System.Threading.Thread.xml", "ref/netstandard1.3/zh-hant/System.Threading.Thread.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.thread.4.3.0.nupkg.sha512", "system.threading.thread.nuspec" ] }, "System.Threading.ThreadPool/4.3.0": { "sha512": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", "type": "package", "path": "system.threading.threadpool/4.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Threading.ThreadPool.dll", "lib/netcore50/_._", "lib/netstandard1.3/System.Threading.ThreadPool.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Threading.ThreadPool.dll", "ref/netstandard1.3/System.Threading.ThreadPool.dll", "ref/netstandard1.3/System.Threading.ThreadPool.xml", "ref/netstandard1.3/de/System.Threading.ThreadPool.xml", "ref/netstandard1.3/es/System.Threading.ThreadPool.xml", "ref/netstandard1.3/fr/System.Threading.ThreadPool.xml", "ref/netstandard1.3/it/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ja/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ko/System.Threading.ThreadPool.xml", "ref/netstandard1.3/ru/System.Threading.ThreadPool.xml", "ref/netstandard1.3/zh-hans/System.Threading.ThreadPool.xml", "ref/netstandard1.3/zh-hant/System.Threading.ThreadPool.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "system.threading.threadpool.4.3.0.nupkg.sha512", "system.threading.threadpool.nuspec" ] }, "Splamy.TSLib/1.1.0": { "type": "project", "path": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj", "msbuildProject": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj" }, "TS3AudioBot/1.0.0": { "type": "project", "path": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj", "msbuildProject": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj" } }, "projectFileDependencyGroups": { ".NETCoreApp,Version=v3.1": [ "Splamy.TSLib >= 1.1.0", "TS3AudioBot >= 1.0.0" ] }, "packageFolders": { "C:\\Users\\Saopig\\.nuget\\packages\\": {} }, "project": { "version": "1.0.0", "restore": { "projectUniqueName": "C:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\ClassLibrary4.csproj", "projectName": "YunBot", "projectPath": "C:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\ClassLibrary4.csproj", "packagesPath": "C:\\Users\\Saopig\\.nuget\\packages\\", "outputPath": "C:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\obj\\", "projectStyle": "PackageReference", "configFilePaths": [ "C:\\Users\\Saopig\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ "netcoreapp3.1" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "projectReferences": { "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj": { "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj" }, "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj": { "projectPath": "G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj" } } } }, "warningProperties": { "warnAsError": [ "NU1605" ] } }, "frameworks": { "netcoreapp3.1": { "targetAlias": "netcoreapp3.1", "imports": [ "net461", "net462", "net47", "net471", "net472", "net48" ], "assetTargetFallback": true, "warn": true, "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.416\\RuntimeIdentifierGraph.json" } } } } ================================================ FILE: obj/project.nuget.cache ================================================ { "version": 2, "dgSpecHash": "pnQ6NJtIspPocDo9pXa2zhiiOXgyT2kdgFOvP8mP0A6KgmFR5CVfZwajnBewYIe6WSeHhIojg8fh2TaTL75FRg==", "success": true, "projectFilePath": "C:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\ClassLibrary4.csproj", "expectedPackageFiles": [ "C:\\Users\\Saopig\\.nuget\\packages\\cliwrap\\3.1.0\\cliwrap.3.1.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\commandlineparser\\2.8.0\\commandlineparser.2.8.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\heijden.dns.portable\\2.0.19\\heijden.dns.portable.2.0.19.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\litedb\\4.1.4\\litedb.4.1.4.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.connections.abstractions\\2.2.0\\microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.cors\\2.2.0\\microsoft.aspnetcore.cors.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.hosting\\2.2.0\\microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.hosting.abstractions\\2.2.0\\microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.hosting.server.abstractions\\2.2.0\\microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.http\\2.2.0\\microsoft.aspnetcore.http.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.http.abstractions\\2.2.0\\microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.http.extensions\\2.2.0\\microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.http.features\\2.2.0\\microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel\\2.2.0\\microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.core\\2.2.0\\microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.https\\2.2.0\\microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.transport.abstractions\\2.2.0\\microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.server.kestrel.transport.sockets\\2.2.0\\microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.staticfiles\\2.2.0\\microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.aspnetcore.webutilities\\2.2.0\\microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.codeanalysis.analyzers\\3.0.0\\microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.codeanalysis.common\\3.7.0\\microsoft.codeanalysis.common.3.7.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.codeanalysis.csharp\\3.7.0\\microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.configuration\\2.2.0\\microsoft.extensions.configuration.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\2.2.0\\microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.configuration.binder\\2.2.0\\microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.configuration.environmentvariables\\2.2.0\\microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.configuration.fileextensions\\2.2.0\\microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\2.2.0\\microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\2.2.0\\microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.fileproviders.abstractions\\2.2.0\\microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.fileproviders.physical\\2.2.0\\microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.filesystemglobbing\\2.2.0\\microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.hosting.abstractions\\2.2.0\\microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.logging\\2.2.0\\microsoft.extensions.logging.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\2.2.0\\microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.objectpool\\2.2.0\\microsoft.extensions.objectpool.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.options\\2.2.0\\microsoft.extensions.options.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.primitives\\2.2.0\\microsoft.extensions.primitives.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.extensions.webencoders\\2.2.0\\microsoft.extensions.webencoders.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.net.http.headers\\2.2.0\\microsoft.net.http.headers.2.2.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.netcore.platforms\\2.1.2\\microsoft.netcore.platforms.2.1.2.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.netcore.targets\\1.1.0\\microsoft.netcore.targets.1.1.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\microsoft.win32.primitives\\4.3.0\\microsoft.win32.primitives.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\nett\\0.15.0\\nett.0.15.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\newtonsoft.json\\12.0.3\\newtonsoft.json.12.0.3.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\nlog\\4.7.3\\nlog.4.7.3.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\playlistsnet\\1.1.2\\playlistsnet.1.1.2.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\portable.bouncycastle\\1.8.6.7\\portable.bouncycastle.1.8.6.7.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\runtime.native.system\\4.3.0\\runtime.native.system.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\sixlabors.imagesharp\\1.0.0\\sixlabors.imagesharp.1.0.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\splamy.ed25519.toolkit\\1.0.3\\splamy.ed25519.toolkit.1.0.3.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.buffers\\4.5.0\\system.buffers.4.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.collections\\4.3.0\\system.collections.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.collections.immutable\\1.5.0\\system.collections.immutable.1.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.componentmodel.annotations\\4.5.0\\system.componentmodel.annotations.4.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.diagnostics.debug\\4.3.0\\system.diagnostics.debug.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.diagnostics.diagnosticsource\\4.5.0\\system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.diagnostics.tracing\\4.3.0\\system.diagnostics.tracing.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.globalization\\4.3.0\\system.globalization.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.io\\4.3.0\\system.io.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.io.filesystem\\4.3.0\\system.io.filesystem.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.io.filesystem.primitives\\4.3.0\\system.io.filesystem.primitives.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.io.pipelines\\4.7.2\\system.io.pipelines.4.7.2.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.linq\\4.3.0\\system.linq.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.memory\\4.5.4\\system.memory.4.5.4.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.net.networkinformation\\4.3.0\\system.net.networkinformation.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.net.primitives\\4.3.0\\system.net.primitives.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.net.sockets\\4.3.0\\system.net.sockets.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.numerics.vectors\\4.5.0\\system.numerics.vectors.4.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.reflection\\4.3.0\\system.reflection.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.reflection.primitives\\4.3.0\\system.reflection.primitives.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.reflection.typeextensions\\4.3.0\\system.reflection.typeextensions.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.resources.resourcemanager\\4.3.0\\system.resources.resourcemanager.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime\\4.3.0\\system.runtime.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\4.7.0\\system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime.extensions\\4.3.0\\system.runtime.extensions.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime.handles\\4.3.0\\system.runtime.handles.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.runtime.interopservices\\4.3.0\\system.runtime.interopservices.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.security.claims\\4.3.0\\system.security.claims.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.security.cryptography.cng\\4.5.0\\system.security.cryptography.cng.4.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.security.principal\\4.3.0\\system.security.principal.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.security.principal.windows\\4.3.0\\system.security.principal.windows.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.text.encoding\\4.3.0\\system.text.encoding.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.text.encoding.codepages\\4.5.1\\system.text.encoding.codepages.4.5.1.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.text.encodings.web\\4.5.0\\system.text.encodings.web.4.5.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading\\4.3.0\\system.threading.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.overlapped\\4.3.0\\system.threading.overlapped.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.tasks\\4.3.0\\system.threading.tasks.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.tasks.extensions\\4.5.3\\system.threading.tasks.extensions.4.5.3.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.thread\\4.3.0\\system.threading.thread.4.3.0.nupkg.sha512", "C:\\Users\\Saopig\\.nuget\\packages\\system.threading.threadpool\\4.3.0\\system.threading.threadpool.4.3.0.nupkg.sha512" ], "logs": [] }