{"action":"created","comment":{"url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pulls/comments/54792652","id":54792652,"diff_hunk":"@@ -430,33 +415,16 @@ private string BuildPlugin(RoslynPluginDefinition definition, string baseTempDir\n             return fullJarPath;\n         }\n \n-        private void AddRoslynMetadata(string baseTempDirectory, PluginBuilder builder, RoslynPluginDefinition definition)\n+        private void AddRoslynMetadata(RoslynPluginJarBuilder builder, RoslynPluginDefinition definition, string repositoryId)\n         {\n-            string sourcesDir = Utilities.CreateSubDirectory(baseTempDirectory, \"src\");\n-            this.logger.LogDebug(UIResources.APG_CreatingRoslynSources, sourcesDir);\n-\n-            SourceGenerator.CreateSourceFiles(typeof(AnalyzerPluginGenerator).Assembly, RoslynResourcesRoot, sourcesDir, new Dictionary<string, string>());\n-\n-            string[] sourceFiles = Directory.GetFiles(sourcesDir, \"*.java\", SearchOption.AllDirectories);\n-            Debug.Assert(sourceFiles.Any(), \"Failed to correctly unpack the Roslyn analyzer specific source files\");\n-\n-            foreach (string sourceFile in sourceFiles)\n-            {\n-                builder.AddSourceFile(sourceFile);\n-            }\n-\n-            builder.SetSourceCodeTokenReplacement(PackageId_Token, definition.PackageId);\n-            builder.SetSourceCodeTokenReplacement(PackageVersion_Token, definition.PackageVersion);\n-            builder.SetSourceCodeTokenReplacement(AnalyzerId_Token, definition.PackageId);\n-            builder.SetSourceCodeTokenReplacement(RuleNamespace_Token, definition.PackageId);\n-            builder.SetSourceCodeTokenReplacement(StaticResourceName_Token, definition.StaticResourceName);\n-            builder.SetSourceCodeTokenReplacement(PluginKey_Token, definition.Manifest.Key);\n-            builder.SetSourceCodeTokenReplacement(PluginVersion_Token, definition.Manifest.Version);\n-\n-            foreach (string extension in Extensions)\n-            {\n-                builder.AddExtension(extension);\n-            }\n+            builder.SetPluginProperty(repositoryId + \".nuget.packageId\", definition.PackageId);\n+            builder.SetPluginProperty(repositoryId + \".nuget.packageVersion\", definition.PackageVersion);\n+\n+            builder.SetPluginProperty(repositoryId + \".analyzerId\", definition.PackageId);\n+            builder.SetPluginProperty(repositoryId + \".ruleNamespace\", definition.PackageId);\n+            builder.SetPluginProperty(repositoryId + \".staticResourceName\", definition.StaticResourceName);\n+            builder.SetPluginProperty(repositoryId + \".pluginKey\", definition.Manifest.Key);\n+            builder.SetPluginProperty(repositoryId + \".pluginVersion\", definition.Manifest.Version);","path":"RoslynPluginGenerator/AnalyzerPluginGenerator.cs","position":130,"original_position":130,"commit_id":"bca5d8eee1595e57d720a7b09a76a45659853724","original_commit_id":"bca5d8eee1595e57d720a7b09a76a45659853724","user":{"login":"duncanpMS","id":10757559,"avatar_url":"https://avatars.githubusercontent.com/u/10757559?v=3","gravatar_id":"","url":"https://api.github.com/users/duncanpMS","html_url":"https://github.com/duncanpMS","followers_url":"https://api.github.com/users/duncanpMS/followers","following_url":"https://api.github.com/users/duncanpMS/following{/other_user}","gists_url":"https://api.github.com/users/duncanpMS/gists{/gist_id}","starred_url":"https://api.github.com/users/duncanpMS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/duncanpMS/subscriptions","organizations_url":"https://api.github.com/users/duncanpMS/orgs","repos_url":"https://api.github.com/users/duncanpMS/repos","events_url":"https://api.github.com/users/duncanpMS/events{/privacy}","received_events_url":"https://api.github.com/users/duncanpMS/received_events","type":"User","site_admin":false},"body":"The \"SetPluginProperty\" replaces the old code which injected the property values into source code that was then compiled. The properties are now written to the new configuration.xml file which is then embedded in the jar.","created_at":"2016-03-02T21:16:16Z","updated_at":"2016-03-02T21:16:16Z","html_url":"https://github.com/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pull/52#discussion_r54792652","pull_request_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pulls/52","_links":{"self":{"href":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pulls/comments/54792652"},"html":{"href":"https://github.com/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pull/52#discussion_r54792652"},"pull_request":{"href":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pulls/52"}}},"pull_request":{"url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pulls/52","id":61467589,"html_url":"https://github.com/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pull/52","diff_url":"https://github.com/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pull/52.diff","patch_url":"https://github.com/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pull/52.patch","issue_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/issues/52","number":52,"state":"open","locked":false,"title":"[SFSRAP-37] Modified generator to not require the JDK","user":{"login":"duncanpMS","id":10757559,"avatar_url":"https://avatars.githubusercontent.com/u/10757559?v=3","gravatar_id":"","url":"https://api.github.com/users/duncanpMS","html_url":"https://github.com/duncanpMS","followers_url":"https://api.github.com/users/duncanpMS/followers","following_url":"https://api.github.com/users/duncanpMS/following{/other_user}","gists_url":"https://api.github.com/users/duncanpMS/gists{/gist_id}","starred_url":"https://api.github.com/users/duncanpMS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/duncanpMS/subscriptions","organizations_url":"https://api.github.com/users/duncanpMS/orgs","repos_url":"https://api.github.com/users/duncanpMS/repos","events_url":"https://api.github.com/users/duncanpMS/events{/privacy}","received_events_url":"https://api.github.com/users/duncanpMS/received_events","type":"User","site_admin":false},"body":"I've added a new builder class that updates an existing jar rather than building a new one.\r\nI haven't removed the old code yet to make reviewing the code more manageable.\r\n\r\nTODO:\r\n* remove dead code\r\n* handle long lines in the manifest\r\n\r\nI've manually tested generating and installing two new plugins, then running an analysis, with and without an embedded SQALE file. All works as expected so far.","created_at":"2016-03-02T21:11:51Z","updated_at":"2016-03-02T21:16:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"84cc87365975c7cf93d06c7cf57b0e92c0ca05b8","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pulls/52/commits","review_comments_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pulls/52/comments","review_comment_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pulls/comments{/number}","comments_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/issues/52/comments","statuses_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/statuses/bca5d8eee1595e57d720a7b09a76a45659853724","head":{"label":"duncanpMS:37sq","ref":"37sq","sha":"bca5d8eee1595e57d720a7b09a76a45659853724","user":{"login":"duncanpMS","id":10757559,"avatar_url":"https://avatars.githubusercontent.com/u/10757559?v=3","gravatar_id":"","url":"https://api.github.com/users/duncanpMS","html_url":"https://github.com/duncanpMS","followers_url":"https://api.github.com/users/duncanpMS/followers","following_url":"https://api.github.com/users/duncanpMS/following{/other_user}","gists_url":"https://api.github.com/users/duncanpMS/gists{/gist_id}","starred_url":"https://api.github.com/users/duncanpMS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/duncanpMS/subscriptions","organizations_url":"https://api.github.com/users/duncanpMS/orgs","repos_url":"https://api.github.com/users/duncanpMS/repos","events_url":"https://api.github.com/users/duncanpMS/events{/privacy}","received_events_url":"https://api.github.com/users/duncanpMS/received_events","type":"User","site_admin":false},"repo":{"id":47558647,"name":"sonarqube-roslyn-sdk","full_name":"duncanpMS/sonarqube-roslyn-sdk","owner":{"login":"duncanpMS","id":10757559,"avatar_url":"https://avatars.githubusercontent.com/u/10757559?v=3","gravatar_id":"","url":"https://api.github.com/users/duncanpMS","html_url":"https://github.com/duncanpMS","followers_url":"https://api.github.com/users/duncanpMS/followers","following_url":"https://api.github.com/users/duncanpMS/following{/other_user}","gists_url":"https://api.github.com/users/duncanpMS/gists{/gist_id}","starred_url":"https://api.github.com/users/duncanpMS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/duncanpMS/subscriptions","organizations_url":"https://api.github.com/users/duncanpMS/orgs","repos_url":"https://api.github.com/users/duncanpMS/repos","events_url":"https://api.github.com/users/duncanpMS/events{/privacy}","received_events_url":"https://api.github.com/users/duncanpMS/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/duncanpMS/sonarqube-roslyn-sdk","description":"SDK for SonarQube Roslyn Analyzer Plugins ","fork":true,"url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk","forks_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/forks","keys_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/teams","hooks_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/hooks","issue_events_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/issues/events{/number}","events_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/events","assignees_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/assignees{/user}","branches_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/branches{/branch}","tags_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/tags","blobs_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/git/refs{/sha}","trees_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/statuses/{sha}","languages_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/languages","stargazers_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/stargazers","contributors_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/contributors","subscribers_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/subscribers","subscription_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/subscription","commits_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/commits{/sha}","git_commits_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/git/commits{/sha}","comments_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/comments{/number}","issue_comment_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/issues/comments{/number}","contents_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/contents/{+path}","compare_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/merges","archive_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/downloads","issues_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/issues{/number}","pulls_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/pulls{/number}","milestones_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/milestones{/number}","notifications_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/labels{/name}","releases_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/releases{/id}","deployments_url":"https://api.github.com/repos/duncanpMS/sonarqube-roslyn-sdk/deployments","created_at":"2015-12-07T14:56:57Z","updated_at":"2016-01-11T16:39:45Z","pushed_at":"2016-03-02T21:07:08Z","git_url":"git://github.com/duncanpMS/sonarqube-roslyn-sdk.git","ssh_url":"git@github.com:duncanpMS/sonarqube-roslyn-sdk.git","clone_url":"https://github.com/duncanpMS/sonarqube-roslyn-sdk.git","svn_url":"https://github.com/duncanpMS/sonarqube-roslyn-sdk","homepage":null,"size":1542,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"SonarSource-VisualStudio:master","ref":"master","sha":"41bf44e90f6fdc34cb227a97166b59b466cd63eb","user":{"login":"SonarSource-VisualStudio","id":16780579,"avatar_url":"https://avatars.githubusercontent.com/u/16780579?v=3","gravatar_id":"","url":"https://api.github.com/users/SonarSource-VisualStudio","html_url":"https://github.com/SonarSource-VisualStudio","followers_url":"https://api.github.com/users/SonarSource-VisualStudio/followers","following_url":"https://api.github.com/users/SonarSource-VisualStudio/following{/other_user}","gists_url":"https://api.github.com/users/SonarSource-VisualStudio/gists{/gist_id}","starred_url":"https://api.github.com/users/SonarSource-VisualStudio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SonarSource-VisualStudio/subscriptions","organizations_url":"https://api.github.com/users/SonarSource-VisualStudio/orgs","repos_url":"https://api.github.com/users/SonarSource-VisualStudio/repos","events_url":"https://api.github.com/users/SonarSource-VisualStudio/events{/privacy}","received_events_url":"https://api.github.com/users/SonarSource-VisualStudio/received_events","type":"Organization","site_admin":false},"repo":{"id":46718922,"name":"sonarqube-roslyn-sdk","full_name":"SonarSource-VisualStudio/sonarqube-roslyn-sdk","owner":{"login":"SonarSource-VisualStudio","id":16780579,"avatar_url":"https://avatars.githubusercontent.com/u/16780579?v=3","gravatar_id":"","url":"https://api.github.com/users/SonarSource-VisualStudio","html_url":"https://github.com/SonarSource-VisualStudio","followers_url":"https://api.github.com/users/SonarSource-VisualStudio/followers","following_url":"https://api.github.com/users/SonarSource-VisualStudio/following{/other_user}","gists_url":"https://api.github.com/users/SonarSource-VisualStudio/gists{/gist_id}","starred_url":"https://api.github.com/users/SonarSource-VisualStudio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SonarSource-VisualStudio/subscriptions","organizations_url":"https://api.github.com/users/SonarSource-VisualStudio/orgs","repos_url":"https://api.github.com/users/SonarSource-VisualStudio/repos","events_url":"https://api.github.com/users/SonarSource-VisualStudio/events{/privacy}","received_events_url":"https://api.github.com/users/SonarSource-VisualStudio/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/SonarSource-VisualStudio/sonarqube-roslyn-sdk","description":"SDK for SonarQube Roslyn Analyzer Plugins ","fork":false,"url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk","forks_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/forks","keys_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/teams","hooks_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/hooks","issue_events_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/issues/events{/number}","events_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/events","assignees_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/assignees{/user}","branches_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/branches{/branch}","tags_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/tags","blobs_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/git/refs{/sha}","trees_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/statuses/{sha}","languages_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/languages","stargazers_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/stargazers","contributors_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/contributors","subscribers_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/subscribers","subscription_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/subscription","commits_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/commits{/sha}","git_commits_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/git/commits{/sha}","comments_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/comments{/number}","issue_comment_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/issues/comments{/number}","contents_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/contents/{+path}","compare_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/merges","archive_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/downloads","issues_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/issues{/number}","pulls_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pulls{/number}","milestones_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/milestones{/number}","notifications_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/labels{/name}","releases_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/releases{/id}","deployments_url":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/deployments","created_at":"2015-11-23T12:31:17Z","updated_at":"2016-03-01T13:48:06Z","pushed_at":"2016-03-02T21:11:52Z","git_url":"git://github.com/SonarSource-VisualStudio/sonarqube-roslyn-sdk.git","ssh_url":"git@github.com:SonarSource-VisualStudio/sonarqube-roslyn-sdk.git","clone_url":"https://github.com/SonarSource-VisualStudio/sonarqube-roslyn-sdk.git","svn_url":"https://github.com/SonarSource-VisualStudio/sonarqube-roslyn-sdk","homepage":null,"size":1339,"stargazers_count":3,"watchers_count":3,"language":"C#","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":1,"forks":8,"open_issues":1,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pulls/52"},"html":{"href":"https://github.com/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pull/52"},"issue":{"href":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/issues/52"},"comments":{"href":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/issues/52/comments"},"review_comments":{"href":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pulls/52/comments"},"review_comment":{"href":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/pulls/52/commits"},"statuses":{"href":"https://api.github.com/repos/SonarSource-VisualStudio/sonarqube-roslyn-sdk/statuses/bca5d8eee1595e57d720a7b09a76a45659853724"}}}}