{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"D8","name":"Code Coverage","shortDescription":{"text":"Code Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/D8"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"D11","name":"Test Reliability","shortDescription":{"text":"Test Reliability"},"helpUri":"https://codehealth.canine.dev/dimensions/D11"},{"id":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D18","name":"Solution Shape","shortDescription":{"text":"Solution Shape"},"helpUri":"https://codehealth.canine.dev/dimensions/D18"},{"id":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D22","name":"Internal API Consistency","shortDescription":{"text":"Internal API Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D22"},{"id":"D23","name":"Boundary Type-Coupling","shortDescription":{"text":"Boundary Type-Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D23"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D27","name":"Navigability","shortDescription":{"text":"Navigability"},"helpUri":"https://codehealth.canine.dev/dimensions/D27"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"]}},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"]}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D36","name":"Supply-chain Provenance \u0026 Signing","shortDescription":{"text":"Supply-chain Provenance \u0026 Signing"},"helpUri":"https://codehealth.canine.dev/dimensions/D36","relationships":[{"target":{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"]}},{"id":"D39","name":"IL Efficiency","shortDescription":{"text":"IL Efficiency"},"helpUri":"https://codehealth.canine.dev/dimensions/D39"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"RemoveTextForHI.RemoveColon (cyclomatic 279): RemoveTextForHI.RemoveColon has cyclomatic complexity 279 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveTextForHI.cs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"367a5a7f18b0988edf1839670d39bcf52d8ab3ac5de6b25b5ff1d20d5139e059"}},{"ruleId":"D1","level":"warning","message":{"text":"RemoveInterjection.Invoke (cyclomatic 268): RemoveInterjection.Invoke has cyclomatic complexity 268 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveInterjection.cs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"d87de397dc35c9dd0c42ce31e9c77900d1e6c945f7331c433741677f8bbf01c5"}},{"ruleId":"D1","level":"warning","message":{"text":"Ebu.GetCharacter (cyclomatic 180): Ebu.GetCharacter has cyclomatic complexity 180 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":1798}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d7184a3f5a0fb68cf439020a7decd6bcab5daaecc7a59dee75d5abe72069a14"}},{"ruleId":"D1","level":"warning","message":{"text":"DownloadTtsViewModel.OnTimerOnElapsed (cyclomatic 169): DownloadTtsViewModel.OnTimerOnElapsed has cyclomatic complexity 169 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"56ffafc5e45a44f70ed183d81f0ade35a71212c280543ddde3eef7f88475681d"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.SubtitleOpen (cyclomatic 153): MainViewModel.SubtitleOpen has cyclomatic complexity 153 (threshold 15). Of this number, 151 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":16071}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ad3e19c28a02a8c993c2023244faa1c38bee345de6aa7095687ed372588c5c1"}},{"ruleId":"D1","level":"warning","message":{"text":"Cavena890.GetTextAsBytes (cyclomatic 153): Cavena890.GetTextAsBytes has cyclomatic complexity 153 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":852}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a9c3214e3d9f72cc921382e7dfeb720f299f590f447481a9ab93358a67c5649"}},{"ruleId":"D1","level":"warning","message":{"text":"RemoveTextForHI.RemoveTextFromHearImpaired (cyclomatic 126): RemoveTextForHI.RemoveTextFromHearImpaired has cyclomatic complexity 126 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveTextForHI.cs"},"region":{"startLine":856}}}],"partialFingerprints":{"codehealthFindingId/v1":"90fb9ce7180a7fb920e1599c13b5b1ebb45f7db88cbb283fbe0e5e5bc7d3ec3e"}},{"ruleId":"D1","level":"warning","message":{"text":"Utilities.RemoveUnneededSpaces (cyclomatic 121): Utilities.RemoveUnneededSpaces has cyclomatic complexity 121 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":2470}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc08721cb918759f19ba5ebe99c32f25e8bea8a4946bf88305222430f0622475"}},{"ruleId":"D1","level":"warning","message":{"text":"LanguageAutoDetect.AutoDetectLanguageName (cyclomatic 119): LanguageAutoDetect.AutoDetectLanguageName has cyclomatic complexity 119 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":1240}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd3bf7edb2d1eb0eab2a0394bbc21738a75b4932f0673c147bd8cb32d3d18c7a"}},{"ruleId":"D1","level":"warning","message":{"text":"ScenaristClosedCaptions.GetSccText (cyclomatic 118): ScenaristClosedCaptions.GetSccText has cyclomatic complexity 118 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ScenaristClosedCaptions.cs"},"region":{"startLine":1004}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ca205e23e5ec0aa7499b7278e17c975596eebff8a9d745affdd06453bd1e291"}},{"ruleId":"D1","level":"warning","message":{"text":"TtsEngineInstaller.EnsureEngineInstalled (cyclomatic 115): TtsEngineInstaller.EnsureEngineInstalled has cyclomatic complexity 115 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TtsEngineInstaller.cs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"40938bfb38da20dcb53b553e0eeb0d7358d830d52752e322e82eec80612ca926"}},{"ruleId":"D1","level":"warning","message":{"text":"FixStartWithUppercaseLetterAfterParagraph.DoFix (cyclomatic 114): FixStartWithUppercaseLetterAfterParagraph.DoFix has cyclomatic complexity 114 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixStartWithUppercaseLetterAfterParagraph.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"245c14967af2f919704d9fd76a883de75b2f46bbf2d2c8b91776ff84490b9c48"}},{"ruleId":"D1","level":"warning","message":{"text":"FixMissingSpaces.Fix (cyclomatic 113): FixMissingSpaces.Fix has cyclomatic complexity 113 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixMissingSpaces.cs"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"70f0c9d25fa272892fdd65a4c492da04f1c8093a60126557ba94c3e627f4ea0c"}},{"ruleId":"D1","level":"warning","message":{"text":"AddMissingQuotes.Fix (cyclomatic 110): AddMissingQuotes.Fix has cyclomatic complexity 110 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/AddMissingQuotes.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"413b7934f1a7966c0c237148fb4db92a22f1fc78ccc41f953ff06d1677d40555"}},{"ruleId":"D1","level":"warning","message":{"text":"HtmlUtil.FixInvalidItalicTags (cyclomatic 106): HtmlUtil.FixInvalidItalicTags has cyclomatic complexity 106 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/HtmlUtil.cs"},"region":{"startLine":865}}}],"partialFingerprints":{"codehealthFindingId/v1":"54ffde1a1a00792d5fc4c16a0f4ccd56ccc1868212333c4fd9940bf66bb7a389"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.OnKeyDownHandler (cyclomatic 105): MainViewModel.OnKeyDownHandler has cyclomatic complexity 105 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":21614}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f99c1c23137231c26bb95b15dfe121bee22cf258a88bdc14da33b4def6208ed"}},{"ruleId":"D1","level":"warning","message":{"text":"SplitBreakLongLinesViewModel.Split (cyclomatic 104): SplitBreakLongLinesViewModel.Split has cyclomatic complexity 104 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/SplitBreakLongLines/SplitBreakLongLinesViewModel.cs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"a57e85005137b060334c150941cb37394d9d334ce401432ca45a58b58ce209be"}},{"ruleId":"D1","level":"warning","message":{"text":"Pac.GetPacParagraph (cyclomatic 102): Pac.GetPacParagraph has cyclomatic complexity 102 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":1659}}}],"partialFingerprints":{"codehealthFindingId/v1":"228e0e846bd3899fdfbde9e580494bf1c50a96572afa44ef4c6af378f75fb58b"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryOcrMatcher.GetCompareMatch (cyclomatic 102): BinaryOcrMatcher.GetCompareMatch has cyclomatic complexity 102 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrMatcher.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ab5d5cecd3a583c9498c0dc8b3facc0c9240b4e84318f7734acffb4d0692f99"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryOcrMatcher.FindBestMatch (cyclomatic 101): BinaryOcrMatcher.FindBestMatch has cyclomatic complexity 101 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrMatcher.cs"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"0285aebfd23fad2286e2c993b13a711cc3e3aa5e5b68b18f247d438d5528d6e4"}},{"ruleId":"D1","level":"warning","message":{"text":"NetflixImsc11Japanese.ReadParagraph (cyclomatic 97): NetflixImsc11Japanese.ReadParagraph has cyclomatic complexity 97 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/NetflixImsc11Japanese.cs"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"f71dd63d6b6f10d35cb830364337dedc24ed23b03fe5a839e7386d03e0154dec"}},{"ruleId":"D1","level":"warning","message":{"text":"DCinemaSmpte2014.ToText (cyclomatic 94): DCinemaSmpte2014.ToText has cyclomatic complexity 94 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2014.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea4b1897e62cd71983b3b6ac2fb695eeebe12dbb93bef20d65d83fb5240db2e9"}},{"ruleId":"D1","level":"warning","message":{"text":"FixSpanishInvertedQuestionAndExclamationMarks.FixSpanishInvertedLetter (cyclomatic 93): FixSpanishInvertedQuestionAndExclamationMarks.FixSpanishInvertedLetter has cyclomatic complexity 93 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixSpanishInvertedQuestionAndExclamationMarks.cs"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"18e23587c07da332ca0c64965e7ad6df256fdceaa9f56f0ef0ebfd9d930024d4"}},{"ruleId":"D1","level":"warning","message":{"text":"DCinemaSmpte2010.LoadSubtitle (cyclomatic 93): DCinemaSmpte2010.LoadSubtitle has cyclomatic complexity 93 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2010.cs"},"region":{"startLine":629}}}],"partialFingerprints":{"codehealthFindingId/v1":"eedc8d25fde93623ff441ac0a4633357eb3ceac71b2db26349d268cf3ba95fd5"}},{"ruleId":"D1","level":"warning","message":{"text":"DCinemaSmpte2007.ToText (cyclomatic 92): DCinemaSmpte2007.ToText has cyclomatic complexity 92 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2007.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"5396b9ea8e436d19783739077fedf7e06246007044b95f1c19ff0be810a23844"}},{"ruleId":"D1","level":"warning","message":{"text":"DCinemaSmpte2010.ToText (cyclomatic 92): DCinemaSmpte2010.ToText has cyclomatic complexity 92 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2010.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab47225ba81f748d33901ecca571730cd8f6727060bcf3fcf783f188de434d93"}},{"ruleId":"D1","level":"warning","message":{"text":"DCinemaInterop.LoadSubtitle (cyclomatic 91): DCinemaInterop.LoadSubtitle has cyclomatic complexity 91 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaInterop.cs"},"region":{"startLine":611}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb2ec4397103acefdac72f387a8a1706d3e6b2634a0623bd84dc91323e12c36f"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedText.LoadSubtitle (cyclomatic 91): TimedText.LoadSubtitle has cyclomatic complexity 91 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText.cs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ad7234ecc90b1f5a6ca7b2748e9e5d1c75442d8f176eb7f66940c1fa6466318"}},{"ruleId":"D1","level":"warning","message":{"text":"ConvertCommand.ExecuteAsync (cyclomatic 90): ConvertCommand.ExecuteAsync has cyclomatic complexity 90 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Commands/ConvertCommand.cs"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea2b6691611a77386b0bb41e75a0448007a340dcda9b4e8df867a9893c2abc87"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioVisualizer.OnPointerMoved (cyclomatic 88): AudioVisualizer.OnPointerMoved has cyclomatic complexity 88 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":1133}}}],"partialFingerprints":{"codehealthFindingId/v1":"51de8b8b79e0df9894da25ad2711bbd6eaf33a72b34ccfef3e7b6e6ecd8d2f36"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedSubStationAlpha.CheckForErrors (cyclomatic 87): AdvancedSubStationAlpha.CheckForErrors has cyclomatic complexity 87 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":2208}}}],"partialFingerprints":{"codehealthFindingId/v1":"68d811a3d45e3950c82b2d3af6356056e11a7f1b8b9232126106c31e19ce248d"}},{"ruleId":"D1","level":"warning","message":{"text":"DCinemaInterop.ToText (cyclomatic 87): DCinemaInterop.ToText has cyclomatic complexity 87 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaInterop.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba359f7acdf3d3d8960c5021dcf4060472b6e692dae00792d54c009c7e3386e3"}},{"ruleId":"D1","level":"warning","message":{"text":"DCinemaSmpte2007.LoadSubtitle (cyclomatic 84): DCinemaSmpte2007.LoadSubtitle has cyclomatic complexity 84 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2007.cs"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"c29c0615df28d34bfb7e52275c30fe7ce93b3de7a207f067522cc555ecb91bfe"}},{"ruleId":"D1","level":"warning","message":{"text":"DCinemaSmpte2014.LoadSubtitle (cyclomatic 83): DCinemaSmpte2014.LoadSubtitle has cyclomatic complexity 83 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2014.cs"},"region":{"startLine":607}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1d27f55758edfead44e7620f4332dc746de7f4a1f4bbedc7ee62d62a63d1eb6"}},{"ruleId":"D1","level":"warning","message":{"text":"LanguageAutoDetect.AutoDetectGoogleLanguage (cyclomatic 82): LanguageAutoDetect.AutoDetectGoogleLanguage has cyclomatic complexity 82 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":478}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cce58c8646465b262dd52925226ee4a30d17b0eac3cc3b57314af61ad789acf"}},{"ruleId":"D1","level":"warning","message":{"text":"ItunesTimedText.ToText (cyclomatic 79): ItunesTimedText.ToText has cyclomatic complexity 79 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ItunesTimedText.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7a1f4e9ca2f43d84f9ee16f5a88c3214461e5339f055d16539dc4f2ad5702c5"}},{"ruleId":"D1","level":"warning","message":{"text":"SeJsonParser.GetArrayElementsByName (cyclomatic 76): SeJsonParser.GetArrayElementsByName has cyclomatic complexity 76 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4c777886371dc4b2b728e9f2826631318b048848478c06f5830930313693da6"}},{"ruleId":"D1","level":"warning","message":{"text":"Sami.LoadSubtitle (cyclomatic 76): Sami.LoadSubtitle has cyclomatic complexity 76 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Sami.cs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"82aedc5d173551e1509af73639372247aa0823553c6b1e389a6e829b76c386e7"}},{"ruleId":"D1","level":"warning","message":{"text":"Cea708.Decode (cyclomatic 75): Cea708.Decode has cyclomatic complexity 75 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Cea708/Cea708.cs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"01af6f47107d25f1842a5a9e5c67dd70ab05818209902250ef956518147cf6e7"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchConverter.Convert (cyclomatic 74): BatchConverter.Convert has cyclomatic complexity 74 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0f82e4a31741972f4382c59f1cfe867fb18a27c70a54599969d281dc4c6856a"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextViewModel.Transcribe (cyclomatic 74): SpeechToTextViewModel.Transcribe has cyclomatic complexity 74 (threshold 15). Of this number, 73 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":3009}}}],"partialFingerprints":{"codehealthFindingId/v1":"a36f2a7b054e9d3d3508ff635c6e081dffeab5651dde8135cfeb8b89715659b2"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedSubStationAlpha.GetSsaStyle (cyclomatic 74): AdvancedSubStationAlpha.GetSsaStyle has cyclomatic complexity 74 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":2601}}}],"partialFingerprints":{"codehealthFindingId/v1":"14c5680a70921949def84dc16ed3ad86f054d5276e93b12cc2da786a8db09427"}},{"ruleId":"D1","level":"warning","message":{"text":"SeJsonParser.GetArrayElements (cyclomatic 72): SeJsonParser.GetArrayElements has cyclomatic complexity 72 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":630}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d4fb488e8588e5c218c9756fada69e1f0f69f4e3d1db3d8852aa4acff255438"}},{"ruleId":"D1","level":"warning","message":{"text":"SeJsonParser.GetFirstObject (cyclomatic 71): SeJsonParser.GetFirstObject has cyclomatic complexity 71 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":919}}}],"partialFingerprints":{"codehealthFindingId/v1":"f340ba6f8c8084b3c64e124dfa6e203a3fe420615980b64c6d850c68ab1c3377"}},{"ruleId":"D1","level":"warning","message":{"text":"SeJsonParser.GetRootElements (cyclomatic 70): SeJsonParser.GetRootElements has cyclomatic complexity 70 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":1227}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fe589ab5c97e10484c2f853e73d035992c9b64ac9f8132ea27ecd63f6b923f0"}},{"ruleId":"D1","level":"warning","message":{"text":"Utilities.AutoBreakLinePrivate (cyclomatic 69): Utilities.AutoBreakLinePrivate has cyclomatic complexity 69 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba096ad979258d8920d6e1ba6972df513dad7f4ecf1bec36ad91bdf33f4937e7"}},{"ruleId":"D1","level":"warning","message":{"text":"SeJsonParser.GetAllTagsByNameAsStrings (cyclomatic 68): SeJsonParser.GetAllTagsByNameAsStrings has cyclomatic complexity 68 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"fec106cdfd6ad02e9f83c9fdcadffb0499b311d6975aa1f213ea0730344e0747"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedTextImage.LoadSubtitle (cyclomatic 66): TimedTextImage.LoadSubtitle has cyclomatic complexity 66 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImage.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc06d68f1b388e9009e2e7d50f25d723a3bf999e92d79bdd4bcc60cc410870c6"}},{"ruleId":"D1","level":"warning","message":{"text":"Teletext.ProcessTelxPacket (cyclomatic 65): Teletext.ProcessTelxPacket has cyclomatic complexity 65 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/Teletext.cs"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"23c2af02b4eb459f9d7ce9625ac7e86ae9505957e0ac71388c2bc620a8d7d3f6"}},{"ruleId":"D1","level":"warning","message":{"text":"WebVTT.LoadSubtitle (cyclomatic 65): WebVTT.LoadSubtitle has cyclomatic complexity 65 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTT.cs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ae1d3bca3d312d6ca838387dc0e2ac0e24e283277a3301a120d9ad842934bdc"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.StartTimers (cyclomatic 63): MainViewModel.StartTimers has cyclomatic complexity 63 (threshold 15). Most of this is not in the body itself: 2 of the 63 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 22780, 22967, 23010). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":22774}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e84e1850322e2a667b50ff1f231e8f1c05658b72f65227918e3c8fd6c53d04c"}},{"ruleId":"D1","level":"warning","message":{"text":"NetflixTimedText.ToText (cyclomatic 63): NetflixTimedText.ToText has cyclomatic complexity 63 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/NetflixTimedText.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9fe0dc7b51f742675c161cb347fb0d02b2b4337b32a27045f12df8247274348"}},{"ruleId":"D1","level":"warning","message":{"text":"ConvertColorsToDialogUtils.ConvertColorsToDialogInSubtitle (cyclomatic 62): ConvertColorsToDialogUtils.ConvertColorsToDialogInSubtitle has cyclomatic complexity 62 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ConvertColorsToDialogUtils.cs"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6a4459152f7679b8c06f9f52b6eca7b12c3247d7a6c8d9a1f0eff421b92ab2a"}},{"ruleId":"D1","level":"warning","message":{"text":"SeJsonValidator.ValidateJson (cyclomatic 62): SeJsonValidator.ValidateJson has cyclomatic complexity 62 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonValidator.cs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"19726f55d4c3233ad0cb664e1b26253afee8e61119ab239d7a1196707e47e17a"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedSubStationAlpha.LoadSubtitle (cyclomatic 61): AdvancedSubStationAlpha.LoadSubtitle has cyclomatic complexity 61 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":1563}}}],"partialFingerprints":{"codehealthFindingId/v1":"33cdf9fff37b1d19b9e4b524c55cce3c8f7c5ef78faa8195806715061c4bfc48"}},{"ruleId":"D1","level":"warning","message":{"text":"MicroDvd.ToText (cyclomatic 61): MicroDvd.ToText has cyclomatic complexity 61 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/MicroDvd.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"b27d4c7e5c2ac555036b5fa418b36336beb0d661f613af4f0a180ae44316f132"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle70.ToText (cyclomatic 61): UnknownSubtitle70.ToText has cyclomatic complexity 61 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle70.cs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"61c1cd8e6270dd4003323343f7332ff7821f38ef2c0eb165a7ddf6068949ddc0"}},{"ruleId":"D1","level":"warning","message":{"text":"FixContinuationStyle.Fix (cyclomatic 60): FixContinuationStyle.Fix has cyclomatic complexity 60 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixContinuationStyle.cs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd302c7bf36192fe9d5a8c47154f2faaa6b51ad0689d5f7384bf6976485f6441"}},{"ruleId":"D1","level":"warning","message":{"text":"SmpteTt2052.ToText (cyclomatic 60): SmpteTt2052.ToText has cyclomatic complexity 60 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SmpteTt2052.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"7174516daf5167a40671ef50df39652ce1a4fcb405c62e1d335842c053e0233f"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrChar.GenerateLines (cyclomatic 60): NOcrChar.GenerateLines has cyclomatic complexity 60 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrChar.cs"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"98d5d953ad3324fa36cb299537fdbaa55698bedcb85012b1ff1c383a3eadb6af"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextViewModel.GetWhisperProcess (cyclomatic 59): SpeechToTextViewModel.GetWhisperProcess has cyclomatic complexity 59 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":3637}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e77839079e7349d299b1ec1741b5725655b7b63ce40d01bc58ae474a1f4d23a"}},{"ruleId":"D1","level":"warning","message":{"text":"EbuTextTimingInformation.EncodeText (cyclomatic 58): EbuTextTimingInformation.EncodeText has cyclomatic complexity 58 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"e69234eee13022b873515f51d54d8848e829c503484040b49d8dd593c85bcaef"}},{"ruleId":"D1","level":"warning","message":{"text":"WhisperHelper.GetWhisperFolder (cyclomatic 58): WhisperHelper.GetWhisperFolder has cyclomatic complexity 58 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/AudioToText/WhisperHelper.cs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"6283d4e15f48bbf7f19519f6eecf793206a14fe18e8d40303f66fc9f7eac869a"}},{"ruleId":"D1","level":"warning","message":{"text":"NikseBitmapImageSplitter2.SplitToLinesNew (cyclomatic 58): NikseBitmapImageSplitter2.SplitToLinesNew has cyclomatic complexity 58 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":631}}}],"partialFingerprints":{"codehealthFindingId/v1":"1856c7364e5c441d504ae36c5ab58bb297541777163aff36ab4629cb1c933a24"}},{"ruleId":"D1","level":"warning","message":{"text":"ModifySelectionRule.IsMatch (cyclomatic 57): ModifySelectionRule.IsMatch has cyclomatic complexity 57 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/ModifySelection/ModifySelectionRule.cs"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"fad3824089d7a5171d2dfb1fd8bc236fe7a5e02e8b0d9ddf4b2cfabf0619fbba"}},{"ruleId":"D1","level":"warning","message":{"text":"ShortcutsViewModel.Configure (cyclomatic 57): ShortcutsViewModel.Configure has cyclomatic complexity 57 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Shortcuts/ShortcutsViewModel.cs"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce705a8bc3551438c970a488cb6fbdf435ad7646eda8a38c6f1d506cd720a463"}},{"ruleId":"D1","level":"warning","message":{"text":"JoinSubtitlesViewModel.SortAndLoad (cyclomatic 54): JoinSubtitlesViewModel.SortAndLoad has cyclomatic complexity 54 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/JoinSubtitles/JoinSubtitlesViewModel.cs"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"55c59b9350fd698d9f5b2483e9800bca1d9bdd94dab43af5a63e8135aa837398"}},{"ruleId":"D1","level":"warning","message":{"text":"TextToSpeechViewModel.SelectedEngineChanged (cyclomatic 54): TextToSpeechViewModel.SelectedEngineChanged has cyclomatic complexity 54 (threshold 15). Most of this is not in the body itself: 2 of the 54 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 3245, 3295, 3510). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":3237}}}],"partialFingerprints":{"codehealthFindingId/v1":"79f468923baf8e13d29217457d93779053aea6ec4551eb1ec555014d8fa05a9b"}},{"ruleId":"D1","level":"warning","message":{"text":"FixOverlappingDisplayTimes.Fix (cyclomatic 54): FixOverlappingDisplayTimes.Fix has cyclomatic complexity 54 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixOverlappingDisplayTimes.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e6e72507a2770d2b3289d815322ccfdd73c496b399099fbd1c0de37c4220c6d"}},{"ruleId":"D1","level":"warning","message":{"text":"StrippableText.FixCasing (cyclomatic 53): StrippableText.FixCasing has cyclomatic complexity 53 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StrippableText.cs"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b4283b03896e2a5e48c4037137f2e9da4dbf3e626d0b6cad99bf21e6f2fb98d"}},{"ruleId":"D1","level":"warning","message":{"text":"EbuTextTimingInformation.GetBytes (cyclomatic 53): EbuTextTimingInformation.GetBytes has cyclomatic complexity 53 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"4226571e461d1febbd06e9e4d32ebdf859c9d0b5066c2d5badc44cbb1be740e1"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownFormatImporter.ImportTimeCodesAndTextOnSameLine (cyclomatic 52): UnknownFormatImporter.ImportTimeCodesAndTextOnSameLine has cyclomatic complexity 52 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6109aef3d19b3bf3462cc9b054c4bb3149113969e8b39384f82673372f2af5d"}},{"ruleId":"D1","level":"warning","message":{"text":"TransportStreamParser.Parse (cyclomatic 52): TransportStreamParser.Parse has cyclomatic complexity 52 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/TransportStreamParser.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"e89d89b76c58cffd62b2339ba0da07dfca9e989f48549da7a477a14081a7cfd6"}},{"ruleId":"D1","level":"warning","message":{"text":"SubStationAlpha.LoadSubtitle (cyclomatic 52): SubStationAlpha.LoadSubtitle has cyclomatic complexity 52 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubStationAlpha.cs"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8a2ede9a5ed4b67ec46f4355137823b2914deaa472adb3b69bca0c50ce72c8c"}},{"ruleId":"D1","level":"warning","message":{"text":"SubRip.TryReadTimeCodesLine (cyclomatic 51): SubRip.TryReadTimeCodesLine has cyclomatic complexity 51 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubRip.cs"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb3970fd534c09c44cec33c6a12720772b868992c851580d595a37c2ec232925"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrFixEngine.CheckAndFixWord (cyclomatic 51): OcrFixEngine.CheckAndFixWord has cyclomatic complexity 51 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixEngine.cs"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"f732ad3588b46ab9b9cf3946751a4e5ee2e6d151d602ca30c35ed35af78c8527"}},{"ruleId":"D1","level":"warning","message":{"text":"AutoTranslateViewModel.SetAutoTranslatorEngine (cyclomatic 50): AutoTranslateViewModel.SetAutoTranslatorEngine has cyclomatic complexity 50 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":1785}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd0a3f96cb273c787127895f3b6a9390dd0e4a22e013b440b8114889566434bb"}},{"ruleId":"D1","level":"warning","message":{"text":"ContinuationUtilities.SanitizeString (cyclomatic 50): ContinuationUtilities.SanitizeString has cyclomatic complexity 50 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"de5beb468d24a86a66bbdd4c80b26e1cf297dc85ac83e984f16e9da76be5acd3"}},{"ruleId":"D1","level":"warning","message":{"text":"MicroDvd.LoadSubtitle (cyclomatic 50): MicroDvd.LoadSubtitle has cyclomatic complexity 50 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/MicroDvd.cs"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"95b94585096b307f1c0a2fbf46ec19853186bdda8400fca7cf70a4ed5d0a9bbd"}},{"ruleId":"D1","level":"warning","message":{"text":"NciCaption.LoadSubtitle (cyclomatic 50): NciCaption.LoadSubtitle has cyclomatic complexity 50 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/NciCaption.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5f1df16ba904be9ea0fa18f05082efd36bb9b96c898ba03724744300befbb3c"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectionSubtitleList.RtfDecode (cyclomatic 50): ProjectionSubtitleList.RtfDecode has cyclomatic complexity 50 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ProjectionSubtitleList.cs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d6c87f28248a5755b0ae9f0bcbca1ad38dc36915b34d40bb1b136cd85b8c542"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedTextImscRosetta.ReadParagraph (cyclomatic 50): TimedTextImscRosetta.ReadParagraph has cyclomatic complexity 50 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImscRosetta.cs"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"92cbfa4a3439295958281cb6ebae47508c909edc3bbebdada562ddfa1a609b7c"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle70.LoadSubtitle (cyclomatic 50): UnknownSubtitle70.LoadSubtitle has cyclomatic complexity 50 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle70.cs"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"904ad65cd03317ace45602f5a505c2a909f7643bb7f6b9806cd0488e6067526c"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrViewModel.StartOcr (cyclomatic 49): OcrViewModel.StartOcr has cyclomatic complexity 49 (threshold 15). Of this number, 45 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":2346}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac0696100da48d0af0495264a8aae45135a33710ded80fb8b9892f20286fdeef"}},{"ruleId":"D1","level":"warning","message":{"text":"FixMissingPeriodsAtEndOfLine.Fix (cyclomatic 49): FixMissingPeriodsAtEndOfLine.Fix has cyclomatic complexity 49 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixMissingPeriodsAtEndOfLine.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"89fae3e61cdb252de15410fc617fc5ebb56573b49c0450c5891267c610edeced"}},{"ruleId":"D1","level":"warning","message":{"text":"Ebu.ReadTextAndTiming (cyclomatic 49): Ebu.ReadTextAndTiming has cyclomatic complexity 49 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":2102}}}],"partialFingerprints":{"codehealthFindingId/v1":"b39898082a4572af16f8bc775111915ce91961a393ce1162810b7ff41e2cd12f"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrLineGenerator.ZhangSuenThin (cyclomatic 49): NOcrLineGenerator.ZhangSuenThin has cyclomatic complexity 49 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"c719959c69412985ab6798350a107784ac44a884373a93c20516f5464cf11da7"}},{"ruleId":"D1","level":"warning","message":{"text":"SubtitleSyntaxTokenizer.Tokenize (cyclomatic 48): SubtitleSyntaxTokenizer.Tokenize has cyclomatic complexity 48 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/SubtitleSyntaxTokenizer.cs"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"196f1df5779e50396a6537f8ce81e209335d2e6fc2698fc1ced2e8b9bd781e16"}},{"ruleId":"D1","level":"warning","message":{"text":"FixShortDisplayTimes.Fix (cyclomatic 48): FixShortDisplayTimes.Fix has cyclomatic complexity 48 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixShortDisplayTimes.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"858ecdc192e4d01be1f7b72da30d27f399faed900ffd75b30421cfe6965576b8"}},{"ruleId":"D1","level":"warning","message":{"text":"TimeCodesBeautifier.FixConnectedSubtitles (cyclomatic 48): TimeCodesBeautifier.FixConnectedSubtitles has cyclomatic complexity 48 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/TimeCodesBeautifier.cs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"4df7f1967e0a7a09a8c321cf628c90e063e138d1946c78944da3bcbf01eae42e"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedSubStationAlpha.ToText (cyclomatic 48): AdvancedSubStationAlpha.ToText has cyclomatic complexity 48 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9f37b711adf9a25782aaccf7aa931c0e9d41ae29917637e489e9f47f0299fd6"}},{"ruleId":"D1","level":"warning","message":{"text":"FinalCutProXml.LoadSubtitle (cyclomatic 47): FinalCutProXml.LoadSubtitle has cyclomatic complexity 47 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProXml.cs"},"region":{"startLine":453}}}],"partialFingerprints":{"codehealthFindingId/v1":"86798b96771d8d3c7080b1334d416f34323ef6e642d7f5468500e8f6de628096"}},{"ruleId":"D1","level":"warning","message":{"text":"SubRipSourceSyntaxHighlighting.ColorizeHtmlAndAssTags (cyclomatic 46): SubRipSourceSyntaxHighlighting.ColorizeHtmlAndAssTags has cyclomatic complexity 46 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/SubRipSourceSyntaxHighlighting.cs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7e225cbda36ce0f7a988075a27a22e8e8c419a94e1baf3a9221108cd7c3ccab"}},{"ruleId":"D1","level":"warning","message":{"text":"LanguageAutoDetect.DetectAnsiEncoding (cyclomatic 46): LanguageAutoDetect.DetectAnsiEncoding has cyclomatic complexity 46 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":1688}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a55d288b65f7c4b4f8fec58262976b891e2aaea124e1da390bee09429ccb7e4"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedTextImsc11.ReadParagraph (cyclomatic 46): TimedTextImsc11.ReadParagraph has cyclomatic complexity 46 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImsc11.cs"},"region":{"startLine":618}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac570e809e5cc7ba81004e1420ed2f071fa6bda1c4cfffff4e60a22f993e8b20"}},{"ruleId":"D1","level":"warning","message":{"text":"MpvReloader.RefreshMpv (cyclomatic 44): MpvReloader.RefreshMpv has cyclomatic complexity 44 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/MpvReloader.cs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"e84b4ed06eb6a031facc156076f7d4073ceca1b9f3e5e8d051f98ae70854cdad"}},{"ruleId":"D1","level":"warning","message":{"text":"Ebu.Save (cyclomatic 44): Ebu.Save has cyclomatic complexity 44 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":1428}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7b84aa73d605b288f85de11c763437163e414edf916173c74359bbcd8f76ddb"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedText10.MakeParagraph (cyclomatic 44): TimedText10.MakeParagraph has cyclomatic complexity 44 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6da2965c830c8f2e3f38eb564e01c30d6ded06f557edbd12bc2aa0be461505f"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedText10.ReadParagraph (cyclomatic 44): TimedText10.ReadParagraph has cyclomatic complexity 44 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1156}}}],"partialFingerprints":{"codehealthFindingId/v1":"c61b3d8e98ec6b93609b12832b2173264ef35aa2b9f3f219797c3ce46f9e5217"}},{"ruleId":"D1","level":"warning","message":{"text":"TextWithSubtitleSyntaxHighlightingConverter.MakeShowFormatting (cyclomatic 43): TextWithSubtitleSyntaxHighlightingConverter.MakeShowFormatting has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs"},"region":{"startLine":505}}}],"partialFingerprints":{"codehealthFindingId/v1":"042aca0ce4b5e45e7aea49c76ffe34fd35a432041667c3467b992a57fa83598f"}},{"ruleId":"D1","level":"warning","message":{"text":"MoveWordUpDown.MoveWordUp (cyclomatic 43): MoveWordUpDown.MoveWordUp has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/MoveWordUpDown.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"4628b173a9a919d52072e8d51d4e1bd8a6c2d07b2eccb2c3f9ed39ced7c18bcb"}},{"ruleId":"D1","level":"warning","message":{"text":"EbuTextTimingInformation.GetNearestEbuColorCode (cyclomatic 43): EbuTextTimingInformation.GetNearestEbuColorCode has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":1141}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0b688a04fbf4058cf97ed52957e2f417718f5a7ab627a1f744def9fe0ff3e8f"}},{"ruleId":"D1","level":"warning","message":{"text":"EbuTextTimingInformation.GetNearestEbuColorCodeByte (cyclomatic 43): EbuTextTimingInformation.GetNearestEbuColorCodeByte has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":1237}}}],"partialFingerprints":{"codehealthFindingId/v1":"d78d9787cb1da6505d05ceee42a5cf874ad37cd735e88f886c4597ec59b14c18"}},{"ruleId":"D1","level":"warning","message":{"text":"ScenaristClosedCaptions.ToSccText (cyclomatic 43): ScenaristClosedCaptions.ToSccText has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ScenaristClosedCaptions.cs"},"region":{"startLine":540}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0c60b07c781820314593d5893f80a1d1658298a3f5e59d1d40e13748351d9d8"}},{"ruleId":"D1","level":"warning","message":{"text":"SubRip.ReadLine (cyclomatic 43): SubRip.ReadLine has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubRip.cs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5a270897bbf8e36f7a278a11d3a9f94f228a208a1ea28ff754872e708c50d3c"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedText10.LoadSubtitle (cyclomatic 43): TimedText10.LoadSubtitle has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":763}}}],"partialFingerprints":{"codehealthFindingId/v1":"130a6353dbca1c615cebe6a387e8c83a556a4a11a0deb1771d1b61f37b94600e"}},{"ruleId":"D1","level":"warning","message":{"text":"SyntaxTextView.OnKeyDown (cyclomatic 42): SyntaxTextView.OnKeyDown has cyclomatic complexity 42 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/SyntaxTextEditorControl/SyntaxTextView.cs"},"region":{"startLine":1113}}}],"partialFingerprints":{"codehealthFindingId/v1":"f088ded6e9d63622fec1de651b18288366719aec84bb64e4b4c19479c72bc003"}},{"ruleId":"D1","level":"warning","message":{"text":"ContinuationUtilities.AddPrefixIfNeeded (cyclomatic 42): ContinuationUtilities.AddPrefixIfNeeded has cyclomatic complexity 42 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":442}}}],"partialFingerprints":{"codehealthFindingId/v1":"715efe883769215d9975ec5047eba312c89a326419ecfa3e186bd606a03a0809"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownFormatImporter.AutoGuessImport (cyclomatic 42): UnknownFormatImporter.AutoGuessImport has cyclomatic complexity 42 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"388d7eda01246765d9dd83b76a17f8af921f5a1bf589bab663bc3aa799d77f3b"}},{"ruleId":"D1","level":"warning","message":{"text":"Helper.FixEllipsesStartHelper (cyclomatic 42): Helper.FixEllipsesStartHelper has cyclomatic complexity 42 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/Helper.cs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0c33ca8078a72977069e8ca7587ccdfae10659dbb0787e09059fee464c554bd"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedSubStationAlpha.GetFormattedText (cyclomatic 42): AdvancedSubStationAlpha.GetFormattedText has cyclomatic complexity 42 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":1171}}}],"partialFingerprints":{"codehealthFindingId/v1":"79c4e86acd36d1fa4773c13c4a749ce70e8f6d0d68ba43792396b96b71a818ba"}},{"ruleId":"D1","level":"warning","message":{"text":"LrcNoEndTime.LoadSubtitle (cyclomatic 42): LrcNoEndTime.LoadSubtitle has cyclomatic complexity 42 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/LrcNoEndTime.cs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"046536a6929519922ec667a473373ff2106e6bd2a9afd117084879807843de32"}},{"ruleId":"D1","level":"warning","message":{"text":"CasingToggler.RemoveAndSaveTags (cyclomatic 41): CasingToggler.RemoveAndSaveTags has cyclomatic complexity 41 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/CasingToggler.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a4f9c013bea1185ee1cb3ed707c59328af10c8bd3c3b459f5b909d84033717b"}},{"ruleId":"D1","level":"warning","message":{"text":"VlcReloader.RefreshVlc (cyclomatic 41): VlcReloader.RefreshVlc has cyclomatic complexity 41 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/VlcReloader.cs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"deceba2eda7170c30d7c90938e268afea2adbc1e1975f56d3786438e83a60cdb"}},{"ruleId":"D1","level":"warning","message":{"text":"LanguageAutoDetect.GetEncodingFromFile (cyclomatic 41): LanguageAutoDetect.GetEncodingFromFile has cyclomatic complexity 41 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":1897}}}],"partialFingerprints":{"codehealthFindingId/v1":"a83093cfaf360b9c51fae84538d66914bc93c55d52cdcab4a050dc1738c41885"}},{"ruleId":"D1","level":"warning","message":{"text":"StringExtensions.RemoveAndSaveTags (cyclomatic 41): StringExtensions.RemoveAndSaveTags has cyclomatic complexity 41 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StringExtensions.cs"},"region":{"startLine":656}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2947ed56321e62065679a60f1c0abd39c335ffabea72e35e0d78bf8437a793f"}},{"ruleId":"D1","level":"warning","message":{"text":"Stbl.GetParagraphs (cyclomatic 41): Stbl.GetParagraphs has cyclomatic complexity 41 (threshold 15). Of this number, 40 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Boxes/Stbl.cs"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6628e298b68d01ab7c235cb344483bda268815a5fa7bf1fcb6569d2f0afa7da"}},{"ruleId":"D1","level":"warning","message":{"text":"XmlSourceSyntaxHighlighting.FormatXml (cyclomatic 40): XmlSourceSyntaxHighlighting.FormatXml has cyclomatic complexity 40 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/XmlSourceSyntaxHighlighting.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a0b2dda20e7da4584cf320ae4bcaf4fef4bd05bb1eba1c7458aeca5608035d2"}},{"ruleId":"D1","level":"warning","message":{"text":"Teletext.ProcessPage (cyclomatic 40): Teletext.ProcessPage has cyclomatic complexity 40 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/Teletext.cs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb992f36eb781ec8af07c07cafe3102e46a6de664d84fdca99f6712920c5ca89"}},{"ruleId":"D1","level":"warning","message":{"text":"Cavena890.FixText (cyclomatic 40): Cavena890.FixText has cyclomatic complexity 40 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":1689}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1f6eab5b53a6237d29f25499498ec1d0e658865caf1bdbf254f2bdf257855e0"}},{"ruleId":"D1","level":"warning","message":{"text":"Lrc.LoadSubtitle (cyclomatic 40): Lrc.LoadSubtitle has cyclomatic complexity 40 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Lrc.cs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcf4ecb8214c65f2708c6f4eb93910f307cfe3c6ee3dde003203049890c17651"}},{"ruleId":"D1","level":"warning","message":{"text":"Lrc3DigitsMs.LoadSubtitle (cyclomatic 40): Lrc3DigitsMs.LoadSubtitle has cyclomatic complexity 40 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Lrc3DigitsMs.cs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"242dba1e219f99e43b7781e5ceaba7ce9e1e02a25532360b363598ff29f4e0ec"}},{"ruleId":"D1","level":"warning","message":{"text":"SubStationAlpha.RemoveNativeFormatting (cyclomatic 40): SubStationAlpha.RemoveNativeFormatting has cyclomatic complexity 40 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubStationAlpha.cs"},"region":{"startLine":689}}}],"partialFingerprints":{"codehealthFindingId/v1":"88a4bf65e353986efb00fe538461aa5578769dc9a514b412f9951048c3a67151"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedText10.ToText (cyclomatic 40): TimedText10.ToText has cyclomatic complexity 40 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"48fa0cb77bbe1016cf33d6fc0ac0bf9e52ef689c49f16646f4334ce3da58d615"}},{"ruleId":"D1","level":"warning","message":{"text":"TSB4.LoadSubtitle (cyclomatic 40): TSB4.LoadSubtitle has cyclomatic complexity 40 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TSB4.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"db8e9adb0552d7c352085b2799a6f608b61049c98a67ec4d37874636a4291dc5"}},{"ruleId":"D1","level":"warning","message":{"text":"AssaDrawViewModel.OnKeyDown (cyclomatic 39): AssaDrawViewModel.OnKeyDown has cyclomatic complexity 39 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawViewModel.cs"},"region":{"startLine":1059}}}],"partialFingerprints":{"codehealthFindingId/v1":"60f981a8b94b6aeb4890ccdf64ae55565a1c6d017297c8c215861ee1a0e6d438"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchConvertViewModel.AddFile (cyclomatic 39): BatchConvertViewModel.AddFile has cyclomatic complexity 39 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":1661}}}],"partialFingerprints":{"codehealthFindingId/v1":"7da8f408bfc0b55763270d7cd61bc3cc149ec8d6206f1b8ca8f9e922ac697755"}},{"ruleId":"D1","level":"warning","message":{"text":"TextWithSubtitleSyntaxHighlightingConverter.ParseAssaTags (cyclomatic 39): TextWithSubtitleSyntaxHighlightingConverter.ParseAssaTags has cyclomatic complexity 39 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs"},"region":{"startLine":781}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1c6a007d00fe6c1e560de252b3ac39dd771ffc1950de46b6dfc5f3a78d02de4"}},{"ruleId":"D1","level":"warning","message":{"text":"TextSplit.TryForWholeSentences (cyclomatic 39): TextSplit.TryForWholeSentences has cyclomatic complexity 39 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TextSplit.cs"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"b693ccaf8c81a2470608f73532bc98e54f526eed500fcc8013aa94b8068211bc"}},{"ruleId":"D1","level":"warning","message":{"text":"Utilities.AutoBreakLineMoreThanTwoLines (cyclomatic 39): Utilities.AutoBreakLineMoreThanTwoLines has cyclomatic complexity 39 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dce798c5f3171d083c9946c8ad4a72a4391f7409f996d314e4228141ee8a830"}},{"ruleId":"D1","level":"warning","message":{"text":"Cavena890.Save (cyclomatic 39): Cavena890.Save has cyclomatic complexity 39 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":508}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fd7910135e5c0ebeac769ef789966b02b54b3f57215a5941efc00c56a5093a3"}},{"ruleId":"D1","level":"warning","message":{"text":"CompareViewModel.AddColoringAndCountDifferences (cyclomatic 38): CompareViewModel.AddColoringAndCountDifferences has cyclomatic complexity 38 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/Compare/CompareViewModel.cs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"848d0535f86c7a9f7d9d04a766f5bb5426619412269931171d252dd6c21461b6"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.SetCueToClosestShotChangeGreenZone (cyclomatic 38): MainViewModel.SetCueToClosestShotChangeGreenZone has cyclomatic complexity 38 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":8122}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4382fa8865e094a7afc6125aa532c96bc3ab13c034b2025879030cf97791d55"}},{"ruleId":"D1","level":"warning","message":{"text":"StrippableText.StrippableText.ctor (cyclomatic 38): StrippableText.StrippableText.ctor has cyclomatic complexity 38 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StrippableText.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1b02dcb81876f816a6cf765994772bbce7066327c1eac4529b24a9106ec1774"}},{"ruleId":"D1","level":"warning","message":{"text":"Json.ReadArray (cyclomatic 38): Json.ReadArray has cyclomatic complexity 38 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Json.cs"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aa59d0c1a584685394c483fe5c9ac81fabf1942580d3ab299310309139ff018"}},{"ruleId":"D1","level":"warning","message":{"text":"SeConvSettings.ApplyBaseSections (cyclomatic 38): SeConvSettings.ApplyBaseSections has cyclomatic complexity 38 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SeConvSettings.cs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eafce33946cbe1c7e38085355c94792933c0f07a77bf3f0ad73f210bb048e39"}},{"ruleId":"D1","level":"warning","message":{"text":"InitListViewAndEditBox.MakeLayoutListViewAndEditBox (cyclomatic 37): InitListViewAndEditBox.MakeLayoutListViewAndEditBox has cyclomatic complexity 37 (threshold 15). Of this number, 33 points are the body\u0027s own statements and 4 belong to 4 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitListViewAndEditBox.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4f22583a476c54bf74e8f285ef36781485fadc9041d840d1304d3923ebce5b1"}},{"ruleId":"D1","level":"warning","message":{"text":"NetflixCheckNumbersOneToTenSpellOut.Check (cyclomatic 37): NetflixCheckNumbersOneToTenSpellOut.Check has cyclomatic complexity 37 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/NetflixQualityCheck/NetflixCheckNumbersOneToTenSpellOut.cs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"7295758634a5ed1a57b2f0d7bcb62b147d57c250ef3c5852a42145ed0df91923"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrFixReplaceList2.OcrFixReplaceList2.ctor (cyclomatic 37): OcrFixReplaceList2.OcrFixReplaceList2.ctor has cyclomatic complexity 37 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfda36573ade5ae9ea96d87ab153310bd33bc41aaa434b512a6729c0a2af7fab"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioVisualizer.OnPointerReleased (cyclomatic 36): AudioVisualizer.OnPointerReleased has cyclomatic complexity 36 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":775}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6c5b7870818ce2e4444f25549ba1517256450a371ff7d3b008af98025bcad11"}},{"ruleId":"D1","level":"warning","message":{"text":"ForcedAligner.AlignAsync (cyclomatic 36): ForcedAligner.AlignAsync has cyclomatic complexity 36 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportPlainText/ForcedAligner.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"b52cdc53db3853079054589fcd1a5c870f9ff5fbf7be1c4ae2277a9bc20605aa"}},{"ruleId":"D1","level":"warning","message":{"text":"AutoTranslateViewModel.DoTranslate (cyclomatic 36): AutoTranslateViewModel.DoTranslate has cyclomatic complexity 36 (threshold 15). Of this number, 28 points are the body\u0027s own statements and 8 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":1436}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5c41be173b61178de94921fd2709f7667e05f94eee245097d1aff3bafe819f2"}},{"ruleId":"D1","level":"warning","message":{"text":"FfmpegGenerator.GenerateHardcodedVideoFile (cyclomatic 36): FfmpegGenerator.GenerateHardcodedVideoFile has cyclomatic complexity 36 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/FfmpegGenerator.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fa227b59c692f5d6a008b88921057aaa58af007e2cc3e3344da71938630d785"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownFormatImporter.ImportTimeCodesOnSameSeparateLine (cyclomatic 36): UnknownFormatImporter.ImportTimeCodesOnSameSeparateLine has cyclomatic complexity 36 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":709}}}],"partialFingerprints":{"codehealthFindingId/v1":"2893feb749fd261c7395466db2a96abc7cdec3f121f221a5bda2776da98bc256"}},{"ruleId":"D1","level":"warning","message":{"text":"WebVTT.EscapeEncodeText (cyclomatic 36): WebVTT.EscapeEncodeText has cyclomatic complexity 36 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTT.cs"},"region":{"startLine":1158}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8fe63354c6759acc6a2065c00b5736cb41238f03d5c7341197acbba09be3c47"}},{"ruleId":"D1","level":"warning","message":{"text":"Formatting.SetTagsAndReturnTrimmed (cyclomatic 36): Formatting.SetTagsAndReturnTrimmed has cyclomatic complexity 36 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Translate/Formatting.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"73592c3aef00e232c25baf795c275ff959ebf4040ba99636adec6f6d79a06980"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioVisualizer.OnPointerWheelChanged (cyclomatic 35): AudioVisualizer.OnPointerWheelChanged has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":624}}}],"partialFingerprints":{"codehealthFindingId/v1":"0840038e2d53edec2f42d823542b0d94ef874285869c70bcfd23d93fba5827b4"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextTimingFixer.ShortenViaWavePeaks (cyclomatic 35): SpeechToTextTimingFixer.ShortenViaWavePeaks has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"db2ca05443226f1222883607599ee9e8a8acd6639033eca28e4ae3233a6de600"}},{"ruleId":"D1","level":"warning","message":{"text":"DialogSplitMerge.FixDashes (cyclomatic 35): DialogSplitMerge.FixDashes has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/DialogSplitMerge.cs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"87740d87f3eb7a1513fa3421c2ddb23fc78ab404935497c6ae3449dab312658c"}},{"ruleId":"D1","level":"warning","message":{"text":"DialogSplitMerge.FixDashes (cyclomatic 35): DialogSplitMerge.FixDashes has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/DialogSplitMerge.cs"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff809eb13497c870ca7bca573a45c83adff52e7d3aaa1642c445385a765016f2"}},{"ruleId":"D1","level":"warning","message":{"text":"Helper.FixHyphensAdd (cyclomatic 35): Helper.FixHyphensAdd has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/Helper.cs"},"region":{"startLine":557}}}],"partialFingerprints":{"codehealthFindingId/v1":"1749543a90b4c9a45e286c3726a64f27ad2e4077d26da3d8c4890d5f1317de2f"}},{"ruleId":"D1","level":"warning","message":{"text":"TimeCodesBeautifier.FixChainableSubtitles (cyclomatic 35): TimeCodesBeautifier.FixChainableSubtitles has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/TimeCodesBeautifier.cs"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"448412eb058a13c164c5dce7584e7c1cdff9d35449c67cd497f3589ddb918dac"}},{"ruleId":"D1","level":"warning","message":{"text":"CaptionsInc.LoadSubtitle (cyclomatic 35): CaptionsInc.LoadSubtitle has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CaptionsInc.cs"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a0acb15668cd7ef9f0cdec629ba47f7682d98c03c11edde1313c6e5d534da2d"}},{"ruleId":"D1","level":"warning","message":{"text":"CheetahCaption.LoadSubtitle (cyclomatic 35): CheetahCaption.LoadSubtitle has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CheetahCaption.cs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d58deffce8bac92a61cc8c26064e5db56434a9132c89bd3494e9f339173b331"}},{"ruleId":"D1","level":"warning","message":{"text":"FinalCutProTestXml.LoadSubtitle (cyclomatic 35): FinalCutProTestXml.LoadSubtitle has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProTextXml.cs"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d4efa52ae293a0293afb97b0b400d23f4f5a209c5003b80fc975660af507bbb"}},{"ruleId":"D1","level":"warning","message":{"text":"IaiSub.GetParagraph (cyclomatic 35): IaiSub.GetParagraph has cyclomatic complexity 35 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/IaiSub.cs"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"b898d597353e0d31ced1ff6e8086f7959c64f97812caea39d5749a6e71867e1e"}},{"ruleId":"D1","level":"warning","message":{"text":"Pac.WriteParagraph (cyclomatic 35): Pac.WriteParagraph has cyclomatic complexity 35 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":1302}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0c9f6ead99f0424ba886f7b9573149a69b4bebd5edd07789dd6d5abebd04398"}},{"ruleId":"D1","level":"warning","message":{"text":"SubPicture.ParseDisplayControlCommands (cyclomatic 35): SubPicture.ParseDisplayControlCommands has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/SubPicture.cs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fe795c5a8cf3ccd9ab232fdeb31cc58660d20d1f3796abecab47ccab4e53a10"}},{"ruleId":"D1","level":"warning","message":{"text":"TextToSpeechViewModel.EnsureClonedVoiceRefTextAsync (cyclomatic 34): TextToSpeechViewModel.EnsureClonedVoiceRefTextAsync has cyclomatic complexity 34 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":582}}}],"partialFingerprints":{"codehealthFindingId/v1":"f96d10ce6a1c1c6322e4e0a94d76ddfe0b9a549a7ec311aab347cfe59298315e"}},{"ruleId":"D1","level":"warning","message":{"text":"FixCasing.FixEnglishAloneILowerToUpper (cyclomatic 34): FixCasing.FixEnglishAloneILowerToUpper has cyclomatic complexity 34 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/FixCasing.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea59b150bf7ab139de09702a36b4c0e0e03bb25f3f83e226be0a31532ed507ea"}},{"ruleId":"D1","level":"warning","message":{"text":"SsaStyle.FromRawSsa (cyclomatic 34): SsaStyle.FromRawSsa has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SsaStyle.cs"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c76f10bc7dca8da9a8777a1325ae9ee9809541a6abf8da67cee369407102569"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownFormatImporterCsv.ReadCsvLines (cyclomatic 34): UnknownFormatImporterCsv.ReadCsvLines has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterCsv.cs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"0effc37358ed0438702cc4448d4db179ba0e112c5be22dd784346697a4d1666f"}},{"ruleId":"D1","level":"warning","message":{"text":"Utilities.ReverseStartAndEndingForRightToLeft (cyclomatic 34): Utilities.ReverseStartAndEndingForRightToLeft has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":1655}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8fb80a13cf1489a949257386f3e65485781c93a21caef73faf1401cde42af23"}},{"ruleId":"D1","level":"warning","message":{"text":"MP4Parser.SniffTextSampleKind (cyclomatic 34): MP4Parser.SniffTextSampleKind has cyclomatic complexity 34 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":940}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab43b6ed1315b470bc19857002f4ed35375845319fc67f2bbfaaa35544963969"}},{"ruleId":"D1","level":"warning","message":{"text":"MoveWordUpDown.MoveWordDown (cyclomatic 34): MoveWordUpDown.MoveWordDown has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/MoveWordUpDown.cs"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e3fa0d32abf1e1411ecf7e2e682f556c738600ed52b40d2e3fee61d33a5678a"}},{"ruleId":"D1","level":"warning","message":{"text":"FinalCutProTest2Xml.LoadSubtitle (cyclomatic 34): FinalCutProTest2Xml.LoadSubtitle has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProTest2Xml.cs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1182cf9ffbeb9607585c09d930f37c36ce20e7aad5cb7cf7358d0f870207b92"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle49.LoadSubtitle (cyclomatic 34): UnknownSubtitle49.LoadSubtitle has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle49.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"0eecd9b39b9c59dee10006ddde1161d7e4c4bab8de5db621bd8a5da0052ae878"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle71.LoadSubtitle (cyclomatic 34): UnknownSubtitle71.LoadSubtitle has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle71.cs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"367fcd659372a9109905c604c367cdbfdc8bdaf7bf4cec19036dc8581cd3bc58"}},{"ruleId":"D1","level":"warning","message":{"text":"WebVTTFileWithLineNumber.LoadSubtitle (cyclomatic 34): WebVTTFileWithLineNumber.LoadSubtitle has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTTFileWithLineNumber.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"680e3228c4099d1ebeb2e417c60181c87ab1f06de8422764100f2fcd52439c60"}},{"ruleId":"D1","level":"warning","message":{"text":"SpellCheckDictionaryDisplay.GetTwoLetterLanguageCode (cyclomatic 34): SpellCheckDictionaryDisplay.GetTwoLetterLanguageCode has cyclomatic complexity 34 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/SpellCheck/SpellCheckDictionaryDisplay.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"164e87517ee851a065622c04556752de31afc8edf44e2b199560bd331e566140"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchConverter.MakeOutputFileName (cyclomatic 33): BatchConverter.MakeOutputFileName has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":2716}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3050b1241329ad91de496058d5c493264e89f98517f51f6f9cff1f21f07dee2"}},{"ruleId":"D1","level":"warning","message":{"text":"TtsVoiceInstaller.EnsureCrispAsrAsync (cyclomatic 33): TtsVoiceInstaller.EnsureCrispAsrAsync has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TtsVoiceInstaller.cs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d819231452d2fdbf43416ad75269d0d6e0b0bd866c03f2f44fc93eea79ee07"}},{"ruleId":"D1","level":"warning","message":{"text":"ContinuationUtilities.AddSuffixIfNeeded (cyclomatic 33): ContinuationUtilities.AddSuffixIfNeeded has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9265f9b8d75f0454cac29926915d45e5ffa0b10513b3c548728583ddd4c8a80"}},{"ruleId":"D1","level":"warning","message":{"text":"FixEmptyLines.Fix (cyclomatic 33): FixEmptyLines.Fix has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixEmptyLines.cs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"53b4dcd45f6a6f53ff475630727636a9a9cbf528cc31a1e4d3321915a1cf7888"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle59.LoadSubtitle (cyclomatic 33): UnknownSubtitle59.LoadSubtitle has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle59.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"f73eb2fae8ad6282dcf0e51e55c0c28e42a660f8cfdd39130c2843f3c9b43148"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrViewModel.RunNOcrLoop (cyclomatic 32): OcrViewModel.RunNOcrLoop has cyclomatic complexity 32 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 7 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3019}}}],"partialFingerprints":{"codehealthFindingId/v1":"138529347699956b240ac192a6f8eb06451751145c2d80126bb55eaa2289e742"}},{"ruleId":"D1","level":"warning","message":{"text":"DownloadHelper.DownloadFileAsync (cyclomatic 32): DownloadHelper.DownloadFileAsync has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Download/DownloadHelper.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d7a5350f86e89a3e264c50a11b50cdee28074446f4f66a84d3ba00e76dedd6a"}},{"ruleId":"D1","level":"warning","message":{"text":"CalcIgnoreArabicDiacriticsNoSpace.CountCharacters (cyclomatic 32): CalcIgnoreArabicDiacriticsNoSpace.CountCharacters has cyclomatic complexity 32 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TextLengthCalculator/CalcIgnoreArabicDiacriticsNoSpace.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f9207fbbb1493ab4ac5872c3f91af92f00af8707ce7b99ec3d41b9bca2a79d7"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownFormatImporterJson.ReadTextTag (cyclomatic 32): UnknownFormatImporterJson.ReadTextTag has cyclomatic complexity 32 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 11 belong to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterJson.cs"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee55acc38febe47cc70be25333014c9ad02cff7683ae917eae5ed1429008b800"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedSubStationAlpha.RemoveNativeFormatting (cyclomatic 32): AdvancedSubStationAlpha.RemoveNativeFormatting has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":1932}}}],"partialFingerprints":{"codehealthFindingId/v1":"97ba93391119192de661e78bfe4197d4bb966a8b1b0d5398a5f0a46e88e11505"}},{"ruleId":"D1","level":"warning","message":{"text":"SubPicture.CropBitmapAndUnlock (cyclomatic 32): SubPicture.CropBitmapAndUnlock has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/SubPicture.cs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8f9709495803f64abdb4178ce97f83f859cab785fbb3c8a78e1f1ffa0c506ca"}},{"ruleId":"D1","level":"warning","message":{"text":"LibSEIntegration.SaveSubtitle (cyclomatic 32): LibSEIntegration.SaveSubtitle has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3d0faff70a63b5d1f945f96dbb641bdc8a90f4674351036ce617d38754b7f52"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.OnLoaded (cyclomatic 31): MainViewModel.OnLoaded has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 13 of the 31 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 18814, 18781, 18741, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":18732}}}],"partialFingerprints":{"codehealthFindingId/v1":"052429284b14d83faae89f3657098b627ff372bffedb54e86d804952f4d05d95"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextViewModel.ProcessOnlineSttTranscription (cyclomatic 31): SpeechToTextViewModel.ProcessOnlineSttTranscription has cyclomatic complexity 31 (threshold 15). Of this number, 28 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":1164}}}],"partialFingerprints":{"codehealthFindingId/v1":"e85b0ad7263216efea3aac47d9a4d7cc80fe2d406d40f5348bc0f13e2bf2c5f8"}},{"ruleId":"D1","level":"warning","message":{"text":"TextToSpeechViewModel.FixSpeed (cyclomatic 31): TextToSpeechViewModel.FixSpeed has cyclomatic complexity 31 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":2751}}}],"partialFingerprints":{"codehealthFindingId/v1":"b402c014c5e5e26d7fdecd92cf10d5fd1ba31f1afaec3a46a7dc3b7a77fa73fe"}},{"ruleId":"D1","level":"warning","message":{"text":"CalcIgnoreArabicDiacritics.CountCharacters (cyclomatic 31): CalcIgnoreArabicDiacritics.CountCharacters has cyclomatic complexity 31 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TextLengthCalculator/CalcIgnoreArabicDiacritics.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"7476a205be853d58a3f34dd480ced98274766ace7ec223dd6e98a43a74e4ac32"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownFormatImporterJson.ReadParagraph (cyclomatic 31): UnknownFormatImporterJson.ReadParagraph has cyclomatic complexity 31 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterJson.cs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"8041f35bd28524ba033a561da79049ca184445b2560c227a6ef30eeb9ce7f610"}},{"ruleId":"D1","level":"warning","message":{"text":"VobSubColorIsolation.Isolate (cyclomatic 31): VobSubColorIsolation.Isolate has cyclomatic complexity 31 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/VobSubColorIsolation.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"76521e910e572f7f06649a444aa25451be42979ab7a03d5ec867f36cbeabe875"}},{"ruleId":"D1","level":"warning","message":{"text":"CheetahCaption.Save (cyclomatic 31): CheetahCaption.Save has cyclomatic complexity 31 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CheetahCaption.cs"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8de321177266659dca390533a5ce74a5fdbe87480cf3d65b1fc9fe62dccc813"}},{"ruleId":"D1","level":"warning","message":{"text":"ConvertCommand.ApplyImageStyleFlags (cyclomatic 31): ConvertCommand.ApplyImageStyleFlags has cyclomatic complexity 31 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Commands/ConvertCommand.cs"},"region":{"startLine":936}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f7672cf6b9b74af6ac52b5bdf9b25a089af230449002d1d514692e545fe30b2"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioVisualizer.OnPointerPressed (cyclomatic 30): AudioVisualizer.OnPointerPressed has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b2fa2ee6492c73b7d9e5df96caf58d6acde3254b120b601835e824516a9f3dc"}},{"ruleId":"D1","level":"warning","message":{"text":"AssaSetPositionViewModel.Initialize (cyclomatic 30): AssaSetPositionViewModel.Initialize has cyclomatic complexity 30 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaSetPosition/AssaSetPositionViewModel.cs"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"333a52aeb616885bd0528991e440e3e8a695064c59d01f98a177a76b1e4e5d54"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.HandleReplaceResult (cyclomatic 30): MainViewModel.HandleReplaceResult has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":11928}}}],"partialFingerprints":{"codehealthFindingId/v1":"07101fa92c38b70b4f2b840c7259c7778ad307c6850d4c315589626f4b6fbbca"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.LoadDvbFromMatroska (cyclomatic 30): MainViewModel.LoadDvbFromMatroska has cyclomatic complexity 30 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":17494}}}],"partialFingerprints":{"codehealthFindingId/v1":"1919b96332b0e9682f270e8533c498848468ee96899ba83635780c012cb475b5"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.SaveSubtitleAs (cyclomatic 30): MainViewModel.SaveSubtitleAs has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":18259}}}],"partialFingerprints":{"codehealthFindingId/v1":"c37f7f17f17aceece7f212361971dc92a516179dcccf9f5aa3ebe07a91b7d888"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.UpdatePlayheadEstimate (cyclomatic 30): MainViewModel.UpdatePlayheadEstimate has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":22569}}}],"partialFingerprints":{"codehealthFindingId/v1":"11caa43d112b32fe080da8c162bb379b4991588ff2e3fa2bbd74b36a4313b182"}},{"ruleId":"D1","level":"warning","message":{"text":"AutoTranslateViewModel.SaveSettings (cyclomatic 30): AutoTranslateViewModel.SaveSettings has cyclomatic complexity 30 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"3225d312ba37221c59002408c95db9e7e20e51bea01b241030094e690e21cb01"}},{"ruleId":"D1","level":"warning","message":{"text":"DownloadSpeechToTextEngineViewModel.ProcessDownloadState (cyclomatic 30): DownloadSpeechToTextEngineViewModel.ProcessDownloadState has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"718a2ab0efce40fabaac7eb70ab0f1db3a624360f4948e25e822e4bbfbf57091"}},{"ruleId":"D1","level":"warning","message":{"text":"TextWithSubtitleSyntaxHighlightingConverter.MakeShowTags (cyclomatic 30): TextWithSubtitleSyntaxHighlightingConverter.MakeShowTags has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"06997c548a5b31a18e915cfdc35b892bb0bf4641daeedae2ba325ff8d6f2823c"}},{"ruleId":"D1","level":"warning","message":{"text":"HtmlUtil.TryGetTagLength (cyclomatic 30): HtmlUtil.TryGetTagLength has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/HtmlUtil.cs"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"8558d263b69ccc0c29e4111684f6dd76c324a8388219855fc21af1c6f7af359c"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownFormatImporter.ImportTimeCodesOnSameSeparateLineNoMilliseconds (cyclomatic 30): UnknownFormatImporter.ImportTimeCodesOnSameSeparateLineNoMilliseconds has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":830}}}],"partialFingerprints":{"codehealthFindingId/v1":"f720b69a8b6ed9f4812c27404e6b3858285fbc869159b338b1167d6e3f4a9bc3"}},{"ruleId":"D1","level":"warning","message":{"text":"Stbl.Stbl.ctor (cyclomatic 30): Stbl.Stbl.ctor has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Boxes/Stbl.cs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"b81c98900d6f566d724e387762f43c3dabd24dd56816c7aa057a2d220c896ab9"}},{"ruleId":"D1","level":"warning","message":{"text":"SubRip.IsValidTimeCode (cyclomatic 30): SubRip.IsValidTimeCode has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubRip.cs"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"66a277acdd347cded24b4c8135b53cf30d4cd13b11db78cbc7504303579aa91d"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedTextImscRosetta.LoadSubtitle (cyclomatic 30): TimedTextImscRosetta.LoadSubtitle has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImscRosetta.cs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddeb894f18d9dd948d7841d5263ab77487e21875dcca4853274482a733789842"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.TryHandleRightToLeftCaretNavigation (cyclomatic 29): MainViewModel.TryHandleRightToLeftCaretNavigation has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":21335}}}],"partialFingerprints":{"codehealthFindingId/v1":"f11697e59c7c85d61c14af5874310d686fe546cf9d80e405d979874132f24fa0"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.AutoTranscribeParagraphViaOpenAiAsync (cyclomatic 29): MainViewModel.AutoTranscribeParagraphViaOpenAiAsync has cyclomatic complexity 29 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 10 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":23318}}}],"partialFingerprints":{"codehealthFindingId/v1":"be65a3b72fc11fc55d9d39828fb53f5ad5e5b128a22c48a4b1439315de160a26"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryEditViewModel.OnKeyDown (cyclomatic 29): BinaryEditViewModel.OnKeyDown has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":2368}}}],"partialFingerprints":{"codehealthFindingId/v1":"acdf67987d4d86c74e8cf7bd05172615f059af00cd474764398ec2e028d03dd1"}},{"ruleId":"D1","level":"warning","message":{"text":"TranslateSettingsViewModel.LoadValues (cyclomatic 29): TranslateSettingsViewModel.LoadValues has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/TranslateSettingsViewModel.cs"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"591f256265cc1d1e66630d4d000cca658ac15cbc62077e589e6d9c87680960be"}},{"ruleId":"D1","level":"warning","message":{"text":"SplitManager.Split (cyclomatic 29): SplitManager.Split has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ISplitManager.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8365ade94c99cc30502e800fbc24e97034234057dde8d2d421e68b1cafbd1c2"}},{"ruleId":"D1","level":"warning","message":{"text":"CdgGraphics.Scroll (cyclomatic 29): CdgGraphics.Scroll has cyclomatic complexity 29 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/CDG/CdgGraphics.cs"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"24c1c8a0986db05b2a02ec407c7e792213bec8059cbe9e15e2dec3ab1b71889e"}},{"ruleId":"D1","level":"warning","message":{"text":"FixCasing.FixStutter (cyclomatic 29): FixCasing.FixStutter has cyclomatic complexity 29 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/FixCasing.cs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"2463f292d3329f453ac6c5e9d9da4c681921b618593bccb4e4d346674e2e85c5"}},{"ruleId":"D1","level":"warning","message":{"text":"Ayato.GetText (cyclomatic 29): Ayato.GetText has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ayato.cs"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"c53969e6ac6cca955101534240b8b29276e5293183cb4eecb6ae7961d7e256b1"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedText10.GetTimeCode (cyclomatic 29): TimedText10.GetTimeCode has cyclomatic complexity 29 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1320}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c75ec1281fdf2734da347dc8722ca101de61e169f2059af05a4c1d2410fd789"}},{"ruleId":"D1","level":"warning","message":{"text":"TimeLineMvt.LoadSubtitle (cyclomatic 29): TimeLineMvt.LoadSubtitle has cyclomatic complexity 29 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimelineMvt.cs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9dd7fd516df59d79624d3b01e1ac11af4bc0ce139e592ba965c2f55c20245c0"}},{"ruleId":"D1","level":"warning","message":{"text":"VobSubParser.MergeVobSubPacks (cyclomatic 29): VobSubParser.MergeVobSubPacks has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/VobSubParser.cs"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bfcabdadbc9f96c4d4492e0ecfc3f40cea6328a27d9c36395ff19acad95e6a1"}},{"ruleId":"D1","level":"warning","message":{"text":"CustomTextFormatter.GetParagraph (cyclomatic 29): CustomTextFormatter.GetParagraph has cyclomatic complexity 29 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/CustomTextFormatter.cs"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a6957327d0cdf057b79a14856fcb3865db2f56da88c75b51ed9f10435a94318"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrFixReplaceList2.FixCommonWordErrors (cyclomatic 29): OcrFixReplaceList2.FixCommonWordErrors has cyclomatic complexity 29 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"691e06001addc2d3042a249a996901180c9121a9c42d0a653520f8b5ab9d81b3"}},{"ruleId":"D1","level":"warning","message":{"text":"InitToolbar.CreateToolbar (cyclomatic 28): InitToolbar.CreateToolbar has cyclomatic complexity 28 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitToolbar.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"e40d0afb0ead88b69a792ca6a792f68404fd021febe60daf58777ed9f4187cac"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrSubtitleBdn.GetBitmap (cyclomatic 28): OcrSubtitleBdn.GetBitmap has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrSubtitle/OcrSubtitleBdn.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a64cbdb5816d0bfdd64544dc30bacca08cc61c438ae762df17c746c3c1fcbef"}},{"ruleId":"D1","level":"warning","message":{"text":"CutVideoViewModel.OnKeyDownHandler (cyclomatic 28): CutVideoViewModel.OnKeyDownHandler has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/CutVideo/CutVideoViewModel.cs"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"122699a21ee6e57e85155a1130daa5e6c2611b14053eb351ace5ea769ed084c3"}},{"ruleId":"D1","level":"warning","message":{"text":"ReviewSpeechViewModel.Export (cyclomatic 28): ReviewSpeechViewModel.Export has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":497}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cc9ae3c25410cccba93c4198c66da616afcd82f60b0fabad57a15f9b18c2a02"}},{"ruleId":"D1","level":"warning","message":{"text":"ContinuationUtilities.RemovePrefix (cyclomatic 28): ContinuationUtilities.RemovePrefix has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":638}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4ed695312785ea98d0b7e3b8130ef0dca02b2bd88b3dc398d7842716b7fdb2c"}},{"ruleId":"D1","level":"warning","message":{"text":"DialogSplitMerge.IsDialog (cyclomatic 28): DialogSplitMerge.IsDialog has cyclomatic complexity 28 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/DialogSplitMerge.cs"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"eff27bb79bb73b7091737defba39d5810d97cb8835ebdd2eec533cfa1d1cf296"}},{"ruleId":"D1","level":"warning","message":{"text":"MxfParser.ParseMxf (cyclomatic 28): MxfParser.ParseMxf has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/MaterialExchangeFormat/MxfParser.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"abdc1b56bc5f7033f94dde85788c4f7e7805265210c7deb99fa81ecab51e774b"}},{"ruleId":"D1","level":"warning","message":{"text":"RemoveTextForHI.RemoveStartEndTags (cyclomatic 28): RemoveTextForHI.RemoveStartEndTags has cyclomatic complexity 28 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveTextForHI.cs"},"region":{"startLine":1329}}}],"partialFingerprints":{"codehealthFindingId/v1":"994e923a416657c208779cceb814f955f3f3e84aadbda3ec9831476c52fabe4d"}},{"ruleId":"D1","level":"warning","message":{"text":"TimeLineAscii.LoadSubtitle (cyclomatic 28): TimeLineAscii.LoadSubtitle has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimelineAscii.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d8e13c87d7580a7483e3b3fe5444c7c0a8158da8cba8767e824a0187ed0eea9"}},{"ruleId":"D1","level":"warning","message":{"text":"TimeLineFootageAscii.LoadSubtitle (cyclomatic 28): TimeLineFootageAscii.LoadSubtitle has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimelineFootageAscii.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"73bfd7e3d6318182abeb18b34464a1426e6da2ffea285bdc5d832973182a3b4c"}},{"ruleId":"D1","level":"warning","message":{"text":"ExportImagesSection.ApplyTo (cyclomatic 28): ExportImagesSection.ApplyTo has cyclomatic complexity 28 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SeConvSettings.cs"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"077020668383a2320f2fec1292e811baebea190ef2bf9b6da0c69ef9bd12f8d2"}},{"ruleId":"D1","level":"warning","message":{"text":"NikseBitmapImageSplitter2.SplitToLinesAggressive (cyclomatic 28): NikseBitmapImageSplitter2.SplitToLinesAggressive has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"54a5602b1045977642550a9ff4f41b033ec0a4cb62edf150c86ced8b5ecd2b2d"}},{"ruleId":"D1","level":"warning","message":{"text":"NikseBitmapImageSplitter2.IsVerticalLineTransparent (cyclomatic 28): NikseBitmapImageSplitter2.IsVerticalLineTransparent has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":982}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f44bea5d3b763835373e87b899fd2574dd06ddb06604ba86afee12bcad090a1"}},{"ruleId":"D1","level":"warning","message":{"text":"InitLayout.RestoreLayoutPositions (cyclomatic 27): InitLayout.RestoreLayoutPositions has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitLayout.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"7540c8308d1ef4c3b83bae7d0f33e99b34dc4a03faa374922adb517c601df218"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.ComboBoxSubtitleFormatChanged (cyclomatic 27): MainViewModel.ComboBoxSubtitleFormatChanged has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":24175}}}],"partialFingerprints":{"codehealthFindingId/v1":"f13af31dcb4b560d7b5bb1be17d7aadc20440dd46b1010c413f957f872ad9b12"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrViewModel.RunBinaryImageCompareOcrLoop (cyclomatic 27): OcrViewModel.RunBinaryImageCompareOcrLoop has cyclomatic complexity 27 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 8 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3384}}}],"partialFingerprints":{"codehealthFindingId/v1":"15cf625c6dc88f7ef9ab32b5b0b83f82461edb66a8dad0ef74bd6df97ed90787"}},{"ruleId":"D1","level":"warning","message":{"text":"VisualSyncViewModel.OnKeyDownHandler (cyclomatic 27): VisualSyncViewModel.OnKeyDownHandler has cyclomatic complexity 27 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Sync/VisualSync/VisualSyncViewModel.cs"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f57d327144fbfe7306894874ab1e454dd6cfd07ab57dd619b4e811d3bba1b9f"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchConverter.LoadDvbFromMatroska (cyclomatic 27): BatchConverter.LoadDvbFromMatroska has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e195f14ab5753ffeb1318a8d39413a5d3a642e0a3436816d085598ae22eb638"}},{"ruleId":"D1","level":"warning","message":{"text":"EmbedTrackPreviewViewModel.InitTrack (cyclomatic 27): EmbedTrackPreviewViewModel.InitTrack has cyclomatic complexity 27 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbedTrackPreviewViewModel.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fb577ca8e72dec932296dbd4d793a274ea36e588ca4c5b4ad4e46f5b39ddc94"}},{"ruleId":"D1","level":"warning","message":{"text":"DownloadSpeechToTextEngineViewModel.StartDownload (cyclomatic 27): DownloadSpeechToTextEngineViewModel.StartDownload has cyclomatic complexity 27 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs"},"region":{"startLine":498}}}],"partialFingerprints":{"codehealthFindingId/v1":"5759f4753f0d6ee6a95b7ae40b36b7f0cc25f8c77a7b7ffc00b1e080a2b6ed91"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextViewModel.OutputHandler (cyclomatic 27): SpeechToTextViewModel.OutputHandler has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":4094}}}],"partialFingerprints":{"codehealthFindingId/v1":"5519f5382cd76e2f3424b28a2bd4e50b9ce0628697640722225dfeacba824d4c"}},{"ruleId":"D1","level":"warning","message":{"text":"ReviewSpeechViewModel.RegenerateAudio (cyclomatic 27): ReviewSpeechViewModel.RegenerateAudio has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":784}}}],"partialFingerprints":{"codehealthFindingId/v1":"1704c358e6152950b62f9913df18d67a73f37263815480ae0b06d47f331e60a2"}},{"ruleId":"D1","level":"warning","message":{"text":"TextWithSubtitleSyntaxHighlightingConverter.ParseHtmlAttributes (cyclomatic 27): TextWithSubtitleSyntaxHighlightingConverter.ParseHtmlAttributes has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs"},"region":{"startLine":1005}}}],"partialFingerprints":{"codehealthFindingId/v1":"58b8f93a050785e4ada9f42d0e77cccdcbef483030110a75bfa85b6441336b6c"}},{"ruleId":"D1","level":"warning","message":{"text":"TimeSpanToDisplayShortConverter.ConvertBack (cyclomatic 27): TimeSpanToDisplayShortConverter.ConvertBack has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TimeSpanToDisplayShortConverter.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"225248a64ff25ba3ce8cdb7fb401d4ec8ca60d488d744e4528390055bc4e7700"}},{"ruleId":"D1","level":"warning","message":{"text":"XmlSourceSyntaxHighlighting.ColorizeAttributes (cyclomatic 27): XmlSourceSyntaxHighlighting.ColorizeAttributes has cyclomatic complexity 27 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/XmlSourceSyntaxHighlighting.cs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"65693f733a66db51d4c8a0a6cdaf3bf769f1bbe861008416561c533ea58629c0"}},{"ruleId":"D1","level":"warning","message":{"text":"RichTextToPlainText.ConvertToText (cyclomatic 27): RichTextToPlainText.ConvertToText has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/RichTextToPlainText.cs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffd3973e2b38f1d9fc5e9496c5b3937f5b0be3cab6251b89e9dbf96ab7f083c1"}},{"ruleId":"D1","level":"warning","message":{"text":"ObjectDataSegment.ProcessDataTypeForPosition (cyclomatic 27): ObjectDataSegment.ProcessDataTypeForPosition has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/ObjectDataSegment.cs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b4d55ed8a565ca14044d93ac4a936631a79cc9d7b49e964b81b4ab0fab56d6c"}},{"ruleId":"D1","level":"warning","message":{"text":"FixAloneLowercaseIToUppercaseI.FixAloneLowercaseIToUppercaseLine (cyclomatic 27): FixAloneLowercaseIToUppercaseI.FixAloneLowercaseIToUppercaseLine has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixAloneLowercaseIToUppercaseI.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"c17724d0133af480a4d7ab779e4c748718453d46b7c0db96e9785fc6b36ad660"}},{"ruleId":"D1","level":"warning","message":{"text":"FixUppercaseIInsideWords.Fix (cyclomatic 27): FixUppercaseIInsideWords.Fix has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixUppercaseIInsideWords.cs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f301ca18c4893e4e316d1cc80c92e3e4aae0ad5230b04cd133a3b75d4a76931"}},{"ruleId":"D1","level":"warning","message":{"text":"Helper.FixDialogsOnOneLine (cyclomatic 27): Helper.FixDialogsOnOneLine has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/Helper.cs"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6924e40e401b3a285d2acf30990d8b48a7c90d44edf21ade617869000113b2e"}},{"ruleId":"D1","level":"warning","message":{"text":"AvidStl.IsMine (cyclomatic 27): AvidStl.IsMine has cyclomatic complexity 27 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AvidStl.cs"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e42105d2a7b75be48b20bdee0fd065f550dd8821a3afffa0bea037204c4f49d"}},{"ruleId":"D1","level":"warning","message":{"text":"EbuTextTimingInformation.EncodeText (cyclomatic 27): EbuTextTimingInformation.EncodeText has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":650}}}],"partialFingerprints":{"codehealthFindingId/v1":"72cedf3fc5e85a5e16e90c201aa582af20d0b32a2a492b4d7b17241c455eed5b"}},{"ruleId":"D1","level":"warning","message":{"text":"ScenaristClosedCaptions.LoadSubtitle (cyclomatic 27): ScenaristClosedCaptions.LoadSubtitle has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ScenaristClosedCaptions.cs"},"region":{"startLine":826}}}],"partialFingerprints":{"codehealthFindingId/v1":"815a5533c93b138daa691e7e4249d2db72bd5d75ffad3ffb797225945be401e4"}},{"ruleId":"D1","level":"warning","message":{"text":"SubStationAlpha.ToText (cyclomatic 27): SubStationAlpha.ToText has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubStationAlpha.cs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba7efb11126a39ec0bca6a2d86f1b32bc6a33fb521d9ed2dae829142b1982b97"}},{"ruleId":"D1","level":"warning","message":{"text":"TranscriptiveJson.LoadSubtitle (cyclomatic 27): TranscriptiveJson.LoadSubtitle has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TranscriptiveJson.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"9599d1ffed3bd6ab735187c48e3b3a74066399036aa129263c41566aa7d0db20"}},{"ruleId":"D1","level":"warning","message":{"text":"LibSEIntegration.ApplyOperation (cyclomatic 27): LibSEIntegration.ApplyOperation has cyclomatic complexity 27 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":585}}}],"partialFingerprints":{"codehealthFindingId/v1":"051485799141439ee7ae896732a9dcdecbfb1964cd193725fdda64ed75c70a44"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrFixReplaceList2.FixOcrErrorViaLineReplaceList (cyclomatic 27): OcrFixReplaceList2.FixOcrErrorViaLineReplaceList has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"89f5d45166a5537bd11d8e43a491eedecc0343b686d27d4869f7e7fce51873bd"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrLineGenerator.HoughPeaksOnMask (cyclomatic 27): NOcrLineGenerator.HoughPeaksOnMask has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":1234}}}],"partialFingerprints":{"codehealthFindingId/v1":"27ad3971e7753493e5e3388d92695bf7aaaf3d95015714f425c3b456fd220303"}},{"ruleId":"D1","level":"warning","message":{"text":"InitMenu.ToKeyGesture (cyclomatic 26): InitMenu.ToKeyGesture has cyclomatic complexity 26 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitMenu.cs"},"region":{"startLine":1124}}}],"partialFingerprints":{"codehealthFindingId/v1":"627f17ed9074e9c32b3233bb7d4f9b302dd699184e17de38906f582652511af4"}},{"ruleId":"D1","level":"warning","message":{"text":"GoogleVisionOcr.JsonToStringList (cyclomatic 26): GoogleVisionOcr.JsonToStringList has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/GoogleVisionOcr.cs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39df0ba0f067e976bdcb02e95c05df3c99632fb4ee25f1e395c2c657db795c3"}},{"ruleId":"D1","level":"warning","message":{"text":"PaddleOcr.OcrBatch (cyclomatic 26): PaddleOcr.OcrBatch has cyclomatic complexity 26 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/PaddleOcr.cs"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"e669993ce5556f673e8dd4319d0b40a740a470dad0300796c6485105a4b8f071"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryEditViewModel.ExtractMkvDvb (cyclomatic 26): BinaryEditViewModel.ExtractMkvDvb has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":944}}}],"partialFingerprints":{"codehealthFindingId/v1":"273a8598d341b874d7f399279250832e62a4ce2f24aba14b31ec57c7ddf27cba"}},{"ruleId":"D1","level":"warning","message":{"text":"FullScreenVideoWindow.FullScreenVideoWindow.ctor (cyclomatic 26): FullScreenVideoWindow.FullScreenVideoWindow.ctor has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 9 of the 26 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 137, 95, 124, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/FullScreenVideoPlayer.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"06fe8b996869017d4ca7fdd68e62f7a777424be8e08f9507b92df86eface6315"}},{"ruleId":"D1","level":"warning","message":{"text":"SpellCheckManager.IsWordCorrect (cyclomatic 26): SpellCheckManager.IsWordCorrect has cyclomatic complexity 26 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/SpellCheckManager.cs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5fae0e7a90bb456d3127d3035f9eaba04151591affa24dc38db8c172becd3ab"}},{"ruleId":"D1","level":"warning","message":{"text":"AutoTranslateViewModel.EvaluateDefaultTargetLanguageCode (cyclomatic 26): AutoTranslateViewModel.EvaluateDefaultTargetLanguageCode has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":2320}}}],"partialFingerprints":{"codehealthFindingId/v1":"1caff7da3be1ad38a3521b9ef2247fa0c6a912ca594535161407e02f2bbd620a"}},{"ruleId":"D1","level":"warning","message":{"text":"VoiceSettingsViewModel.ImportVoiceFromFileAsync (cyclomatic 26): VoiceSettingsViewModel.ImportVoiceFromFileAsync has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/VoiceSettings/VoiceSettingsViewModel.cs"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1a7416f19d9bc6d0f4dce805c5b1691e49b390e242ad3bc356a584afa60a0bc"}},{"ruleId":"D1","level":"warning","message":{"text":"DialogSplitMerge.IsDialog (cyclomatic 26): DialogSplitMerge.IsDialog has cyclomatic complexity 26 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/DialogSplitMerge.cs"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a9deca08387858eb6262310d7552d543316ab0ab23611935315c80ba6188367"}},{"ruleId":"D1","level":"warning","message":{"text":"LanguageAutoDetect.GetEncodingViaLetter (cyclomatic 26): LanguageAutoDetect.GetEncodingViaLetter has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":2166}}}],"partialFingerprints":{"codehealthFindingId/v1":"2235d77b15a790dcd27d2ab55a06fb291fad926e9fc988b3bc9d9325dd0b3dce"}},{"ruleId":"D1","level":"warning","message":{"text":"NikseBitmap.CropTransparentSidesAndBottom (cyclomatic 26): NikseBitmap.CropTransparentSidesAndBottom has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/NikseBitmap.cs"},"region":{"startLine":586}}}],"partialFingerprints":{"codehealthFindingId/v1":"028c3389c5f9bb11d1c98c3dc95cdb3feea63e6448398fe576323d7f3a0f9c2b"}},{"ruleId":"D1","level":"warning","message":{"text":"SsaStyle.ToRawSsa (cyclomatic 26): SsaStyle.ToRawSsa has cyclomatic complexity 26 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SsaStyle.cs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1475928ec2df56d9fd0055d917e0b1865e541516fc6b4cd879a68fcd8b4a914"}},{"ruleId":"D1","level":"warning","message":{"text":"SsaStyle.ToRawAss (cyclomatic 26): SsaStyle.ToRawAss has cyclomatic complexity 26 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SsaStyle.cs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"820ffe769e2bcbacc0a5d6b523bad306283baa9d36eb3544710ef487a2da8c27"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownFormatImporter.ImportTimeCodesInFramesOnSameSeparateLine (cyclomatic 26): UnknownFormatImporter.ImportTimeCodesInFramesOnSameSeparateLine has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"7173c94a5861bd9f89c9b1ff0eca073d5ed7740244ef109daa56f7795da7aafe"}},{"ruleId":"D1","level":"warning","message":{"text":"Utilities.LoadMatroskaSSA (cyclomatic 26): Utilities.LoadMatroskaSSA has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":3187}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ab3e65533b66006593689a4d237e4e9b1e7419b10ae3d54fe3e298ea84716f8"}},{"ruleId":"D1","level":"warning","message":{"text":"WebVttToAssa.GetPositionInfo (cyclomatic 26): WebVttToAssa.GetPositionInfo has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/WebVttToAssa.cs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"51e928e8dde21f9d1a00e5004e29f920e73292612cbeed2f2043a0adb6b473b6"}},{"ruleId":"D1","level":"warning","message":{"text":"FixMusicNotation.Fix (cyclomatic 26): FixMusicNotation.Fix has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixMusicNotation.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6b52a136406aff7c81bd15f7823b1e028340223fae69c3201b464230d1da025"}},{"ruleId":"D1","level":"warning","message":{"text":"AribText.AribText.ctor (cyclomatic 26): AribText.AribText.ctor has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AribB36.cs"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"48815c7f66f82a5fcfd3c289b9b0c990bf098907008a8f07cc19bf26bcfce007"}},{"ruleId":"D1","level":"warning","message":{"text":"DvdStudioProSpace.LoadSubtitle (cyclomatic 26): DvdStudioProSpace.LoadSubtitle has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DvdStudioProSpace.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7b1d0d2472bd5afb582a6b397591a433a064d5bf534f178b6df4be4cc6c2f44"}},{"ruleId":"D1","level":"warning","message":{"text":"SmilTimesheetData.LoadSubtitle (cyclomatic 26): SmilTimesheetData.LoadSubtitle has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SmilTimesheetData.cs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1686c018292595ba1df16b8ba650918c134d75cd29dedd5f1bdbbceb36f814a"}},{"ruleId":"D1","level":"warning","message":{"text":"DialogPresentationSegment.DialogPresentationSegment.ctor (cyclomatic 26): DialogPresentationSegment.DialogPresentationSegment.ctor has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TextST.cs"},"region":{"startLine":590}}}],"partialFingerprints":{"codehealthFindingId/v1":"36eff2e5de604b4f97e6f21a4443ee72e69683b3ef2f717f22322b81a833197d"}},{"ruleId":"D1","level":"warning","message":{"text":"LibSEIntegration.DetectEncodingWithFallback (cyclomatic 26): LibSEIntegration.DetectEncodingWithFallback has cyclomatic complexity 26 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"736dfe59b9adcdc6f266be2f644e4fb217495b73f6e4170a494a37abb9732ff3"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryOcrBitmap.IsLowercaseI (cyclomatic 26): BinaryOcrBitmap.IsLowercaseI has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9464407bef53c4665a13ad26e7da02983b45583ba69bcd961bc5bd794c65184"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryOcrBitmap.IsO (cyclomatic 26): BinaryOcrBitmap.IsO has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5602c4a74fc936d5c915eda172449bbf7c74da821f4ec516909f74038159ce9"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrFixReplaceList2.CreateGuessesFromLetters (cyclomatic 26): OcrFixReplaceList2.CreateGuessesFromLetters has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"30bef7ff7070b71f6ac4677ef93d9ee3ffcd3197865d38ce33719ba0075ed1e2"}},{"ruleId":"D1","level":"warning","message":{"text":"NikseBitmapImageSplitter2.SplitToLines (cyclomatic 26): NikseBitmapImageSplitter2.SplitToLines has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a561e29d2bb7bb76a0d41afc7e94a7a5ca925ee6e0c922a26d09fc27f5bfbeb"}},{"ruleId":"D1","level":"warning","message":{"text":"GoogleCloudVisionApi.JsonToStringList (cyclomatic 26): GoogleCloudVisionApi.JsonToStringList has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/Service/GoogleCloudVisionApi.cs"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"897b65da4fc86d653b42af52314001e392d0f26c830cb66e5655ff33a95d84df"}},{"ruleId":"D1","level":"warning","message":{"text":"CopyPasteTranslator.SplitMergedLines (cyclomatic 26): CopyPasteTranslator.SplitMergedLines has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Translate/CopyPasteTranslator.cs"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"90d3583e051e97eb88d481d4cd41201e83c8f59b73756442121e6802ee3e6017"}},{"ruleId":"D1","level":"warning","message":{"text":"AssaDrawViewModel.ImportAssaDrawingFromText (cyclomatic 25): AssaDrawViewModel.ImportAssaDrawingFromText has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawViewModel.cs"},"region":{"startLine":919}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaad4d0bb312d1572aad9f46e2ced9681010fd20499fa6a4cc10b4defa013fd7"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedText10PropertiesViewModel.WriteValuesToXml (cyclomatic 25): TimedText10PropertiesViewModel.WriteValuesToXml has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/TimedText10Properties/TimedText10PropertiesViewModel.cs"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"f801f221cba53c9e929f356f50ee0eb98890c2e5e714785949f17c2666d1cef2"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.ColumnPasteFromClipboard (cyclomatic 25): MainViewModel.ColumnPasteFromClipboard has cyclomatic complexity 25 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":4391}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9f8241584ba0dc33037c7f40d55a1fee5326945eaa6ae5840c7b8ea015d9bf8"}},{"ruleId":"D1","level":"warning","message":{"text":"SubtitleLineViewModel.GetErrors (cyclomatic 25): SubtitleLineViewModel.GetErrors has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/SubtitleLineViewModel.cs"},"region":{"startLine":988}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8ae1a777767912e54a7220a7129410cb7889d09ecc9f850d5677e807245a484"}},{"ruleId":"D1","level":"warning","message":{"text":"GoogleLensOcr.OcrBatch (cyclomatic 25): GoogleLensOcr.OcrBatch has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 12 of the 25 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 102, 169). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/GoogleLensOcr.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"c06e31e0935abb473867bffc76bca34be441dcc51242a0740562ea76ad20bd10"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsViewModel.LoadSettings (cyclomatic 25): SettingsViewModel.LoadSettings has cyclomatic complexity 25 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsViewModel.cs"},"region":{"startLine":658}}}],"partialFingerprints":{"codehealthFindingId/v1":"25e8f20766ea568b10c2a169afb1c003b3b434fa321ac986536cfb89c19c330c"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextViewModel.ProcessQwen3AsrCppTranscription (cyclomatic 25): SpeechToTextViewModel.ProcessQwen3AsrCppTranscription has cyclomatic complexity 25 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":947}}}],"partialFingerprints":{"codehealthFindingId/v1":"32f26fb6106ed34dcb2bfbd89fa6d837cba36ca3eaf03506eecc658bb615ad3e"}},{"ruleId":"D1","level":"warning","message":{"text":"TextToSpeechViewModel.GetModelDotStatus (cyclomatic 25): TextToSpeechViewModel.GetModelDotStatus has cyclomatic complexity 25 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":1514}}}],"partialFingerprints":{"codehealthFindingId/v1":"a21f842e4514c31475b289327da134bc11a50d7de8c941c7d538c30f20d75972"}},{"ruleId":"D1","level":"warning","message":{"text":"TextToSpeechViewModel.GenerateSpeech (cyclomatic 25): TextToSpeechViewModel.GenerateSpeech has cyclomatic complexity 25 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 5 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":2448}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c7000f49aa94a9a419f2532a1b4c200f967e8a305b8e4a7e29625ab8517580f"}},{"ruleId":"D1","level":"warning","message":{"text":"UndoRedoManager.DetectContentChanges (cyclomatic 25): UndoRedoManager.DetectContentChanges has cyclomatic complexity 25 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/UndoRedo/UndoRedoManager.cs"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef888e19dcfd9901dbe06aa16600a4297f719e7d6ec35bbe20a46cb5f002a28f"}},{"ruleId":"D1","level":"warning","message":{"text":"LibMpvDynamicPlayer.GetAudioTracks (cyclomatic 25): LibMpvDynamicPlayer.GetAudioTracks has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibMpvDynamic/LibMpvDynamicPlayer.cs"},"region":{"startLine":1550}}}],"partialFingerprints":{"codehealthFindingId/v1":"06da01aab8f6bac200ec9123f8edf48b71f0d5d697eb10084710a35b2fea6434"}},{"ruleId":"D1","level":"warning","message":{"text":"ContinuationUtilities.IsFullLineQuote (cyclomatic 25): ContinuationUtilities.IsFullLineQuote has cyclomatic complexity 25 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":995}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dffb12e8b382e626848a6e9a9a1807c55e50fae9ea77a29083c68787713a067"}},{"ruleId":"D1","level":"warning","message":{"text":"CalcCjk.CountCharacters (cyclomatic 25): CalcCjk.CountCharacters has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TextLengthCalculator/CalcCJK.cs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0eebee5431dc5d1e69d7536d47552c7994d360c1740babe5e346674ffde95a7"}},{"ruleId":"D1","level":"warning","message":{"text":"CalcCjkNoSpace.CountCharacters (cyclomatic 25): CalcCjkNoSpace.CountCharacters has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TextLengthCalculator/CalcCJKNoSpace.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddf615f27fd36ce2b7b944faabdd3e6a5cad801b51c38312d4beaeb1dc41a15c"}},{"ruleId":"D1","level":"warning","message":{"text":"Cavena890.LoadSubtitle (cyclomatic 25): Cavena890.LoadSubtitle has cyclomatic complexity 25 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":1573}}}],"partialFingerprints":{"codehealthFindingId/v1":"e589791edace9c0fa4712088d219b9989a6d88f7779dcba2413beef0a293dee9"}},{"ruleId":"D1","level":"warning","message":{"text":"DvdStudioProSpaceOne.LoadSubtitle (cyclomatic 25): DvdStudioProSpaceOne.LoadSubtitle has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DvdStudioProSpaceOne.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"034381c2e65ecbb883d63e4d44027b1d7826b2928666213d9b2c970550bc497a"}},{"ruleId":"D1","level":"warning","message":{"text":"DvdStudioProSpaceOneSemicolon.LoadSubtitle (cyclomatic 25): DvdStudioProSpaceOneSemicolon.LoadSubtitle has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DvdStudioProSpaceOneSemicolon.cs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b447dd0113f65250cbbbca2d405179ba3eb8733c7b4d7f5ecc5eb07bf8871e7"}},{"ruleId":"D1","level":"warning","message":{"text":"JacoSub.DecodeText (cyclomatic 25): JacoSub.DecodeText has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JacoSub.cs"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"00f31aa3656636d59b659ff5bc5283dd0710b87a771e4c12d96eec55011d167f"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedTextImsc11.GetAssStyleFromRegion (cyclomatic 25): TimedTextImsc11.GetAssStyleFromRegion has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImsc11.cs"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"f695cf61e42abf17b2fd7aaa98b479aa1b21130cd555f974b15589a48603c5a9"}},{"ruleId":"D1","level":"warning","message":{"text":"TmpegEncXml.LoadTMpeg (cyclomatic 25): TmpegEncXml.LoadTMpeg has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TmpegEncXml.cs"},"region":{"startLine":461}}}],"partialFingerprints":{"codehealthFindingId/v1":"40265271954bc2a479a3a9eb73c5c5e03a9f8ea9a05c87dbbbbd1edbc7a55664"}},{"ruleId":"D1","level":"warning","message":{"text":"SubtitleConverter.ConvertAsync (cyclomatic 25): SubtitleConverter.ConvertAsync has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SubtitleConverter.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2c50bd786bc241b6a15d9bb97512d90201c1df65fdf620cafd7e2dbd10c2fc4"}},{"ruleId":"D1","level":"warning","message":{"text":"ExportHandlerBluRaySup.MakeBluRaySupImage (cyclomatic 25): ExportHandlerBluRaySup.MakeBluRaySupImage has cyclomatic complexity 25 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerBluRaySup.cs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"d74a6612fd101e3f228854ead7c282def1b5aad0a659dcf8fcb8f2ba10e06c47"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryOcrBitmap.IsC (cyclomatic 25): BinaryOcrBitmap.IsC has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"892d53d1eebc40d46c19186ed7ddee5a532e2082e341162f143c44d55452dcbf"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrFixEngine.SplitLine (cyclomatic 25): OcrFixEngine.SplitLine has cyclomatic complexity 25 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixEngine.cs"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"09718f63352359113958fbd886de6f7b1c9ea09e16c629fefd64ce952cdf7ccc"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrViewModel.EngineSelectionChanged (cyclomatic 24): OcrViewModel.EngineSelectionChanged has cyclomatic complexity 24 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":4751}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ead01c7e96d80849904a0bbf120b7eac299557230b66e8e70bd3351bc2071f0"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsImportExportViewModel.ImportSettings (cyclomatic 24): SettingsImportExportViewModel.ImportSettings has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsImportExport/SettingsImportExportViewModel.cs"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9aed05e36baf98362d5264b3e071b4c3d31e0bc0d2cc274998c37139e7741c0"}},{"ruleId":"D1","level":"warning","message":{"text":"AiReviewViewModel.Review (cyclomatic 24): AiReviewViewModel.Review has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/AiReview/AiReviewViewModel.cs"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7a682e27aae9485daa12769f218e91084871779d88335d851e12b7b879e8498"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextEngineSettingsViewModel.DetectBackend (cyclomatic 24): SpeechToTextEngineSettingsViewModel.DetectBackend has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/EngineSettings/SpeechToTextEngineSettingsViewModel.cs"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"c394be8364b9bdbbfdb3dbb3ab7018dae65ceea42407434c46e111f02832f911"}},{"ruleId":"D1","level":"warning","message":{"text":"IndexTtsCrispAsr.EnsureServerRunningAsync (cyclomatic 24): IndexTtsCrispAsr.EnsureServerRunningAsync has cyclomatic complexity 24 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"21f93ba4f45787e47d7a747a5d64e928543492fdb01f546f81347753c0b64481"}},{"ruleId":"D1","level":"warning","message":{"text":"ContinuationUtilities.IsNewSentence (cyclomatic 24): ContinuationUtilities.IsNewSentence has cyclomatic complexity 24 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c7eda75dc073384f38d30adb8d44eda4c8d817e9841d8548dc320aa9b9b1c5b"}},{"ruleId":"D1","level":"warning","message":{"text":"NikseBitmap.CropSidesAndBottom (cyclomatic 24): NikseBitmap.CropSidesAndBottom has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/NikseBitmap.cs"},"region":{"startLine":706}}}],"partialFingerprints":{"codehealthFindingId/v1":"98b625ffba70a1b5d7bd5368921573b3fe59184e76372895cab9ba5bee05ffe8"}},{"ruleId":"D1","level":"warning","message":{"text":"StringExtensions.FixExtraSpaces (cyclomatic 24): StringExtensions.FixExtraSpaces has cyclomatic complexity 24 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StringExtensions.cs"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"f198b0fc65dd95b22557e0424b54d1d8cc7dc93e679c87b4dbec4d382d577ec9"}},{"ruleId":"D1","level":"warning","message":{"text":"Utilities.LoadMatroskaTextSubtitle (cyclomatic 24): Utilities.LoadMatroskaTextSubtitle has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":2998}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe876232d18077d3c1751fa83ca37eb8a2836dfaea7f25a46e5cbec3b384b576"}},{"ruleId":"D1","level":"warning","message":{"text":"WebVttToAssa.WebVttToAssaInline (cyclomatic 24): WebVttToAssa.WebVttToAssaInline has cyclomatic complexity 24 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/WebVttToAssa.cs"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d165c3c31c5d93baa824fd482cbe599a7e81b47b138a08bb27d1aa62d65ea13"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedSubStationAlpha.LoadStylesFromTimedText10 (cyclomatic 24): AdvancedSubStationAlpha.LoadStylesFromTimedText10 has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":573}}}],"partialFingerprints":{"codehealthFindingId/v1":"6be9d0584afc7ab1775df0a281da712e055dc5caa85da3a20574226baadcad3d"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedSubStationAlpha.LoadStylesFromTimedTextTimedDraft2006Oct (cyclomatic 24): AdvancedSubStationAlpha.LoadStylesFromTimedTextTimedDraft2006Oct has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":706}}}],"partialFingerprints":{"codehealthFindingId/v1":"6556b516ce83a50a2580f7764de0740adab80fdc4726b3a43c663891394fbc33"}},{"ruleId":"D1","level":"warning","message":{"text":"ClqttJson.LoadSubtitle (cyclomatic 24): ClqttJson.LoadSubtitle has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ClqttJson.cs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f795caa5ee6289b5179f617ed6a8b71776336b9c231f47150df360a7efd836c"}},{"ruleId":"D1","level":"warning","message":{"text":"DvdStudioPro.LoadSubtitle (cyclomatic 24): DvdStudioPro.LoadSubtitle has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DvdStudioPro.cs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c434293b04628ba663d02334bcdd21f4c471179a5fb02b3ba63b8a62d64cda7"}},{"ruleId":"D1","level":"warning","message":{"text":"FinalCutProXml15.ToText (cyclomatic 24): FinalCutProXml15.ToText has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProXml15.cs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd599208d4028e02cbb5a4936e8c34f959ead8e7ef0b0c08cf8be4f8332982ea"}},{"ruleId":"D1","level":"warning","message":{"text":"Sami.ToText (cyclomatic 24): Sami.ToText has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Sami.cs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"e10be9d2217496067785b069180713ab757ae1e805ee38f79fb0e9dabd0f47ea"}},{"ruleId":"D1","level":"warning","message":{"text":"SubRip.LoadSubtitle (cyclomatic 24): SubRip.LoadSubtitle has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubRip.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"76419219b19dc58bc37f3fc5b3f47bc1b4647bca85eb9bc8b106b8a0608dff9c"}},{"ruleId":"D1","level":"warning","message":{"text":"SwiftInterchange2.LoadSubtitle (cyclomatic 24): SwiftInterchange2.LoadSubtitle has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SwiftInterchange2.cs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"d426e58c77012fe5de6914c76a6c04f3d90078dd63d7411d7733e0b5107c2cd6"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedTextNoNs.ToText (cyclomatic 24): TimedTextNoNs.ToText has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextNoNs.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"993f43b8a0039d5d1e0e3f2343c7623d22233db7ad381ddf7128122bd8eba8ec"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle87.ReadLine (cyclomatic 24): UnknownSubtitle87.ReadLine has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle87.cs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cb0cfc5ab372b1474be68bc07068c5434e1753c19aadcad3a967ad913398ea5"}},{"ruleId":"D1","level":"warning","message":{"text":"WebVTT.GetPositionInfo (cyclomatic 24): WebVTT.GetPositionInfo has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTT.cs"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a44787a0c3da2f0c8456224f77cee8ebcab29f95fdf6b421006670c5dfde869"}},{"ruleId":"D1","level":"warning","message":{"text":"LibSEIntegration.LooksLikeUtf8 (cyclomatic 24): LibSEIntegration.LooksLikeUtf8 has cyclomatic complexity 24 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"39837b297786cea9afb8af1e2d1292aec4c358b7e9112c27ec1d18488d55357d"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryOcrBitmap.IsLowercaseJ (cyclomatic 24): BinaryOcrBitmap.IsLowercaseJ has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee4c86d84b78d11e72b78f3eb4c0fdb03e07604cf5f899ae9e5b979089e8e34e"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioVisualizer.OnTapped (cyclomatic 23): AudioVisualizer.OnTapped has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"551ff3ad024cefe030aea786cf344ab438d8ffc1ba3308a80168070259e6f86e"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.ImportStyling (cyclomatic 23): MainViewModel.ImportStyling has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":3400}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d5dee8319c9231544ca91aead46dffb561f7b3b4fab316d6bf7cfbbec947369"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.ApplySettings (cyclomatic 23): MainViewModel.ApplySettings has cyclomatic complexity 23 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":9413}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd0d1a26c7dcd336e454c976dd2d78b2aa859123b3e09a1ea03e88133a7b0150"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrCharacterAddViewModel.KeyDown (cyclomatic 23): NOcrCharacterAddViewModel.KeyDown has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"758a0b9051f2d1de7fc886be0b5a8a67db9d639c59d7445c60d82e063c27a782"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchConvertViewModel.UpdateAutoTranslateSettings (cyclomatic 23): BatchConvertViewModel.UpdateAutoTranslateSettings has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":2224}}}],"partialFingerprints":{"codehealthFindingId/v1":"c32a886c7e05cf37f2699d88dc043f647737e791411d934dfcd3f24713a84c70"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextPostProcessor.Fix (cyclomatic 23): SpeechToTextPostProcessor.Fix has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextPostProcessor.cs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"9978b90d635183c310f346ec81719d7c2f6091dca61a4d3db44810726b8cb95e"}},{"ruleId":"D1","level":"warning","message":{"text":"MossTtsCrispAsr.EnsureServerRunningAsync (cyclomatic 23): MossTtsCrispAsr.EnsureServerRunningAsync has cyclomatic complexity 23 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs"},"region":{"startLine":606}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac79d3c9b5a5ef4030b3c5bb097e4383fbb573bbd993eec5d0da8abf2aa253ce"}},{"ruleId":"D1","level":"warning","message":{"text":"TextToSpeechViewModel.Import (cyclomatic 23): TextToSpeechViewModel.Import has cyclomatic complexity 23 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":1742}}}],"partialFingerprints":{"codehealthFindingId/v1":"2719d3da2655fbbf84f05b7389b676c2d7ae50e9856db60d5cf45a62fd2baf79"}},{"ruleId":"D1","level":"warning","message":{"text":"CropAreaSelector.HitTest (cyclomatic 23): CropAreaSelector.HitTest has cyclomatic complexity 23 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/VideoOcr/CropAreaSelector.cs"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeebed94e44e0f608d6cf33cd9a50eb2aeb041477e0ee1b384ade97bfeb3e57e"}},{"ruleId":"D1","level":"warning","message":{"text":"InsertService.InsertAfter (cyclomatic 23): InsertService.InsertAfter has cyclomatic complexity 23 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/InsertService.cs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3c25f1d5ded1b9c819cdade400359bf9044f87fc5ebebb87c149c761e9b4284"}},{"ruleId":"D1","level":"warning","message":{"text":"FfmpegGenerator.AlterEmbeddedTracksMatroska (cyclomatic 23): FfmpegGenerator.AlterEmbeddedTracksMatroska has cyclomatic complexity 23 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/FfmpegGenerator.cs"},"region":{"startLine":1337}}}],"partialFingerprints":{"codehealthFindingId/v1":"0baef470b1b5046b886988e9f7d373f7c230bd80c734b9a030ef16654e1c7e5c"}},{"ruleId":"D1","level":"warning","message":{"text":"NetflixCheckShotChange.Check (cyclomatic 23): NetflixCheckShotChange.Check has cyclomatic complexity 23 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 4 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/NetflixQualityCheck/NetflixCheckShotChange.cs"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb7b11ec93c7ee2900b68c4fd4ad9781d4d6527285fa2aca16e7ee4c27631082"}},{"ruleId":"D1","level":"warning","message":{"text":"ShortcutManager.CheckShortcuts (cyclomatic 23): ShortcutManager.CheckShortcuts has cyclomatic complexity 23 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ShortcutManager.cs"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"d28e1f55b298a9003061c3ec73a1e7c4a828964719279044fb9f6d33debb4d8a"}},{"ruleId":"D1","level":"warning","message":{"text":"HtmlUtil.RemoveHtmlTags (cyclomatic 23): HtmlUtil.RemoveHtmlTags has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/HtmlUtil.cs"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ff3883814ca22b1f6533fa08cecd8e850bf9dd0c0c9e78b75f49dd00e4248cb"}},{"ruleId":"D1","level":"warning","message":{"text":"StrippableText.ReplaceNames1Remove (cyclomatic 23): StrippableText.ReplaceNames1Remove has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StrippableText.cs"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ba2ebf23515788ec221f8a0dfcbb75e9f8b64cab291632133ba22bce75e0ff2"}},{"ruleId":"D1","level":"warning","message":{"text":"MP4Parser.CheckForMoovVideoCea608 (cyclomatic 23): MP4Parser.CheckForMoovVideoCea608 has cyclomatic complexity 23 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"90421d1085def331a056f8693a1a1b8cc81a0a06ca5166c5852b68022c70da58"}},{"ruleId":"D1","level":"warning","message":{"text":"MergeLinesWithSameTimeCodes.Merge (cyclomatic 23): MergeLinesWithSameTimeCodes.Merge has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/MergeLinesWithSameTimeCodes.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8bd09fb63a7623ace3532f4e2f7a55442fe227294ba8a959448a78849f4cf42"}},{"ruleId":"D1","level":"warning","message":{"text":"CapMakerPlus.LoadSubtitle (cyclomatic 23): CapMakerPlus.LoadSubtitle has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CapMakerPlus.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcb5082390a5e6a0b833049a0b28e367fba7108cafb3a674a5bf32a14590478d"}},{"ruleId":"D1","level":"warning","message":{"text":"DfxpBasic.ToText (cyclomatic 23): DfxpBasic.ToText has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DfxpBasic.cs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea427901a26d06cde33307082d7810945e997b1d12566921c8a3688eadeaab70"}},{"ruleId":"D1","level":"warning","message":{"text":"GooglePlayJson.LoadSubtitle (cyclomatic 23): GooglePlayJson.LoadSubtitle has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/GooglePlayJson.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"c18f4b028cebbeed89634e07b4bcdcdaeb1f9d53c9182c844af01c32217dfc55"}},{"ruleId":"D1","level":"warning","message":{"text":"Pns.GetParagraph (cyclomatic 23): Pns.GetParagraph has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pns.cs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9b57d828142f063949f1d312bda507c8b442cf5d492f1b3b10f9564cf1b0608"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle30.LoadSubtitle (cyclomatic 23): UnknownSubtitle30.LoadSubtitle has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle30.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1776728770afdf758028ea532a15cc9ff5bd8a1fb980d05573d5221919ca92c"}},{"ruleId":"D1","level":"warning","message":{"text":"YouTubeAnnotations.LoadSubtitle (cyclomatic 23): YouTubeAnnotations.LoadSubtitle has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/YouTubeAnnotations.cs"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"91d19cbf51dd9da43109ca77eb6d31c0ac032acf0d4cdeb96dcf5aea93f1423a"}},{"ruleId":"D1","level":"warning","message":{"text":"LibSEIntegration.LoadSubtitleWithFormat (cyclomatic 23): LibSEIntegration.LoadSubtitleWithFormat has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"2267a8a44985c80414c954efa08eaf06d1f4656b55c7f73c13f114a9f12ea641"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioVisualizer.HitTestParagraph (cyclomatic 22): AudioVisualizer.HitTestParagraph has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":1613}}}],"partialFingerprints":{"codehealthFindingId/v1":"2175020658a5d2311c99b23b8375e167e621bca722fbd60a5b41376ec61ac14b"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioVisualizer.DrawAllGridLines (cyclomatic 22): AudioVisualizer.DrawAllGridLines has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":2089}}}],"partialFingerprints":{"codehealthFindingId/v1":"679687a395454e773b5b15103c684e090f622848d9c639ff7f228c303cb9f643"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioVisualizer.FindDataBelowThresholdBackForStart (cyclomatic 22): AudioVisualizer.FindDataBelowThresholdBackForStart has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":3550}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f016da6e551c57afd9e70a86e7dc24f0a075a5fd796b4e3cac3de42bb00d9ba"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedEffectMatrix.ApplyEffect (cyclomatic 22): AdvancedEffectMatrix.ApplyEffect has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectMatrix.cs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"1293fad0ab6c91f505548db64a28b13072abf438d75d250970ab4c7369e9c672"}},{"ruleId":"D1","level":"warning","message":{"text":"PlainTextSplitter.FindBestBreakPoint (cyclomatic 22): PlainTextSplitter.FindBestBreakPoint has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportPlainText/PlainTextSplitter.cs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"18dbd5c7873db4f016f1a77651242b8c8113b64ba9b8d0b3f8967270cba76b6d"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.ShowVideoOpenFromUrl (cyclomatic 22): MainViewModel.ShowVideoOpenFromUrl has cyclomatic complexity 22 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":6813}}}],"partialFingerprints":{"codehealthFindingId/v1":"b18f6c04e38e90d497ad73146e64e75541a87744ce5cfd7353ef767a93d0cd65"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.AddSubtitleGridSpellCheckMenuItems (cyclomatic 22): MainViewModel.AddSubtitleGridSpellCheckMenuItems has cyclomatic complexity 22 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":20636}}}],"partialFingerprints":{"codehealthFindingId/v1":"29624a9a2db7cf5981ce2f7b91d878a9393e09434474df2855619ecb65e3628d"}},{"ruleId":"D1","level":"warning","message":{"text":"ApplyDurationLimitsViewModel.UpdatePreview (cyclomatic 22): ApplyDurationLimitsViewModel.UpdatePreview has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 4 of the 22 points are its own statements and the rest belongs to one function literal inside it that branches (line 102). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/ApplyDurationLimits/ApplyDurationLimitsViewModel.cs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c05c46ac6465250dec4f9e70bd3cc1648064f74818562bcfdffb414c7054827"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchConvertSettingsViewModel.OnOcrEngineChanged (cyclomatic 22): BatchConvertSettingsViewModel.OnOcrEngineChanged has cyclomatic complexity 22 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertSettingsViewModel.cs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"c802c71876c01b3fcbed7298591a908cfcf7f0506371495adcc8212c5b9bbabb"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextViewModel.ReDownloadWhisperEngine (cyclomatic 22): SpeechToTextViewModel.ReDownloadWhisperEngine has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":2542}}}],"partialFingerprints":{"codehealthFindingId/v1":"61d7cfef6d62d01d892ba3cf2d92eda83d8b6ca7c10e6660dba31e2e6bf0b91b"}},{"ruleId":"D1","level":"warning","message":{"text":"Qwen3TtsCrispAsr.EnsureServerRunningAsync (cyclomatic 22): Qwen3TtsCrispAsr.EnsureServerRunningAsync has cyclomatic complexity 22 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs"},"region":{"startLine":914}}}],"partialFingerprints":{"codehealthFindingId/v1":"07e8793135c472efb0ba68229004e1db910ab8a71eadbad1e2c4b70224e66aa2"}},{"ruleId":"D1","level":"warning","message":{"text":"ZonosTtsCrispAsr.EnsureServerRunningAsync (cyclomatic 22): ZonosTtsCrispAsr.EnsureServerRunningAsync has cyclomatic complexity 22 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ZonosTtsCrispAsr.cs"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"a79d0a41ec64439f3ba104bd45b075e4322e6ee4991a3ad974904a60907b8d40"}},{"ruleId":"D1","level":"warning","message":{"text":"Se.SetDefaultValues (cyclomatic 22): Se.SetDefaultValues has cyclomatic complexity 22 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Config/Se.cs"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4c018cd844d2abae28a60e55ff0f855dd707acea2fe659dae960ea12b85182b"}},{"ruleId":"D1","level":"warning","message":{"text":"NetflixCheckTextForHiUseBrackets.Check (cyclomatic 22): NetflixCheckTextForHiUseBrackets.Check has cyclomatic complexity 22 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/NetflixQualityCheck/NetflixCheckTextForHiUseBrackets.cs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"8af5f3d07e11980fe549f367b39687d2f4bde12c184944ee13afeb95e0f05873"}},{"ruleId":"D1","level":"warning","message":{"text":"SkBitmapExtensions.CropTransparentColors (cyclomatic 22): SkBitmapExtensions.CropTransparentColors has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/SkBitmapExtensions.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"8080c35b5131b1d6e8aa27361769400c3ff3d73729c11e01206dfa75d2cfa1b7"}},{"ruleId":"D1","level":"warning","message":{"text":"TextWithSubtitleSyntaxHighlightingConverter.SpellCheckLines (cyclomatic 22): TextWithSubtitleSyntaxHighlightingConverter.SpellCheckLines has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e2377fe8d719d6ee5a2860bd0f90bcc5ecdfe26f9683a8a73e9bfd097b610b0"}},{"ruleId":"D1","level":"warning","message":{"text":"LanguageAutoDetect.IsUtf8 (cyclomatic 22): LanguageAutoDetect.IsUtf8 has cyclomatic complexity 22 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":1996}}}],"partialFingerprints":{"codehealthFindingId/v1":"a477c223ef1d78c11c922cefacf32175d009f896442a9bbf65c694bb3deb5022"}},{"ruleId":"D1","level":"warning","message":{"text":"StrippableText.ShouldStartWithUpperCase (cyclomatic 22): StrippableText.ShouldStartWithUpperCase has cyclomatic complexity 22 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StrippableText.cs"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ac94a02936ce8cdd7893447e4d74f5b163ecc1800e1c69e29f9460c87685016"}},{"ruleId":"D1","level":"warning","message":{"text":"MatroskaFile.ReadTrackEntryElement (cyclomatic 22): MatroskaFile.ReadTrackEntryElement has cyclomatic complexity 22 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Matroska/MatroskaFile.cs"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7564d89dcac7ba4d6c3c6fb2e474f83b2f0bd64055b99ce931dbcb7ef72c3fd"}},{"ruleId":"D1","level":"warning","message":{"text":"FixStartWithUppercaseLetterAfterColon.Fix (cyclomatic 22): FixStartWithUppercaseLetterAfterColon.Fix has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixStartWithUppercaseLetterAfterColon.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"21fe0071cb4ef75a0864a351e3cb7e068f880f06c51c24ef04ed707d4975d9d7"}},{"ruleId":"D1","level":"warning","message":{"text":"FixStartWithUppercaseLetterAfterPeriodInsideParagraph.Fix (cyclomatic 22): FixStartWithUppercaseLetterAfterPeriodInsideParagraph.Fix has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixStartWithUppercaseLetterAfterPeriodInsideParagraph.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"32c83bb903ab732000663f47f3e0e69af8d72aa012d8668280f92e5371a44cc2"}},{"ruleId":"D1","level":"warning","message":{"text":"TimeCodesBeautifier.FindBestCueFrame (cyclomatic 22): TimeCodesBeautifier.FindBestCueFrame has cyclomatic complexity 22 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/TimeCodesBeautifier.cs"},"region":{"startLine":986}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fcd46741c8e80974ea202d6d3270d8a8227998ec97d6bdb97e73b4b2722ba53"}},{"ruleId":"D1","level":"warning","message":{"text":"AdobePremierePrProj.LoadSubtitle (cyclomatic 22): AdobePremierePrProj.LoadSubtitle has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdobePremierePrProj.cs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce375baa5c7504882dcd46673aae7a8c1cde725350680ffda5c571933ad610de"}},{"ruleId":"D1","level":"warning","message":{"text":"AribB24Decoder.HandleC1 (cyclomatic 22): AribB24Decoder.HandleC1 has cyclomatic complexity 22 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AribB24Decoder.cs"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e330fee0d30d3132b5aaff1e71b685a4f2d6fd8c2bcc66df7f3bb2aff990cdc"}},{"ruleId":"D1","level":"warning","message":{"text":"AribB24Decoder.HandleGraphicCharacter (cyclomatic 22): AribB24Decoder.HandleGraphicCharacter has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AribB24Decoder.cs"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f72f75056579be99e798863cc43cb48a4f3797b7bbcec0d5bb343322d0b2e74"}},{"ruleId":"D1","level":"warning","message":{"text":"Ebu.CloseFontTagIfNewColor (cyclomatic 22): Ebu.CloseFontTagIfNewColor has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":2314}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdd035b338d59df96f5cdc12ed429c941bb2c84c50c20bd11b38057462ad3a4d"}},{"ruleId":"D1","level":"warning","message":{"text":"Footage.LoadSubtitle (cyclomatic 22): Footage.LoadSubtitle has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Footage.cs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"a101a1e2fd9605b42bd6f7781d60626c7464d1cd088bede03fe46669b22deedf"}},{"ruleId":"D1","level":"warning","message":{"text":"LambdaCap.EncodeStyle (cyclomatic 22): LambdaCap.EncodeStyle has cyclomatic complexity 22 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/LambdaCap.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a9a4a4b98eb3faead7697af21cb091150f07fad9351e60cd2cf7c17c5d5b874"}},{"ruleId":"D1","level":"warning","message":{"text":"LambdaCap.DecodeStyle (cyclomatic 22): LambdaCap.DecodeStyle has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/LambdaCap.cs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5b93c6a395c6d6522eeda68ea3005951af3c37ec4939a7850ff9f746630e55f"}},{"ruleId":"D1","level":"warning","message":{"text":"Pac.Analyze (cyclomatic 22): Pac.Analyze has cyclomatic complexity 22 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":1586}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac824e4d91167d30e117fb321157fc6518ef0c5b4b63ddabf4eb4fc921eae489"}},{"ruleId":"D1","level":"warning","message":{"text":"StructuredTitles.LoadSubtitle (cyclomatic 22): StructuredTitles.LoadSubtitle has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/StructuredTitles.cs"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"01dbeab3e9592f723b8454b373d262d4b5aa09d1794c29b91db3a0316cf24ec1"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedTextImsc11.LoadSubtitle (cyclomatic 22): TimedTextImsc11.LoadSubtitle has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImsc11.cs"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"c52e5c3b4c86a64b4ea3d2634fdc6c3bc57cd7a7dfd41109c5864c80cf33d434"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle17.LoadSubtitle (cyclomatic 22): UnknownSubtitle17.LoadSubtitle has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle17.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"07e6c4bbdbc441d2075de4a9ebbd2f6c6a808078b3fdf4ae18b0b354bdf4d339"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle25.LoadSubtitle (cyclomatic 22): UnknownSubtitle25.LoadSubtitle has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle25.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d55769041e03d37f47eecf60fd25f93894a9e1f481dbee98e8b5dad9632bdb3"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle31.LoadSubtitle (cyclomatic 22): UnknownSubtitle31.LoadSubtitle has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle31.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d756e918664d5701be66ec6b757c74999c7e5a3e564e9f2f46c3a382d276aff"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle34.LoadSubtitle (cyclomatic 22): UnknownSubtitle34.LoadSubtitle has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle34.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"417b6970d48a7df09fd432c8217e7b4dde5350f631552e991a2980fb5588f608"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageRenderer.RenderTextToCanvas (cyclomatic 22): ImageRenderer.RenderTextToCanvas has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ImageRenderer.cs"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d409514cf8bd4ae647e7f8aafacb80fde6a13e0e09e7de15941f9f3ec1107d9"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrChar.IsMatchPointForeGround (cyclomatic 22): NOcrChar.IsMatchPointForeGround has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrChar.cs"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d23bfcd1f10b0ec0fbc027c93ead8593f00141072a36a89b88d82afdd90b09b"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrLineGenerator.ChamferDistanceTransform (cyclomatic 22): NOcrLineGenerator.ChamferDistanceTransform has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":951}}}],"partialFingerprints":{"codehealthFindingId/v1":"6edc384abc973f13876f36e76bddf63297c37ec5694f776a619133c183188f9f"}},{"ruleId":"D1","level":"warning","message":{"text":"ItunesTimedTextPropertiesViewModel.WriteValuesToXml (cyclomatic 21): ItunesTimedTextPropertiesViewModel.WriteValuesToXml has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesViewModel.cs"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8a89072c23b4771c721b8e55a4bd8df665cd9f665f3eeb50e99efd83abbe66c"}},{"ruleId":"D1","level":"warning","message":{"text":"ImportCsvXlsxCustomColumnsViewModel.LoadFile (cyclomatic 21): ImportCsvXlsxCustomColumnsViewModel.LoadFile has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportCsvXlsxCustomColumns/ImportCsvXlsxCustomColumnsViewModel.cs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f1bbbad8e137396ce9cb014a929bafcf8411c9ea638be1480c55112eac48186"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.RunPlugin (cyclomatic 21): MainViewModel.RunPlugin has cyclomatic complexity 21 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":5426}}}],"partialFingerprints":{"codehealthFindingId/v1":"724a1058c98b480689bc4317ac5c3cf9db47b5881ad35458bdf24a5c7f2cde3a"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.ApplyTtsChanges (cyclomatic 21): MainViewModel.ApplyTtsChanges has cyclomatic complexity 21 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":7523}}}],"partialFingerprints":{"codehealthFindingId/v1":"7165ef2d3d7b4889bd346d100db659840c9b1306289f9ad2b04f9dd598993b07"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrInspectViewModel.KeyDown (cyclomatic 21): NOcrInspectViewModel.KeyDown has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/NOcr/NOcrInspectViewModel.cs"},"region":{"startLine":624}}}],"partialFingerprints":{"codehealthFindingId/v1":"564515dbe0b93af1108c8596335388195b931c0a43b68ff25e9f1e571e39d223"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrViewModel.ImportTextFromSubtitle (cyclomatic 21): OcrViewModel.ImportTextFromSubtitle has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":827}}}],"partialFingerprints":{"codehealthFindingId/v1":"707a77344174936b1757a8cf582401b5fe8c2de68570a5ae454f31210ec050a4"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrViewModel.EnsureCrispEmbedReady (cyclomatic 21): OcrViewModel.EnsureCrispEmbedReady has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1285}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bd140a1ca093bec573e19dd310790b4009be4b30bccd4008c90460aead159b4"}},{"ruleId":"D1","level":"warning","message":{"text":"PositionMonitorControl.Render (cyclomatic 21): PositionMonitorControl.Render has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/PositionMonitorControl.cs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"be0fe17df9bf175ca145d4bcd0d73eeb7ddcc41cc0e081d45eb2193933e4c8d8"}},{"ruleId":"D1","level":"warning","message":{"text":"AdjustAllTimesViewModel.OnKeyDown (cyclomatic 21): AdjustAllTimesViewModel.OnKeyDown has cyclomatic complexity 21 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Sync/AdjustAllTimes/AdjustAllTimesViewModel.cs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"27e5dc2b8a2236994e5087aba8c9074d9c795256c1f5bccb2955449ba2d82f9d"}},{"ruleId":"D1","level":"warning","message":{"text":"AutoTranslateViewModel.StartTranslation (cyclomatic 21): AutoTranslateViewModel.StartTranslation has cyclomatic complexity 21 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":1309}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4a605eea510f8401d35a2218c0be673dfb7330b7b0d2382e567de6fb4784fbd"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextViewModel.OnTimerWhisperOnElapsed (cyclomatic 21): SpeechToTextViewModel.OnTimerWhisperOnElapsed has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 9 of the 21 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 750, 650). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"7472dac5e90ba61f789c25679f1e581ba89e93c09d62a298ae343badb96e05b6"}},{"ruleId":"D1","level":"warning","message":{"text":"F5TtsCrispAsr.EnsureServerRunningAsync (cyclomatic 21): F5TtsCrispAsr.EnsureServerRunningAsync has cyclomatic complexity 21 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"6056b0488ddf4adcefe23406a9fda4a4f78f9b4a9c2d9db4047fd3246b59bcf1"}},{"ruleId":"D1","level":"warning","message":{"text":"VoxCPM2CrispAsr.EnsureServerRunningAsync (cyclomatic 21): VoxCPM2CrispAsr.EnsureServerRunningAsync has cyclomatic complexity 21 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs"},"region":{"startLine":554}}}],"partialFingerprints":{"codehealthFindingId/v1":"b41aa3f8a4f288a513e9387eea429fe44722001a28438412b265781b14b7a8b5"}},{"ruleId":"D1","level":"warning","message":{"text":"ReviewSpeechViewModel.SelectedEngineChangedAsync (cyclomatic 21): ReviewSpeechViewModel.SelectedEngineChangedAsync has cyclomatic complexity 21 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":1401}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c9492828abc2ebf37987b95e8ec9a20fd6469695a174bb8c4d3e194dfdf60b5"}},{"ruleId":"D1","level":"warning","message":{"text":"InsertService.InsertBefore (cyclomatic 21): InsertService.InsertBefore has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/InsertService.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"e60ce58802e799898590adac7d15617c0558469a6cff3876c875e0860eaac29e"}},{"ruleId":"D1","level":"warning","message":{"text":"WaveformExtractionEstimate.GetDecodeSpeedFactor (cyclomatic 21): WaveformExtractionEstimate.GetDecodeSpeedFactor has cyclomatic complexity 21 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/WaveformExtractionEstimate.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"23223b38ef05bf9015c84a2f50d3eb30efb07ba2939d8f38936fcb7c7c95c869"}},{"ruleId":"D1","level":"warning","message":{"text":"MergeManager.MergeSelectedLines (cyclomatic 21): MergeManager.MergeSelectedLines has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/MergeManager.cs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca23ae0d97149dfd1850a4dd9a94e9d8a69645d46ddcd9ca72fb08daa437d764"}},{"ruleId":"D1","level":"warning","message":{"text":"ActorConverter.FixActors (cyclomatic 21): ActorConverter.FixActors has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ActorConverter.cs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"3055c7c51425189af9ad7e49cac5b2df66f73386044f45f8159243900c042bb9"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownFormatImporterJson.FixTimeCodeMsOrSeconds (cyclomatic 21): UnknownFormatImporterJson.FixTimeCodeMsOrSeconds has cyclomatic complexity 21 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterJson.cs"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"958312d738f10000842435337f3517501a08f6f8e087e83451ae5a5b8d209fce"}},{"ruleId":"D1","level":"warning","message":{"text":"Utilities.CanBreak (cyclomatic 21): Utilities.CanBreak has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"2db6a0e8e5d6b94d7e787b2d6da7cd5796ef9b45746dc03d96bf22cd9c1ca1f4"}},{"ruleId":"D1","level":"warning","message":{"text":"ObjectDataSegment.ProcessDataType (cyclomatic 21): ObjectDataSegment.ProcessDataType has cyclomatic complexity 21 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/ObjectDataSegment.cs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"a45cfc11a7ba58bba1f5666e0293913ba62cd0ef26c4924e1a4971fc904fc9ca"}},{"ruleId":"D1","level":"warning","message":{"text":"Helper.FixDash (cyclomatic 21): Helper.FixDash has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/Helper.cs"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a35518dfb0e63ea01e5d69735cd6656e5ec072f54803a923a0424ec62fd503f"}},{"ruleId":"D1","level":"warning","message":{"text":"BelleNuitSubtitler.LoadSubtitle (cyclomatic 21): BelleNuitSubtitler.LoadSubtitle has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/BelleNuitSubtitler.cs"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4a5742dc6865692a5771684b384271bfa6432c002ab766e411c5a610cdb5a5e"}},{"ruleId":"D1","level":"warning","message":{"text":"Edl.LoadSubtitle (cyclomatic 21): Edl.LoadSubtitle has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Edl.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2759153eb5135697d33e50abf4b8beecf38901daf8ad81a6b3bc61634c41729"}},{"ruleId":"D1","level":"warning","message":{"text":"JsonType6.LoadSubtitle (cyclomatic 21): JsonType6.LoadSubtitle has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType6.cs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"993ec4b35f5de1bdcc716fc8baf4a6ed15e8eb0f0fa9146b5a047457fda4a9da"}},{"ruleId":"D1","level":"warning","message":{"text":"KanopyHtml.LoadSubtitle (cyclomatic 21): KanopyHtml.LoadSubtitle has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/KanopyHtml.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eaec633dcdbb9169ca3e9c0979d56c7757075ab2d7011c4bc0993eb5dccf8df"}},{"ruleId":"D1","level":"warning","message":{"text":"NciCaption.IsMine (cyclomatic 21): NciCaption.IsMine has cyclomatic complexity 21 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/NciCaption.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f55ea32b21df5fcb3e9ab799b3c3cfb5795047440e373c056cef846e7ec68cc"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedText200604.LoadSubtitle (cyclomatic 21): TimedText200604.LoadSubtitle has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText200604.cs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"27500cf713558c4348b775df32eb70137a2210160d2ce362158116be973e6963"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle60.LoadSubtitle (cyclomatic 21): UnknownSubtitle60.LoadSubtitle has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle60.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c3fb2021c48322d487ae291a5d7bb4f06862ca87ae90e1b4f6598439d8c4c85"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle64.LoadSubtitle (cyclomatic 21): UnknownSubtitle64.LoadSubtitle has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle64.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bc5575fd0d7ec501f05c9df2436c1f21df4bcabfdbf545681a1588cd8f42b4d"}},{"ruleId":"D1","level":"warning","message":{"text":"SubtitleConverter.ApplyTransformsAndSaveAsync (cyclomatic 21): SubtitleConverter.ApplyTransformsAndSaveAsync has cyclomatic complexity 21 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SubtitleConverter.cs"},"region":{"startLine":683}}}],"partialFingerprints":{"codehealthFindingId/v1":"92b4227b573459d9db113d08f0d49713e0ae165e3e3f2693e269802d0cca64cf"}},{"ruleId":"D1","level":"warning","message":{"text":"Program.Main (cyclomatic 21): Program.Main has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Program.cs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"f020c411acfbe79d2afe437cae4cd2ad990a53d82e509e10a18ac278b691ec7e"}},{"ruleId":"D1","level":"warning","message":{"text":"LlamaCppServerManager.EnsureServerRunningAsync (cyclomatic 21): LlamaCppServerManager.EnsureServerRunningAsync has cyclomatic complexity 21 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/LlamaCpp/LlamaCppServerManager.cs"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca34aa659c2789593b709c4dccd5b975f3ab4cb9c46bb5353e0f26c94a23f983"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryOcrBitmap.IsColon (cyclomatic 21): BinaryOcrBitmap.IsColon has cyclomatic complexity 21 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"05876fc5d275dde088ea117c430d3ac42d4b7b49da25256ed7f0028577ed852b"}},{"ruleId":"D1","level":"warning","message":{"text":"AssaPropertiesViewModel.LoadFromHeader (cyclomatic 20): AssaPropertiesViewModel.LoadFromHeader has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaPropertiesViewModel.cs"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"e90a238a85947fc03977c485221534ef2115512c31b82dd561eb8de7f6f0906a"}},{"ruleId":"D1","level":"warning","message":{"text":"ExportImageBasedViewModel.CalculatePosition (cyclomatic 20): ExportImageBasedViewModel.CalculatePosition has cyclomatic complexity 20 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportImageBased/ExportImageBasedViewModel.cs"},"region":{"startLine":687}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ec9d1a92cf77e727e6f773a727d930f183f2750a0b39dc4bccb1687f1dd7a2c"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedTextImsc11PropertiesViewModel.WriteValuesToXml (cyclomatic 20): TimedTextImsc11PropertiesViewModel.WriteValuesToXml has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/TimedTextImsc11Properties/TimedTextImsc11PropertiesViewModel.cs"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"62b3c43af7d4634735c34f91727e0bcfedc1b9e730d11895f832d1ae9a267be9"}},{"ruleId":"D1","level":"warning","message":{"text":"ImportCsvXlsxCustomColumnsViewModel.RebuildPreview (cyclomatic 20): ImportCsvXlsxCustomColumnsViewModel.RebuildPreview has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportCsvXlsxCustomColumns/ImportCsvXlsxCustomColumnsViewModel.cs"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"91065dd6d153665d6cea2db7a7da7bd29223520f78ff3a6f1271312227d6f9c8"}},{"ruleId":"D1","level":"warning","message":{"text":"MacWindowsMenuInterop.TryRegisterWindowsMenu (cyclomatic 20): MacWindowsMenuInterop.TryRegisterWindowsMenu has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/MacWindowsMenuInterop.cs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d26c66df152cbe2497be52f72a145a4dc66b9832cb077ce1a986c3156e4a4d"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.SnapSelectedLinesToNearestShotChange (cyclomatic 20): MainViewModel.SnapSelectedLinesToNearestShotChange has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":7850}}}],"partialFingerprints":{"codehealthFindingId/v1":"197ada3e8ac0e36746424a6b33be133505f3b4e5e0d6c37814be9784987d91ed"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.ShowFind (cyclomatic 20): MainViewModel.ShowFind has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 8 of the 20 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 11433, 11454, 11478). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":11405}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8ebd47e2aa4be5486bd519bd97d8aaf7bc5e59212c62333ffaecffe605d52df"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.ShowReplace (cyclomatic 20): MainViewModel.ShowReplace has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 8 of the 20 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 11791, 11822, 11836). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":11759}}}],"partialFingerprints":{"codehealthFindingId/v1":"b136226990b311c2c3207aadcba32022c1496741a0096f64482f1568de6559c5"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.TextBoxContextOpening (cyclomatic 20): MainViewModel.TextBoxContextOpening has cyclomatic complexity 20 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":23890}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc18c6a82eb8bb5847b219c727ccd0040059b751dd42725c57ada93ebe8b9e8a"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrSubtitleImageParameter.GetPosition (cyclomatic 20): OcrSubtitleImageParameter.GetPosition has cyclomatic complexity 20 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrSubtitle/OcrSubtitleImageParameter.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"df3c20634444df34d25fb5a30dc2a5782153ad83bc30792922b014b0caed18db"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchConvertViewModel.LoadSettings (cyclomatic 20): BatchConvertViewModel.LoadSettings has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":658}}}],"partialFingerprints":{"codehealthFindingId/v1":"60f7e5b6f839a39263329e8c2ac8600a2f079b481af437585ede9755113660e3"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchConvertViewModel.EnsurePaddleOcrAvailable (cyclomatic 20): BatchConvertViewModel.EnsurePaddleOcrAvailable has cyclomatic complexity 20 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":1021}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf9bfdde2e2769fd6068dc7d6be7c3fc22364a8f47af1edcd1c4f4c1a8b9896c"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchStatics.CalculateGeneralStatistics (cyclomatic 20): BatchStatics.CalculateGeneralStatistics has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchStatics.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee2f634a77dd21ff57743121353852e2d536a05a2c5c1ad06302ceb7379be8cc"}},{"ruleId":"D1","level":"warning","message":{"text":"OmniVoiceCrispAsr.EnsureServerRunningAsync (cyclomatic 20): OmniVoiceCrispAsr.EnsureServerRunningAsync has cyclomatic complexity 20 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"423194052953bd86a69ebc2f9886dc7ac5a79d74fe40639da3bec752134977ed"}},{"ruleId":"D1","level":"warning","message":{"text":"Qwen3TtsCrispAsr.Speak (cyclomatic 20): Qwen3TtsCrispAsr.Speak has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs"},"region":{"startLine":726}}}],"partialFingerprints":{"codehealthFindingId/v1":"27bec5d777ae23ce591eef0b01d4ccdaae05f5fd0522b9101ae4ff5dd3a5bbb3"}},{"ruleId":"D1","level":"warning","message":{"text":"TextToSpeechViewModel.SaveSettings (cyclomatic 20): TextToSpeechViewModel.SaveSettings has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"13afa258000560aedaee80e62c4437c2b9450729d235ede8b98b5b1a222c6cb7"}},{"ruleId":"D1","level":"warning","message":{"text":"ZipUnpacker.UnpackTarGzStream (cyclomatic 20): ZipUnpacker.UnpackTarGzStream has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Compression/ZipUnpacker.cs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d39fc1d02284abe220400ce8a27e3d46dd89a22bb45972c84c53d336dcbd91a"}},{"ruleId":"D1","level":"warning","message":{"text":"PlainTextImporter.ImportAutoSplit (cyclomatic 20): PlainTextImporter.ImportAutoSplit has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/PlainTextImporter.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"f808cc9ae8e72ca17ed527477fdb1baf93c4bafb27ee259fab3011684ed26750"}},{"ruleId":"D1","level":"warning","message":{"text":"CalcAll.CountCharacters (cyclomatic 20): CalcAll.CountCharacters has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TextLengthCalculator/CalcAll.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa626355b40b7b7b39b534860894e9901c86126e59b64a971bc85cba1f7867d3"}},{"ruleId":"D1","level":"warning","message":{"text":"ObjectDataSegment.CalculateSize (cyclomatic 20): ObjectDataSegment.CalculateSize has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/ObjectDataSegment.cs"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"16350e6bb765308578e3f355b2ced92f0af6a3f539bc0861f06c5f0ce7e9c685"}},{"ruleId":"D1","level":"warning","message":{"text":"StringWithoutSpaceSplitToWords.SplitWord (cyclomatic 20): StringWithoutSpaceSplitToWords.SplitWord has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Dictionaries/StringWithoutSpaceSplitToWords.cs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"34a3806cb4447773135ee6a5ca7362ea73919466015b8e600bfe91c5f90504f4"}},{"ruleId":"D1","level":"warning","message":{"text":"FixMissingOpenBracket.RestoreMissingOpenParenthesis (cyclomatic 20): FixMissingOpenBracket.RestoreMissingOpenParenthesis has cyclomatic complexity 20 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixMissingOpenBracket.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb2b6f1fb873b5f7ed9fbcd278287c5d15aa5b48dc18ecc0866de61e9ca5fc96"}},{"ruleId":"D1","level":"warning","message":{"text":"RemoveTextForHI.RemoveTextBetweenTags (cyclomatic 20): RemoveTextForHI.RemoveTextBetweenTags has cyclomatic complexity 20 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveTextForHI.cs"},"region":{"startLine":1493}}}],"partialFingerprints":{"codehealthFindingId/v1":"95faeeef23c8e51129937a45c8929df7c753f71e857d584487ec674709e90782"}},{"ruleId":"D1","level":"warning","message":{"text":"SplitLongLinesHelper.SplitLongLinesInSubtitle (cyclomatic 20): SplitLongLinesHelper.SplitLongLinesInSubtitle has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/SplitLongLinesHelper.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"6045321186f344f3aadcf345d6c526380dd88cbc37bfdfd1a380c11bd2f2a904"}},{"ruleId":"D1","level":"warning","message":{"text":"BelleNuitSubtitler.DecodeText (cyclomatic 20): BelleNuitSubtitler.DecodeText has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/BelleNuitSubtitler.cs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"2effed2b699e09ae4ff31f00ee294e3d3b10ed8e75f16409404b925db9a90c72"}},{"ruleId":"D1","level":"warning","message":{"text":"Chk.ApplyFont (cyclomatic 20): Chk.ApplyFont has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Chk.cs"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"70bd2a24b535bb42b6b297c909e6ae8997faff9b8bffb58bf3c32d81ee6d7f95"}},{"ruleId":"D1","level":"warning","message":{"text":"JsonTypeOnlyLoad4.LoadSubtitle (cyclomatic 20): JsonTypeOnlyLoad4.LoadSubtitle has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonTypeOnlyLoad4.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"07441d1f77242fde796c9930abc8708d5ff0dbea8993e6eb927e3fece12512a3"}},{"ruleId":"D1","level":"warning","message":{"text":"NetflixImsc11Japanese.LoadSubtitle (cyclomatic 20): NetflixImsc11Japanese.LoadSubtitle has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/NetflixImsc11Japanese.cs"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0840eb64a5977eee0256e35bbd85e740260a6b20a88e3d6c5e0b05721c4e8b2"}},{"ruleId":"D1","level":"warning","message":{"text":"Pe2.LoadSubtitle (cyclomatic 20): Pe2.LoadSubtitle has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/PE2.cs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"19c8e41cac204e1cb8d5c8d88c67877db2108f4bedcf62e8545d8166364cc589"}},{"ruleId":"D1","level":"warning","message":{"text":"PlayStationSubs.GetSubtitleBitmap (cyclomatic 20): PlayStationSubs.GetSubtitleBitmap has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/PlayStationSubs.cs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d1429b8a442ed6c5406de31d0912a46962a1477366f7ee45620ea513863171f"}},{"ruleId":"D1","level":"warning","message":{"text":"DialogPresentationSegment.DialogPresentationSegment.ctor (cyclomatic 20): DialogPresentationSegment.DialogPresentationSegment.ctor has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TextST.cs"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"2409d0b9889729cf258dab4ea852e69061dff298871fa52bab3f769e162adf66"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedText10.GetIfTopAligned (cyclomatic 20): TimedText10.GetIfTopAligned has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1572}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad346e0c2b64c96d2e6e8000d5e090586fdb1af6882d285c35be09aaa64d1590"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedText10.GetIfBottomAligned (cyclomatic 20): TimedText10.GetIfBottomAligned has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1637}}}],"partialFingerprints":{"codehealthFindingId/v1":"19d80e434a1f51cfc473b376d02c2ba22174181a9cb72be8a77b1527b61188f7"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedText200604Ooyala.LoadSubtitle (cyclomatic 20): TimedText200604Ooyala.LoadSubtitle has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText200604Ooyala.cs"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c0c4f6c196222a5d7b3a10099437a088e5bfb7bcd981ef742c1d95bfb7b6d89"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedTextImscRosetta.GetAlignmentTagFromRegionAndStyle (cyclomatic 20): TimedTextImscRosetta.GetAlignmentTagFromRegionAndStyle has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImscRosetta.cs"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"07929fb545e4dee80522e514d0d197a5436187e6f11535172535cb449bf302b5"}},{"ruleId":"D1","level":"warning","message":{"text":"Ultech130.LoadSubtitle (cyclomatic 20): Ultech130.LoadSubtitle has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ultech130.cs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"4345c5f6ace98bdb9606783dd6c245450ed06050ff0effdf1388002f314fdc19"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrFixReplaceList2.ReplaceWord (cyclomatic 20): OcrFixReplaceList2.ReplaceWord has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":1139}}}],"partialFingerprints":{"codehealthFindingId/v1":"c22ab5e30429edd699b1b3e37b5510a9580bc9e4447e42f0c9b2a801bb07c366"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownWordGuesser.CreateGuessesFromLetters (cyclomatic 20): UnknownWordGuesser.CreateGuessesFromLetters has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/UnknownWordGuesser.cs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"480d01f5bf19d0eb94bb34c2b5a1a688ffbe79f46428b000ed82b04f890eb6b7"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrChar.IsMatchPointBackGround (cyclomatic 20): NOcrChar.IsMatchPointBackGround has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrChar.cs"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef32d32e05e39ebf9647c3ad778ef3dd0cca82ce5d0550d221d83ebb80b0586b"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioVisualizer.BuildWaveFormFancy (cyclomatic 19): AudioVisualizer.BuildWaveFormFancy has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":2392}}}],"partialFingerprints":{"codehealthFindingId/v1":"af8c29be8fffd13f9bac0567b7bae9c60a94695970749df63805caf8774bb11e"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioVisualizer.LoadParagraphs (cyclomatic 19): AudioVisualizer.LoadParagraphs has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":3268}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3bcc885c7f5b644a248f545ba0b1cc9ec3745f6a4a0a572739c3324904b251b"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedEffectFancyKaraoke.TryAutoSequenceByWords (cyclomatic 19): AdvancedEffectFancyKaraoke.TryAutoSequenceByWords has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFancyKaraoke.cs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"175344e6f1e68e00dee0a48512ef6a5122de9a88e841c24a8b7ea9ad6f11ae18"}},{"ruleId":"D1","level":"warning","message":{"text":"AssaDrawViewModel.CloseShape (cyclomatic 19): AssaDrawViewModel.CloseShape has cyclomatic complexity 19 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawViewModel.cs"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"158271b4dbb852ff114a766d1e5ff8e686defde2a663c1eac9142225a853d9d5"}},{"ruleId":"D1","level":"warning","message":{"text":"CsvImporter.Import (cyclomatic 19): CsvImporter.Import has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/MultipleReplace/CsvImporter.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"edf83fdac598c6d8667bb618c50166db5bef2cc8945be8bdb5e147859d03def7"}},{"ruleId":"D1","level":"warning","message":{"text":"MultipleReplaceViewModel.OnKeyDown (cyclomatic 19): MultipleReplaceViewModel.OnKeyDown has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/MultipleReplace/MultipleReplaceViewModel.cs"},"region":{"startLine":919}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e771f986c99300d518a616c673805572d1cecb7e72c7362cebd765bdde18af2"}},{"ruleId":"D1","level":"warning","message":{"text":"DCinemaSmptePropertiesViewModel.LoadSettings (cyclomatic 19): DCinemaSmptePropertiesViewModel.LoadSettings has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cbbc7aa3fd99769d9f11295e6d89c05f02b7c80cbfd8676c2ef80aec35675c0"}},{"ruleId":"D1","level":"warning","message":{"text":"ScriptSyncService.SyncScript (cyclomatic 19): ScriptSyncService.SyncScript has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportPlainText/ScriptSyncService.cs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e741cdf15f6dc945f2fbc17840f4d6142defea5399eac2969699cb22e06ee93"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.ExtractWaveformAndSpectrogramAndShotChanges (cyclomatic 19): MainViewModel.ExtractWaveformAndSpectrogramAndShotChanges has cyclomatic complexity 19 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":19478}}}],"partialFingerprints":{"codehealthFindingId/v1":"7097d508c48332529b81c15f500a8bc9bfe41e40a062d78f81b72d245257980f"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.SubtitleContextOpening (cyclomatic 19): MainViewModel.SubtitleContextOpening has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":20499}}}],"partialFingerprints":{"codehealthFindingId/v1":"203429585e1c34f1759242f7b5cb7f920bf884fbca515d1570a0fbce41624047"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.SubtitleGrid_PointerPressed (cyclomatic 19): MainViewModel.SubtitleGrid_PointerPressed has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":22077}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ea61d64bb1d0741d12ef91047cd8bb38dcf6440054b9fe914c2aca3856e9b5c"}},{"ruleId":"D1","level":"warning","message":{"text":"SpellCheckViewModel.LoadImageSource (cyclomatic 19): SpellCheckViewModel.LoadImageSource has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/SpellCheckViewModel.cs"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9a09c12fde8a5d8dbcf8b8113a7008afc520e59fc638ee0f2f633a5f1bb972d"}},{"ruleId":"D1","level":"warning","message":{"text":"SsaPropertiesViewModel.LoadFromHeader (cyclomatic 19): SsaPropertiesViewModel.LoadFromHeader has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ssa/SsaPropertiesViewModel.cs"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"b352d73a187e3606c7ca84edbb1f4e24015f0c55befb916b7cb43b6372c36988"}},{"ruleId":"D1","level":"warning","message":{"text":"AiReviewProtocol.ParseChanges (cyclomatic 19): AiReviewProtocol.ParseChanges has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/AiReview/AiReviewProtocol.cs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a4e85e5a3070be11c273a9d48fd803c4923fee3370d85c09f92b04e3ba25a75"}},{"ruleId":"D1","level":"warning","message":{"text":"AutoTranslateViewModel.UpdateTargetLanguages (cyclomatic 19): AutoTranslateViewModel.UpdateTargetLanguages has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"71e8ba9af4796df38d18d9a21ba95aed7deddb850b83c66990149470305ec7d8"}},{"ruleId":"D1","level":"warning","message":{"text":"DownloadLlamaCppViewModel.StartDownload (cyclomatic 19): DownloadLlamaCppViewModel.StartDownload has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/DownloadLlamaCppViewModel.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8bceed6df14b7a75b0968d9166211c767416e19eb2d458384e8ab7b8ea200a7"}},{"ruleId":"D1","level":"warning","message":{"text":"CosyVoice3CrispAsr.EnsureServerRunningAsync (cyclomatic 19): CosyVoice3CrispAsr.EnsureServerRunningAsync has cyclomatic complexity 19 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs"},"region":{"startLine":619}}}],"partialFingerprints":{"codehealthFindingId/v1":"3caa8e3a45a54b68c68e1fd36f84aceb8fde7f7f19a522cfc8f990db4d31cbc5"}},{"ruleId":"D1","level":"warning","message":{"text":"OmniVoiceTtsCpp.Speak (cyclomatic 19): OmniVoiceTtsCpp.Speak has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceTtsCpp.cs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"77dc668182faa75203dab767a5e666c7b42934f1858e467de7772d2de3867822"}},{"ruleId":"D1","level":"warning","message":{"text":"Qwen3TtsCpp.EnsureServerRunningAsync (cyclomatic 19): Qwen3TtsCpp.EnsureServerRunningAsync has cyclomatic complexity 19 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCpp.cs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"f05e635241d76b9db88cce3b93814058cc4e4bdbf1233ee713a43f899fc140be"}},{"ruleId":"D1","level":"warning","message":{"text":"ReviewSpeechViewModel.TrimAndAdjustSpeed (cyclomatic 19): ReviewSpeechViewModel.TrimAndAdjustSpeed has cyclomatic complexity 19 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":1088}}}],"partialFingerprints":{"codehealthFindingId/v1":"7903f8c61154be7d4125378f5c957982e12a7b6fc06d85fd6322af5162bf8b69"}},{"ruleId":"D1","level":"warning","message":{"text":"SeNamesList.LoadNamesList (cyclomatic 19): SeNamesList.LoadNamesList has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Dictionaries/SeNamesList.cs"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6afcc40a1fdff1fa4c8ce36131df6717add6be3e518b64f6dddf05b24eff155"}},{"ruleId":"D1","level":"warning","message":{"text":"FfmpegGenerator.AlterEmbeddedTracksMp4 (cyclomatic 19): FfmpegGenerator.AlterEmbeddedTracksMp4 has cyclomatic complexity 19 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 7 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/FfmpegGenerator.cs"},"region":{"startLine":1460}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba5e46616c46a71442d73889a65914eb4529ccf44085908c90745fa9e90523b3"}},{"ruleId":"D1","level":"warning","message":{"text":"LensCore.ParseLensProtoResponse (cyclomatic 19): LensCore.ParseLensProtoResponse has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Ocr/GoogleLens/LensCore.cs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a9008463bce7e1664b6c48005a23621a6710e28adaa54ba6e97f92abf3f64b4"}},{"ruleId":"D1","level":"warning","message":{"text":"HtmlUtil.StartsWithUppercaseTag (cyclomatic 19): HtmlUtil.StartsWithUppercaseTag has cyclomatic complexity 19 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/HtmlUtil.cs"},"region":{"startLine":764}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b09adf0ea7532ab46b93b2a30c5a2cdb5011d58371ffadedd34fbae547b06fb"}},{"ruleId":"D1","level":"warning","message":{"text":"StringExtensions.HasSentenceEnding (cyclomatic 19): StringExtensions.HasSentenceEnding has cyclomatic complexity 19 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StringExtensions.cs"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"b67dd66220aec82d3d914251ac1aa7533fefbc0216ecc87adbbd6a1c67374c15"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownFormatImporterJson.AutoGuessImport (cyclomatic 19): UnknownFormatImporterJson.AutoGuessImport has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterJson.cs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d67f0f331f963aeaaf1d4b82960f08b1eeb276f0fb152eb6d6332751b4874e1"}},{"ruleId":"D1","level":"warning","message":{"text":"WebVttHelper.GetCssProperties (cyclomatic 19): WebVttHelper.GetCssProperties has cyclomatic complexity 19 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/WebVttHelper.cs"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dc9c6576c68f6ec9de795925d13d3f4898a5738640dbe8ff4919eba34ddb6a4"}},{"ruleId":"D1","level":"warning","message":{"text":"CmafParser.ParseCmaf (cyclomatic 19): CmafParser.ParseCmaf has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/CmafParser.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e5d17d7b0bb6fa235c824031c998a8f7c1d516ea9d2a6921990496ab90f374f"}},{"ruleId":"D1","level":"warning","message":{"text":"NameList.LoadNamesList (cyclomatic 19): NameList.LoadNamesList has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Dictionaries/NameList.cs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"57caf0d0005f6e08de8c4288c19f66ba369507870df1f9001192a7cf099189f8"}},{"ruleId":"D1","level":"warning","message":{"text":"AdobeEncoreLineTabNewLine.LoadSubtitle (cyclomatic 19): AdobeEncoreLineTabNewLine.LoadSubtitle has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdobeEncoreLineTabNewLine.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"a33cd7bbccdf482e953957464a13b3c2660d05a2076b46fb605c0595d001ea0f"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedSubStationAlpha.CheckAndAddSubTags (cyclomatic 19): AdvancedSubStationAlpha.CheckAndAddSubTags has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":1465}}}],"partialFingerprints":{"codehealthFindingId/v1":"4332666106e823cba23fc30b91503997bde721b7465561e4f27e925a31b88daa"}},{"ruleId":"D1","level":"warning","message":{"text":"AribB24Decoder.HandleEsc (cyclomatic 19): AribB24Decoder.HandleEsc has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AribB24Decoder.cs"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"297645944102794fc12943950455e96823991ff6f7b1e0433afb27996f3c9b23"}},{"ruleId":"D1","level":"warning","message":{"text":"HtmlSamiArray.LoadSubtitle (cyclomatic 19): HtmlSamiArray.LoadSubtitle has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/HtmlSamiArray.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a6601beee4c5e84b909cee87f91fae0052fab7c1873405e861feb9bf42139b9"}},{"ruleId":"D1","level":"warning","message":{"text":"QuickTimeText.LoadSubtitle (cyclomatic 19): QuickTimeText.LoadSubtitle has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/QuickTimeText.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"51e977b16a28a403501ffc45c23dae6dc8b1ca426f529d1b01622e93788a66bf"}},{"ruleId":"D1","level":"warning","message":{"text":"Ted20.LoadSubtitle (cyclomatic 19): Ted20.LoadSubtitle has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ted20.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cf11a9dfdbe1bc98bede1012a3694984e0cb7dcf878e16b1a0862da5dfdb8fd"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle11.ToText (cyclomatic 19): UnknownSubtitle11.ToText has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle11.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4d326c130fe5c4c53e060dd32fd4f64d241a90cdce4b420ae1cf7ec16a7bc4b"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle9.LoadSubtitle (cyclomatic 19): UnknownSubtitle9.LoadSubtitle has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle9.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f1c45c5bfa4e9ff6b83491ce55ea08b69d205c24193f5e2245885d3bca242eb"}},{"ruleId":"D1","level":"warning","message":{"text":"VobSubParser.OpenSubIdx (cyclomatic 19): VobSubParser.OpenSubIdx has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/VobSubParser.cs"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"14309820edf0ceaa89b68aac196cd2983e3db77e7581d7dfa6724b5b41892f6d"}},{"ruleId":"D1","level":"warning","message":{"text":"CsvRules.Parse (cyclomatic 19): CsvRules.Parse has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/MultipleReplaceLoader.cs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"d79850a3e79bec47363f787a85276083d5943a10e52fd1dc6b281d7cf5d5e2b3"}},{"ruleId":"D1","level":"warning","message":{"text":"OffsetParser.Parse (cyclomatic 19): OffsetParser.Parse has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/OffsetParser.cs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"de9e77e9f815e5b151ecc94fd135a45242f52b19bf8e1f94fa38976cd2ea8ab0"}},{"ruleId":"D1","level":"warning","message":{"text":"SubtitleConverter.ConvertVobBatchAsync (cyclomatic 19): SubtitleConverter.ConvertVobBatchAsync has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SubtitleConverter.cs"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca194f5af7c8eb6cf209a6457e67b3a2a366ab08d27bb5b15810b9b7bb1836eb"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageRenderer.CalculatePosition (cyclomatic 19): ImageRenderer.CalculatePosition has cyclomatic complexity 19 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ImageRenderer.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5a2a2fbc21377ce61fd7c77117c157565da5a9aa7a33736944620d41157eb40"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryOcrBitmap.IsDash (cyclomatic 19): BinaryOcrBitmap.IsDash has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":573}}}],"partialFingerprints":{"codehealthFindingId/v1":"84616eee6a04ad0655942f5df05e13104187a8b9ae5a61521d94561c2d9739ea"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrDb.GetMatchExpanded (cyclomatic 19): NOcrDb.GetMatchExpanded has cyclomatic complexity 19 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrDb.cs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6c381d5931168d63031644a978b3ecf840cfd967e7172258a157c7eb381a03e"}},{"ruleId":"D1","level":"warning","message":{"text":"ItunesTimedTextPropertiesViewModel.Initialize (cyclomatic 18): ItunesTimedTextPropertiesViewModel.Initialize has cyclomatic complexity 18 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesViewModel.cs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3f32f54cc8902e0ddd02253b1ea0d5c0d3736dbb2d723fbe6d8b4e75b095551"}},{"ruleId":"D1","level":"warning","message":{"text":"InitWaveform.MakeWaveform (cyclomatic 18): InitWaveform.MakeWaveform has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 5 of the 18 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 638, 672, 506, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitWaveform.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"af8cde1b44d2bbb5e8aa8e3792f3c0a97825e4deebfca13b817d27c401555d74"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.SpeechToTextSelectedLines (cyclomatic 18): MainViewModel.SpeechToTextSelectedLines has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":6657}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9a3f19b3ada853660cc15c69fa672f5ac5a27370dd94dadbfcbb3a2b5c17c41"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.SaveSubtitle (cyclomatic 18): MainViewModel.SaveSubtitle has cyclomatic complexity 18 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":18015}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc1f118060c021d4710d7bec04945501344f5e76e11762ac7756abc4450bda11"}},{"ruleId":"D1","level":"warning","message":{"text":"PickMatroskaTrackViewModel.Export (cyclomatic 18): PickMatroskaTrackViewModel.Export has cyclomatic complexity 18 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/PickMatroskaTrack/PickMatroskaTrackViewModel.cs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa438ad8bf2d37ecc9b8664ac89f5623591e8eb5330ee38d1c1b7812b901c33a"}},{"ruleId":"D1","level":"warning","message":{"text":"MergeSameTimeCodesViewModel.UpdatePreview (cyclomatic 18): MergeSameTimeCodesViewModel.UpdatePreview has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/MergeSubtitlesWithSameTimeCodes/MergeSameTimeCodesViewModel.cs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"088a19658dc1866f433ee865500598bedb71466e150c3cfd5f119280743a255f"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextPostProcessor.MergeShortLines (cyclomatic 18): SpeechToTextPostProcessor.MergeShortLines has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextPostProcessor.cs"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"93927d4d89fbcda3c34c20ab54265eeef6d9eee4fde73e365853d40333a9bd9d"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextViewModel.TranscribeViaWhisper (cyclomatic 18): SpeechToTextViewModel.TranscribeViaWhisper has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":3527}}}],"partialFingerprints":{"codehealthFindingId/v1":"56e957218be9bc292655ea47ec21877041c831a786da905c749735828b3a97f3"}},{"ruleId":"D1","level":"warning","message":{"text":"ChatterboxTtsCpp.EnsureServerRunningAsync (cyclomatic 18): ChatterboxTtsCpp.EnsureServerRunningAsync has cyclomatic complexity 18 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dd01c7124dcc49d6399fbacff23cdbc44d0f7c8b6c99087940a9b8b2ed8ddd3"}},{"ruleId":"D1","level":"warning","message":{"text":"VibeVoiceCrispAsr.EnsureServerRunningAsync (cyclomatic 18): VibeVoiceCrispAsr.EnsureServerRunningAsync has cyclomatic complexity 18 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"452378416c70c52416c1eea2d5dc3ede170bda4b0fa0af83d3bcce34e76db264"}},{"ruleId":"D1","level":"warning","message":{"text":"ReviewSpeechViewModel.OnTimerOnElapsed (cyclomatic 18): ReviewSpeechViewModel.OnTimerOnElapsed has cyclomatic complexity 18 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 5 belong to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2b5d67a997d42938eff87aa837e4420d5881f7ca86f7a8fc1bd9f778b87af87"}},{"ruleId":"D1","level":"warning","message":{"text":"AssaFontEmbedder.AddFontToFooter (cyclomatic 18): AssaFontEmbedder.AddFontToFooter has cyclomatic complexity 18 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/AssaFontEmbedder.cs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"3451934d1ed7c10a90109c0e1bcd699cad0a12ed193e4c80fe25d1bbabdfe517"}},{"ruleId":"D1","level":"warning","message":{"text":"FfmpegMediaInfo2.ParseLog (cyclomatic 18): FfmpegMediaInfo2.ParseLog has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/FfmpegMediainfo2.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fb2e9ea467690df38eef0c38ba7c8d42cb0f38c3d82a51b3af483abf5ad2aba"}},{"ruleId":"D1","level":"warning","message":{"text":"WavePeakGenerator2.GeneratePeaks (cyclomatic 18): WavePeakGenerator2.GeneratePeaks has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/WaveToVisualizer2.cs"},"region":{"startLine":558}}}],"partialFingerprints":{"codehealthFindingId/v1":"613996dad08b5cb157e026d565d857d046dfbac783d48071ea871cd567aa64fe"}},{"ruleId":"D1","level":"warning","message":{"text":"Unpacker.Unpack7ZipVia77zExecutable (cyclomatic 18): Unpacker.Unpack7ZipVia77zExecutable has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/SevenZipExtractor/Unpacker.cs"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"032da86156369f97263b262a159e2363e5b6634c6bff7993b6fdbcb50cffd07a"}},{"ruleId":"D1","level":"warning","message":{"text":"UiUtil.MakeColorPickerButton (cyclomatic 18): UiUtil.MakeColorPickerButton has cyclomatic complexity 18 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 8 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/UiUtil.cs"},"region":{"startLine":2177}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bd0ecdaf88440492355714ef3e0a1b26555479e1ee9b7e85646fcc70ad1bedd"}},{"ruleId":"D1","level":"warning","message":{"text":"JsonParser.String (cyclomatic 18): JsonParser.String has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TinyJsonParser.cs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd158de43a5e59a5187506919c57e7b8ad4fc3033046b4cfd14a5a414579ad0e"}},{"ruleId":"D1","level":"warning","message":{"text":"Utilities.RemoveSsaTags (cyclomatic 18): Utilities.RemoveSsaTags has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":886}}}],"partialFingerprints":{"codehealthFindingId/v1":"6660806f113cd35a3bf384a4824f951119a6a9a9dcb2fe63bffc54e987b791e2"}},{"ruleId":"D1","level":"warning","message":{"text":"Utilities.GetOriginalParagraph (cyclomatic 18): Utilities.GetOriginalParagraph has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":1544}}}],"partialFingerprints":{"codehealthFindingId/v1":"579df3f8fb004e1315f80de21539494325eda1ab522aff8e4ee48ae141075340"}},{"ruleId":"D1","level":"warning","message":{"text":"Trun.Trun.ctor (cyclomatic 18): Trun.Trun.ctor has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Boxes/Trun.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6d26532454aaace86ab5f8198e5ebd4a15a3ab78030d66a5d901ebf225c3557"}},{"ruleId":"D1","level":"warning","message":{"text":"MP4Parser.ReadWvttSample (cyclomatic 18): MP4Parser.ReadWvttSample has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":1035}}}],"partialFingerprints":{"codehealthFindingId/v1":"761654fbeeb8ad593d123b2bc16f7fe340de6a4e7af185838bc86c7b45b17915"}},{"ruleId":"D1","level":"warning","message":{"text":"ObjectDataSegment.FindPosition (cyclomatic 18): ObjectDataSegment.FindPosition has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/ObjectDataSegment.cs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c793410504a34307a6031ffafd93b7a45dce0dd34d44a189eecfd88572eda81"}},{"ruleId":"D1","level":"warning","message":{"text":"Cavena890.FixColors (cyclomatic 18): Cavena890.FixColors has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":2056}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0138060c8740f0a6bdea7bf760c6d672a668c417df3608dae0514a07f8ee02d"}},{"ruleId":"D1","level":"warning","message":{"text":"Ebu.IsMine (cyclomatic 18): Ebu.IsMine has cyclomatic complexity 18 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":1649}}}],"partialFingerprints":{"codehealthFindingId/v1":"4395258dd39aaf1466a6e866de5ee1a84b644f25a222359128257efe421e81e2"}},{"ruleId":"D1","level":"warning","message":{"text":"EbuTtD.SplitToStyledSegments (cyclomatic 18): EbuTtD.SplitToStyledSegments has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/EbuTtD.cs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9acc21e3e1e08dd67e8e1c3277efad29d38b11e47ca3883dfabb099e3e96665"}},{"ruleId":"D1","level":"warning","message":{"text":"JsonType14.LoadSubtitle (cyclomatic 18): JsonType14.LoadSubtitle has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType14.cs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"02f02363970b90e3258ac93282c65026536b1286afc7d9d7ecedd5ceaa51666e"}},{"ruleId":"D1","level":"warning","message":{"text":"Pac.FixItalics (cyclomatic 18): Pac.FixItalics has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":2017}}}],"partialFingerprints":{"codehealthFindingId/v1":"9444da50b872df3640ee9a0ba9b03464b5808c2e3863c0a4bb95ae675ad2b8f8"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle33.LoadSubtitle (cyclomatic 18): UnknownSubtitle33.LoadSubtitle has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle33.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"678dac47e74418790ce75e479f5d43cd860a85f7ea596200439411380e717a4c"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle61.LoadSubtitle (cyclomatic 18): UnknownSubtitle61.LoadSubtitle has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle61.cs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"5394ce2d334b5a07703aeee6dfb9323b0d123d91a0a72334af2c7da1b502316a"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle89.LoadSubtitle (cyclomatic 18): UnknownSubtitle89.LoadSubtitle has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle89.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"57a23740e75604c236cb8b74459295e5122be15100387f00c9a5238ca01195cb"}},{"ruleId":"D1","level":"warning","message":{"text":"WebVttThumbnail.GetBitmap (cyclomatic 18): WebVttThumbnail.GetBitmap has cyclomatic complexity 18 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVttThumbnail.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cb4a5216d1c55549c21b642e1d05d1e7548282c61ce9518a25c714eada23916"}},{"ruleId":"D1","level":"warning","message":{"text":"VobSubWriter.WriteDisplayArea (cyclomatic 18): VobSubWriter.WriteDisplayArea has cyclomatic complexity 18 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/VobSubWriter.cs"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"28d3facdc41e23aac0c2756c2c170f35009013c0c3ea54215bf682f93f1bd9ab"}},{"ruleId":"D1","level":"warning","message":{"text":"WhisperHelper.GetWhisperPathAndFileName (cyclomatic 18): WhisperHelper.GetWhisperPathAndFileName has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/AudioToText/WhisperHelper.cs"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"54b1a5b83e346940e52f56afac2d548fe7754176d0f139caaf16bc394683319d"}},{"ruleId":"D1","level":"warning","message":{"text":"GoogleTranslateV2.Translate (cyclomatic 18): GoogleTranslateV2.Translate has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/AutoTranslate/GoogleTranslateV2.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8cb5ae7ff65584fe5f9dc8ff529ae646eb31ceaae68a2c36451e288bb63fb3c"}},{"ruleId":"D1","level":"warning","message":{"text":"ExportHandlerDost.WriteParagraph (cyclomatic 18): ExportHandlerDost.WriteParagraph has cyclomatic complexity 18 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerDost.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"63d93220f0f5ba7c9049e312e898c44ba23ef387504eb0a8b372167779c001e1"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryOcrBitmap.IsExclamationMark (cyclomatic 18): BinaryOcrBitmap.IsExclamationMark has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":630}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc1d7a0179ebe4c88e800fb929b40d6d0ecdb003c46529eda99dd868c103a132"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrLineGenerator.LongestRunAlongLine (cyclomatic 18): NOcrLineGenerator.LongestRunAlongLine has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":1345}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea507120b00fa60374b5bcd9aadb01dd1c365d5105a69089b820e0ae164a11fc"}},{"ruleId":"D1","level":"warning","message":{"text":"SpellChecker.IsWordCorrect (cyclomatic 18): SpellChecker.IsWordCorrect has cyclomatic complexity 18 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/SpellCheck/SpellChecker.cs"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"59050e2714276df5c16e5d380450b9c41211d7f05b292b99b9bfb63c6362aecd"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioVisualizer.OnKeyDown (cyclomatic 17): AudioVisualizer.OnKeyDown has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"a64c64e6ce3c8e683c672e5adec50973a53ebd2b2205a27a77b934b8837c0093"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedEffectConfetti.ApplyEffect (cyclomatic 17): AdvancedEffectConfetti.ApplyEffect has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectConfetti.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"b737b1e7995522ba5c33c484ee5e0a49364d1ec33466a68a0e9fc7e6cc3d0042"}},{"ruleId":"D1","level":"warning","message":{"text":"AssaDrawCanvas.DrawShape (cyclomatic 17): AssaDrawCanvas.DrawShape has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawCanvas.cs"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"82f64fd745fd4ccd6c8ae16cb9ac88f0e87a62bf049a38a1668e669589e24603"}},{"ruleId":"D1","level":"warning","message":{"text":"StatisticsViewModel.CalculateGeneralStatistics (cyclomatic 17): StatisticsViewModel.CalculateGeneralStatistics has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/Statistics/StatisticsViewModel.cs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"060a56251d2e9e7adadbc251cccbb60d44aaa45d857f8c035fe113fa45374e0b"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.ImportSubtitleFromMp4 (cyclomatic 17): MainViewModel.ImportSubtitleFromMp4 has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":17134}}}],"partialFingerprints":{"codehealthFindingId/v1":"3559c0356f33b4022a63eedbebf9ce6e42ece6c66464e6bb6b948bbe94389d07"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.ImportSubtitleFromMatroskaFile (cyclomatic 17): MainViewModel.ImportSubtitleFromMatroskaFile has cyclomatic complexity 17 (threshold 15). Of this number, 9 points are the body\u0027s own statements and 8 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":17294}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8cce82ec9edaa07aa4cdd19dad9f39bb9528a609e281bc493846bd6045469b4"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrViewModel.GetTextWithMoreSpacesInItalic (cyclomatic 17): OcrViewModel.GetTextWithMoreSpacesInItalic has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3254}}}],"partialFingerprints":{"codehealthFindingId/v1":"9726b130ed2a10e9789a3cad8d4757517e042b78fef4e41747a85a9c160e4a05"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrViewModel.OnKeyDown (cyclomatic 17): OcrViewModel.OnKeyDown has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":4496}}}],"partialFingerprints":{"codehealthFindingId/v1":"a37fb22441f7774117d2ae45a54aebfb6935a640dae45ef5514ae21d56419013"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsViewModel.SaveSettings (cyclomatic 17): SettingsViewModel.SaveSettings has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsViewModel.cs"},"region":{"startLine":1539}}}],"partialFingerprints":{"codehealthFindingId/v1":"a12f31f0b54e6c403f787d9eee8270a1f05d357931f2681b5023e46f27436b9a"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryEditViewModel.ChangeSpeed (cyclomatic 17): BinaryEditViewModel.ChangeSpeed has cyclomatic complexity 17 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":1892}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc91e622de83519688f45489495152bbd9e720aec71c8eff5a53b193001bec87"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchConverter.WriteToImageBasedFormat (cyclomatic 17): BatchConverter.WriteToImageBasedFormat has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":1414}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e2594c2b01463af8e148f041ad0f4471f2db4f7abcd8ba75b9530354de4dcce"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchConverter.AssaChangeResolution (cyclomatic 17): BatchConverter.AssaChangeResolution has cyclomatic complexity 17 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":2191}}}],"partialFingerprints":{"codehealthFindingId/v1":"f266ec0d5f2c9ac8026e8ba09fa1be7e3f1fa269ec85e76a03464840f3f20baf"}},{"ruleId":"D1","level":"warning","message":{"text":"ConvertActorsViewModel.UpdatePreview (cyclomatic 17): ConvertActorsViewModel.UpdatePreview has cyclomatic complexity 17 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/ConvertActors/ConvertActorsViewModel.cs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"048cccb15e89418c5ddd7369a965af396fde91802cd4e8614be8da84b41a00e9"}},{"ruleId":"D1","level":"warning","message":{"text":"TranslateSettingsViewModel.SaveValues (cyclomatic 17): TranslateSettingsViewModel.SaveValues has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/TranslateSettingsViewModel.cs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"93b719d282a0c0459401b0ca5ecd1e203cf1dd5c69001d831fe6035389bea96c"}},{"ruleId":"D1","level":"warning","message":{"text":"BurnInViewModel.Generate (cyclomatic 17): BurnInViewModel.Generate has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1229}}}],"partialFingerprints":{"codehealthFindingId/v1":"507b2abc54caa6fe8585ef8d2b7c269230c7d3aa7c9f1cd59c12dc1fdf2117bb"}},{"ruleId":"D1","level":"warning","message":{"text":"BurnInViewModel.FillCrf (cyclomatic 17): BurnInViewModel.FillCrf has cyclomatic complexity 17 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1757}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab4660b225bec3f296f3bdf45f8e080ffd09a81ccc3b610e6543171495131831"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextViewModel.MakeWavePeaks (cyclomatic 17): SpeechToTextViewModel.MakeWavePeaks has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":2007}}}],"partialFingerprints":{"codehealthFindingId/v1":"86544086edd410f30dfe6b0234ee26838123c8729962bb40e206c8ad35f38876"}},{"ruleId":"D1","level":"warning","message":{"text":"CosyVoice3CrispAsr.Speak (cyclomatic 17): CosyVoice3CrispAsr.Speak has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b8ac472aec8606942359bfb71c4cbe0ec910161575b0cda98b63dd48c0e95b3"}},{"ruleId":"D1","level":"warning","message":{"text":"TextToSpeechViewModel.GenerateTts (cyclomatic 17): TextToSpeechViewModel.GenerateTts has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":1175}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa1b0f127e7921a9ca3c1abbd6e5876c47442eb98652eea5e82d60b1e8063e61"}},{"ruleId":"D1","level":"warning","message":{"text":"InsertService.SetStyleForNewParagraph (cyclomatic 17): InsertService.SetStyleForNewParagraph has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/InsertService.cs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ac0cb5ca9fad0dddd70dadbd1d6f8601d4add9da4e8afb37d52513eb2c85e19"}},{"ruleId":"D1","level":"warning","message":{"text":"Mp3DurationReader.TryParseFrame (cyclomatic 17): Mp3DurationReader.TryParseFrame has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/Mp3DurationReader.cs"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a92cf93f66737ff0bbcbc6a1037859e0fff8fb563127f0acbfb9b674eabcb75"}},{"ruleId":"D1","level":"warning","message":{"text":"FileSizeConverter.Convert (cyclomatic 17): FileSizeConverter.Convert has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/FileSizeConverter.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea9ee429920d1ef8e73a802330f95f1d0d7e8157eb960e772cb461f579e5a4e6"}},{"ruleId":"D1","level":"warning","message":{"text":"NativeMethods.NativeMethods.ctor (cyclomatic 17): NativeMethods.NativeMethods.ctor has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibMpvDynamic/NativeMethods.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"26479a2c18f3dd4db082aeafe2b069591012791ec5fb08acddda238d0debf653"}},{"ruleId":"D1","level":"warning","message":{"text":"CsvUtil.CsvSplit (cyclomatic 17): CsvUtil.CsvSplit has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/CsvUtil.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"63a8dd683a2001bb6836a9d7f67a2b616fac1f753d960ef5861799124c2b8205"}},{"ruleId":"D1","level":"warning","message":{"text":"FileUtil.IsPlainText (cyclomatic 17): FileUtil.IsPlainText has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/FileUtil.cs"},"region":{"startLine":704}}}],"partialFingerprints":{"codehealthFindingId/v1":"da73eab6eaff938a634ca06fd60a6175f98cae8e7ff947600101cec5688e9cb8"}},{"ruleId":"D1","level":"warning","message":{"text":"FileUtil.FindPythonModuleExecutableFileName (cyclomatic 17): FileUtil.FindPythonModuleExecutableFileName has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/FileUtil.cs"},"region":{"startLine":1048}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e99710089744830dd20a13ee8ae6536fddd36849e3c25fce9c870c4dc94b06a"}},{"ruleId":"D1","level":"warning","message":{"text":"Utilities.StartsAndEndsWithTag (cyclomatic 17): Utilities.StartsAndEndsWithTag has cyclomatic complexity 17 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":1501}}}],"partialFingerprints":{"codehealthFindingId/v1":"76987cb4ce61f71059c50a2fe3f79c8d735800e52108d3f62e3431390eedb34a"}},{"ruleId":"D1","level":"warning","message":{"text":"FixUnneededPeriods.Fix (cyclomatic 17): FixUnneededPeriods.Fix has cyclomatic complexity 17 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixUnneededPeriods.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0154b21bf213602d86e18630278daa3407a773bf53ce21307b0c6a97d1060c0"}},{"ruleId":"D1","level":"warning","message":{"text":"Helper.FixHyphensRemoveForSingleLine (cyclomatic 17): Helper.FixHyphensRemoveForSingleLine has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/Helper.cs"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d1b2e7163bcbf030e9c8a35f8b9ba3f548753c16f5c89471967b982ea1145e3"}},{"ruleId":"D1","level":"warning","message":{"text":"TimeCodesBeautifier.FindConnectedSubtitlesBestCueFrame (cyclomatic 17): TimeCodesBeautifier.FindConnectedSubtitlesBestCueFrame has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/TimeCodesBeautifier.cs"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"005eb9398e5419f331027f09c8f028ab794e23343e60fb734c98ed4a3097bb8e"}},{"ruleId":"D1","level":"warning","message":{"text":"CapMakerPlus.Save (cyclomatic 17): CapMakerPlus.Save has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CapMakerPlus.cs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"c754173cb3954ac88a154ab57ff3597a1817ee6f952e2998ca6036658cc2b1fa"}},{"ruleId":"D1","level":"warning","message":{"text":"DCinemaInterop.FixInvalidItalicTags (cyclomatic 17): DCinemaInterop.FixInvalidItalicTags has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaInterop.cs"},"region":{"startLine":1017}}}],"partialFingerprints":{"codehealthFindingId/v1":"75b3ebde5bade43aab4524bc820d473b96778b2126cbb85767afe53974257a9a"}},{"ruleId":"D1","level":"warning","message":{"text":"DvdStudioPro.EncodeStyles (cyclomatic 17): DvdStudioPro.EncodeStyles has cyclomatic complexity 17 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DvdStudioPro.cs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"b09d6cf765be9e0eb196f968759cef6e507a76225e7e77758b80456c9682a911"}},{"ruleId":"D1","level":"warning","message":{"text":"Json.DecodeJsonText (cyclomatic 17): Json.DecodeJsonText has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Json.cs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8029c90d17db3a36fc1494daea4d730b94b6f40fb7025218fef5a08668f15f5"}},{"ruleId":"D1","level":"warning","message":{"text":"JsonType13.LoadSubtitle (cyclomatic 17): JsonType13.LoadSubtitle has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType13.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6729221a5bb0dd6ba4825d06c3596c2eac5a0c80c8b06fd23afdcee35c8fc61"}},{"ruleId":"D1","level":"warning","message":{"text":"SatBoxPng.LoadSubtitle (cyclomatic 17): SatBoxPng.LoadSubtitle has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SatBoxPng.cs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d229dba1b3f0517618286dfcfd4cba3f57ae71df4164174fa41b9824287db66"}},{"ruleId":"D1","level":"warning","message":{"text":"Spruce.LoadSubtitle (cyclomatic 17): Spruce.LoadSubtitle has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Spruce.cs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"c71b161820294ddc7e8a7ed6077b522b8253476775815beeac0a6bde8c985361"}},{"ruleId":"D1","level":"warning","message":{"text":"TextST.LoadSubtitleFromM2Ts (cyclomatic 17): TextST.LoadSubtitleFromM2Ts has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TextST.cs"},"region":{"startLine":1087}}}],"partialFingerprints":{"codehealthFindingId/v1":"48caaa13201e9934ec9f4275d5ade7d33cda2b8741ad45ade64322b75cd5880e"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle11.LoadSubtitle (cyclomatic 17): UnknownSubtitle11.LoadSubtitle has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle11.cs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"0086060729dc6d3c72acd6225c1944a648cff90e90a7c8cadf25d20040565664"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle20.LoadSubtitle (cyclomatic 17): UnknownSubtitle20.LoadSubtitle has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle20.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"1368ad00bbf9a5a6692d50682bdcbfe0f2060a3abb9b115d0763973630ea43fe"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle44.LoadSubtitle (cyclomatic 17): UnknownSubtitle44.LoadSubtitle has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle44.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"b49121ffc3142931c36cc038969f4a9ab1ccb815a5bf3d71da4557551dbf927f"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle53.LoadSubtitle (cyclomatic 17): UnknownSubtitle53.LoadSubtitle has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle53.cs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"017a2e7cc402ca6ab58d5d0fba9a799aff6c1569ad1e7ec63de18f831bad9fca"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle54.LoadSubtitle (cyclomatic 17): UnknownSubtitle54.LoadSubtitle has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle54.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1bec5b0e3a5bf9d2f8d1c760e93048bc6062b9179441014d7e50ba18e8f4cf5"}},{"ruleId":"D1","level":"warning","message":{"text":"VobSubParser.IsStartOfMpeg2Pack (cyclomatic 17): VobSubParser.IsStartOfMpeg2Pack has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/VobSubParser.cs"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bd4b6365d1f6035e8474058569f7cb3f464d5d3cd3bf0f5c8bedded308dc08e"}},{"ruleId":"D1","level":"warning","message":{"text":"AutoTranslateRunner.Create (cyclomatic 17): AutoTranslateRunner.Create has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/AutoTranslateRunner.cs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ca3d4fec40a2d10e2ab78c4af9bc9987b4a85ba3a173b1bcd35b226b5dd1838"}},{"ruleId":"D1","level":"warning","message":{"text":"ContainerSubtitleLoader.LoadMatroska (cyclomatic 17): ContainerSubtitleLoader.LoadMatroska has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/ContainerSubtitleLoader.cs"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"2de319baf0fc6857d5ac72cf6d77920ff8b50efe5d67feebf25a3a3594dc244c"}},{"ruleId":"D1","level":"warning","message":{"text":"SubtitleConverter.PassThroughMatroskaPgsAsync (cyclomatic 17): SubtitleConverter.PassThroughMatroskaPgsAsync has cyclomatic complexity 17 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SubtitleConverter.cs"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"c235e72c49dd68864d14f7ee4b762ba564f5c37d4ad62ba84acef5222c33a7f0"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageRenderer.ParseTextWithStyling (cyclomatic 17): ImageRenderer.ParseTextWithStyling has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ImageRenderer.cs"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e7e39d32df4321f6f889406ad47bab9fdd70eecb79b65b11fdd09e204380b5c"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryOcrBitmap.IsPeriod (cyclomatic 17): BinaryOcrBitmap.IsPeriod has cyclomatic complexity 17 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"339e576813ea8a22c73874cf09e8aa0e5188d610a5fe3686b83e62f6bb9b571e"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryOcrBitmap.IsPeriodAtTop (cyclomatic 17): BinaryOcrBitmap.IsPeriodAtTop has cyclomatic complexity 17 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"b23bb0ca0259be3c5e7d180701a057c59e38ca72c018953e93af98f72effd8ab"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrFixReplaceList2.Fix0InsideLowerCaseWord (cyclomatic 17): OcrFixReplaceList2.Fix0InsideLowerCaseWord has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":836}}}],"partialFingerprints":{"codehealthFindingId/v1":"febedc2bd053d8dbb6fa2d56f8d08220421d7506c257384f34c04800b2e13771"}},{"ruleId":"D1","level":"warning","message":{"text":"NikseBitmapImageSplitter2.SplitHorizontalNew (cyclomatic 17): NikseBitmapImageSplitter2.SplitHorizontalNew has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":874}}}],"partialFingerprints":{"codehealthFindingId/v1":"39d51131dd989b4637d3289ca46c0cec1b10c7fa5503713f7cf89ba87c20d06b"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrCaseFixer.FixUppercaseLowercaseIssues (cyclomatic 17): NOcrCaseFixer.FixUppercaseLowercaseIssues has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrCaseFixer.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f8c409156aec5fcd13fb891d2024ae945e8438102cb0b853e8bdb11c7fe6e72"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrDb.IsExpandedLineMatch (cyclomatic 17): NOcrDb.IsExpandedLineMatch has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrDb.cs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e881f08e9412b04a0d627fd8b26ace9f504068c9512ab6ba78b9f52b199f43d"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedEffectGlitch.ApplyEffect (cyclomatic 16): AdvancedEffectGlitch.ApplyEffect has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectGlitch.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"371558d0f6e240dd7f54fdaeb3756985449293a84cd510b2370d181dc3832965"}},{"ruleId":"D1","level":"warning","message":{"text":"AssaDrawViewModel.GenerateSubtitle (cyclomatic 16): AssaDrawViewModel.GenerateSubtitle has cyclomatic complexity 16 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawViewModel.cs"},"region":{"startLine":668}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1fe461ed2875bb2d6948abc1e91b12fc017a79f191d149353df45c31d84bef0"}},{"ruleId":"D1","level":"warning","message":{"text":"MultipleReplaceWindow.MakeRulesView (cyclomatic 16): MultipleReplaceWindow.MakeRulesView has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 283, 170, 262, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/MultipleReplace/MultipleReplaceWindow.cs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"13a1cdb24438953671ffdbd2cc2d5337f6b17f65fec6c059111dbcc76660389a"}},{"ruleId":"D1","level":"warning","message":{"text":"ExportEbuStlViewModel.Ok (cyclomatic 16): ExportEbuStlViewModel.Ok has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportEbuStl/ExportEbuStlViewModel.cs"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f8c41cee9712f44e19043e13476d85d53b223b6cd541253ec5b06c82fd88992"}},{"ruleId":"D1","level":"warning","message":{"text":"PasteFromClipboardHelper.PasteFromClipboard (cyclomatic 16): PasteFromClipboardHelper.PasteFromClipboard has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainHelpers/PasteFromClipboardHelper.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f6e9cdb324f416fa9721cf46b95f10fcc2ec9d6dcd865b0477eef34014dc4c9"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.ShowAutoTranslate (cyclomatic 16): MainViewModel.ShowAutoTranslate has cyclomatic complexity 16 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":8590}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eee5a9d571029f2021aaaa4870058722c27cc8996f7f201c5c2294f7b646278"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.ImportSubtitleFromTransportStream (cyclomatic 16): MainViewModel.ImportSubtitleFromTransportStream has cyclomatic complexity 16 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":17026}}}],"partialFingerprints":{"codehealthFindingId/v1":"a42aeb77e0db5528ad874e77bc50d95cd57dadb4c273f54251cb82d0c359b532"}},{"ruleId":"D1","level":"warning","message":{"text":"MainViewModel.AudioVisualizerOnPrimarySingleClicked (cyclomatic 16): MainViewModel.AudioVisualizerOnPrimarySingleClicked has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":24573}}}],"partialFingerprints":{"codehealthFindingId/v1":"eecbdf67c742689299d64262455b0083d176866914538a38987655787b81542c"}},{"ruleId":"D1","level":"warning","message":{"text":"BinaryOcrCharacterAddViewModel.KeyDown (cyclomatic 16): BinaryOcrCharacterAddViewModel.KeyDown has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1b3655d005c9047852e9298068a42642f294b42c4de40cd0063f2cba53672dc"}},{"ruleId":"D1","level":"warning","message":{"text":"DownloadPaddleOcrViewModel.OnTimerOnElapsed (cyclomatic 16): DownloadPaddleOcrViewModel.OnTimerOnElapsed has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadPaddleOcrViewModel.cs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e60754a7ad523c1c2bba9ddd7844b3c3e37fc1d12fada6d208ea2c9f709aa5e"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrViewModel.RunTesseractOcr (cyclomatic 16): OcrViewModel.RunTesseractOcr has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to one function literal inside it that branches (line 3969). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3962}}}],"partialFingerprints":{"codehealthFindingId/v1":"b998dd80b23f81279b086cbe121623612ba9e3eeca7ed4b5a965a32277ab4cdc"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsImportExportViewModel.ExportSettings (cyclomatic 16): SettingsImportExportViewModel.ExportSettings has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsImportExport/SettingsImportExportViewModel.cs"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"04325611619fe02b44e391dedd47040ea6da24943453e395bee205e3dc36e128"}},{"ruleId":"D1","level":"warning","message":{"text":"ShortcutsViewModel.ShortcutsGrid_SelectionChanged (cyclomatic 16): ShortcutsViewModel.ShortcutsGrid_SelectionChanged has cyclomatic complexity 16 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Shortcuts/ShortcutsViewModel.cs"},"region":{"startLine":1251}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9e15e5c86b358a06f1afa93e681ad594f577f40a73b53309a3804148a803e2a"}},{"ruleId":"D1","level":"warning","message":{"text":"WordListsViewModel.InitComboBoxWordListLanguages (cyclomatic 16): WordListsViewModel.InitComboBoxWordListLanguages has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/WordLists/WordListsViewModel.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e941b462cfb9748b6948b4edf051a42ef6a40f95c31270ab7e52ddf253c00a8"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaInfoSyntaxHighlighting.ColorizeTrackDetails (cyclomatic 16): MediaInfoSyntaxHighlighting.ColorizeTrackDetails has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/MediaInfoView/MediaInfoSyntaxHighlighting.cs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a9a3ec4b3452b06c26e27b27123a423e0ce647aca682fcf75a817851d7995f8"}},{"ruleId":"D1","level":"warning","message":{"text":"VideoPlayerUndockedViewModel.OnKeyDown (cyclomatic 16): VideoPlayerUndockedViewModel.OnKeyDown has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/Undocked/VideoPlayerUndockedViewModel.cs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"912422b75c87d7cf5a4ca40dea3a76cb7e81d4b196366c172624eb5645e266af"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchConverter.AssaChangeStyle (cyclomatic 16): BatchConverter.AssaChangeStyle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":2253}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb559776253ea91de94ca324e7567f04f1c133b9105ac277a4358a33ad5cbaf5"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchConvertViewModel.ShowTargetFormatSettings (cyclomatic 16): BatchConvertViewModel.ShowTargetFormatSettings has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":1413}}}],"partialFingerprints":{"codehealthFindingId/v1":"779cf4c669270e55adbe7bfea54fad002140ccc875441246f11020751807ce38"}},{"ruleId":"D1","level":"warning","message":{"text":"MergeShortLinesHelper.MergeWithHighlights (cyclomatic 16): MergeShortLinesHelper.MergeWithHighlights has cyclomatic complexity 16 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/MergeShortLines/MergeShortLinesHelper.cs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"2daa50b2e88fd3d7ad86caeebbd09b60945606939c44719c7b95c9da202dcf7d"}},{"ruleId":"D1","level":"warning","message":{"text":"OpenAiSttService.TranscribeCoreAsync (cyclomatic 16): OpenAiSttService.TranscribeCoreAsync has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/OpenAiCompatible/OpenAiSttService.cs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"33c45f074935683e37d5de5934cdee576fac153799ce96495f4db14897a31ac7"}},{"ruleId":"D1","level":"warning","message":{"text":"SpeechToTextViewModel.EngineChanged (cyclomatic 16): SpeechToTextViewModel.EngineChanged has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":4390}}}],"partialFingerprints":{"codehealthFindingId/v1":"888bf2b9007562ad9560a40c658909b071b847aaee56247d0ce1407a23193733"}},{"ruleId":"D1","level":"warning","message":{"text":"EdgeTts.Speak (cyclomatic 16): EdgeTts.Speak has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/EdgeTts.cs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"be99bb1fa28509d72cbb936a573b329b8b822e604fac3a28e06bbeccc1e62fae"}},{"ruleId":"D1","level":"warning","message":{"text":"TextToSpeechViewModel.TestVoice (cyclomatic 16): TextToSpeechViewModel.TestVoice has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":1560}}}],"partialFingerprints":{"codehealthFindingId/v1":"705495e4a6189b76247c7e2e4eebc565ddd61e2034355911fdabaaac76e70472"}},{"ruleId":"D1","level":"warning","message":{"text":"VideoOcrViewModel.StartOcr (cyclomatic 16): VideoOcrViewModel.StartOcr has cyclomatic complexity 16 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/VideoOcr/VideoOcrViewModel.cs"},"region":{"startLine":553}}}],"partialFingerprints":{"codehealthFindingId/v1":"514180dc1e2cd3d50950daeccc1ad7af61f73fb0f3254446fe4b01fd3ae0486e"}},{"ruleId":"D1","level":"warning","message":{"text":"AssaFontEmbedder.GetEmbeddedFonts (cyclomatic 16): AssaFontEmbedder.GetEmbeddedFonts has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/AssaFontEmbedder.cs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"47ddfed1a20069961401129a91e1ffdad1f06f7999d65c6d62c4475cb046dfb6"}},{"ruleId":"D1","level":"warning","message":{"text":"WaveformExtractionEstimate.GetCodecDisplayName (cyclomatic 16): WaveformExtractionEstimate.GetCodecDisplayName has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/WaveformExtractionEstimate.cs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"28a5ad161c609c0aa90ca1faf99dda16ea893c5b19d391bb8c8e8e397e1dc193"}},{"ruleId":"D1","level":"warning","message":{"text":"MergeManager.MergeSelectedLines (cyclomatic 16): MergeManager.MergeSelectedLines has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/MergeManager.cs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"30495dd22a4e10ba552fc5fd819fba26bf5b8c1ae487fa8de391e51e74306829"}},{"ruleId":"D1","level":"warning","message":{"text":"AssaResampler.FixDrawing (cyclomatic 16): AssaResampler.FixDrawing has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/AssaResampler.cs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c50f855d1cfad62fe31fa1b2c0baaf7cb3b3ff09529e58d11e543089cfdc46a"}},{"ruleId":"D1","level":"warning","message":{"text":"PlainTextImporter.AutoSplitAddLine (cyclomatic 16): PlainTextImporter.AutoSplitAddLine has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/PlainTextImporter.cs"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"8699ef8e50c021dd580715c7bb377ea9c44b2c6369db733dea33bd8c4b46a300"}},{"ruleId":"D1","level":"warning","message":{"text":"Subtitle.AdjustDisplayTimeUsingPercent (cyclomatic 16): Subtitle.AdjustDisplayTimeUsingPercent has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Subtitle.cs"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"174797a05b488b9cc95aeb91312e97496a98208f3e0ff5300c2a6dee6bd2dca7"}},{"ruleId":"D1","level":"warning","message":{"text":"CalcIncludeCompositionCharactersNotSpace.CountCharacters (cyclomatic 16): CalcIncludeCompositionCharactersNotSpace.CountCharacters has cyclomatic complexity 16 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TextLengthCalculator/CalcIncludeCompositionCharactersNotSpace.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd474b5b7050ed2b5a18b39097cc48bdc00cb525c7e4da08439cd470dd7735b3"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownFormatImporter.ImportTimeCodesOnAloneLines (cyclomatic 16): UnknownFormatImporter.ImportTimeCodesOnAloneLines has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"caffc03d6aefdb8e8d4e22410c384b8a3e0257558b05db6926be5b67ad05bb37"}},{"ruleId":"D1","level":"warning","message":{"text":"Utilities.GetColorFromFontString (cyclomatic 16): Utilities.GetColorFromFontString has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":2143}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdb2801d9f10ae767298707e93e9fbe66c2481b9ec85e0e0df9cf656616762f6"}},{"ruleId":"D1","level":"warning","message":{"text":"Utilities.SplitForChangedCalc (cyclomatic 16): Utilities.SplitForChangedCalc has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":2231}}}],"partialFingerprints":{"codehealthFindingId/v1":"22b7a1dcd80a69c5eccf31c0ac9244dff5d46222ad127483fc5217813ce799a4"}},{"ruleId":"D1","level":"warning","message":{"text":"FixSpanishInvertedQuestionAndExclamationMarks.Fix (cyclomatic 16): FixSpanishInvertedQuestionAndExclamationMarks.Fix has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixSpanishInvertedQuestionAndExclamationMarks.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc0c9a7dce5e269b5465d8a0801598a98a8b0a88f85f6b8764767b96822a0ea3"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedSubStationAlpha.GetHeaderAndStylesFromSubStationAlpha (cyclomatic 16): AdvancedSubStationAlpha.GetHeaderAndStylesFromSubStationAlpha has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca67d6831ba0aa7015d6af8de538a1a8fa1083352fdaa9bac9772ae0a08b7f11"}},{"ruleId":"D1","level":"warning","message":{"text":"AvidCaption.LoadSubtitle (cyclomatic 16): AvidCaption.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AvidCaption.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce6cf1eb6b9a2ee761c0515413bf3a151c31f31382e3d0e281921df43ec3848e"}},{"ruleId":"D1","level":"warning","message":{"text":"AvidCaptionDropFrame.LoadSubtitle (cyclomatic 16): AvidCaptionDropFrame.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AvidCaptionDropFrame.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"99673868be1d537aca17eba47224103805e7d3da139da70441fe041c74742a72"}},{"ruleId":"D1","level":"warning","message":{"text":"Cappella.LoadSubtitle (cyclomatic 16): Cappella.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cappella.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"997d8e17d017ef13691e1c78092083eaeec3650766fe9bc873d482e0a03d5182"}},{"ruleId":"D1","level":"warning","message":{"text":"Chk.ReadParagraph (cyclomatic 16): Chk.ReadParagraph has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Chk.cs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cbcb383a5b8b2f5c16d943b5c97a834d4e121a4b5212de38052c7a73ba29a96"}},{"ruleId":"D1","level":"warning","message":{"text":"Csv3.ReadText (cyclomatic 16): Csv3.ReadText has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Csv3.cs"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"70683264bb7346748823642d41014e4a4f22ab791b4808ea3ecb2ee6b0c16277"}},{"ruleId":"D1","level":"warning","message":{"text":"FinalCutProImage.LoadSubtitle (cyclomatic 16): FinalCutProImage.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProImage.cs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"95f124b946a710131041ebb4ed15c26774fa4122a33cc301afab001b9362fc2c"}},{"ruleId":"D1","level":"warning","message":{"text":"PlayStationSubs.LoadSubtitle (cyclomatic 16): PlayStationSubs.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/PlayStationSubs.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"3476a17813a98144c05e44bf2703b2fa8ba9d4bf597b2433d379ee774619219d"}},{"ruleId":"D1","level":"warning","message":{"text":"SoftNicolonSub.DoLoadSubtitle (cyclomatic 16): SoftNicolonSub.DoLoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SoftNiColonSub.cs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cb67f982c306f75513378c11fc34e7f05281d9c0bc97988dae11ced253b4ef6"}},{"ruleId":"D1","level":"warning","message":{"text":"SoftNiSub.LoadSubtitle (cyclomatic 16): SoftNiSub.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SoftNiSub.cs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e8334fb268a3a8f513aa51a13b80bc9635419a043ba47f9f9a74176166ae02c"}},{"ruleId":"D1","level":"warning","message":{"text":"TimedText10.IsMine (cyclomatic 16): TimedText10.IsMine has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ae4c650e58e69398f0e997963f260e92fd70a81b72a8a377f2af96c35ae6089"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle107.LoadSubtitle (cyclomatic 16): UnknownSubtitle107.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle107.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5c975c7f497041a98d277461131dfd784e906a0b496c28cc5d764a6334c1c21"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle32.LoadSubtitle (cyclomatic 16): UnknownSubtitle32.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle32.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"db48179fb3c995aaf6ca39c6d862e6093cd451850f00e52b76c7e2d5bc38e88c"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle58.LoadSubtitle (cyclomatic 16): UnknownSubtitle58.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle58.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"08e919bd183f0ac0557c35627af0676548b4d8b93ba63f52676761ff1bcb2411"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle68.LoadSubtitle (cyclomatic 16): UnknownSubtitle68.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle68.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"58ed77a927867f62b36ac1ff0ed693a0aef462f886493f029ea7221e12aa9467"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle75.LoadSubtitle (cyclomatic 16): UnknownSubtitle75.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle75.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"16842de1a234b6709082a60e2a03b8df16382979bc9ea6ae1a4953db77d85147"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle88.LoadSubtitle (cyclomatic 16): UnknownSubtitle88.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle88.cs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"263ce7bd7f47e8843f51cc0d84837fb8827b9ff81bf7d4544e8cdc5fdf10e0ae"}},{"ruleId":"D1","level":"warning","message":{"text":"UnknownSubtitle99.LoadSubtitle (cyclomatic 16): UnknownSubtitle99.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle99.cs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad030b56515b2ede1211edf6a25c584d0755a551bcc4e0e48e40cd6d5ec5822e"}},{"ruleId":"D1","level":"warning","message":{"text":"WinCaps32.LoadSubtitle (cyclomatic 16): WinCaps32.LoadSubtitle has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WinCaps32.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"90957715c1dfc181279698ff2992a3b6415e34f9a41029da577b947550f894c6"}},{"ruleId":"D1","level":"warning","message":{"text":"ContainerSubtitleLoader.TryLoadTracks (cyclomatic 16): ContainerSubtitleLoader.TryLoadTracks has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/ContainerSubtitleLoader.cs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4e01db84010d544ce8f6c5fbba8c3127ce7564b217239ebaca51a6bd23164cd"}},{"ruleId":"D1","level":"warning","message":{"text":"WhisperHelper.GetExecutableFileNameNoPath (cyclomatic 16): WhisperHelper.GetExecutableFileNameNoPath has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/AudioToText/WhisperHelper.cs"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc8d8dffb54041e5a4ddb1cb1c2d463ed728f9a1032faa6cc8bc018edb2f8179"}},{"ruleId":"D1","level":"warning","message":{"text":"FfmpegMediaInfo.ParseLog (cyclomatic 16): FfmpegMediaInfo.ParseLog has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Media/FfmpegMediaInfo.cs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc3c5c922fedb7b0fe0ec896c6aecf3fa43a659d0cdba98aea6c808cc6635315"}},{"ruleId":"D1","level":"warning","message":{"text":"OcrFixReplaceList2.FixIor1InsideLowerCaseWord (cyclomatic 16): OcrFixReplaceList2.FixIor1InsideLowerCaseWord has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":788}}}],"partialFingerprints":{"codehealthFindingId/v1":"b87943f192d6f1be3ed95847b85bb5ac53162d05ee1cf631ab67b318922e6416"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrChar.RemoveDuplicates (cyclomatic 16): NOcrChar.RemoveDuplicates has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrChar.cs"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"218cc82baab09bb2262e5217cb6fd0c2cffd85aca35602d951a100125b93788a"}},{"ruleId":"D1","level":"warning","message":{"text":"NOcrLineGenerator.AddSkeletonForegroundLines (cyclomatic 16): NOcrLineGenerator.AddSkeletonForegroundLines has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":438}}}],"partialFingerprints":{"codehealthFindingId/v1":"34b59b5cbc5805bc2cde36f6624c7066ae8183994fccc35d76ef722bd2c2498c"}},{"ruleId":"D1","level":"warning","message":{"text":"MergeAndSplitHelper.CalculateCandidateScore (cyclomatic 16): MergeAndSplitHelper.CalculateCandidateScore has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Translate/MergeAndSplitHelper.cs"},"region":{"startLine":873}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b7fea7c4ffa2b8ed43b09e8df433a7f85bc8c3abb4de8e0ddb6cb425e089b5a"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoveTextForHI.RemoveColon (cognitive 552): RemoveTextForHI.RemoveColon has cognitive complexity 552 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveTextForHI.cs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"65bb5e9b98ac7747754625db05ab6d59cd87e93dfec8f2ebc807bc29d6e4e902"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoveInterjection.Invoke (cognitive 531): RemoveInterjection.Invoke has cognitive complexity 531 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveInterjection.cs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"a89c0ee77aa7dde5940d82cfabd6a4a9def3f898e5a08d93b5905fbb9b3580eb"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrMatcher.FindBestMatch (cognitive 369): BinaryOcrMatcher.FindBestMatch has cognitive complexity 369 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrMatcher.cs"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae05e28f1b7ac042569961b2bc454033491176a2b285dd270df772b60bb5d870"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadTtsViewModel.OnTimerOnElapsed (cognitive 301): DownloadTtsViewModel.OnTimerOnElapsed has cognitive complexity 301 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e099af008b01bb16959a8c48ae4b4ada90712550746768d0a26edfa48f290dd"}},{"ruleId":"D2","level":"warning","message":{"text":"ScenaristClosedCaptions.GetSccText (cognitive 261): ScenaristClosedCaptions.GetSccText has cognitive complexity 261 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ScenaristClosedCaptions.cs"},"region":{"startLine":1004}}}],"partialFingerprints":{"codehealthFindingId/v1":"99fd2fc282f40eb5fed1f5811004e886d7bd4cfefa9062bb9c88fc99bc978cda"}},{"ruleId":"D2","level":"warning","message":{"text":"NetflixImsc11Japanese.ReadParagraph (cognitive 250): NetflixImsc11Japanese.ReadParagraph has cognitive complexity 250 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/NetflixImsc11Japanese.cs"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"772648d6efabe4adf1979e1154f301ac612b407753dacf7a438ecce6027160a9"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.CheckForErrors (cognitive 243): AdvancedSubStationAlpha.CheckForErrors has cognitive complexity 243 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":2208}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0f1fee29f259a5989cc0247ac649262a5a4c65e385c244273386a2add29e9f4"}},{"ruleId":"D2","level":"warning","message":{"text":"DCinemaSmpte2010.LoadSubtitle (cognitive 239): DCinemaSmpte2010.LoadSubtitle has cognitive complexity 239 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2010.cs"},"region":{"startLine":629}}}],"partialFingerprints":{"codehealthFindingId/v1":"5540b67d295e1c1ede3ef8819d5381ce449cf2fc3ab6ad8922236354dca59a8e"}},{"ruleId":"D2","level":"warning","message":{"text":"DCinemaInterop.LoadSubtitle (cognitive 236): DCinemaInterop.LoadSubtitle has cognitive complexity 236 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaInterop.cs"},"region":{"startLine":611}}}],"partialFingerprints":{"codehealthFindingId/v1":"132c825be3fb1b3d3490638ce68b57498406dedb22cc98abe3786f4fe79d18f9"}},{"ruleId":"D2","level":"warning","message":{"text":"TtsEngineInstaller.EnsureEngineInstalled (cognitive 231): TtsEngineInstaller.EnsureEngineInstalled has cognitive complexity 231 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TtsEngineInstaller.cs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dcf7d9882e5762d0af6424b8231b5f4b30fa2d8202a2bd933b31b9b4d0a5aca"}},{"ruleId":"D2","level":"warning","message":{"text":"FixMissingSpaces.Fix (cognitive 226): FixMissingSpaces.Fix has cognitive complexity 226 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixMissingSpaces.cs"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"94fae221b61c301194a35c522f35d2bfce47b03e814eb0c07a5c66e4a03049e7"}},{"ruleId":"D2","level":"warning","message":{"text":"DCinemaInterop.ToText (cognitive 208): DCinemaInterop.ToText has cognitive complexity 208 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaInterop.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"660a7f122e618481cc706bc204a58caff5aec26ba23051df22f08959b809ba80"}},{"ruleId":"D2","level":"warning","message":{"text":"LanguageAutoDetect.AutoDetectLanguageName (cognitive 207): LanguageAutoDetect.AutoDetectLanguageName has cognitive complexity 207 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":1240}}}],"partialFingerprints":{"codehealthFindingId/v1":"642e5f9e0280b0890cb06910c1b9b90ea7ddfb50dfd2ebbd5e2e8c891ee3d41d"}},{"ruleId":"D2","level":"warning","message":{"text":"DCinemaSmpte2014.ToText (cognitive 203): DCinemaSmpte2014.ToText has cognitive complexity 203 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2014.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3d1ee0cc0c5d0ba57b2ba4fd20ea16ff0dfa198ad081f92432cd88ef3515876"}},{"ruleId":"D2","level":"warning","message":{"text":"DCinemaSmpte2007.LoadSubtitle (cognitive 201): DCinemaSmpte2007.LoadSubtitle has cognitive complexity 201 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2007.cs"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7291dd35d252ca86a66b5f275490ad60a6ffd3f966d9dc70025e8e81a66c44b"}},{"ruleId":"D2","level":"warning","message":{"text":"DCinemaSmpte2014.LoadSubtitle (cognitive 200): DCinemaSmpte2014.LoadSubtitle has cognitive complexity 200 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2014.cs"},"region":{"startLine":607}}}],"partialFingerprints":{"codehealthFindingId/v1":"e193b4a8c7fdaf1ba9e52bc4b13dedf84b35ccdb37f1d8cc5e206a060c445d6b"}},{"ruleId":"D2","level":"warning","message":{"text":"DCinemaSmpte2007.ToText (cognitive 195): DCinemaSmpte2007.ToText has cognitive complexity 195 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2007.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"5458683aeaed387221428a8c40cff373034f289ff0747aef87fe060d29843616"}},{"ruleId":"D2","level":"warning","message":{"text":"DCinemaSmpte2010.ToText (cognitive 195): DCinemaSmpte2010.ToText has cognitive complexity 195 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2010.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"28619e63f16eb07d1d4ace27b328cbf9aaf9615851c1e4d1e25a923b92c4f880"}},{"ruleId":"D2","level":"warning","message":{"text":"AddMissingQuotes.Fix (cognitive 184): AddMissingQuotes.Fix has cognitive complexity 184 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/AddMissingQuotes.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"2451d61f9d597a64c31b304c07d80e44c326084bf43241ef00457cc1ad5d6cc7"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoveTextForHI.RemoveTextFromHearImpaired (cognitive 180): RemoveTextForHI.RemoveTextFromHearImpaired has cognitive complexity 180 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveTextForHI.cs"},"region":{"startLine":856}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ffa07cd6c9c16973d3cf1b21536bc7a2adaaac7dc7e0b8fb2a74c180063ee04"}},{"ruleId":"D2","level":"warning","message":{"text":"MicroDvd.ToText (cognitive 178): MicroDvd.ToText has cognitive complexity 178 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/MicroDvd.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8b35b69c6057f6e3b3cb288e3014f11e4135bdce7927ccf2b44ae97aa1b9c0f"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle70.ToText (cognitive 178): UnknownSubtitle70.ToText has cognitive complexity 178 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle70.cs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8695c7e91dec6abc18fb2fe9a68263b61198afc810ba82676a4af34448c8980"}},{"ruleId":"D2","level":"warning","message":{"text":"Cavena890.GetTextAsBytes (cognitive 177): Cavena890.GetTextAsBytes has cognitive complexity 177 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":852}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae8a726d0af3146b9675e796fe69d83fb569c4472a436dd4644d0565978ee6d0"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.SubtitleOpen (cognitive 175): MainViewModel.SubtitleOpen has cognitive complexity 175 (threshold 15). Of this number, 170 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":16071}}}],"partialFingerprints":{"codehealthFindingId/v1":"adab15d64ba86556de7567185f04540a4446b48faf12a902892c20dc7103ebd0"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextViewModel.Transcribe (cognitive 174): SpeechToTextViewModel.Transcribe has cognitive complexity 174 (threshold 15). Of this number, 172 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":3009}}}],"partialFingerprints":{"codehealthFindingId/v1":"c98cdea2d9c41e12b71feb14e203b0b5806749fb2e62278a530dd9584362bdd0"}},{"ruleId":"D2","level":"warning","message":{"text":"SeJsonParser.GetArrayElementsByName (cognitive 172): SeJsonParser.GetArrayElementsByName has cognitive complexity 172 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"05886a582e6b6afa79afe7fed3e022851b582158c080b4901eb28b4b46c82be5"}},{"ruleId":"D2","level":"warning","message":{"text":"ItunesTimedText.ToText (cognitive 169): ItunesTimedText.ToText has cognitive complexity 169 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ItunesTimedText.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"b28581a777227d62551fb466b36c9350df46e4f157c6cdd58f9e20e7e5e90420"}},{"ruleId":"D2","level":"warning","message":{"text":"Stbl.GetParagraphs (cognitive 166): Stbl.GetParagraphs has cognitive complexity 166 (threshold 15). Of this number, 164 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Boxes/Stbl.cs"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fa80449e336f935ba9070ec1fbb32ebaa7beca52e0f9f9f5787973c58f910eb"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrMatcher.GetCompareMatch (cognitive 163): BinaryOcrMatcher.GetCompareMatch has cognitive complexity 163 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrMatcher.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f082ff7393294d484ed82c028e1453d5931deafb58ecb6a68a3726187c5307e"}},{"ruleId":"D2","level":"warning","message":{"text":"SeJsonParser.GetRootElements (cognitive 161): SeJsonParser.GetRootElements has cognitive complexity 161 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":1227}}}],"partialFingerprints":{"codehealthFindingId/v1":"c35673f0a10771dc84fcea16e625c3a27d9bda70820326f7a1941d5be3525c5f"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText.LoadSubtitle (cognitive 161): TimedText.LoadSubtitle has cognitive complexity 161 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText.cs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"b56aed1c5aba6ec9b2c57929081f38a4beb331786ebe7a959a18ee66ac95f7be"}},{"ruleId":"D2","level":"warning","message":{"text":"NetflixTimedText.ToText (cognitive 160): NetflixTimedText.ToText has cognitive complexity 160 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/NetflixTimedText.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"febbe2486de56295056661546f79a259e4e73659db8215716ec5945fa03f18cd"}},{"ruleId":"D2","level":"warning","message":{"text":"SeJsonParser.GetAllTagsByNameAsStrings (cognitive 157): SeJsonParser.GetAllTagsByNameAsStrings has cognitive complexity 157 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"be8a3d18b2c4e1f86252faa3c59684b537c40dfb0d8df6d79892ba95e62f6df0"}},{"ruleId":"D2","level":"warning","message":{"text":"FixStartWithUppercaseLetterAfterParagraph.DoFix (cognitive 157): FixStartWithUppercaseLetterAfterParagraph.DoFix has cognitive complexity 157 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixStartWithUppercaseLetterAfterParagraph.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"11adbe159c50467959727e9bb2a96125a7bf0295d2cc57a5e539dc390c471aad"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalCutProXml.LoadSubtitle (cognitive 157): FinalCutProXml.LoadSubtitle has cognitive complexity 157 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProXml.cs"},"region":{"startLine":453}}}],"partialFingerprints":{"codehealthFindingId/v1":"66c20c24ed39e75d477e5b67b43a051542057b38fe97ea2a21d5b1875dcbf4f3"}},{"ruleId":"D2","level":"warning","message":{"text":"SeJsonParser.GetFirstObject (cognitive 156): SeJsonParser.GetFirstObject has cognitive complexity 156 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":919}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bcac1654acba341ca49ee0aa563bf1f8600fb0a879200792a37b4886e53e11b"}},{"ruleId":"D2","level":"warning","message":{"text":"MicroDvd.LoadSubtitle (cognitive 156): MicroDvd.LoadSubtitle has cognitive complexity 156 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/MicroDvd.cs"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb8e908b105ba4e27885f89ac72fd824e8ca29e28a4b218dffe59d4d9556e283"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle70.LoadSubtitle (cognitive 156): UnknownSubtitle70.LoadSubtitle has cognitive complexity 156 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle70.cs"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3e7a5152ebe2379b592da1dd815a03602bbf889cb2ef81b7861a7e1e0c5cce6"}},{"ruleId":"D2","level":"warning","message":{"text":"HtmlUtil.FixInvalidItalicTags (cognitive 154): HtmlUtil.FixInvalidItalicTags has cognitive complexity 154 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/HtmlUtil.cs"},"region":{"startLine":865}}}],"partialFingerprints":{"codehealthFindingId/v1":"2241050b54ff479222f4ad9b48ffaf8ba55985439d963ab6874a2e37a85da67c"}},{"ruleId":"D2","level":"warning","message":{"text":"SplitBreakLongLinesViewModel.Split (cognitive 153): SplitBreakLongLinesViewModel.Split has cognitive complexity 153 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/SplitBreakLongLines/SplitBreakLongLinesViewModel.cs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"faaca7ec91babf570e7ebab44ee77709b64885b7e3bcfb9360dd5257885392b0"}},{"ruleId":"D2","level":"warning","message":{"text":"ConvertColorsToDialogUtils.ConvertColorsToDialogInSubtitle (cognitive 152): ConvertColorsToDialogUtils.ConvertColorsToDialogInSubtitle has cognitive complexity 152 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ConvertColorsToDialogUtils.cs"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"37f43edd03ac7c910f28e39dc1d0bbe7920b8740001979e50d2e6928414611eb"}},{"ruleId":"D2","level":"warning","message":{"text":"SeJsonParser.GetArrayElements (cognitive 152): SeJsonParser.GetArrayElements has cognitive complexity 152 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":630}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfcc08572b6324af2c70e1d7b494de2203371cf1e7425d63ac964c60c6c9de89"}},{"ruleId":"D2","level":"warning","message":{"text":"FixSpanishInvertedQuestionAndExclamationMarks.FixSpanishInvertedLetter (cognitive 149): FixSpanishInvertedQuestionAndExclamationMarks.FixSpanishInvertedLetter has cognitive complexity 149 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixSpanishInvertedQuestionAndExclamationMarks.cs"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"78141e6a185c7d1977df03edfedd390a18bf992bef8c84da65199202164ab62b"}},{"ruleId":"D2","level":"warning","message":{"text":"FixContinuationStyle.Fix (cognitive 147): FixContinuationStyle.Fix has cognitive complexity 147 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixContinuationStyle.cs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"84af9cd1fd03f51df8c2a3080b71bc6dd144179777b4e01bf54ab0126ae3e713"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedTextImscRosetta.ReadParagraph (cognitive 147): TimedTextImscRosetta.ReadParagraph has cognitive complexity 147 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImscRosetta.cs"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffafc912b30aa6d6fdb263faa8e1ea177e1085efb42518a5f07b64688d5591af"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.OnPointerMoved (cognitive 146): AudioVisualizer.OnPointerMoved has cognitive complexity 146 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":1133}}}],"partialFingerprints":{"codehealthFindingId/v1":"036dbdd21fc2f7ada36786e7c352de4f8445e126b031cdb5aa235d2966183efa"}},{"ruleId":"D2","level":"warning","message":{"text":"Cea708.Decode (cognitive 146): Cea708.Decode has cognitive complexity 146 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Cea708/Cea708.cs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"216c8959ce3d62db0b87cff75b94af72503804656f34880a6b438cd5c08f495a"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.GetSsaStyle (cognitive 143): AdvancedSubStationAlpha.GetSsaStyle has cognitive complexity 143 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":2601}}}],"partialFingerprints":{"codehealthFindingId/v1":"e165d8f05dbcf68c1fdc5d10baa1b2c4b7ed9fd3376fea486f849899e6101e33"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.RemoveUnneededSpaces (cognitive 141): Utilities.RemoveUnneededSpaces has cognitive complexity 141 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":2470}}}],"partialFingerprints":{"codehealthFindingId/v1":"5770e9a01cf986ce6829ea96945d5e2c83ae9d915a25494c7d61f6b87f09d65b"}},{"ruleId":"D2","level":"warning","message":{"text":"Pac.GetPacParagraph (cognitive 141): Pac.GetPacParagraph has cognitive complexity 141 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":1659}}}],"partialFingerprints":{"codehealthFindingId/v1":"568848075db9fcf4ff2f7e7af41dd9559bcdc5b63053e677a7a65e18c33910b1"}},{"ruleId":"D2","level":"warning","message":{"text":"SeJsonValidator.ValidateJson (cognitive 133): SeJsonValidator.ValidateJson has cognitive complexity 133 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonValidator.cs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"543850438276ead7f2b582616a22ad7492cfe340dc8eb685a317188a2eae18b4"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.Convert (cognitive 132): BatchConverter.Convert has cognitive complexity 132 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"f775bf68fd04a534f5aae0e12e2fc46e7a145e5f99d9c721d837fcab1fc265a9"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedTextImsc11.ReadParagraph (cognitive 131): TimedTextImsc11.ReadParagraph has cognitive complexity 131 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImsc11.cs"},"region":{"startLine":618}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd24ed961e388097a2c5d68565178fcee994505b963680e7724d798175aa3716"}},{"ruleId":"D2","level":"warning","message":{"text":"FixOverlappingDisplayTimes.Fix (cognitive 130): FixOverlappingDisplayTimes.Fix has cognitive complexity 130 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixOverlappingDisplayTimes.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2969747911acaf5cc6373b1f39befa6a0ff59110e95a2e5c0e7f8f84614a2a3"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText10.ReadParagraph (cognitive 129): TimedText10.ReadParagraph has cognitive complexity 129 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1156}}}],"partialFingerprints":{"codehealthFindingId/v1":"baace678ca87fdb25c6ec7b9365a4c3958e2fb0699f98cb06ca5d65706bd8662"}},{"ruleId":"D2","level":"warning","message":{"text":"TransportStreamParser.Parse (cognitive 127): TransportStreamParser.Parse has cognitive complexity 127 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/TransportStreamParser.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"f08615579d5286f9535b9578d346aecdd93e01ae1ab2109b7b6495ee937fc71f"}},{"ruleId":"D2","level":"warning","message":{"text":"ConvertCommand.ExecuteAsync (cognitive 125): ConvertCommand.ExecuteAsync has cognitive complexity 125 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Commands/ConvertCommand.cs"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a0817f0f90cd536c4b5218523a8ef9d7dafea19b00621c8ebe97dbd46b22592"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.GetFormattedText (cognitive 124): AdvancedSubStationAlpha.GetFormattedText has cognitive complexity 124 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":1171}}}],"partialFingerprints":{"codehealthFindingId/v1":"6253be2c85ae903dfc0d20dcac631ab7a46169178e857bed604c2e46fd3490ce"}},{"ruleId":"D2","level":"warning","message":{"text":"SmpteTt2052.ToText (cognitive 124): SmpteTt2052.ToText has cognitive complexity 124 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SmpteTt2052.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"296187dae2a6d60705cee78658da9cf9610e52dc34f3a07bac54295708c11440"}},{"ruleId":"D2","level":"warning","message":{"text":"JoinSubtitlesViewModel.SortAndLoad (cognitive 121): JoinSubtitlesViewModel.SortAndLoad has cognitive complexity 121 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/JoinSubtitles/JoinSubtitlesViewModel.cs"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"add80b994f73972cb5d3fb43e6e711126424527a26d1dd54111724c575e295b1"}},{"ruleId":"D2","level":"warning","message":{"text":"Teletext.ProcessTelxPacket (cognitive 118): Teletext.ProcessTelxPacket has cognitive complexity 118 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/Teletext.cs"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"47e68a38c14f522b01e6039807c96095a8b78dfdfc3186b3ae6c7ce68c02c9f1"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextTimingFixer.ShortenViaWavePeaks (cognitive 117): SpeechToTextTimingFixer.ShortenViaWavePeaks has cognitive complexity 117 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d4da0a4930ece5ddaf7b5784ba574f2ad9a0cc0192b47dbe98271f19e40288a"}},{"ruleId":"D2","level":"warning","message":{"text":"StrippableText.FixCasing (cognitive 117): StrippableText.FixCasing has cognitive complexity 117 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StrippableText.cs"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"decfd83c1653073c488546436e180d2b4ac52985ae9fe369230c8377464ba48d"}},{"ruleId":"D2","level":"warning","message":{"text":"EbuTextTimingInformation.EncodeText (cognitive 117): EbuTextTimingInformation.EncodeText has cognitive complexity 117 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"64a5e050b2956c6bb64770e672ff7fb04d6a3b196abcf6331511f55dcda78f75"}},{"ruleId":"D2","level":"warning","message":{"text":"Sami.LoadSubtitle (cognitive 117): Sami.LoadSubtitle has cognitive complexity 117 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Sami.cs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"40d1c564ae613c716cb41094a3aaa1d7b1ddf50782fcf1480a34d84630f61c5b"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrLineGenerator.ZhangSuenThin (cognitive 116): NOcrLineGenerator.ZhangSuenThin has cognitive complexity 116 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7ea1371589f54633c9acbcabbeed12c69679e795fac932b65ae978e6ef66d7b"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.OnKeyDownHandler (cognitive 114): MainViewModel.OnKeyDownHandler has cognitive complexity 114 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":21614}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbe696e67a4c4d741d89b4c9b429e7999331e50290759d8efeb5792475655cac"}},{"ruleId":"D2","level":"warning","message":{"text":"LanguageAutoDetect.AutoDetectGoogleLanguage (cognitive 113): LanguageAutoDetect.AutoDetectGoogleLanguage has cognitive complexity 113 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":478}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a3f751d2630b42e6b37797e06c9de3c33f51f91582cb3b9566e359fee611f03"}},{"ruleId":"D2","level":"warning","message":{"text":"TranscriptiveJson.LoadSubtitle (cognitive 111): TranscriptiveJson.LoadSubtitle has cognitive complexity 111 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TranscriptiveJson.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"33087b0d440f665a9139ebfce39bd7b0dca8462ad4dd30d87873a259b8bdd8d5"}},{"ruleId":"D2","level":"warning","message":{"text":"WhisperHelper.GetWhisperFolder (cognitive 110): WhisperHelper.GetWhisperFolder has cognitive complexity 110 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/AudioToText/WhisperHelper.cs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ebc38df907429ff6e8fb73b63953f20a1d07bdd2461fb06e94517b9984eb8e3"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalCutProTestXml.LoadSubtitle (cognitive 109): FinalCutProTestXml.LoadSubtitle has cognitive complexity 109 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProTextXml.cs"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ba711fbe40d52b2dcaea6b860a64e115bfb2b878a2cc6e249703acf85b48343"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporter.ImportTimeCodesAndTextOnSameLine (cognitive 108): UnknownFormatImporter.ImportTimeCodesAndTextOnSameLine has cognitive complexity 108 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"620793effa351f8e858a7221388917a8d7182483d80b5c9cfc57f5e8ac7593f9"}},{"ruleId":"D2","level":"warning","message":{"text":"SubStationAlpha.LoadSubtitle (cognitive 106): SubStationAlpha.LoadSubtitle has cognitive complexity 106 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubStationAlpha.cs"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"05d67ca1d754dc4ccbf50689b89b303bc2eba6be7ff7289049842f98d82aa161"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalCutProTest2Xml.LoadSubtitle (cognitive 105): FinalCutProTest2Xml.LoadSubtitle has cognitive complexity 105 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProTest2Xml.cs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"a75a39e8de87a390af40d189ae22bf32024eb65f08bc0793f95f1a1d342a860d"}},{"ruleId":"D2","level":"warning","message":{"text":"FixMissingPeriodsAtEndOfLine.Fix (cognitive 104): FixMissingPeriodsAtEndOfLine.Fix has cognitive complexity 104 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixMissingPeriodsAtEndOfLine.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"86fe058940772e4edfa2ca97d820e9a5bc3a670687df56ed111802ed7d92727f"}},{"ruleId":"D2","level":"warning","message":{"text":"NciCaption.LoadSubtitle (cognitive 104): NciCaption.LoadSubtitle has cognitive complexity 104 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/NciCaption.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"374de5b923c5ec347f54fd544b51e3bd86568cd0d9c4c3e3fc80f50e7eba51ab"}},{"ruleId":"D2","level":"warning","message":{"text":"TimeCodesBeautifier.FixConnectedSubtitles (cognitive 103): TimeCodesBeautifier.FixConnectedSubtitles has cognitive complexity 103 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/TimeCodesBeautifier.cs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b44649b2ab7fe64343667c3046d1a4e69c72218d5ab0319eae433a50afd5c14"}},{"ruleId":"D2","level":"warning","message":{"text":"GoogleVisionOcr.JsonToStringList (cognitive 101): GoogleVisionOcr.JsonToStringList has cognitive complexity 101 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/GoogleVisionOcr.cs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"008f12dba328e251daec8ca1e6ce78e1ffcfa2fd3b62d1df724a5a5ab8070b31"}},{"ruleId":"D2","level":"warning","message":{"text":"GoogleCloudVisionApi.JsonToStringList (cognitive 101): GoogleCloudVisionApi.JsonToStringList has cognitive complexity 101 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/Service/GoogleCloudVisionApi.cs"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5f48b953523916f2faea152bd8585f85e46f6cb6f410875e164f16e44a14971"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmapImageSplitter2.SplitToLinesNew (cognitive 100): NikseBitmapImageSplitter2.SplitToLinesNew has cognitive complexity 100 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":631}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b10de3ca903d26b59bfb231eb612306cb9b52990a57ca3637ce840cd94d3016"}},{"ruleId":"D2","level":"warning","message":{"text":"ShortcutsViewModel.Configure (cognitive 97): ShortcutsViewModel.Configure has cognitive complexity 97 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Shortcuts/ShortcutsViewModel.cs"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"59089c51f4d9858c427bcf974eef5b9f90bdfb56fe8c37e2cbdd036fcc87a6d3"}},{"ruleId":"D2","level":"warning","message":{"text":"SubtitleSyntaxTokenizer.Tokenize (cognitive 97): SubtitleSyntaxTokenizer.Tokenize has cognitive complexity 97 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/SubtitleSyntaxTokenizer.cs"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"71039bed4fda227727a63b2dbc9d975b00c6c36d766770c1ef24f52d3bb59114"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.LoadSubtitle (cognitive 97): AdvancedSubStationAlpha.LoadSubtitle has cognitive complexity 97 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":1563}}}],"partialFingerprints":{"codehealthFindingId/v1":"619f7544a54768ebf70170fd91d6361fec9a3304ad9721273b0cf4e99154097f"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.StartTimers (cognitive 96): MainViewModel.StartTimers has cognitive complexity 96 (threshold 15). Most of this is not in the body itself: 1 of the 96 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 22780, 23010, 22967). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":22774}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8f8679fbb8506878ca5d52e78eeec3a7c7d76fa8746a24bab875b5eef6e878b"}},{"ruleId":"D2","level":"warning","message":{"text":"MoveWordUpDown.MoveWordUp (cognitive 95): MoveWordUpDown.MoveWordUp has cognitive complexity 95 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/MoveWordUpDown.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"98290fec90ea3aac9a7905fee3629337c30d49cbb63b647eced7688a5611666a"}},{"ruleId":"D2","level":"warning","message":{"text":"Teletext.ProcessPage (cognitive 94): Teletext.ProcessPage has cognitive complexity 94 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/Teletext.cs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"f67c8859e77e6437edcc14fd996956379bad73fcf80507357f0a479aabe66abf"}},{"ruleId":"D2","level":"warning","message":{"text":"Ebu.ReadTextAndTiming (cognitive 92): Ebu.ReadTextAndTiming has cognitive complexity 92 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":2102}}}],"partialFingerprints":{"codehealthFindingId/v1":"74253ebb7a5d8d32fec75d98b248f08123f7fbfac14cab9921824227ba5b82b0"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextViewModel.GetWhisperProcess (cognitive 91): SpeechToTextViewModel.GetWhisperProcess has cognitive complexity 91 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":3637}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2705eae8e9fd7274efbe70ab0127ab8fcff5a93e5aa6865aa6c76bc2df983d6"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedTextImage.LoadSubtitle (cognitive 90): TimedTextImage.LoadSubtitle has cognitive complexity 90 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImage.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f6c711cfd10a60b8ac0f92af977840301e53c4dc802b3618bcabec7755813ae"}},{"ruleId":"D2","level":"warning","message":{"text":"MpvReloader.RefreshMpv (cognitive 89): MpvReloader.RefreshMpv has cognitive complexity 89 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/MpvReloader.cs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ac9cbda545e7c6a194f74df00bc2ac020e942c057ff3581dc9889252b62b2ce"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.SetCueToClosestShotChangeGreenZone (cognitive 88): MainViewModel.SetCueToClosestShotChangeGreenZone has cognitive complexity 88 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":8122}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ae1f5c0a252b79ea7415553bc9d7df8da4ead9187eb186d68613a4fae202ed9"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.AutoBreakLinePrivate (cognitive 86): Utilities.AutoBreakLinePrivate has cognitive complexity 86 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed4c9d6b5d33463f2983dfafe71d8247be95906f14964dc30ac989d5f54fbe66"}},{"ruleId":"D2","level":"warning","message":{"text":"TimeCodesBeautifier.FixChainableSubtitles (cognitive 86): TimeCodesBeautifier.FixChainableSubtitles has cognitive complexity 86 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/TimeCodesBeautifier.cs"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"c00f5f690605430efa2b45dbf83d1d91d19a435e40a8a24923f987a0c6624a10"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrSubtitleBdn.GetBitmap (cognitive 84): OcrSubtitleBdn.GetBitmap has cognitive complexity 84 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrSubtitle/OcrSubtitleBdn.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"928b23138dbc112178fd4fc7e25277b901276566c4f8d0e51504c58fd64073bc"}},{"ruleId":"D2","level":"warning","message":{"text":"SubRipSourceSyntaxHighlighting.ColorizeHtmlAndAssTags (cognitive 84): SubRipSourceSyntaxHighlighting.ColorizeHtmlAndAssTags has cognitive complexity 84 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/SubRipSourceSyntaxHighlighting.cs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7dbc7e710360a9fe17d1cc9c63690c253ecbb26a5e9f4eff7935b4d0fb6d102"}},{"ruleId":"D2","level":"warning","message":{"text":"FixMusicNotation.Fix (cognitive 84): FixMusicNotation.Fix has cognitive complexity 84 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixMusicNotation.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad3f66c1da2639e319094049ddf3a46d386398f81f138c6eb3c987bea23e467b"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVTT.LoadSubtitle (cognitive 84): WebVTT.LoadSubtitle has cognitive complexity 84 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTT.cs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1882dfa7c181a9dad240a4e089a7650e5eaf847281a1dbed06e28022eb869de"}},{"ruleId":"D2","level":"warning","message":{"text":"VlcReloader.RefreshVlc (cognitive 83): VlcReloader.RefreshVlc has cognitive complexity 83 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/VlcReloader.cs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"16eb57751cc61350779bcb81d60f8e9853b374030c03b560c38f4110568d9aa3"}},{"ruleId":"D2","level":"warning","message":{"text":"CompareViewModel.AddColoringAndCountDifferences (cognitive 82): CompareViewModel.AddColoringAndCountDifferences has cognitive complexity 82 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/Compare/CompareViewModel.cs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"c54ccccd39c357e2f8fa276f3fe6d8351863b74a861180861f82b4285fe71858"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText10.LoadSubtitle (cognitive 82): TimedText10.LoadSubtitle has cognitive complexity 82 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":763}}}],"partialFingerprints":{"codehealthFindingId/v1":"c34988cd9a1757288fb043d6abce983e0f7d7c960238fc5c0d4e52b83c261a15"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.StartOcr (cognitive 80): OcrViewModel.StartOcr has cognitive complexity 80 (threshold 15). Of this number, 72 points are the body\u0027s own statements and 8 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":2346}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3eacdfc8e009b5f5ca54d04b2f9178d9b6864cd00fea482e3c5cd1e583fceac"}},{"ruleId":"D2","level":"warning","message":{"text":"FixShortDisplayTimes.Fix (cognitive 80): FixShortDisplayTimes.Fix has cognitive complexity 80 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixShortDisplayTimes.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"23e3eee5c86f73d16f9e284bfeb66996c15408c7cb02f26d4dfda5d6b6e37d0e"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.RunNOcrLoop (cognitive 79): OcrViewModel.RunNOcrLoop has cognitive complexity 79 (threshold 15). Of this number, 68 points are the body\u0027s own statements and 11 belong to 3 function literals inside it that branch. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3019}}}],"partialFingerprints":{"codehealthFindingId/v1":"a683ac94a046e4d2ad4019eb47d652836b30fe58ed695f982105bdfd4d804c45"}},{"ruleId":"D2","level":"warning","message":{"text":"Lrc.LoadSubtitle (cognitive 79): Lrc.LoadSubtitle has cognitive complexity 79 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Lrc.cs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"218f39641809144b657a6df7bd39a1e27aa15839208b557b30887e3e587f926c"}},{"ruleId":"D2","level":"warning","message":{"text":"Lrc3DigitsMs.LoadSubtitle (cognitive 79): Lrc3DigitsMs.LoadSubtitle has cognitive complexity 79 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Lrc3DigitsMs.cs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc137d5962ec2d9a696774d3ba1124c369685c5ed59fa5ff22c87a331f040b18"}},{"ruleId":"D2","level":"warning","message":{"text":"ScenaristClosedCaptions.ToSccText (cognitive 79): ScenaristClosedCaptions.ToSccText has cognitive complexity 79 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ScenaristClosedCaptions.cs"},"region":{"startLine":540}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d07ccaf6850dbf2a320433bc63eced8e867e813c99b2fb5a790cb8263b249b7"}},{"ruleId":"D2","level":"warning","message":{"text":"LensProtoResponse.ParseObjectsResponse (cognitive 78): LensProtoResponse.ParseObjectsResponse has cognitive complexity 78 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Ocr/GoogleLens/Proto/LensProtoResponse.cs"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dbc5a27d1a2963e6e4915744ab68bf9021b51016e5c0a8a3637c99859ec4768"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText10.ToText (cognitive 78): TimedText10.ToText has cognitive complexity 78 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"b84ef374a21b05141e8191b1d4c94c1dafd874e9f799412e340a20414848274c"}},{"ruleId":"D2","level":"warning","message":{"text":"EbuTextTimingInformation.GetBytes (cognitive 77): EbuTextTimingInformation.GetBytes has cognitive complexity 77 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f8a695477f1285d0f293644716ca01bdbfd486f89ec407a7db857b659213cca"}},{"ruleId":"D2","level":"warning","message":{"text":"Json.ReadArray (cognitive 77): Json.ReadArray has cognitive complexity 77 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Json.cs"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"433980f65a2d39282c8ec0c5b917732af076162951ff76c4a992cf273cf6e58f"}},{"ruleId":"D2","level":"warning","message":{"text":"TimeLineAscii.LoadSubtitle (cognitive 77): TimeLineAscii.LoadSubtitle has cognitive complexity 77 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimelineAscii.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa647965443fe0fa1500cb4635605e6661f0ff43d90f066c820470f78b608b71"}},{"ruleId":"D2","level":"warning","message":{"text":"TimeLineFootageAscii.LoadSubtitle (cognitive 77): TimeLineFootageAscii.LoadSubtitle has cognitive complexity 77 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimelineFootageAscii.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa17a1a3f3e9d5b70e9a86c87ffa2c12724d57e6a06e8b8c24ef565c429152fe"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.RunBinaryImageCompareOcrLoop (cognitive 76): OcrViewModel.RunBinaryImageCompareOcrLoop has cognitive complexity 76 (threshold 15). Of this number, 59 points are the body\u0027s own statements and 17 belong to 3 function literals inside it that branch. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3384}}}],"partialFingerprints":{"codehealthFindingId/v1":"94ee09d0ca660b6b4392585b43837c04cb757422ca498e9f7709f23a73a18547"}},{"ruleId":"D2","level":"warning","message":{"text":"LrcNoEndTime.LoadSubtitle (cognitive 76): LrcNoEndTime.LoadSubtitle has cognitive complexity 76 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/LrcNoEndTime.cs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"b20c8b8d4692f4c557c4c5d5887e8212d1ebb2855e01cb9fbaec99f4ab020d6a"}},{"ruleId":"D2","level":"warning","message":{"text":"FixEmptyLines.Fix (cognitive 75): FixEmptyLines.Fix has cognitive complexity 75 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixEmptyLines.cs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"0988ad66b4a280d4a5c681913f1dec5a60928c3ad833a1f0e311214c10390ad2"}},{"ruleId":"D2","level":"warning","message":{"text":"SubPicture.CropBitmapAndUnlock (cognitive 75): SubPicture.CropBitmapAndUnlock has cognitive complexity 75 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/SubPicture.cs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"6979bab09a8c57c4e800986ada863d13c34aff69a7a670536dcbc6a06cadde31"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalCutProXml15.ToText (cognitive 74): FinalCutProXml15.ToText has cognitive complexity 74 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProXml15.cs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cfb6fb263b3d5f73d4408dea469eb0bd01097bd5cf5b1cb2cc458c3e68bfb1e"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle59.LoadSubtitle (cognitive 74): UnknownSubtitle59.LoadSubtitle has cognitive complexity 74 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle59.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef1158b73ff33f031d658f92dace50670dea089a0a42e63a2d5e9b12c55dfafd"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrChar.GenerateLines (cognitive 74): NOcrChar.GenerateLines has cognitive complexity 74 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrChar.cs"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2d50fa9e7941ee0bf439eacfc4a4ab3a90d632ffb2b670f6bdad87177894680"}},{"ruleId":"D2","level":"warning","message":{"text":"MoveWordUpDown.MoveWordDown (cognitive 73): MoveWordUpDown.MoveWordDown has cognitive complexity 73 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/MoveWordUpDown.cs"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"50013c6e3127147b5ddd121dc060920d33d7657c983a446e18d5db118d98d148"}},{"ruleId":"D2","level":"warning","message":{"text":"ForcedAligner.AlignAsync (cognitive 72): ForcedAligner.AlignAsync has cognitive complexity 72 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportPlainText/ForcedAligner.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab24790d51cdac44af1dce0564c7c80394d94a21addef448cbc461decc7b5f74"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporter.ImportTimeCodesOnSameSeparateLineNoMilliseconds (cognitive 71): UnknownFormatImporter.ImportTimeCodesOnSameSeparateLineNoMilliseconds has cognitive complexity 71 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":830}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb486184416f65ffc69958aa3ef091b1be249b992073682aeaf667214a72bc2c"}},{"ruleId":"D2","level":"warning","message":{"text":"Stbl.Stbl.ctor (cognitive 71): Stbl.Stbl.ctor has cognitive complexity 71 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Boxes/Stbl.cs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"57df43bca6109fd827073139f8746e9dd89d7bcfb07403be74838f3d01fb2289"}},{"ruleId":"D2","level":"warning","message":{"text":"Helper.FixHyphensAdd (cognitive 71): Helper.FixHyphensAdd has cognitive complexity 71 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/Helper.cs"},"region":{"startLine":557}}}],"partialFingerprints":{"codehealthFindingId/v1":"4645e0f23e16172b60ae4273776ac3e808f2c321afe5b79c035af3346a475a4a"}},{"ruleId":"D2","level":"warning","message":{"text":"GooglePlayJson.LoadSubtitle (cognitive 71): GooglePlayJson.LoadSubtitle has cognitive complexity 71 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/GooglePlayJson.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"9132946ed4ea265393d24fcf88339dfc143ef83ecc8936edfbf74e90c0509f6c"}},{"ruleId":"D2","level":"warning","message":{"text":"SmilTimesheetData.LoadSubtitle (cognitive 71): SmilTimesheetData.LoadSubtitle has cognitive complexity 71 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SmilTimesheetData.cs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b843a78bc865b3eb1909c475daaadb06690dc739d14d22a54585376887f0f93"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrFixEngine.CheckAndFixWord (cognitive 71): OcrFixEngine.CheckAndFixWord has cognitive complexity 71 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixEngine.cs"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"77c3d3732aabd9285b57e3d4fa0aeb3e32e92570ca36d958256a6bd705b169be"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.HandleReplaceResult (cognitive 70): MainViewModel.HandleReplaceResult has cognitive complexity 70 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":11928}}}],"partialFingerprints":{"codehealthFindingId/v1":"aba79b9a3241818014fbc2adab48fc3f958f4208f9e85f85c98defe665494388"}},{"ruleId":"D2","level":"warning","message":{"text":"AutoTranslateViewModel.SetAutoTranslatorEngine (cognitive 70): AutoTranslateViewModel.SetAutoTranslatorEngine has cognitive complexity 70 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":1785}}}],"partialFingerprints":{"codehealthFindingId/v1":"d95cb58687bf5db387e776d0c58cb289058986fa916550e05c014d2185631927"}},{"ruleId":"D2","level":"warning","message":{"text":"TextWithSubtitleSyntaxHighlightingConverter.MakeShowFormatting (cognitive 70): TextWithSubtitleSyntaxHighlightingConverter.MakeShowFormatting has cognitive complexity 70 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs"},"region":{"startLine":505}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8f171f784181339da4d12a9e04cf6b23c9cdc724e2d2a6e6df27ce1d2d5696f"}},{"ruleId":"D2","level":"warning","message":{"text":"CaptionsInc.LoadSubtitle (cognitive 69): CaptionsInc.LoadSubtitle has cognitive complexity 69 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CaptionsInc.cs"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"a72e3f262801fd9c7935cdbbfb9270ad064d207af31205f55e7f370d5703208e"}},{"ruleId":"D2","level":"warning","message":{"text":"SeConvSettings.ApplyBaseSections (cognitive 69): SeConvSettings.ApplyBaseSections has cognitive complexity 69 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SeConvSettings.cs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"309681fc27b61d2c3817ec84a63c5f49d6a65c9223b0b9b7e9e83401267959f7"}},{"ruleId":"D2","level":"warning","message":{"text":"StrippableText.StrippableText.ctor (cognitive 68): StrippableText.StrippableText.ctor has cognitive complexity 68 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StrippableText.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"e648c104eb959a5a33d6baf63952d5a42daf6a9bc2efa03340f3e528c9b5ea7c"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporter.ImportTimeCodesInFramesOnSameSeparateLine (cognitive 68): UnknownFormatImporter.ImportTimeCodesInFramesOnSameSeparateLine has cognitive complexity 68 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f60c594ac86a2beabc8a782e1f2b02befbc3a8bf8e1495bd66eeacb3cec47b5"}},{"ruleId":"D2","level":"warning","message":{"text":"Cavena890.FixText (cognitive 68): Cavena890.FixText has cognitive complexity 68 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":1689}}}],"partialFingerprints":{"codehealthFindingId/v1":"40ca2cef3618b34dc7db857fb3e5105f0f9331fb058b2e155c25940b816a5fc7"}},{"ruleId":"D2","level":"warning","message":{"text":"TextToSpeechViewModel.SelectedEngineChanged (cognitive 67): TextToSpeechViewModel.SelectedEngineChanged has cognitive complexity 67 (threshold 15). Most of this is not in the body itself: 1 of the 67 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 3245, 3295, 3510). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":3237}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcf79a1feb2f890f83d1ef65e0e3596c3ce8619d8deb78f57d9b009ab71311fc"}},{"ruleId":"D2","level":"warning","message":{"text":"TextWithSubtitleSyntaxHighlightingConverter.MakeShowTags (cognitive 67): TextWithSubtitleSyntaxHighlightingConverter.MakeShowTags has cognitive complexity 67 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"608cde89b1dfb4c9ecf2775ef84868bb1fe9e9290607c533905bfbdc35c96ab5"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporter.ImportTimeCodesOnSameSeparateLine (cognitive 65): UnknownFormatImporter.ImportTimeCodesOnSameSeparateLine has cognitive complexity 65 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":709}}}],"partialFingerprints":{"codehealthFindingId/v1":"a900855da0f976d2f930d28a7891f57d8e47c172d7c4a9ff212b2ba95551f3b5"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText10.MakeParagraph (cognitive 65): TimedText10.MakeParagraph has cognitive complexity 65 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"c04f0c1217c44d2a6b6d0400eb17d16410473d81d9111cdde58a70f29f00b55f"}},{"ruleId":"D2","level":"warning","message":{"text":"ClqttJson.LoadSubtitle (cognitive 63): ClqttJson.LoadSubtitle has cognitive complexity 63 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ClqttJson.cs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"08b74717b4627c174c02951e109d8026b4d7001a98cccdd96ad31f085636aec4"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle71.LoadSubtitle (cognitive 63): UnknownSubtitle71.LoadSubtitle has cognitive complexity 63 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle71.cs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"979e29686f4a4068f5577de708b505cd81f1fde0b5c1e18958450d0b472589d1"}},{"ruleId":"D2","level":"warning","message":{"text":"XmlSourceSyntaxHighlighting.FormatXml (cognitive 62): XmlSourceSyntaxHighlighting.FormatXml has cognitive complexity 62 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/XmlSourceSyntaxHighlighting.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"801fbad524327f588a3a3aeca08c52ff598e6a0655c8e5ebb758aa32789662f2"}},{"ruleId":"D2","level":"warning","message":{"text":"SubRip.ReadLine (cognitive 61): SubRip.ReadLine has cognitive complexity 61 (threshold 15). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubRip.cs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"95da0c6008234f0e44e08d5c47fa6d7f4fbc51cbf2f8a0e5659f8cb55a4868c9"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.OnLoaded (cognitive 60): MainViewModel.OnLoaded has cognitive complexity 60 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 42 belong to 7 function literals inside it that branch. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":18732}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9396c05a2985b93f48d694d27d5fd35a3edfeba2c0e156e99024f32b6b06b31"}},{"ruleId":"D2","level":"warning","message":{"text":"TextWithSubtitleSyntaxHighlightingConverter.ParseHtmlAttributes (cognitive 59): TextWithSubtitleSyntaxHighlightingConverter.ParseHtmlAttributes has cognitive complexity 59 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs"},"region":{"startLine":1005}}}],"partialFingerprints":{"codehealthFindingId/v1":"958da1e17e6422c9fea9d9e5dc27be812537a0426fb1523bb996efc96a56c097"}},{"ruleId":"D2","level":"warning","message":{"text":"FixUppercaseIInsideWords.Fix (cognitive 59): FixUppercaseIInsideWords.Fix has cognitive complexity 59 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixUppercaseIInsideWords.cs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b88cc40b2e553c5409dd87c7733b543460c486f3f7dd19d37a1b2fe690f719b"}},{"ruleId":"D2","level":"warning","message":{"text":"DfxpBasic.ToText (cognitive 59): DfxpBasic.ToText has cognitive complexity 59 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DfxpBasic.cs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"2725bba4d0cf6af6960ac57ad923e82e638f000d0e377e2fa1e7d0eb543b28ac"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmapImageSplitter2.SplitToLinesAggressive (cognitive 59): NikseBitmapImageSplitter2.SplitToLinesAggressive has cognitive complexity 59 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fb19a381858a148d9af36b4a9495115f01249d1920641f185498106987a3de3"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedTextImscRosetta.LoadSubtitle (cognitive 58): TimedTextImscRosetta.LoadSubtitle has cognitive complexity 58 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImscRosetta.cs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff8da1e5d32238dac73d5cbf21d7391e92e7ac166c13a6534f17bea550d40442"}},{"ruleId":"D2","level":"warning","message":{"text":"SubPicture.ParseDisplayControlCommands (cognitive 58): SubPicture.ParseDisplayControlCommands has cognitive complexity 58 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/SubPicture.cs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfbdecfef35cf50f8bb0315682225856f6d127e489de2a640d183870636040df"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedEffectFancyKaraoke.TryAutoSequenceByWords (cognitive 57): AdvancedEffectFancyKaraoke.TryAutoSequenceByWords has cognitive complexity 57 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFancyKaraoke.cs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"893432e56234703dc932ae5863850133be6297b4da14531249a6b4b461b02e6e"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedEffectMatrix.ApplyEffect (cognitive 57): AdvancedEffectMatrix.ApplyEffect has cognitive complexity 57 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectMatrix.cs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"161ba9ceee847e80104616f22cba4039429a826369466cf8720b8a793f08bb7d"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ImportSubtitleFromMatroskaFile (cognitive 57): MainViewModel.ImportSubtitleFromMatroskaFile has cognitive complexity 57 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 32 belong to 3 function literals inside it that branch. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":17294}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ebc9d63a4be3948a2356aa72ce0c4e6b57cceccbc200c403b2450061d4fdffd"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConvertViewModel.AddFile (cognitive 57): BatchConvertViewModel.AddFile has cognitive complexity 57 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":1661}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5d98592e005a88a45259ecaf0cf5b3db95b40517e85e164545ec8b28ad86d0d"}},{"ruleId":"D2","level":"warning","message":{"text":"CheetahCaption.LoadSubtitle (cognitive 57): CheetahCaption.LoadSubtitle has cognitive complexity 57 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CheetahCaption.cs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"117e989edd8f8571a15f6af346ff15f96d213ac1e88f2401e3d55ec162a1e6b2"}},{"ruleId":"D2","level":"warning","message":{"text":"EbuTextTimingInformation.EncodeText (cognitive 57): EbuTextTimingInformation.EncodeText has cognitive complexity 57 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":650}}}],"partialFingerprints":{"codehealthFindingId/v1":"40d5245a6c615f974ddedd9f10be7372a61260723d7ffc2ac1c30a75f30e7037"}},{"ruleId":"D2","level":"warning","message":{"text":"SubtitleConverter.ConvertAsync (cognitive 57): SubtitleConverter.ConvertAsync has cognitive complexity 57 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SubtitleConverter.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"30f4085cb6a0d7817dc47ae7e23d11ebdae5c9240c51179569aefca2d83dc3f6"}},{"ruleId":"D2","level":"warning","message":{"text":"RichTextToPlainText.ConvertToText (cognitive 56): RichTextToPlainText.ConvertToText has cognitive complexity 56 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/RichTextToPlainText.cs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"f79882fcf50b4e3ea3184e7531876cc98b7e8d5bb5ce5938ce3de962cf8f4aa6"}},{"ruleId":"D2","level":"warning","message":{"text":"TmpegEncXml.LoadTMpeg (cognitive 56): TmpegEncXml.LoadTMpeg has cognitive complexity 56 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TmpegEncXml.cs"},"region":{"startLine":461}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7882bb7d532126dc10188c1824f58173377e6fb0509dbd0c1644c68f51d2a7e"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle49.LoadSubtitle (cognitive 56): UnknownSubtitle49.LoadSubtitle has cognitive complexity 56 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle49.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f20bace9756c617629ac6622a68be5b522a461b0070a33e98c4066282a51548"}},{"ruleId":"D2","level":"warning","message":{"text":"VobSubParser.OpenSubIdx (cognitive 56): VobSubParser.OpenSubIdx has cognitive complexity 56 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/VobSubParser.cs"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9b10129679439102de34bdca4c384175ed48a5026695ed0ee6086293d835a9d"}},{"ruleId":"D2","level":"warning","message":{"text":"AutoTranslateViewModel.DoTranslate (cognitive 55): AutoTranslateViewModel.DoTranslate has cognitive complexity 55 (threshold 15). Of this number, 43 points are the body\u0027s own statements and 12 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":1436}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a489527dfee438d840f6d785aab79ca2fee89630d63c83543f4e6fab6cd6f88"}},{"ruleId":"D2","level":"warning","message":{"text":"ContinuationUtilities.AddPrefixIfNeeded (cognitive 55): ContinuationUtilities.AddPrefixIfNeeded has cognitive complexity 55 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":442}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ec4ab8801435bc0fe4a98a222d9a044c28e94ff2e4b025c3039882437a4f6a4"}},{"ruleId":"D2","level":"warning","message":{"text":"GoogleTranslateV2.Translate (cognitive 55): GoogleTranslateV2.Translate has cognitive complexity 55 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/AutoTranslate/GoogleTranslateV2.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"72f4633178308a1cc8c74767bc7d1aff9eb991268672fee7ff6724f757cd9a57"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrLineGenerator.HoughPeaksOnMask (cognitive 55): NOcrLineGenerator.HoughPeaksOnMask has cognitive complexity 55 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":1234}}}],"partialFingerprints":{"codehealthFindingId/v1":"834c8aee78bdf818a680e67eb1dc8591479e501d8f7c3d3fdd4720b702b0cc58"}},{"ruleId":"D2","level":"warning","message":{"text":"InitLayout.RestoreLayoutPositions (cognitive 54): InitLayout.RestoreLayoutPositions has cognitive complexity 54 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitLayout.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"38ee88aa9b89d558fe081043b596e66c14a6078115016431713731f2abdafd29"}},{"ruleId":"D2","level":"warning","message":{"text":"WavePeakGenerator2.GeneratePeaks (cognitive 54): WavePeakGenerator2.GeneratePeaks has cognitive complexity 54 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/WaveToVisualizer2.cs"},"region":{"startLine":558}}}],"partialFingerprints":{"codehealthFindingId/v1":"966dfa8bb6e42a205c486945ba325959914b5203872b6186e4933aa09afc349c"}},{"ruleId":"D2","level":"warning","message":{"text":"CdgGraphics.Scroll (cognitive 54): CdgGraphics.Scroll has cognitive complexity 54 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/CDG/CdgGraphics.cs"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4f55ecf422dc409c4a2d87ea594f8bf17d68c24d3e80b15861c11eb7d720b6b"}},{"ruleId":"D2","level":"warning","message":{"text":"Helper.FixDash (cognitive 54): Helper.FixDash has cognitive complexity 54 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/Helper.cs"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"09eff79a8402c447ae51702a7bc72216389a1cb2534e838b5e037d026dd12e97"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.ToText (cognitive 54): AdvancedSubStationAlpha.ToText has cognitive complexity 54 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c79400f0bf10d6910a6657683f49195e90974cddee54395bfc0c9e589ac9742"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrFixReplaceList2.OcrFixReplaceList2.ctor (cognitive 54): OcrFixReplaceList2.OcrFixReplaceList2.ctor has cognitive complexity 54 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"f40cd74152b39b29b918513231c892ddf13c7faca754b6c50f613946d3fa717e"}},{"ruleId":"D2","level":"warning","message":{"text":"ModifySelectionRule.IsMatch (cognitive 53): ModifySelectionRule.IsMatch has cognitive complexity 53 (threshold 15). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/ModifySelection/ModifySelectionRule.cs"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f4a2d784141effe984e11aa5d455e9aa6fff31cdcbf6d3407852abd362cb780"}},{"ruleId":"D2","level":"warning","message":{"text":"FfmpegGenerator.GenerateHardcodedVideoFile (cognitive 53): FfmpegGenerator.GenerateHardcodedVideoFile has cognitive complexity 53 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/FfmpegGenerator.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"29b4ae8747f475af49396c555fc57c2b144251beb45772762ed53d370e438ed8"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmap.CropTransparentSidesAndBottom (cognitive 53): NikseBitmap.CropTransparentSidesAndBottom has cognitive complexity 53 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/NikseBitmap.cs"},"region":{"startLine":586}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2a74ceed850c0bd7fc8ca28898e611618361957366011c55042fcdece351a0d"}},{"ruleId":"D2","level":"warning","message":{"text":"Ebu.GetCharacter (cognitive 53): Ebu.GetCharacter has cognitive complexity 53 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":1798}}}],"partialFingerprints":{"codehealthFindingId/v1":"466dffa0522a85110655206bc0c91667f28ba419a9350f7b38cc18d930a75b44"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ComboBoxSubtitleFormatChanged (cognitive 52): MainViewModel.ComboBoxSubtitleFormatChanged has cognitive complexity 52 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":24175}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9080bb22d9d8327049376b80d0ed153aeb14c1dbcd1a27228c166bea49fc19d"}},{"ruleId":"D2","level":"warning","message":{"text":"SplitManager.Split (cognitive 52): SplitManager.Split has cognitive complexity 52 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ISplitManager.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"938d4464a716fb7a77bcc190af959cd10e5f0ed3d674e348e4c9bde9e4fdbd21"}},{"ruleId":"D2","level":"warning","message":{"text":"TextWithSubtitleSyntaxHighlightingConverter.ParseAssaTags (cognitive 52): TextWithSubtitleSyntaxHighlightingConverter.ParseAssaTags has cognitive complexity 52 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs"},"region":{"startLine":781}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb608a82271316a3601d7025d68fda1c9304952895a899b8f3b14744b309f731"}},{"ruleId":"D2","level":"warning","message":{"text":"DialogSplitMerge.FixDashes (cognitive 52): DialogSplitMerge.FixDashes has cognitive complexity 52 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/DialogSplitMerge.cs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"533d1e2955febde6e6b287436fca1b01970c486701a9f3498987b0e0d9185987"}},{"ruleId":"D2","level":"warning","message":{"text":"DialogSplitMerge.FixDashes (cognitive 52): DialogSplitMerge.FixDashes has cognitive complexity 52 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/DialogSplitMerge.cs"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8348390b9a8990a3c47f4efe1375f6f5af2858972b7354da1e1e9f1a8226202"}},{"ruleId":"D2","level":"warning","message":{"text":"FixStartWithUppercaseLetterAfterPeriodInsideParagraph.Fix (cognitive 52): FixStartWithUppercaseLetterAfterPeriodInsideParagraph.Fix has cognitive complexity 52 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixStartWithUppercaseLetterAfterPeriodInsideParagraph.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"02236d5ce0385c6b32c3cf75b7bfe02f20f5eef85d2162903c4357e645d4a597"}},{"ruleId":"D2","level":"warning","message":{"text":"Helper.FixDialogsOnOneLine (cognitive 52): Helper.FixDialogsOnOneLine has cognitive complexity 52 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/Helper.cs"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2cf34d380bb65a2a8362edefb4ed9e6cab1710da9deee37f3148e1261dd9bdc"}},{"ruleId":"D2","level":"warning","message":{"text":"DialogPresentationSegment.DialogPresentationSegment.ctor (cognitive 52): DialogPresentationSegment.DialogPresentationSegment.ctor has cognitive complexity 52 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TextST.cs"},"region":{"startLine":590}}}],"partialFingerprints":{"codehealthFindingId/v1":"06dea620fa93cfcd393391186ff3f9a4dc0b8154cec3a10b6a17b9f487edefd5"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrFixReplaceList2.CreateGuessesFromLetters (cognitive 52): OcrFixReplaceList2.CreateGuessesFromLetters has cognitive complexity 52 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"7878691002f358a72a31e497349418a5c4ce760a7863e4af2e3b80d7e14adec9"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.AutoTranscribeParagraphViaOpenAiAsync (cognitive 51): MainViewModel.AutoTranscribeParagraphViaOpenAiAsync has cognitive complexity 51 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 29 belong to 2 function literals inside it that branch. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":23318}}}],"partialFingerprints":{"codehealthFindingId/v1":"94af86035586393f55e05cdc86c88161c91c95a97a6826c7ccf96c6b041f746a"}},{"ruleId":"D2","level":"warning","message":{"text":"TextToSpeechViewModel.FixSpeed (cognitive 51): TextToSpeechViewModel.FixSpeed has cognitive complexity 51 (threshold 15). Of this number, 49 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":2751}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a3b610c9f30641df2aa6b06aa80c663a48fe593f00901f54710a209426ebf68"}},{"ruleId":"D2","level":"warning","message":{"text":"LanguageAutoDetect.DetectAnsiEncoding (cognitive 51): LanguageAutoDetect.DetectAnsiEncoding has cognitive complexity 51 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":1688}}}],"partialFingerprints":{"codehealthFindingId/v1":"64ffe325286d31e91f2a6a83e257372628880e9806af4d72c300d6ad13919ee5"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.AutoBreakLineMoreThanTwoLines (cognitive 51): Utilities.AutoBreakLineMoreThanTwoLines has cognitive complexity 51 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"028f6ac6244a2b85d8fbc443288f67651e39dfc665ca90fe7ec80694d70abd96"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.LoadStylesFromTimedText10 (cognitive 51): AdvancedSubStationAlpha.LoadStylesFromTimedText10 has cognitive complexity 51 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":573}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a5e49537b58c89700a5cec224ed815fed7823214fd4a3d2e3882e704fa831d6"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.LoadStylesFromTimedTextTimedDraft2006Oct (cognitive 51): AdvancedSubStationAlpha.LoadStylesFromTimedTextTimedDraft2006Oct has cognitive complexity 51 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":706}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ae07fa232e7497b43ab5bc8debe1ec7f8d2a8af3d00b866f096e65bb481eb98"}},{"ruleId":"D2","level":"warning","message":{"text":"EbuTextTimingInformation.GetNearestEbuColorCode (cognitive 51): EbuTextTimingInformation.GetNearestEbuColorCode has cognitive complexity 51 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":1141}}}],"partialFingerprints":{"codehealthFindingId/v1":"64a7f6df30fc05dcba3aba3aaa3c8769ce097573b1547c58187ccdedc8dfa127"}},{"ruleId":"D2","level":"warning","message":{"text":"EbuTextTimingInformation.GetNearestEbuColorCodeByte (cognitive 51): EbuTextTimingInformation.GetNearestEbuColorCodeByte has cognitive complexity 51 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":1237}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c14c318b387d28de882d437569aa91b158c05cb04b59b440b5703e3b6853a76"}},{"ruleId":"D2","level":"warning","message":{"text":"SoftNicolonSub.DoLoadSubtitle (cognitive 51): SoftNicolonSub.DoLoadSubtitle has cognitive complexity 51 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SoftNiColonSub.cs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"47997aa84987c248e4d833d11dccd138ef21626d332e85c3df55c9cafd93138d"}},{"ruleId":"D2","level":"warning","message":{"text":"SoftNiSub.LoadSubtitle (cognitive 51): SoftNiSub.LoadSubtitle has cognitive complexity 51 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SoftNiSub.cs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"6317c8884f39d724d7fa6fb68fdedaa9761aee70a1d662ac5ffdc46f469f24c9"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText200604.LoadSubtitle (cognitive 51): TimedText200604.LoadSubtitle has cognitive complexity 51 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText200604.cs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbcbe8cb8b12194e9f58ff4bdb641d7522446a022f74e4e1147faedfcecbb36c"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle17.LoadSubtitle (cognitive 51): UnknownSubtitle17.LoadSubtitle has cognitive complexity 51 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle17.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"79aa52758a97dde2afa54bf1af8967978fea7bd31dbfcd05b2d217811c030536"}},{"ruleId":"D2","level":"warning","message":{"text":"LibSEIntegration.SaveSubtitle (cognitive 51): LibSEIntegration.SaveSubtitle has cognitive complexity 51 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceb41c172a78cdb93d62ef54a34cc45c37072e043770bbf83e30581a1d5e46d1"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchStatics.CalculateGeneralStatistics (cognitive 50): BatchStatics.CalculateGeneralStatistics has cognitive complexity 50 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchStatics.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"a257875bf8f4d77e7e8bbf5a41f24b651e376856c2bfe5ba7dfaf1c03947dfb3"}},{"ruleId":"D2","level":"warning","message":{"text":"Ebu.Save (cognitive 50): Ebu.Save has cognitive complexity 50 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":1428}}}],"partialFingerprints":{"codehealthFindingId/v1":"38c9f80cd97e20d6d6ff717653bf552d8b8c891300d5628d48199e04d595fa6c"}},{"ruleId":"D2","level":"warning","message":{"text":"Pe2.LoadSubtitle (cognitive 50): Pe2.LoadSubtitle has cognitive complexity 50 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/PE2.cs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb8baea01de0e444f83e242985acf536450db69493b08318a97dda4cdf751dcd"}},{"ruleId":"D2","level":"warning","message":{"text":"VobSubParser.MergeVobSubPacks (cognitive 50): VobSubParser.MergeVobSubPacks has cognitive complexity 50 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/VobSubParser.cs"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"3971e8d2fa234f350512dc267c5f5900a9837c8554b80f2e620764909fa64525"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmapImageSplitter2.IsVerticalLineTransparent (cognitive 50): NikseBitmapImageSplitter2.IsVerticalLineTransparent has cognitive complexity 50 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":982}}}],"partialFingerprints":{"codehealthFindingId/v1":"79daa8b09873136c0aaf51d0a0423ae4f552e431f3b12ae0b41606862c9dfe55"}},{"ruleId":"D2","level":"warning","message":{"text":"Cavena890.Save (cognitive 49): Cavena890.Save has cognitive complexity 49 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":508}}}],"partialFingerprints":{"codehealthFindingId/v1":"074a770b4f5d7e7b92f481d6f7b526336f012724c2d5bc6fe114f470df601cc4"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectionSubtitleList.RtfDecode (cognitive 49): ProjectionSubtitleList.RtfDecode has cognitive complexity 49 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ProjectionSubtitleList.cs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"cad1084b59d2f13da394c8c8c291c98d410bf80da3a0892595106e5bcb70c340"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText200604Ooyala.LoadSubtitle (cognitive 49): TimedText200604Ooyala.LoadSubtitle has cognitive complexity 49 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText200604Ooyala.cs"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"dadf8d6e23051ffd1618a6a7b61ea16fe377a3a9dfa52b2b4eb7bb65ab12f842"}},{"ruleId":"D2","level":"warning","message":{"text":"YouTubeAnnotations.LoadSubtitle (cognitive 49): YouTubeAnnotations.LoadSubtitle has cognitive complexity 49 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/YouTubeAnnotations.cs"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"926f1d1face86d8ad6eb11bc5523fcf9ba3c8ba137d814ba87d61723c63b9183"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.MakeOutputFileName (cognitive 48): BatchConverter.MakeOutputFileName has cognitive complexity 48 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":2716}}}],"partialFingerprints":{"codehealthFindingId/v1":"33bfac352420dbbba38f06e82223b6e7a673b745f7f380a7ecbf9ca48536699b"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadSpeechToTextEngineViewModel.ProcessDownloadState (cognitive 48): DownloadSpeechToTextEngineViewModel.ProcessDownloadState has cognitive complexity 48 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdfb014449a8016c6ce12db822b561cdb55a0ddd1ad214e2f6d30e3b7ba6a618"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextViewModel.ProcessOnlineSttTranscription (cognitive 48): SpeechToTextViewModel.ProcessOnlineSttTranscription has cognitive complexity 48 (threshold 15). Of this number, 45 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":1164}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef0ccfa198d0030f06a962a225e738d4bf89e33c4c4c8e943b0f53827628ffb7"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadHelper.DownloadFileAsync (cognitive 48): DownloadHelper.DownloadFileAsync has cognitive complexity 48 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Download/DownloadHelper.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"bca4f2d301e17bfdf79899710a70ab793b35ee4e47baa02d47e74138a7e47e9e"}},{"ruleId":"D2","level":"warning","message":{"text":"Helper.FixEllipsesStartHelper (cognitive 48): Helper.FixEllipsesStartHelper has cognitive complexity 48 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/Helper.cs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"1714ad3ba3e36743bf86ca94537c9bfe9eeccdce8fdb3da43ca2faf846546dee"}},{"ruleId":"D2","level":"warning","message":{"text":"AdobeEncoreLineTabNewLine.LoadSubtitle (cognitive 48): AdobeEncoreLineTabNewLine.LoadSubtitle has cognitive complexity 48 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdobeEncoreLineTabNewLine.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"39ef955927df3f7bdd7595be892ac0c467ce6eec07ccd5b80d89679fb6dc4f34"}},{"ruleId":"D2","level":"warning","message":{"text":"ScenaristClosedCaptions.LoadSubtitle (cognitive 48): ScenaristClosedCaptions.LoadSubtitle has cognitive complexity 48 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ScenaristClosedCaptions.cs"},"region":{"startLine":826}}}],"partialFingerprints":{"codehealthFindingId/v1":"95ad4bdafde511dd34ced831ad25872242d1eb34b091294309308f523827fdb8"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.OnPointerWheelChanged (cognitive 47): AudioVisualizer.OnPointerWheelChanged has cognitive complexity 47 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":624}}}],"partialFingerprints":{"codehealthFindingId/v1":"7af2339e84eb1040383f51924edff6994b6edcec56ffeebc65a6a141f7913135"}},{"ruleId":"D2","level":"warning","message":{"text":"NetflixCheckShotChange.Check (cognitive 47): NetflixCheckShotChange.Check has cognitive complexity 47 (threshold 15). Of this number, 35 points are the body\u0027s own statements and 12 belong to 4 function literals inside it that branch. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/NetflixQualityCheck/NetflixCheckShotChange.cs"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ef4660fa19cf5e738942932d3fb48696cf840a28f5dbe041b79775cb619a3c8"}},{"ruleId":"D2","level":"warning","message":{"text":"NativeMethods.NativeMethods.ctor (cognitive 47): NativeMethods.NativeMethods.ctor has cognitive complexity 47 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibMpvDynamic/NativeMethods.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"198a4a137e429d40b99260641ae41ca46ea05af1115b2143bc2cfc02f6916f0a"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporter.AutoGuessImport (cognitive 47): UnknownFormatImporter.AutoGuessImport has cognitive complexity 47 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"42bd7d522830e18cbf7b713058e7fb4820edc56adbd82bf2676ddbb655c72adf"}},{"ruleId":"D2","level":"warning","message":{"text":"AdobePremierePrProj.LoadSubtitle (cognitive 47): AdobePremierePrProj.LoadSubtitle has cognitive complexity 47 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdobePremierePrProj.cs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcb9d52bac4e79ca09ae84a8b0dcdaae93e6b9fe06072eff7e6f2f5732ce5438"}},{"ruleId":"D2","level":"warning","message":{"text":"CheetahCaption.Save (cognitive 47): CheetahCaption.Save has cognitive complexity 47 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CheetahCaption.cs"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"141685162c611ecff5186c4731dd255b3c544cc86ee6468471305c9b147434d3"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.OnPointerPressed (cognitive 46): AudioVisualizer.OnPointerPressed has cognitive complexity 46 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8be6bccc725f322e4836737a6edaa188bc655117bda1cb48d43980827b57e66"}},{"ruleId":"D2","level":"warning","message":{"text":"TtsVoiceInstaller.EnsureCrispAsrAsync (cognitive 46): TtsVoiceInstaller.EnsureCrispAsrAsync has cognitive complexity 46 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TtsVoiceInstaller.cs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa097e7af756c2dc32405479f72bbb19e128e4b7e3b9dcf7a372860e6a3aa123"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.LoadMatroskaSSA (cognitive 46): Utilities.LoadMatroskaSSA has cognitive complexity 46 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":3187}}}],"partialFingerprints":{"codehealthFindingId/v1":"82dc3f21512fc228b32874c44003c5936a98e7f4dcb704633549f9426e3961f0"}},{"ruleId":"D2","level":"warning","message":{"text":"NameList.LoadNamesList (cognitive 46): NameList.LoadNamesList has cognitive complexity 46 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Dictionaries/NameList.cs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"f044546dfc8442d4720f6f7e58b576e8e3151e689e34654cb898df308167e06f"}},{"ruleId":"D2","level":"warning","message":{"text":"FixStartWithUppercaseLetterAfterColon.Fix (cognitive 46): FixStartWithUppercaseLetterAfterColon.Fix has cognitive complexity 46 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixStartWithUppercaseLetterAfterColon.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"d17cc3edcf67d9cdf2ef5913ec8a1d02cfd60ce7cb86e1c1cf78257ab819a6a6"}},{"ruleId":"D2","level":"warning","message":{"text":"FixUnneededPeriods.Fix (cognitive 46): FixUnneededPeriods.Fix has cognitive complexity 46 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixUnneededPeriods.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"e60c2b54a89fa766a6cb10a0ca2bbd768208c93e505cdedb3e6dac90700edda1"}},{"ruleId":"D2","level":"warning","message":{"text":"AribText.AribText.ctor (cognitive 46): AribText.AribText.ctor has cognitive complexity 46 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AribB36.cs"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9163ac0f4961fc84dd8eab8af13a7c82de3923b149a399e6b62a29a11c678f5"}},{"ruleId":"D2","level":"warning","message":{"text":"DvdStudioProSpace.LoadSubtitle (cognitive 46): DvdStudioProSpace.LoadSubtitle has cognitive complexity 46 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DvdStudioProSpace.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"790e93c8c067ae8b5f08c525c02abd3a66ba44b54903dedc6d4bf7b11e79fa28"}},{"ruleId":"D2","level":"warning","message":{"text":"Footage.LoadSubtitle (cognitive 46): Footage.LoadSubtitle has cognitive complexity 46 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Footage.cs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"93b22c0b6c3c220a1149c69f5b9a9cae0b4c81eba4bc621616e79a0fe7134caf"}},{"ruleId":"D2","level":"warning","message":{"text":"Pac.GetBytesViaLists (cognitive 46): Pac.GetBytesViaLists has cognitive complexity 46 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":2317}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3f65f26465067d774c11d3d32d043b62adb076a0082f500fe23d79f2c6ede8b"}},{"ruleId":"D2","level":"warning","message":{"text":"TimeLineMvt.LoadSubtitle (cognitive 46): TimeLineMvt.LoadSubtitle has cognitive complexity 46 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimelineMvt.cs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"e553581618a87677c6bd65fe8245a7a77857ee9d9c7bb1df192c6817411685d2"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrFixReplaceList2.FixOcrErrorViaLineReplaceList (cognitive 46): OcrFixReplaceList2.FixOcrErrorViaLineReplaceList has cognitive complexity 46 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"29eae984863eaf716d723eda3e7bf0d41bba2273812e889072fa6f7c02df7d40"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrLineGenerator.ChamferDistanceTransform (cognitive 46): NOcrLineGenerator.ChamferDistanceTransform has cognitive complexity 46 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":951}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a4539a94d837e3687f2ba894d20693b0225d915c9734485cab9c24d5d85bdea"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextPostProcessor.MergeShortLines (cognitive 45): SpeechToTextPostProcessor.MergeShortLines has cognitive complexity 45 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextPostProcessor.cs"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"51289583c2d0b33c198a1f663bb749c5ed3cd23939532f60afc803beef221141"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextViewModel.OutputHandler (cognitive 45): SpeechToTextViewModel.OutputHandler has cognitive complexity 45 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":4094}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a50bfaf63acff187db69d93987aa5127ebab543cd94eab97dec4a52c99ea23b"}},{"ruleId":"D2","level":"warning","message":{"text":"ContinuationUtilities.SanitizeString (cognitive 45): ContinuationUtilities.SanitizeString has cognitive complexity 45 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"76a6f0ca49b65a4b32d8e11f574b8494320ae21edf55cb2cfd8347573a66a5e4"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmap.CropSidesAndBottom (cognitive 45): NikseBitmap.CropSidesAndBottom has cognitive complexity 45 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/NikseBitmap.cs"},"region":{"startLine":706}}}],"partialFingerprints":{"codehealthFindingId/v1":"49bf7882d8e28aa77fdbe105c93b0e4eb151eef6bd5bdca70e2d555d757879b0"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageRenderer.RenderTextToCanvas (cognitive 45): ImageRenderer.RenderTextToCanvas has cognitive complexity 45 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ImageRenderer.cs"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"15beb7858c6a525d96e15294c1e6eb0b518210712cbac4ab1af4ea8aba5aea5b"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaDrawViewModel.OnKeyDown (cognitive 44): AssaDrawViewModel.OnKeyDown has cognitive complexity 44 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawViewModel.cs"},"region":{"startLine":1059}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c0862c080bdc803b653101c10bea95ab4bb63d9ffa827afaf9136ad315782d9"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.SaveSubtitleAs (cognitive 44): MainViewModel.SaveSubtitleAs has cognitive complexity 44 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":18259}}}],"partialFingerprints":{"codehealthFindingId/v1":"32552b6d18607ca69ff953fba339a5c0afa1cdacaa6a8475bd679f2aa0f40209"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.UpdatePlayheadEstimate (cognitive 44): MainViewModel.UpdatePlayheadEstimate has cognitive complexity 44 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":22569}}}],"partialFingerprints":{"codehealthFindingId/v1":"da4c7e824c18f7bacddce3c5d185b0ed3442b673e430d43a4420c282280daf70"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.MultipleReplace (cognitive 44): BatchConverter.MultipleReplace has cognitive complexity 44 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":1708}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a6e940a02f8586ae142909562af66c8ec4c92d6c4678bf38d400dab21e5d559"}},{"ruleId":"D2","level":"warning","message":{"text":"NetflixCheckNumbersOneToTenSpellOut.Check (cognitive 44): NetflixCheckNumbersOneToTenSpellOut.Check has cognitive complexity 44 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/NetflixQualityCheck/NetflixCheckNumbersOneToTenSpellOut.cs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4b8e0dd7e2b4f2dd9bddd6e7a641f4df41e001e24a1de129f8b615fd1fa66e7"}},{"ruleId":"D2","level":"warning","message":{"text":"LensCore.ParseLensProtoResponse (cognitive 44): LensCore.ParseLensProtoResponse has cognitive complexity 44 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Ocr/GoogleLens/LensCore.cs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"afcacfaa598b7844933dbf9b59f54aabda0ff6166a8d7c21f3ec69fd3d93eaf8"}},{"ruleId":"D2","level":"warning","message":{"text":"MergeLinesWithSameTimeCodes.Merge (cognitive 44): MergeLinesWithSameTimeCodes.Merge has cognitive complexity 44 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/MergeLinesWithSameTimeCodes.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"33f9dd127ecfca52baa5f789894d550d6c14c75e820bda81b043f768ec7ebbaa"}},{"ruleId":"D2","level":"warning","message":{"text":"SubRip.TryReadTimeCodesLine (cognitive 44): SubRip.TryReadTimeCodesLine has cognitive complexity 44 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubRip.cs"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbb86b160dfa87c114d2020b9545b86ca637a2e8076d9ca3beeaa02904266405"}},{"ruleId":"D2","level":"warning","message":{"text":"SubRip.IsValidTimeCode (cognitive 44): SubRip.IsValidTimeCode has cognitive complexity 44 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubRip.cs"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"70f976799e83462e352d1cb2f208ed4cebbd7cd54d12b0308493de7c7480fa01"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle20.LoadSubtitle (cognitive 44): UnknownSubtitle20.LoadSubtitle has cognitive complexity 44 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle20.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6573405ebed5880321dda780edb7c24d79e1471fba49209a6192f7277ca0d7c"}},{"ruleId":"D2","level":"warning","message":{"text":"MultipleReplaceViewModel.GeneratePreview (cognitive 43): MultipleReplaceViewModel.GeneratePreview has cognitive complexity 43 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/MultipleReplace/MultipleReplaceViewModel.cs"},"region":{"startLine":1141}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e2b092ca30b350608806a0186317d319687b665629796ec242c2bc4694db76c"}},{"ruleId":"D2","level":"warning","message":{"text":"MergeShortLinesHelper.MergeWithHighlights (cognitive 43): MergeShortLinesHelper.MergeWithHighlights has cognitive complexity 43 (threshold 15). Of this number, 42 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/MergeShortLines/MergeShortLinesHelper.cs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"63b879ea93c96b442a093cf2264e5c0ac200d6146f00e153de4274d2343ab5f2"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.ReverseStartAndEndingForRightToLeft (cognitive 43): Utilities.ReverseStartAndEndingForRightToLeft has cognitive complexity 43 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":1655}}}],"partialFingerprints":{"codehealthFindingId/v1":"95f541c5d670c2c37803f25650913f29e331c4cd8291ecdc09198daababf5eda"}},{"ruleId":"D2","level":"warning","message":{"text":"VobSubColorIsolation.Isolate (cognitive 43): VobSubColorIsolation.Isolate has cognitive complexity 43 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/VobSubColorIsolation.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0ad4c07a2424205270d76bb82efa308989a059168e33d1e142b13e3fd8a87c8"}},{"ruleId":"D2","level":"warning","message":{"text":"FixAloneLowercaseIToUppercaseI.FixAloneLowercaseIToUppercaseLine (cognitive 43): FixAloneLowercaseIToUppercaseI.FixAloneLowercaseIToUppercaseLine has cognitive complexity 43 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixAloneLowercaseIToUppercaseI.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cf878f5cbcb2c3234f5bd78e3a0e1c61ef1af320966d1d52455c7d2efe411cb"}},{"ruleId":"D2","level":"warning","message":{"text":"StructuredTitles.LoadSubtitle (cognitive 43): StructuredTitles.LoadSubtitle has cognitive complexity 43 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/StructuredTitles.cs"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"a27b4b6bb9e63912b6c4bb33cf4cdca4d00c27b462f766878dc75558003dc010"}},{"ruleId":"D2","level":"warning","message":{"text":"Ultech130.LoadSubtitle (cognitive 43): Ultech130.LoadSubtitle has cognitive complexity 43 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ultech130.cs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"b982fba98b50692080fdb1d4af5b5624f467d4fc99517ec49b928c748f06a51c"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle30.LoadSubtitle (cognitive 43): UnknownSubtitle30.LoadSubtitle has cognitive complexity 43 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle30.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"be8ee40fb24465b85ef99c8b4e14a3af7d1ffe383de03889d045ee5287f01e6e"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVTTFileWithLineNumber.LoadSubtitle (cognitive 43): WebVTTFileWithLineNumber.LoadSubtitle has cognitive complexity 43 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTTFileWithLineNumber.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb8daf9fe0b5d01eeb7ff619bae11f9968ddaa12a18aa40d902ca01f47d52efb"}},{"ruleId":"D2","level":"warning","message":{"text":"ConvertCommand.ApplyImageStyleFlags (cognitive 43): ConvertCommand.ApplyImageStyleFlags has cognitive complexity 43 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Commands/ConvertCommand.cs"},"region":{"startLine":936}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d5111e77f167340c7d07f2f7dc4589e2248b24d28fcde4a760c1069658f646f"}},{"ruleId":"D2","level":"warning","message":{"text":"TranslateSettingsViewModel.LoadValues (cognitive 42): TranslateSettingsViewModel.LoadValues has cognitive complexity 42 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/TranslateSettingsViewModel.cs"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c8fb4732b457827ac8266be81a354a5f7b34cb8eef49a6541db59f63251883a"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporterCsv.ReadCsvLines (cognitive 42): UnknownFormatImporterCsv.ReadCsvLines has cognitive complexity 42 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterCsv.cs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"64ee90701619fc5da6cc834016bf4decb925a041966cdf7c2bbdeb3287b610c1"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.LoadMatroskaTextSubtitle (cognitive 42): Utilities.LoadMatroskaTextSubtitle has cognitive complexity 42 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":2998}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6c8352bb4538ad517f5be5e630733ad6251359a676e5e1cc35648a950a99146"}},{"ruleId":"D2","level":"warning","message":{"text":"DvdStudioProSpaceOneSemicolon.LoadSubtitle (cognitive 42): DvdStudioProSpaceOneSemicolon.LoadSubtitle has cognitive complexity 42 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DvdStudioProSpaceOneSemicolon.cs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ea82198600afe2363f0a63be9a38e7ac0ddbd30bf6319c5d24cee1fe7264551"}},{"ruleId":"D2","level":"warning","message":{"text":"SwiftInterchange2.LoadSubtitle (cognitive 42): SwiftInterchange2.LoadSubtitle has cognitive complexity 42 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SwiftInterchange2.cs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"216c07c3a4c7e373d2fc4f2fa217dd44cbc379267fb9b63ea1a36472881ede68"}},{"ruleId":"D2","level":"warning","message":{"text":"TSB4.LoadSubtitle (cognitive 42): TSB4.LoadSubtitle has cognitive complexity 42 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TSB4.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb5c25a9bdb329063adaa5c5c3851cb8f578539d30f8ad812ad1c662de866bfa"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle31.LoadSubtitle (cognitive 42): UnknownSubtitle31.LoadSubtitle has cognitive complexity 42 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle31.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d170c92a8578814f6b03122500f94b62ed87f6a04c711a638a066b0fd3cbe02"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle64.LoadSubtitle (cognitive 42): UnknownSubtitle64.LoadSubtitle has cognitive complexity 42 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle64.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd3956ea6c2048a4f0018acdfa72b265709af6237ff408577a921a1cedd18b56"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrFixReplaceList2.ReplaceWord (cognitive 42): OcrFixReplaceList2.ReplaceWord has cognitive complexity 42 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":1139}}}],"partialFingerprints":{"codehealthFindingId/v1":"39a126052aac0f2aa8787219ceb026316380c1cb0302124e4f2a409c88ca24b5"}},{"ruleId":"D2","level":"warning","message":{"text":"InitListViewAndEditBox.MakeLayoutListViewAndEditBox (cognitive 41): InitListViewAndEditBox.MakeLayoutListViewAndEditBox has cognitive complexity 41 (threshold 15). Of this number, 37 points are the body\u0027s own statements and 4 belong to 4 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitListViewAndEditBox.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"2626ea0e00cc78eaaa3630ef7e5d7ca8df81f9eeee3586ed9149a3e716462b73"}},{"ruleId":"D2","level":"warning","message":{"text":"ReviewSpeechViewModel.Export (cognitive 41): ReviewSpeechViewModel.Export has cognitive complexity 41 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":497}}}],"partialFingerprints":{"codehealthFindingId/v1":"d715dbd3cbb4033d663a772b74f5570feaf4f9ccbc428cc8569d7881d85eb9c5"}},{"ruleId":"D2","level":"warning","message":{"text":"ZipUnpacker.UnpackTarGzStream (cognitive 41): ZipUnpacker.UnpackTarGzStream has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Compression/ZipUnpacker.cs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bfe74be9c38176b0148c17c8ed0adb5fb8eb141a420eba0fdc29ce004b75ea1"}},{"ruleId":"D2","level":"warning","message":{"text":"TextWithSubtitleSyntaxHighlightingConverter.SpellCheckLines (cognitive 41): TextWithSubtitleSyntaxHighlightingConverter.SpellCheckLines has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c8daccd5be2da13fd05e73570e33c852c56b5bf752f4efd82ef29034b220d2f"}},{"ruleId":"D2","level":"warning","message":{"text":"TextSplit.TryForWholeSentences (cognitive 41): TextSplit.TryForWholeSentences has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TextSplit.cs"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"eff4431d3b6f5770f1d21b5a788db814220686125f032e350ce7908652322624"}},{"ruleId":"D2","level":"warning","message":{"text":"ObjectDataSegment.ProcessDataTypeForPosition (cognitive 41): ObjectDataSegment.ProcessDataTypeForPosition has cognitive complexity 41 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/ObjectDataSegment.cs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"248695d44d185d1e5481465e8946c1bf6148dc9d60afb19fa9e9a074703b3261"}},{"ruleId":"D2","level":"warning","message":{"text":"AdobeEncoreLineTabs.LoadSubtitle (cognitive 41): AdobeEncoreLineTabs.LoadSubtitle has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdobeEncoreLineTabs.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"5608f432ac93f92579ff52f23a867c35b04c664bb0ba5397a866b529ddeb87b0"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.RemoveNativeFormatting (cognitive 41): AdvancedSubStationAlpha.RemoveNativeFormatting has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":1932}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2cbf8f1571c22def711e4bea2d4f060b0e410ac5b714b1e0417def984a34db6"}},{"ruleId":"D2","level":"warning","message":{"text":"CapMakerPlus.LoadSubtitle (cognitive 41): CapMakerPlus.LoadSubtitle has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CapMakerPlus.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3a23466cb714f12d71b0e1bd3be1066762eb813600009a6a7b69369d02637df"}},{"ruleId":"D2","level":"warning","message":{"text":"DvdStudioPro.LoadSubtitle (cognitive 41): DvdStudioPro.LoadSubtitle has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DvdStudioPro.cs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4c85a122be66f53402e590bffe3791b9c93247f8e8409198f121143cefb6a3d"}},{"ruleId":"D2","level":"warning","message":{"text":"DvdStudioProSpaceOne.LoadSubtitle (cognitive 41): DvdStudioProSpaceOne.LoadSubtitle has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DvdStudioProSpaceOne.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"da3244ec6c460d8a42a2645d1176099dae2ed867d670bb10cc13405cc2899ac2"}},{"ruleId":"D2","level":"warning","message":{"text":"Edl.LoadSubtitle (cognitive 41): Edl.LoadSubtitle has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Edl.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4c0d6daf42e56093222ee265fa4a9f83b5b519f975633914a0f76c8db224699"}},{"ruleId":"D2","level":"warning","message":{"text":"PlayStationSubs.GetSubtitleBitmap (cognitive 41): PlayStationSubs.GetSubtitleBitmap has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/PlayStationSubs.cs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7041d5a716afe2c9e4b76a994e776940018c733d3196fd2992f96f053f7c801"}},{"ruleId":"D2","level":"warning","message":{"text":"TitleExchangePro.LoadSubtitle (cognitive 41): TitleExchangePro.LoadSubtitle has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TitleExchangePro.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"07d21a1a974cdd12f23caebe7bfdfc6352551a410288300d58b2314bb422cc9c"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle54.LoadSubtitle (cognitive 41): UnknownSubtitle54.LoadSubtitle has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle54.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"076bd7713e3760018c032f7eed54cd20bf9dca2e798614c07c1a69a9a5ac0837"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText10PropertiesViewModel.WriteValuesToXml (cognitive 40): TimedText10PropertiesViewModel.WriteValuesToXml has cognitive complexity 40 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/TimedText10Properties/TimedText10PropertiesViewModel.cs"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bdb4673064e8f06d92788920d04e6c9457dd73bf8439f9c7e701d7f42013f41"}},{"ruleId":"D2","level":"warning","message":{"text":"SubtitleLineViewModel.GetErrors (cognitive 40): SubtitleLineViewModel.GetErrors has cognitive complexity 40 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/SubtitleLineViewModel.cs"},"region":{"startLine":988}}}],"partialFingerprints":{"codehealthFindingId/v1":"b032042ce692146db31199c272cc413af41e8b4eeec8e04ebf1357d09828f572"}},{"ruleId":"D2","level":"warning","message":{"text":"SsaStyle.FromRawSsa (cognitive 40): SsaStyle.FromRawSsa has cognitive complexity 40 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SsaStyle.cs"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"b10a741b491a589d2558240d85c8e0b88ea2535a020b122ebe4ed8894b952bc7"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVttToAssa.GetPositionInfo (cognitive 40): WebVttToAssa.GetPositionInfo has cognitive complexity 40 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/WebVttToAssa.cs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"e344a1e726a1ea4529de7eabeb139988ef9942437c702174879d4af1a7420ae7"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedTextNoNs.ToText (cognitive 40): TimedTextNoNs.ToText has cognitive complexity 40 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextNoNs.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"0974346c1a6bc7d53d8e7cab985ddac900ae7402c37cdc3acb3417b376df32e7"}},{"ruleId":"D2","level":"warning","message":{"text":"ApplyDurationLimitsViewModel.UpdatePreview (cognitive 39): ApplyDurationLimitsViewModel.UpdatePreview has cognitive complexity 39 (threshold 15). Most of this is not in the body itself: 2 of the 39 points are its own statements and the rest belongs to one function literal inside it that branches (line 102). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/ApplyDurationLimits/ApplyDurationLimitsViewModel.cs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f90fea34506eeedd8ce3eef9028079cbe590d23e2a436e838e95de3bb684ab8"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle7.LoadSubtitle (cognitive 39): UnknownSubtitle7.LoadSubtitle has cognitive complexity 39 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle7.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dcd928003d0cef7311466f169e6b19b85eb26121783be78d4e76de6ee6c7d0d"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVTT.GetPositionInfo (cognitive 39): WebVTT.GetPositionInfo has cognitive complexity 39 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTT.cs"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab3a4184dd7eae57f61a38c19cde7b8b87a84055ec652b01af5d3bcda847a108"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrBitmap.ToOldBitmap (cognitive 39): BinaryOcrBitmap.ToOldBitmap has cognitive complexity 39 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dbd7503a4603515d4f2f492842058721bd6575859bd0f5a3ee8611af58539f0"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrBitmap.IsLowercaseJ (cognitive 39): BinaryOcrBitmap.IsLowercaseJ has cognitive complexity 39 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"21a946e3a4afad27013e537c7e46c018cd8186797ceb02f7124959703909b454"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.OnPointerReleased (cognitive 38): AudioVisualizer.OnPointerReleased has cognitive complexity 38 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":775}}}],"partialFingerprints":{"codehealthFindingId/v1":"f77d9a6c980fe50c8440d8002e6727b69bacde16baf6296963cfabb8e4efa830"}},{"ruleId":"D2","level":"warning","message":{"text":"PaddleOcr.OcrBatch (cognitive 38): PaddleOcr.OcrBatch has cognitive complexity 38 (threshold 15). Of this number, 33 points are the body\u0027s own statements and 5 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/PaddleOcr.cs"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0ddbe0b2694b836fd4d75ef6ea884abb8f296fbae1a15c2cbf74ea4b6f77330"}},{"ruleId":"D2","level":"warning","message":{"text":"MergeSameTimeCodesViewModel.UpdatePreview (cognitive 38): MergeSameTimeCodesViewModel.UpdatePreview has cognitive complexity 38 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/MergeSubtitlesWithSameTimeCodes/MergeSameTimeCodesViewModel.cs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cd00b888971156936ae47bf22f2df6422b045e1be22498e5dbf6e1fe8b15fac"}},{"ruleId":"D2","level":"warning","message":{"text":"CutVideoViewModel.OnKeyDownHandler (cognitive 38): CutVideoViewModel.OnKeyDownHandler has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/CutVideo/CutVideoViewModel.cs"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"2456cb938868e694fe5a0c7faeecf0dc36ee0b0c3ddb59d2fb2f2f0950483091"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextViewModel.ProcessQwen3AsrCppTranscription (cognitive 38): SpeechToTextViewModel.ProcessQwen3AsrCppTranscription has cognitive complexity 38 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 12 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":947}}}],"partialFingerprints":{"codehealthFindingId/v1":"2879450f69bc02fb81e85ba103898dd89069b89b97b9d2a1d233cd96f1565970"}},{"ruleId":"D2","level":"warning","message":{"text":"ContinuationUtilities.AddSuffixIfNeeded (cognitive 38): ContinuationUtilities.AddSuffixIfNeeded has cognitive complexity 38 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"f31e2cc7c11e391a7ff82211bfc567cfedc78a7b1eb372d981449529e7a48bad"}},{"ruleId":"D2","level":"warning","message":{"text":"MxfParser.ParseMxf (cognitive 38): MxfParser.ParseMxf has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/MaterialExchangeFormat/MxfParser.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f24f977cd4021786d7583028d94d53564b796f087c4a8230b528e5ec5e6a756"}},{"ruleId":"D2","level":"warning","message":{"text":"TransportStreamParser.FixTeletextItalics (cognitive 38): TransportStreamParser.FixTeletextItalics has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/TransportStreamParser.cs"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f344c2907c6c670f167b74c6fad3f9adbca1863568e09e91ff7817151f20a42"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonType6.LoadSubtitle (cognitive 38): JsonType6.LoadSubtitle has cognitive complexity 38 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType6.cs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"4be0cee11197f62999c3bed19b202c4ab855026c1a19a118cbedd1a977f94231"}},{"ruleId":"D2","level":"warning","message":{"text":"QuickTimeText.LoadSubtitle (cognitive 38): QuickTimeText.LoadSubtitle has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/QuickTimeText.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"f18ee157b818ad7c80da84595c63113fcded166ee11fed02246e17911052e917"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedTextImsc11.LoadSubtitle (cognitive 38): TimedTextImsc11.LoadSubtitle has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImsc11.cs"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"77eee10274e38701fa4244d271299b2ec215e3f3d69e2723f8f8389c521e0f26"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle87.ReadLine (cognitive 38): UnknownSubtitle87.ReadLine has cognitive complexity 38 (threshold 15). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle87.cs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fe07204143679648606705ba7791f2077ea822099ae8163599a18b4b503ba48"}},{"ruleId":"D2","level":"warning","message":{"text":"ContainerSubtitleLoader.LoadTransportStream (cognitive 38): ContainerSubtitleLoader.LoadTransportStream has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/ContainerSubtitleLoader.cs"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"b03fadb7be8a1d74185738fe1db54af660d2a5022da3626097bdc9b325eda522"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmapImageSplitter2.SplitToLines (cognitive 38): NikseBitmapImageSplitter2.SplitToLines has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ac8abb43e9f9bda6190092b269695ef2b874800b718a08234b7dba6cbf305a3"}},{"ruleId":"D2","level":"warning","message":{"text":"CopyPasteTranslator.SplitMergedLines (cognitive 38): CopyPasteTranslator.SplitMergedLines has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Translate/CopyPasteTranslator.cs"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"82a2a81c57de96987142bba87002fb48e996014d19b66f0bdae40c45e96737d6"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedEffectWaveBlue.ApplyEffect (cognitive 37): AdvancedEffectWaveBlue.ApplyEffect has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectWaveBlue.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"8732efceb072d73587926c5faa6a38dab04ad6e200d45cd7294b24db4686da9f"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ImportStyling (cognitive 37): MainViewModel.ImportStyling has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":3400}}}],"partialFingerprints":{"codehealthFindingId/v1":"100d394459a0a73e8e3d9fac364bca490acce6cb1ef663e03921bfc2047824c7"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ApplySettings (cognitive 37): MainViewModel.ApplySettings has cognitive complexity 37 (threshold 15). Of this number, 36 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":9413}}}],"partialFingerprints":{"codehealthFindingId/v1":"edf4927df96afbe381d765d506ae8cfd3cfe4de67c1badccd95bb6dada019d99"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.SubtitleContextOpening (cognitive 37): MainViewModel.SubtitleContextOpening has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":20499}}}],"partialFingerprints":{"codehealthFindingId/v1":"13604cf9e135c83d77ff6490dcf8571e9da9c416cdc5e8cbde9eb5c1a48b7a17"}},{"ruleId":"D2","level":"warning","message":{"text":"MergeSameTextViewModel.UpdatePreview (cognitive 37): MergeSameTextViewModel.UpdatePreview has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/MergeSubtitlesWithSameText/MergeSameTextViewModel.cs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"fec3bb0afed2ed9ec0d491069a02093f1341b8d4ad4447996b4ae464f5bb0eaa"}},{"ruleId":"D2","level":"warning","message":{"text":"TextToSpeechViewModel.EnsureClonedVoiceRefTextAsync (cognitive 37): TextToSpeechViewModel.EnsureClonedVoiceRefTextAsync has cognitive complexity 37 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":582}}}],"partialFingerprints":{"codehealthFindingId/v1":"10fbcd664f63b261ff98b10f21735dd1c9b465c3b691c03a13f538fb3257287d"}},{"ruleId":"D2","level":"warning","message":{"text":"VoiceSettingsViewModel.ImportVoiceFromFileAsync (cognitive 37): VoiceSettingsViewModel.ImportVoiceFromFileAsync has cognitive complexity 37 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/VoiceSettings/VoiceSettingsViewModel.cs"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"34761a40525f97cf699cbe0f9599ec96ea07021c7942eb135ff564204edff4e4"}},{"ruleId":"D2","level":"warning","message":{"text":"SeNamesList.LoadNamesList (cognitive 37): SeNamesList.LoadNamesList has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Dictionaries/SeNamesList.cs"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"620e95fd4d142c67bc0012ddaab4ea468cccea6d15bce95db16ee5d07e676abc"}},{"ruleId":"D2","level":"warning","message":{"text":"ActorConverter.FixActors (cognitive 37): ActorConverter.FixActors has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ActorConverter.cs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb38bc8e6cf2c6f4b50d08533df96966683f3e14852a24b59b6edef4d21b5532"}},{"ruleId":"D2","level":"warning","message":{"text":"LanguageAutoDetect.GetEncodingFromFile (cognitive 37): LanguageAutoDetect.GetEncodingFromFile has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":1897}}}],"partialFingerprints":{"codehealthFindingId/v1":"15acff86a068223bd00fb70e698ad7901fd6feba4849b315d4024f353cac635b"}},{"ruleId":"D2","level":"warning","message":{"text":"Subtitle.AdjustDisplayTimeUsingPercent (cognitive 37): Subtitle.AdjustDisplayTimeUsingPercent has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Subtitle.cs"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"896eed9b8356d0ee54be23f9f53e8d17182a552912a8b59d1d79f9324223e283"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.CheckAndAddSubTags (cognitive 37): AdvancedSubStationAlpha.CheckAndAddSubTags has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":1465}}}],"partialFingerprints":{"codehealthFindingId/v1":"9734b64ae13bed8c2d7d545916b6b25874d8290a1cc8b46a6da275bd3d9315b1"}},{"ruleId":"D2","level":"warning","message":{"text":"AQTitle.LoadSubtitle (cognitive 37): AQTitle.LoadSubtitle has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AQTitle.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"0793cbd655e9ce3e1cda9d51bf3d51d464b78af2c789c7d4e6b9d4b64c850210"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle60.LoadSubtitle (cognitive 37): UnknownSubtitle60.LoadSubtitle has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle60.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb9728275faa8734f5871160c30b6dcd74bb40e6812430402d4e590b4668fa83"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownWordGuesser.CreateGuessesFromLetters (cognitive 37): UnknownWordGuesser.CreateGuessesFromLetters has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/UnknownWordGuesser.cs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"eab91f74d0ea95dfc2f05261768cc6aad93d1c87322617e438037620743d59ae"}},{"ruleId":"D2","level":"warning","message":{"text":"AiReviewViewModel.Review (cognitive 36): AiReviewViewModel.Review has cognitive complexity 36 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/AiReview/AiReviewViewModel.cs"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e6f4889bcef90ef920d4f195ee1eb6c66a972a3caeaf54e8762d5706b3b01eb"}},{"ruleId":"D2","level":"warning","message":{"text":"AutoTranslateViewModel.EvaluateDefaultTargetLanguageCode (cognitive 36): AutoTranslateViewModel.EvaluateDefaultTargetLanguageCode has cognitive complexity 36 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":2320}}}],"partialFingerprints":{"codehealthFindingId/v1":"1928ccd79640c114ceab535a423cf9b1a84a4aea4a62cc42b76d92dc21591c3f"}},{"ruleId":"D2","level":"warning","message":{"text":"SplitManager.FixTags (cognitive 36): SplitManager.FixTags has cognitive complexity 36 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ISplitManager.cs"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"87b371df71add6c4b29aca09dd3e90cfd3f13b8d46e3c71bd070ee8713fcd40f"}},{"ruleId":"D2","level":"warning","message":{"text":"HtmlUtil.RemoveHtmlTags (cognitive 36): HtmlUtil.RemoveHtmlTags has cognitive complexity 36 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/HtmlUtil.cs"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b470b166b9c3387bb7c1d65a9b6cfd37c7f287646484d4ba002bbea6f81814a"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.ReadFragmentedCcSamples (cognitive 36): MP4Parser.ReadFragmentedCcSamples has cognitive complexity 36 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":717}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4cd8522c52798cadbd2ad609bb82dc6f9a317860ae1386c2e0e1d58d4c5bc59"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonType14.LoadSubtitle (cognitive 36): JsonType14.LoadSubtitle has cognitive complexity 36 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType14.cs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d6f3a5563b441f332ba44d5011def97110b4b04fb61b6d0f36a37a315278536"}},{"ruleId":"D2","level":"warning","message":{"text":"LambdaCap.DecodeStyle (cognitive 36): LambdaCap.DecodeStyle has cognitive complexity 36 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/LambdaCap.cs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd27bd08b6dc4f322e31d1b180dbb7a4aaf75dcbfc08989dc21c2e39b77ffe11"}},{"ruleId":"D2","level":"warning","message":{"text":"NetflixImsc11Japanese.LoadSubtitle (cognitive 36): NetflixImsc11Japanese.LoadSubtitle has cognitive complexity 36 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/NetflixImsc11Japanese.cs"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b0fa80c2fbfa370126011e967fadd055fb5b6f454d8314035070ec430bae0c5"}},{"ruleId":"D2","level":"warning","message":{"text":"Pns.GetParagraph (cognitive 36): Pns.GetParagraph has cognitive complexity 36 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pns.cs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"a04e8598a88145d2f07b304fb871b5416d1f7449c45a56c3ebe6dbef7f1ee6ce"}},{"ruleId":"D2","level":"warning","message":{"text":"SubStationAlpha.ToText (cognitive 36): SubStationAlpha.ToText has cognitive complexity 36 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubStationAlpha.cs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"208c65e58d4bb638ce2d90e498c0a7ad3a0fe684db0a4f3fb4b42f780f229155"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle34.LoadSubtitle (cognitive 36): UnknownSubtitle34.LoadSubtitle has cognitive complexity 36 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle34.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"ded5e2689cb5c83f090eaa57da64f06e6cf96f22c4171c5e2580b4997b89c354"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageRenderer.ParseTextWithStyling (cognitive 36): ImageRenderer.ParseTextWithStyling has cognitive complexity 36 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ImageRenderer.cs"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d22dbe7ec4b286c0e30a1b6a849bdedd15c5e080e87665583dd44f12be6cd2d"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.GenerateTimeCodes (cognitive 35): AudioVisualizer.GenerateTimeCodes has cognitive complexity 35 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":3653}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cff8aeb8d9891afe5e1e121da63301535db1f1f2f3a3b24c7f8fd844289f5ba"}},{"ruleId":"D2","level":"warning","message":{"text":"DCinemaSmptePropertiesViewModel.LoadSettings (cognitive 35): DCinemaSmptePropertiesViewModel.LoadSettings has cognitive complexity 35 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5471e58a541d9da12022af9af3d858af66e72176e5695010e313a5abb72cb0e"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.TryHandleRightToLeftCaretNavigation (cognitive 35): MainViewModel.TryHandleRightToLeftCaretNavigation has cognitive complexity 35 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":21335}}}],"partialFingerprints":{"codehealthFindingId/v1":"29fb0e034927eb594d1bc9253fd35c2511fc0e6858cdd6f2d312ca58a6456492"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.TextBoxContextOpening (cognitive 35): MainViewModel.TextBoxContextOpening has cognitive complexity 35 (threshold 15). Of this number, 32 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":23890}}}],"partialFingerprints":{"codehealthFindingId/v1":"f67da52fa6359a9d3657f8b3d25267ddcef2506c3e0a34153a878846151ec980"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.AddFormatting (cognitive 35): BatchConverter.AddFormatting has cognitive complexity 35 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":1862}}}],"partialFingerprints":{"codehealthFindingId/v1":"271003a915d1f19e37f832b902174d8e1b6bf9d3aa46c6ab74de24fc128d8fc1"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextPostProcessor.Fix (cognitive 35): SpeechToTextPostProcessor.Fix has cognitive complexity 35 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextPostProcessor.cs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84a3da3641db9cd1bba1a90f4a93224d884ea84aadcdfbcb02f14934fdc3be7"}},{"ruleId":"D2","level":"warning","message":{"text":"FfmpegMediaInfo2.ParseLog (cognitive 35): FfmpegMediaInfo2.ParseLog has cognitive complexity 35 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/FfmpegMediainfo2.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"9391399db8b96339de8350dc2a2993090ed98c9c5bad5074d5f34f253c54e017"}},{"ruleId":"D2","level":"warning","message":{"text":"XmlSourceSyntaxHighlighting.ColorizeAttributes (cognitive 35): XmlSourceSyntaxHighlighting.ColorizeAttributes has cognitive complexity 35 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/XmlSourceSyntaxHighlighting.cs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"cceb9f508148df5f6b1c02de9d9cb87663cf41d2c9fea83d9d49919ff7d990a3"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaResampler.FixDrawing (cognitive 35): AssaResampler.FixDrawing has cognitive complexity 35 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/AssaResampler.cs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc7f9032efb5f0380dba512b5ebcc06b1edbb676a7ab68ea8a3623c77ac9d774"}},{"ruleId":"D2","level":"warning","message":{"text":"ContinuationUtilities.RemovePrefix (cognitive 35): ContinuationUtilities.RemovePrefix has cognitive complexity 35 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":638}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6d3b235473baf734d5a35a77fc682599ce1aba68e3c906282c88d6e0e15fb6a"}},{"ruleId":"D2","level":"warning","message":{"text":"LanguageAutoDetect.GetEncodingViaLetter (cognitive 35): LanguageAutoDetect.GetEncodingViaLetter has cognitive complexity 35 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":2166}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc759882322bb33d297a828e6b6acdebbc4ac3712d50b189dd3bad7338c5ec5b"}},{"ruleId":"D2","level":"warning","message":{"text":"KanopyHtml.LoadSubtitle (cognitive 35): KanopyHtml.LoadSubtitle has cognitive complexity 35 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/KanopyHtml.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eb6b70d5f6ee4fdc4326ba92c44af9d0928cc71b228ae32ed1a733c6a3dfbc8"}},{"ruleId":"D2","level":"warning","message":{"text":"Pac.Analyze (cognitive 35): Pac.Analyze has cognitive complexity 35 (threshold 15). Of this number, 34 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":1586}}}],"partialFingerprints":{"codehealthFindingId/v1":"e38f26ca4cc47a91748a66754fd6b94cc081c24ff9fad9f5419f454b74de3bd1"}},{"ruleId":"D2","level":"warning","message":{"text":"Pac.FixItalics (cognitive 35): Pac.FixItalics has cognitive complexity 35 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":2017}}}],"partialFingerprints":{"codehealthFindingId/v1":"719e70b2c9af2ece6d44b90489076b65630509124970eb2fcb98800008837065"}},{"ruleId":"D2","level":"warning","message":{"text":"QubeMasterImport.LoadSubtitle (cognitive 35): QubeMasterImport.LoadSubtitle has cognitive complexity 35 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/QubeMasterImport.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"3901bc1c7b75ce32436c67684eb19ed6338c04e0f0cbe95d08a15f95c8aa822a"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle11.LoadSubtitle (cognitive 35): UnknownSubtitle11.LoadSubtitle has cognitive complexity 35 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle11.cs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c064c4574445f6e896595be04cc73a4919e88a22bc7628662552d361a4b83f9"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle61.LoadSubtitle (cognitive 35): UnknownSubtitle61.LoadSubtitle has cognitive complexity 35 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle61.cs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"055aca528f10a23bad8810f5997b789c5146ec7ffeaa0e67747d9ee38836a6ab"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle89.LoadSubtitle (cognitive 35): UnknownSubtitle89.LoadSubtitle has cognitive complexity 35 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle89.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"be977ce5502e9b48ec6b81a59219b176b379f0c544f3b909da6b445774c34be3"}},{"ruleId":"D2","level":"warning","message":{"text":"LibSEIntegration.LoadSubtitleWithFormat (cognitive 35): LibSEIntegration.LoadSubtitleWithFormat has cognitive complexity 35 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8f2efc7fc8c43c31954d982ca1fce9307b5482c31b81813f96ccf8022d3b8f9"}},{"ruleId":"D2","level":"warning","message":{"text":"WhisperHelper.GetWhisperPathAndFileName (cognitive 35): WhisperHelper.GetWhisperPathAndFileName has cognitive complexity 35 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/AudioToText/WhisperHelper.cs"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"343ffd34ac80ca4069778662cdcc4d4c49db4b6b826c1d27b2459da84f7a859a"}},{"ruleId":"D2","level":"warning","message":{"text":"TextSplitter.SplitLineIntoLetters (cognitive 35): TextSplitter.SplitLineIntoLetters has cognitive complexity 35 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/ImageTextSplitter.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a27c1e3c2c021f3c21bfeacf9efb1e5bba524f7a9639625eb6596ddcf8a26fe"}},{"ruleId":"D2","level":"warning","message":{"text":"ItunesTimedTextPropertiesViewModel.WriteValuesToXml (cognitive 34): ItunesTimedTextPropertiesViewModel.WriteValuesToXml has cognitive complexity 34 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesViewModel.cs"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1324c740103f564908ad1ce1261578bba3119a18e97e0d10fd56ca879e90481"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ApplyTtsChanges (cognitive 34): MainViewModel.ApplyTtsChanges has cognitive complexity 34 (threshold 15). Of this number, 33 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":7523}}}],"partialFingerprints":{"codehealthFindingId/v1":"52d56af040785627ae14246b2023fb1eae47078c6a555247dfafcc4462dff923"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.LoadDvbFromMatroska (cognitive 34): MainViewModel.LoadDvbFromMatroska has cognitive complexity 34 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":17494}}}],"partialFingerprints":{"codehealthFindingId/v1":"e267f3be0c2ff8337588871bfcf0410184561bb01079ed863408c7e0dd7c46c8"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsImportExportViewModel.ImportSettings (cognitive 34): SettingsImportExportViewModel.ImportSettings has cognitive complexity 34 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsImportExport/SettingsImportExportViewModel.cs"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb1e8a99c6e1240e90dab382e803e99698df9d332a910cdb6548372a68784f21"}},{"ruleId":"D2","level":"warning","message":{"text":"WordListsViewModel.InitComboBoxWordListLanguages (cognitive 34): WordListsViewModel.InitComboBoxWordListLanguages has cognitive complexity 34 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/WordLists/WordListsViewModel.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c70714785af1005bfe91356961ba2122f042fbf8eca856979b52a9b893e72f3"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.SplitForChangedCalc (cognitive 34): Utilities.SplitForChangedCalc has cognitive complexity 34 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":2231}}}],"partialFingerprints":{"codehealthFindingId/v1":"604a55c6cb3daa9db73412a06738fbe6c6cf2b16a79751a8e4d36fce18732ed0"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.CheckForMoovVideoCea608 (cognitive 34): MP4Parser.CheckForMoovVideoCea608 has cognitive complexity 34 (threshold 15). Of this number, 33 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"57c2110b0a93f0f3f44d34d366934eca648a22c14fe9c376b19c587c4803468c"}},{"ruleId":"D2","level":"warning","message":{"text":"FixDoubleDash.Fix (cognitive 34): FixDoubleDash.Fix has cognitive complexity 34 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixDoubleDash.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"168b3f4a86040e45c0f135f66c6736e7121938a17a7d87d8823e7eeda9c09f57"}},{"ruleId":"D2","level":"warning","message":{"text":"AribB36.LoadSubtitle (cognitive 34): AribB36.LoadSubtitle has cognitive complexity 34 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AribB36.cs"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"1febe3ce73f0afa7966c472cffb6a1df21787fa4e7bbf0ace0713760b62e7c5f"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle9.LoadSubtitle (cognitive 34): UnknownSubtitle9.LoadSubtitle has cognitive complexity 34 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle9.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"96b6fd8466e5b975602cabea39b048b0e9277632bab864cdb8e6558e4f178524"}},{"ruleId":"D2","level":"warning","message":{"text":"CustomTextFormatter.GetParagraph (cognitive 34): CustomTextFormatter.GetParagraph has cognitive complexity 34 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/CustomTextFormatter.cs"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"97c2d06b64ebabb2bb27cbd17fac28ccfa289d4af34bb06f320a1066656413a3"}},{"ruleId":"D2","level":"warning","message":{"text":"SpellCheckDictionaryDisplay.GetTwoLetterLanguageCode (cognitive 34): SpellCheckDictionaryDisplay.GetTwoLetterLanguageCode has cognitive complexity 34 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/SpellCheck/SpellCheckDictionaryDisplay.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e5369bfd8d318bc05622358f76ef90ca9c003ac0d8f72e9b83e6f25cfd58f8b"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.DrawAllGridLines (cognitive 33): AudioVisualizer.DrawAllGridLines has cognitive complexity 33 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":2089}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4e5461e5cdcbe383ee5b79a21d5512ca7c312b094b0ec119dc76fd1dd32e8b6"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.BuildWaveFormFancy (cognitive 33): AudioVisualizer.BuildWaveFormFancy has cognitive complexity 33 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":2392}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d9556973e6b4194849293ee01349be15a6021c6f79f24b9e1b4c6b24043acb1"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedEffectRainbowPulse.ApplyEffect (cognitive 33): AdvancedEffectRainbowPulse.ApplyEffect has cognitive complexity 33 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectRainbowPulse.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5743f618322aa6215c72c50821ad4f9ff958eb55ff53e47209412a0ca4d90b8"}},{"ruleId":"D2","level":"warning","message":{"text":"PlainTextSplitter.FindBestBreakPoint (cognitive 33): PlainTextSplitter.FindBestBreakPoint has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportPlainText/PlainTextSplitter.cs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"46155865fc11a38aa388cc758fcfc692a09956f5e0a0318c02fb30ac84c2b47f"}},{"ruleId":"D2","level":"warning","message":{"text":"StatisticsViewModel.CalculateGeneralStatistics (cognitive 33): StatisticsViewModel.CalculateGeneralStatistics has cognitive complexity 33 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/Statistics/StatisticsViewModel.cs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"d974be9dc93327fb491663a6d36d6c8c7a5f12fc6e72750e7bdcde33014422d6"}},{"ruleId":"D2","level":"warning","message":{"text":"PasteFromClipboardHelper.PasteFromClipboard (cognitive 33): PasteFromClipboardHelper.PasteFromClipboard has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainHelpers/PasteFromClipboardHelper.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cb15eb270bc08ccff2bf0efa50bea4bb2ae56ad6b3d3005f35b4015419936fe"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ColumnPasteFromClipboard (cognitive 33): MainViewModel.ColumnPasteFromClipboard has cognitive complexity 33 (threshold 15). Of this number, 32 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":4391}}}],"partialFingerprints":{"codehealthFindingId/v1":"648beb965c6656ddd66151b6833c55903a359ee0a3fabef0174add7647687176"}},{"ruleId":"D2","level":"warning","message":{"text":"GoogleVisionOcr.GetAnnotations (cognitive 33): GoogleVisionOcr.GetAnnotations has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/GoogleVisionOcr.cs"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ffa37fed483d8b835e99c91a296df42c9fed32c4ab717fe69fbdf64b61d1b55"}},{"ruleId":"D2","level":"warning","message":{"text":"SkBitmapExtensions.CropTransparentColors (cognitive 33): SkBitmapExtensions.CropTransparentColors has cognitive complexity 33 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/SkBitmapExtensions.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"22087d9187538f2b82709ec55f9bcb5fe641f4fd3cc13e7f322befd764d579c0"}},{"ruleId":"D2","level":"warning","message":{"text":"ObjectDataSegment.FindPosition (cognitive 33): ObjectDataSegment.FindPosition has cognitive complexity 33 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/ObjectDataSegment.cs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"e563336aeba834a159473a619195eb8a975d88ccc4436aa65bb665516d145509"}},{"ruleId":"D2","level":"warning","message":{"text":"Cavena890.FixColors (cognitive 33): Cavena890.FixColors has cognitive complexity 33 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":2056}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad6a4cd02d57bcef59c257300b74d01afdd4510dfea98668a907af9abf6acb21"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle44.LoadSubtitle (cognitive 33): UnknownSubtitle44.LoadSubtitle has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle44.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"b255c02b53f5377dce0c2fdbb36a753f594e349a2a15d9a6b5d46a30196fd863"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle68.LoadSubtitle (cognitive 33): UnknownSubtitle68.LoadSubtitle has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle68.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"48f25e5390049918498873eb2063b61e3b1a6c6ec2048db3eecc10d9899f94b6"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle85.LoadSubtitle (cognitive 33): UnknownSubtitle85.LoadSubtitle has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle85.cs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4b711cdd88f4f2eec27724b81eefc6796edb54ee0bce5d70e6aa0678ca9f189"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrDb.IsMatch (cognitive 33): NOcrDb.IsMatch has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrDb.cs"},"region":{"startLine":510}}}],"partialFingerprints":{"codehealthFindingId/v1":"846583fca663759f7d0ce4903427054161ec4e905d57254473e476b289a6eba5"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrLineGenerator.RemoveSimilarLines (cognitive 33): NOcrLineGenerator.RemoveSimilarLines has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"20a1f31ba458b0038428745106a92bdce6a38907f88244bf7b42c483fa1f4f1c"}},{"ruleId":"D2","level":"warning","message":{"text":"GoogleCloudVisionApi.GetAnnotations (cognitive 33): GoogleCloudVisionApi.GetAnnotations has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/Service/GoogleCloudVisionApi.cs"},"region":{"startLine":369}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a718e31ffb4ee90e9fcb6b5107abd2af507271ec09919cfe3a2c1e15bcba008"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaPropertiesViewModel.LoadFromHeader (cognitive 32): AssaPropertiesViewModel.LoadFromHeader has cognitive complexity 32 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaPropertiesViewModel.cs"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba81a60e73ca694b841e75ac0142cc13e7c54bedf2093f4e7fc0ae8c07065e6a"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.RemoveFormatting (cognitive 32): BatchConverter.RemoveFormatting has cognitive complexity 32 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":1793}}}],"partialFingerprints":{"codehealthFindingId/v1":"145c70e6ddac8cd30b7dde391dd3cb32c60635e08dd9d1a5d967dc3ada2f5b6d"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConvertViewModel.UpdateAutoTranslateSettings (cognitive 32): BatchConvertViewModel.UpdateAutoTranslateSettings has cognitive complexity 32 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":2224}}}],"partialFingerprints":{"codehealthFindingId/v1":"56ed7031b1e587d2fea704c58fd464c44cc64d3e606ad18df860eb6330239f50"}},{"ruleId":"D2","level":"warning","message":{"text":"EmbedTrackPreviewViewModel.InitTrack (cognitive 32): EmbedTrackPreviewViewModel.InitTrack has cognitive complexity 32 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbedTrackPreviewViewModel.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"26f97a60d1abd18c427acf5dc98c35bc154dbc490a982975e5e5455b4f87091e"}},{"ruleId":"D2","level":"warning","message":{"text":"TextToSpeechViewModel.GenerateSpeech (cognitive 32): TextToSpeechViewModel.GenerateSpeech has cognitive complexity 32 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 10 belong to 4 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":2448}}}],"partialFingerprints":{"codehealthFindingId/v1":"6394984a4986324a240241ca5770a69b2df5e82064257ddf2744cc81972de5af"}},{"ruleId":"D2","level":"warning","message":{"text":"BluRayHelper.LoadBluRaySubFromMatroska (cognitive 32): BluRayHelper.LoadBluRaySubFromMatroska has cognitive complexity 32 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/BluRayHelper.cs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"6661b628b482d96bb86e9b8248d3391b311b054840f02fc5099558c23acbc16b"}},{"ruleId":"D2","level":"warning","message":{"text":"GetCcDataHelper.ParseCcDataFromSei (cognitive 32): GetCcDataHelper.ParseCcDataFromSei has cognitive complexity 32 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Cea608/GetCcDataHelper.cs"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe8cc209a47f9b66e179494f1f0216e0e981d83f6d000eccbf7406e689cadcb1"}},{"ruleId":"D2","level":"warning","message":{"text":"Ayato.GetText (cognitive 32): Ayato.GetText has cognitive complexity 32 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ayato.cs"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"e48bbdf9c6366e8bcfeb1af547917780fcd4684b54be693947304b7a9bac984f"}},{"ruleId":"D2","level":"warning","message":{"text":"Cappella.LoadSubtitle (cognitive 32): Cappella.LoadSubtitle has cognitive complexity 32 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cappella.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc30d5dbd85c64cd5dafbd7cb2592e87bde87f62bfeda7a7eedaac706fdf7322"}},{"ruleId":"D2","level":"warning","message":{"text":"DvdSubtitle.LoadSubtitle (cognitive 32): DvdSubtitle.LoadSubtitle has cognitive complexity 32 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DvdSubtitle.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"70f0cadf644c0612ccd9fa87a07520d576eb71d54f04e13ca504581d83cce628"}},{"ruleId":"D2","level":"warning","message":{"text":"Ebu.CloseFontTagIfNewColor (cognitive 32): Ebu.CloseFontTagIfNewColor has cognitive complexity 32 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":2314}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d8e1c1b17d67d30ccfe6cf83bbcb9b94c1a2c55869034f83a0471c585f2d3bf"}},{"ruleId":"D2","level":"warning","message":{"text":"Sami.ToText (cognitive 32): Sami.ToText has cognitive complexity 32 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Sami.cs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3135eac602f1794848311d982920cecd3687558d6cab7c8e27f06935abf6c93"}},{"ruleId":"D2","level":"warning","message":{"text":"SubtitleConverter.ConvertVobBatchAsync (cognitive 32): SubtitleConverter.ConvertVobBatchAsync has cognitive complexity 32 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SubtitleConverter.cs"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7fe518ea59c023600953c1b4ead31ec3d0d32e09443ba7388eb7d4e6fb49698"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedEffectConfetti.ApplyEffect (cognitive 31): AdvancedEffectConfetti.ApplyEffect has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectConfetti.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"c92850db95b2e43b81a18ff3133d0b3c99c4ef418862df848a8049f36a0569f9"}},{"ruleId":"D2","level":"warning","message":{"text":"MacWindowsMenuInterop.TryRegisterWindowsMenu (cognitive 31): MacWindowsMenuInterop.TryRegisterWindowsMenu has cognitive complexity 31 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/MacWindowsMenuInterop.cs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"88b403d00d0dca785038c4edcc5c50faf9c60a2fda55bc14da3cad9bca3ddf7f"}},{"ruleId":"D2","level":"warning","message":{"text":"GoogleLensOcr.OcrBatch (cognitive 31): GoogleLensOcr.OcrBatch has cognitive complexity 31 (threshold 15). Most of this is not in the body itself: 13 of the 31 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 102, 169). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/GoogleLensOcr.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b059f3d6456470bb1bb43b1ee5df968629aecfd65e4b9acd6d10768911816b8"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.EnsureCrispEmbedReady (cognitive 31): OcrViewModel.EnsureCrispEmbedReady has cognitive complexity 31 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1285}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0f79bd30e357a67497eeb79eec9b023f57396ff47e552198e621b6f1bfdf96f"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.EngineSelectionChanged (cognitive 31): OcrViewModel.EngineSelectionChanged has cognitive complexity 31 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":4751}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe6448eae305fb8cf12bd6c1622ecafe45d43ca00a1438a6d4295142ef724734"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.LoadDvbFromMatroska (cognitive 31): BatchConverter.LoadDvbFromMatroska has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf921852a85bef5737547bbd5a0246dc75e9b240f6693626d7286de64bfb7f0e"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.LoadBluRaySupFromMatroska (cognitive 31): BatchConverter.LoadBluRaySupFromMatroska has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":582}}}],"partialFingerprints":{"codehealthFindingId/v1":"33438694fd73f400c0b479900d4c8ccd2eec8d37431719927f3841585a1caf68"}},{"ruleId":"D2","level":"warning","message":{"text":"AutoTranslateViewModel.SaveSettings (cognitive 31): AutoTranslateViewModel.SaveSettings has cognitive complexity 31 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"32bf14491abd21a909cac414668c0b392e546e5ad64915aa1adce56b5a07b158"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextViewModel.OnTimerWhisperOnElapsed (cognitive 31): SpeechToTextViewModel.OnTimerWhisperOnElapsed has cognitive complexity 31 (threshold 15). Most of this is not in the body itself: 13 of the 31 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 750, 650). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd2f402f2ecf27882c0439c134fe3671ecb2427a63c6e8974592e2caeeb160a7"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextViewModel.MakeWavePeaks (cognitive 31): SpeechToTextViewModel.MakeWavePeaks has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":2007}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2b95e814a74fb01fa202abad2dd25d0f54ee2259f385626e724563cab52aff4"}},{"ruleId":"D2","level":"warning","message":{"text":"FfmpegGenerator.AlterEmbeddedTracksMatroska (cognitive 31): FfmpegGenerator.AlterEmbeddedTracksMatroska has cognitive complexity 31 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/FfmpegGenerator.cs"},"region":{"startLine":1337}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3d8d05b3e2ea36bca3abf2ae56d1b00b6e3237d095676354f9229102c713473"}},{"ruleId":"D2","level":"warning","message":{"text":"PlainTextImporter.ImportAutoSplit (cognitive 31): PlainTextImporter.ImportAutoSplit has cognitive complexity 31 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/PlainTextImporter.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"21fc86b620434979cc4f14a1e24f91bce6db28e3e91cf688f60d56df63d73793"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporter.ImportTimeCodesOnAloneLines (cognitive 31): UnknownFormatImporter.ImportTimeCodesOnAloneLines has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"64e43238ee0dfe463bc6dcbcd46b06b12ed9ea22ace1588ae2f01d14f7bcb18e"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.RemoveSsaTags (cognitive 31): Utilities.RemoveSsaTags has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":886}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7e2b2a891653e756b7ad97e8063a7a890b076b3e9e9e596472de1c511b035ef"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.AddToUserDictionary (cognitive 31): Utilities.AddToUserDictionary has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":1301}}}],"partialFingerprints":{"codehealthFindingId/v1":"93ca39cb285d03998f035e1e370cb1fdf1ea93c6c600ff03d6211287b513d874"}},{"ruleId":"D2","level":"warning","message":{"text":"CmafParser.ParseCmaf (cognitive 31): CmafParser.ParseCmaf has cognitive complexity 31 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/CmafParser.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc10f0d4aeb10d00a41f3cb261346a15aaedda5cb15b624b966a99eaeea1ede9"}},{"ruleId":"D2","level":"warning","message":{"text":"TimeCodesBeautifier.Beautify (cognitive 31): TimeCodesBeautifier.Beautify has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/TimeCodesBeautifier.cs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ef14ef03968a9cc5b0b29eb85b0a47802aac6d89d6d8ec6bf55bdd27244ad65"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.FormatText (cognitive 31): AdvancedSubStationAlpha.FormatText has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":1057}}}],"partialFingerprints":{"codehealthFindingId/v1":"86d2d657b76841b46fb5fccc7425a91334dd5b2b0a08b2bfca35f41f9dd03397"}},{"ruleId":"D2","level":"warning","message":{"text":"NciTimedRollUpCaptions.LoadSubtitle (cognitive 31): NciTimedRollUpCaptions.LoadSubtitle has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/NciTimedRollUpCaptions.cs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"f96fe466809b9b8ac0dd925474f73adf8ed7ac34e3311382b8d04bb150bea860"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle50.LoadSubtitle (cognitive 31): UnknownSubtitle50.LoadSubtitle has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle50.cs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"77db2f9c479ab665599768e4ae82b8bc45b3f79581c7238903818a0cf9c14aec"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle6.LoadSubtitle (cognitive 31): UnknownSubtitle6.LoadSubtitle has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle6.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"4516187e90b279fa154f90cd212bbc0b3302d1cb956dd2d10fa7d74a6728599c"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrFixEngine.SplitLine (cognitive 31): OcrFixEngine.SplitLine has cognitive complexity 31 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixEngine.cs"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"1da6b0752f0b84a25d9157dbf2103059033ae9554ac17a8eeda75fd0dadd820a"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrFixReplaceList2.FixCommonWordErrors (cognitive 31): OcrFixReplaceList2.FixCommonWordErrors has cognitive complexity 31 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7659f2f7af0cf5f97e9eb51a927b3d54e22470eeffffd45c51a1efceac56ad8"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.HitTestParagraph (cognitive 30): AudioVisualizer.HitTestParagraph has cognitive complexity 30 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":1613}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b1357cf163f05330c6502ea0f73f1cfbe14a4b8452c122a4e00f1454d22b6c9"}},{"ruleId":"D2","level":"warning","message":{"text":"MultipleReplaceViewModel.BuildReplaceExpressions (cognitive 30): MultipleReplaceViewModel.BuildReplaceExpressions has cognitive complexity 30 (threshold 15). Of this number, 29 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/MultipleReplace/MultipleReplaceViewModel.cs"},"region":{"startLine":1222}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ee45ec3d0bab4c4fe4515283f80c7c3ad2b6b84ab86927f5c55c5dac217eba4"}},{"ruleId":"D2","level":"warning","message":{"text":"ExportPlainTextViewModel.GetExportText (cognitive 30): ExportPlainTextViewModel.GetExportText has cognitive complexity 30 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportPlainText/ExportPlainTextViewModel.cs"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"3109a18be4396105953ba0bf3e9e45befd088d818c49597689ceee042182f173"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.AddSubtitleGridSpellCheckMenuItems (cognitive 30): MainViewModel.AddSubtitleGridSpellCheckMenuItems has cognitive complexity 30 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":20636}}}],"partialFingerprints":{"codehealthFindingId/v1":"c58000e7d2216462f7c6e054af4740bb94746070ab81d17b54d30194a42400f8"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrCharacterAddViewModel.KeyDown (cognitive 30): NOcrCharacterAddViewModel.KeyDown has cognitive complexity 30 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae8f425fd28aa74dd46c06f420fcfc3182031f81744322f8acc4e8e5f71e2888"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsViewModel.LoadSettings (cognitive 30): SettingsViewModel.LoadSettings has cognitive complexity 30 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsViewModel.cs"},"region":{"startLine":658}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ce8fab12c27041fe68c239e8fd65a7330583497a688975091568b1c03aeb884"}},{"ruleId":"D2","level":"warning","message":{"text":"ReviewSpeechViewModel.RegenerateAudio (cognitive 30): ReviewSpeechViewModel.RegenerateAudio has cognitive complexity 30 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":784}}}],"partialFingerprints":{"codehealthFindingId/v1":"32555103bf4718b4181cf485eb668500d443d340f5da0f6fed16548e741f0e9d"}},{"ruleId":"D2","level":"warning","message":{"text":"MergeManager.MergeSelectedLines (cognitive 30): MergeManager.MergeSelectedLines has cognitive complexity 30 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/MergeManager.cs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"5470b88f918329f2785e8595c33bf8b647ae31bba71e3849ba6a62818a6113ae"}},{"ruleId":"D2","level":"warning","message":{"text":"LibMpvDynamicPlayer.GetAudioTracks (cognitive 30): LibMpvDynamicPlayer.GetAudioTracks has cognitive complexity 30 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibMpvDynamic/LibMpvDynamicPlayer.cs"},"region":{"startLine":1550}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ab9b2a78c00beff8a0219099a8e40ff7ad7ac81cd2739a16ca817cd50787651"}},{"ruleId":"D2","level":"warning","message":{"text":"DialogSplitMerge.IsDialog (cognitive 30): DialogSplitMerge.IsDialog has cognitive complexity 30 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/DialogSplitMerge.cs"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"613e85e3913e4d8e56cac4f0df30c0f3b15d1ac5d516298a1e8f25c612e5354f"}},{"ruleId":"D2","level":"warning","message":{"text":"FixCasing.FixEnglishAloneILowerToUpper (cognitive 30): FixCasing.FixEnglishAloneILowerToUpper has cognitive complexity 30 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/FixCasing.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"5805441af038485d9f4ab19fea89dc10bcf8837738abb0569b889a565ab44554"}},{"ruleId":"D2","level":"warning","message":{"text":"XSub.GenerateBitmap (cognitive 30): XSub.GenerateBitmap has cognitive complexity 30 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/XSub.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"57550e668dbd0ee5a5073d717b363423bdda8811f007d7591dc884707f07803b"}},{"ruleId":"D2","level":"warning","message":{"text":"BelleNuitSubtitler.LoadSubtitle (cognitive 30): BelleNuitSubtitler.LoadSubtitle has cognitive complexity 30 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/BelleNuitSubtitler.cs"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"87a56eebfafe87324570235e2b49a9c37feb9048a7d08a5db8aeb47ab43f56f3"}},{"ruleId":"D2","level":"warning","message":{"text":"Chk.ApplyFont (cognitive 30): Chk.ApplyFont has cognitive complexity 30 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Chk.cs"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"738629303a4456c70696927f8ce456c53dc6985cfe8c35fb0bd7287241be2c8e"}},{"ruleId":"D2","level":"warning","message":{"text":"EbuTtD.ReadNode (cognitive 30): EbuTtD.ReadNode has cognitive complexity 30 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/EbuTtD.cs"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"9be6c0e22138615b71c3539d16fb503bf1372d9840d51df9ee31a652b1540f0b"}},{"ruleId":"D2","level":"warning","message":{"text":"ESubXf.GenerateLineWithSpan (cognitive 30): ESubXf.GenerateLineWithSpan has cognitive complexity 30 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ESubXf.cs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7f4aba254da3be5f3a79cdd734b7b5e7776f0f9d26e343284bc17f9e63bbee4"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalCutProImage.LoadSubtitle (cognitive 30): FinalCutProImage.LoadSubtitle has cognitive complexity 30 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProImage.cs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"aca71cf8a7facc76d0c566a4740f8775f30700c057c3cf9ae94784b2671bb513"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalCutProXmlName.LoadSubtitle (cognitive 30): FinalCutProXmlName.LoadSubtitle has cognitive complexity 30 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProXmlName.cs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec616d0dff10f134701cfa49ba20f5f0d6c0b7b9c260ab56baf5b819a3a47ac8"}},{"ruleId":"D2","level":"warning","message":{"text":"IaiSub.GetParagraph (cognitive 30): IaiSub.GetParagraph has cognitive complexity 30 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/IaiSub.cs"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1db196d1685581245b986a3273b626e097f769196a571c9a0d6ec83cbc18384"}},{"ruleId":"D2","level":"warning","message":{"text":"JacoSub.DecodeText (cognitive 30): JacoSub.DecodeText has cognitive complexity 30 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JacoSub.cs"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"af883fe98dfa18d0205ffa91bc16ea3f09af30138b701ae879e9a7b28e0de092"}},{"ruleId":"D2","level":"warning","message":{"text":"SubStationAlpha.RemoveNativeFormatting (cognitive 30): SubStationAlpha.RemoveNativeFormatting has cognitive complexity 30 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubStationAlpha.cs"},"region":{"startLine":689}}}],"partialFingerprints":{"codehealthFindingId/v1":"842cec543ce7884ca98896feb2037816fc2a6659844031994ecda8ac035236f0"}},{"ruleId":"D2","level":"warning","message":{"text":"TMPlayer.LoadSubtitle (cognitive 30): TMPlayer.LoadSubtitle has cognitive complexity 30 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TMPlayer.cs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"0370eedb12caad402f1635decda712ccc8a2e5373cad65a8133cb7b196612c94"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle11.ToText (cognitive 30): UnknownSubtitle11.ToText has cognitive complexity 30 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle11.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddaa325eaad9569a1e52cf2935a07c2f30348c881e3b86dde26a6c2892659c6c"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle55.LoadSubtitle (cognitive 30): UnknownSubtitle55.LoadSubtitle has cognitive complexity 30 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle55.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cb2a6cfa14c54a8168485979f12fe05d31e36b6b214b8273e721b7ee377ee26"}},{"ruleId":"D2","level":"warning","message":{"text":"ContainerSubtitleLoader.LoadMatroska (cognitive 30): ContainerSubtitleLoader.LoadMatroska has cognitive complexity 30 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/ContainerSubtitleLoader.cs"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f79120d2dc490816d7b44b689ee11de0df0f7409c3dcd1bd5baff58dd783303"}},{"ruleId":"D2","level":"warning","message":{"text":"SubtitleLinter.Lint (cognitive 30): SubtitleLinter.Lint has cognitive complexity 30 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SubtitleLinter.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"278e446b4a91c998f549ffc4cfa8117a27af9e47591d451c3a38dd5de1066c79"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmapImageSplitter2.SplitBitmapToLettersNew (cognitive 30): NikseBitmapImageSplitter2.SplitBitmapToLettersNew has cognitive complexity 30 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"13bb12afb883eb8bcf2aa86aa6892283f9feed48d880a7058b84578f673fb782"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrLineGenerator.AddSkeletonForegroundLines (cognitive 30): NOcrLineGenerator.AddSkeletonForegroundLines has cognitive complexity 30 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":438}}}],"partialFingerprints":{"codehealthFindingId/v1":"139e28ef21e2c98fa991e58a4327c4bcba874539e179a3766eaa0344d4fe70ce"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedEffectWave.ApplyEffect (cognitive 29): AdvancedEffectWave.ApplyEffect has cognitive complexity 29 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectWave.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2f064864f0a8d3cc66017674ed7016a0d2c1b04a6ebc9f211d434552ba2d3c8"}},{"ruleId":"D2","level":"warning","message":{"text":"MultipleReplaceViewModel.RulesTreeView_KeyDown (cognitive 29): MultipleReplaceViewModel.RulesTreeView_KeyDown has cognitive complexity 29 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 9 belong to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/MultipleReplace/MultipleReplaceViewModel.cs"},"region":{"startLine":1025}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7e515494039850452045e280f7a6eaaa1803974e742e4032ed6b3d6bed1e8d6"}},{"ruleId":"D2","level":"warning","message":{"text":"CompareViewModel.InsertMissingLines (cognitive 29): CompareViewModel.InsertMissingLines has cognitive complexity 29 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/Compare/CompareViewModel.cs"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c534ce6d001dc1e78a913e079b2bc50594a12f885bc1e4f9edc41d5ba80f886"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedTextImsc11PropertiesViewModel.WriteValuesToXml (cognitive 29): TimedTextImsc11PropertiesViewModel.WriteValuesToXml has cognitive complexity 29 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/TimedTextImsc11Properties/TimedTextImsc11PropertiesViewModel.cs"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"61a45e259f80deb7a553074871e336e4e8c966b0f0669ccca2aabf1d616ba18e"}},{"ruleId":"D2","level":"warning","message":{"text":"ImportPlainTextViewModel.UpdatePreviewText (cognitive 29): ImportPlainTextViewModel.UpdatePreviewText has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportPlainText/ImportPlainTextViewModel.cs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"609b6d4db3c6d6be44a32244b69db31f87ef6a3e69e3e3a7e82426fed0d2dc0b"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.LoadAudioTrackMenuItems (cognitive 29): MainViewModel.LoadAudioTrackMenuItems has cognitive complexity 29 (threshold 15). Most of this is not in the body itself: 6 of the 29 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 19310, 19288). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":19278}}}],"partialFingerprints":{"codehealthFindingId/v1":"10eb3dcc351d3a909e4451d0710e92d13a5a26a8b7a0d621b879bd5cf69774f4"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.ImportTextFromSubtitle (cognitive 29): OcrViewModel.ImportTextFromSubtitle has cognitive complexity 29 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":827}}}],"partialFingerprints":{"codehealthFindingId/v1":"90f3f975c6de5913c60c81d03fe3467aeab95f23f3e04de978258848ad4fe023"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryEditViewModel.ExtractMkvDvb (cognitive 29): BinaryEditViewModel.ExtractMkvDvb has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":944}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ecfe1a75b1c5af61180318602ae422e50ba64d1b93312431042766a1a1dfbdf"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.OcrSingleNOcrImage (cognitive 29): BatchConverter.OcrSingleNOcrImage has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":815}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5efe1135e50cb9a41c90bcb1d3f34375b893d3ad8a75591d48611dff68e0aa3"}},{"ruleId":"D2","level":"warning","message":{"text":"UiUtil.MakeColorPickerButton (cognitive 29): UiUtil.MakeColorPickerButton has cognitive complexity 29 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 13 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/UiUtil.cs"},"region":{"startLine":2177}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6e5cd6556678887831d78430d93dd15e1a5e7d80c62734615adfc08f1aa2ba5"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.ReadWvttSample (cognitive 29): MP4Parser.ReadWvttSample has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":1035}}}],"partialFingerprints":{"codehealthFindingId/v1":"544ede9652ce59361369be9132706766c2c5435807e184d7b6fc4c3518f75390"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalCutProXml15.LoadSubtitle (cognitive 29): FinalCutProXml15.LoadSubtitle has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProXml15.cs"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e6b159e8661ba044a2e49ef7d88834c6c090683af2430c02822ed60adadf941"}},{"ruleId":"D2","level":"warning","message":{"text":"HtmlSamiArray.LoadSubtitle (cognitive 29): HtmlSamiArray.LoadSubtitle has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/HtmlSamiArray.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ad05e9f0303955e0f0b7420d0a28678cace4a34b08eb097226969e311eaa83"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonTypeOnlyLoad6.LoadSubtitle (cognitive 29): JsonTypeOnlyLoad6.LoadSubtitle has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonTypeOnlyLoad6.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c91cc346cd8d217a3b34760e40e73b2a25093e39f4fcdf85fe2313654b36f1a"}},{"ruleId":"D2","level":"warning","message":{"text":"OresmeDocXDocument.LoadSubtitle (cognitive 29): OresmeDocXDocument.LoadSubtitle has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/OresmeDocXDocument.cs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4c3f2e0493222f26456161c4e529815cf6d474c56a2a6def3db31789a2e9c87"}},{"ruleId":"D2","level":"warning","message":{"text":"Pac.WriteParagraph (cognitive 29): Pac.WriteParagraph has cognitive complexity 29 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":1302}}}],"partialFingerprints":{"codehealthFindingId/v1":"173f572e954e11509d64676dcf74540075e8dd3719ed3f00e0e41c55c45a3938"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle32.LoadSubtitle (cognitive 29): UnknownSubtitle32.LoadSubtitle has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle32.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ce23255907ea1b2fbaf7b60054b5c0d4c0f4316528adcb3280aa513cbc49ac7"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle56.LoadSubtitle (cognitive 29): UnknownSubtitle56.LoadSubtitle has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle56.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"58fbf88c8e8c8fd7fd865207413c250acb9373e8b03f452a676d8d0f7ad581be"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle58.LoadSubtitle (cognitive 29): UnknownSubtitle58.LoadSubtitle has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle58.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dca6aa8fe2f2cabd44d06ca327b5dbb1307cdc113aa6af679d911ebad38309b"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle75.LoadSubtitle (cognitive 29): UnknownSubtitle75.LoadSubtitle has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle75.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbcc03dc8beed590a7c45073ef37a2b15184acfbf8fb1e0c776e68162c913184"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrDb.Add (cognitive 29): BinaryOcrDb.Add has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrDb.cs"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"54693033a104774f8a1fd08f7fa588d20012ec7d46b8760762528ab3cd059284"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrFixReplaceList2.Fix0InsideLowerCaseWord (cognitive 29): OcrFixReplaceList2.Fix0InsideLowerCaseWord has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":836}}}],"partialFingerprints":{"codehealthFindingId/v1":"277b14e15cf6fd30b37a3e935dd927ecb42fe6fd55feafc5d2a3d0be59102495"}},{"ruleId":"D2","level":"warning","message":{"text":"SpellCheckWordLists.SpellCheckWordLists.ctor (cognitive 29): SpellCheckWordLists.SpellCheckWordLists.ctor has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/SpellCheck/SpellCheckWordLists.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"592bb14d97bc87c6140fe10c7d9fd4f77357a275bfb5e02ce55d91f0ace2b181"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaDrawCanvas.DrawShape (cognitive 28): AssaDrawCanvas.DrawShape has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawCanvas.cs"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e0575b68dbce7b3451252961d91ff57d24383548c0a14a90d9ac9bda9220618"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaDrawViewModel.GenerateSubtitle (cognitive 28): AssaDrawViewModel.GenerateSubtitle has cognitive complexity 28 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawViewModel.cs"},"region":{"startLine":668}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed2a5ddac6c745b6e3ed4f73956963210b9eaaaf8e1f484734af393b85e7d787"}},{"ruleId":"D2","level":"warning","message":{"text":"ScriptSyncService.SyncScript (cognitive 28): ScriptSyncService.SyncScript has cognitive complexity 28 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportPlainText/ScriptSyncService.cs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d57f5a2d0c06ad5615f0097ea3a29ad7b2d5b852d6c5222a0d599b74c4d646c"}},{"ruleId":"D2","level":"warning","message":{"text":"InitToolbar.CreateToolbar (cognitive 28): InitToolbar.CreateToolbar has cognitive complexity 28 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitToolbar.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"714f3646928ed9acb263dfcfeaa30b30a1ac7cc5bddcaa3d217607b68d9c91aa"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ShowVideoOpenFromUrl (cognitive 28): MainViewModel.ShowVideoOpenFromUrl has cognitive complexity 28 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":6813}}}],"partialFingerprints":{"codehealthFindingId/v1":"561f997fb16dc9fbf11bb0a9865369c8b5d7763e2a70aa1bdd3a216d7588ac33"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ImportSubtitleFromMp4 (cognitive 28): MainViewModel.ImportSubtitleFromMp4 has cognitive complexity 28 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":17134}}}],"partialFingerprints":{"codehealthFindingId/v1":"317a48140a26367f4dcd31931efa5b85316cfd1a2c151d94910dc21eb2649c47"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ExtractWaveformAndSpectrogramAndShotChanges (cognitive 28): MainViewModel.ExtractWaveformAndSpectrogramAndShotChanges has cognitive complexity 28 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":19478}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2be15c9e0f3a1de990af30517bbfe6d1fea708e8832b9ee8b2ef3d5c80306eb"}},{"ruleId":"D2","level":"warning","message":{"text":"PaddleOcrInstallHelper.EnsureInstalled (cognitive 28): PaddleOcrInstallHelper.EnsureInstalled has cognitive complexity 28 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 7 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/PaddleOcrInstallHelper.cs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff55316aa2a4b73d6780a7f39b09d2d784891077ee491f6aeaa08044244cf05"}},{"ruleId":"D2","level":"warning","message":{"text":"VisualSyncViewModel.OnKeyDownHandler (cognitive 28): VisualSyncViewModel.OnKeyDownHandler has cognitive complexity 28 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Sync/VisualSync/VisualSyncViewModel.cs"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"ece623ca3041de49bd8d675ad4de222cae8051f61381ae27840ebd355b9c994e"}},{"ruleId":"D2","level":"warning","message":{"text":"FixNamesViewModel.FindAllNames (cognitive 28): FixNamesViewModel.FindAllNames has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/ChangeCasing/FixNamesViewModel.cs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"17831dfbbac477eba047f4477556f142c2cc3c6d8dfbc8e2b6b42c783c4adf5d"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextViewModel.ReDownloadWhisperEngine (cognitive 28): SpeechToTextViewModel.ReDownloadWhisperEngine has cognitive complexity 28 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":2542}}}],"partialFingerprints":{"codehealthFindingId/v1":"f740250b30e2498e61cd8ddab9591461a20926a1f6b34834963d780718324c45"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextViewModel.TranscribeViaWhisper (cognitive 28): SpeechToTextViewModel.TranscribeViaWhisper has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":3527}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d2980a1e58c8b160ca3211d6899f4820d0475149a1b4ff215f85ca3b1b3412a"}},{"ruleId":"D2","level":"warning","message":{"text":"TextToSpeechViewModel.Import (cognitive 28): TextToSpeechViewModel.Import has cognitive complexity 28 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":1742}}}],"partialFingerprints":{"codehealthFindingId/v1":"f24ff3f64f14ec775aff58bfa22acfbaae607ea378d8fbf0cc6488c3f1df146a"}},{"ruleId":"D2","level":"warning","message":{"text":"CasingToggler.RemoveAndSaveTags (cognitive 28): CasingToggler.RemoveAndSaveTags has cognitive complexity 28 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/CasingToggler.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8ed6c78cc7675fb0021301c666c159628fa8c92659d9537036b81142f128875"}},{"ruleId":"D2","level":"warning","message":{"text":"Core.ParseResult (cognitive 28): Core.ParseResult has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Ocr/GoogleLens/Core.cs"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a0b0cd0670b041603c0a0e6bcb64f58dec2c1cc88ba748149da823047b39088"}},{"ruleId":"D2","level":"warning","message":{"text":"TimeSpanToDisplayShortConverter.ConvertBack (cognitive 28): TimeSpanToDisplayShortConverter.ConvertBack has cognitive complexity 28 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TimeSpanToDisplayShortConverter.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e35dd288b921f60edda5730806f9f1da20cbf92d7dea168b06f7035da5e4204"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmap.ConvertToFourColors (cognitive 28): NikseBitmap.ConvertToFourColors has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/NikseBitmap.cs"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd09b01d059f10095c97b821252f9bd8f4a35a1d2a7702b54ef5f6c971f641bb"}},{"ruleId":"D2","level":"warning","message":{"text":"StringExtensions.RemoveAndSaveTags (cognitive 28): StringExtensions.RemoveAndSaveTags has cognitive complexity 28 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StringExtensions.cs"},"region":{"startLine":656}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b7880dc86ac9fb5caca222d85584a1b25b92fbc50f9dcac85cc95a5da4bf040"}},{"ruleId":"D2","level":"warning","message":{"text":"StrippableText.ReplaceNames1Remove (cognitive 28): StrippableText.ReplaceNames1Remove has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StrippableText.cs"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"61624d7d1881b4a4e4c9107ca001ad969a9622c530db4b1b047d11ec6c60bac6"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVttToAssa.SetInlineStyles (cognitive 28): WebVttToAssa.SetInlineStyles has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/WebVttToAssa.cs"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"23624e7439ab7f2513bc1830c7a063473a2b5180377fce9b98aa070e467b7747"}},{"ruleId":"D2","level":"warning","message":{"text":"Trun.Trun.ctor (cognitive 28): Trun.Trun.ctor has cognitive complexity 28 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Boxes/Trun.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a4de3f351bf94ec0027fd6f6ab39012b816129fd816d497e4d659903451fffb"}},{"ruleId":"D2","level":"warning","message":{"text":"TimeCodesBeautifier.FindBestCueFrame (cognitive 28): TimeCodesBeautifier.FindBestCueFrame has cognitive complexity 28 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/TimeCodesBeautifier.cs"},"region":{"startLine":986}}}],"partialFingerprints":{"codehealthFindingId/v1":"660be0c4b1725a6624b5608a34d3d7d89804197e9428041444863b8a8324cf8f"}},{"ruleId":"D2","level":"warning","message":{"text":"MPlayer2.LoadSubtitle (cognitive 28): MPlayer2.LoadSubtitle has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/MPlayer2.cs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c848f1360c56aa64df9a6197bc7504a9e26f58f5bef4ff59f4425539521eebc"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle25.LoadSubtitle (cognitive 28): UnknownSubtitle25.LoadSubtitle has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle25.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5056c93344a18fdd835f71733a332bcf5e502256866f2d9794f8d53ad66e102"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle62.LoadSubtitle (cognitive 28): UnknownSubtitle62.LoadSubtitle has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle62.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"878f366ed173d951fdbd0714dd4160da8b54bd56bccd24990f1439a49c900242"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle63.LoadSubtitle (cognitive 28): UnknownSubtitle63.LoadSubtitle has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle63.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b32cb9e0e715fc29eada1d1a1494fd87d17bd3295a691cf12dd106dd64b2a47"}},{"ruleId":"D2","level":"warning","message":{"text":"VobSubWriter.WriteParagraph (cognitive 28): VobSubWriter.WriteParagraph has cognitive complexity 28 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/VobSubWriter.cs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"b22d6223ce4d22c205b691e089f0a9cde5af562146c6a0b071b43d9f6339d966"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepLTranslate.Translate (cognitive 28): DeepLTranslate.Translate has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/AutoTranslate/DeepLTranslate.cs"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"25e7563e9bb87ab037ce4f13eb55a903803ca9a14b9d2d52f7839af1de508779"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrBitmap.IsC (cognitive 28): BinaryOcrBitmap.IsC has cognitive complexity 28 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"1365342448e60ae7820d59c6f6baa954204d9470c66757c35dffffc88b011675"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrBitmap.IsO (cognitive 28): BinaryOcrBitmap.IsO has cognitive complexity 28 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"2798851d25cbfb2b43c0dac7cfa2c98091ec3f79b051c0d54e9789a3f9d7d975"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmap2.ConvertToFourColors (cognitive 28): NikseBitmap2.ConvertToFourColors has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmap2.cs"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed9d1ad9136ad236e003e96d4d52ca1332765813ad09b8435410106d362a1ae3"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmapImageSplitter2.SplitHorizontalNew (cognitive 28): NikseBitmapImageSplitter2.SplitHorizontalNew has cognitive complexity 28 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":874}}}],"partialFingerprints":{"codehealthFindingId/v1":"632c668f80f0fa3c282c13910539cd7fb46824e4e7cc99100e4eef5a86aceeb3"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrLineGenerator.CollectFgDiagonalCandidates (cognitive 28): NOcrLineGenerator.CollectFgDiagonalCandidates has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":865}}}],"partialFingerprints":{"codehealthFindingId/v1":"779f65b60003fb28c95a3bf7b12f30c468db2431ed3538f04bf9b90657e885ce"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrLineGenerator.CollectBgDiagonalCandidates (cognitive 28): NOcrLineGenerator.CollectBgDiagonalCandidates has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":1092}}}],"partialFingerprints":{"codehealthFindingId/v1":"312e2fd8b730f943a1551e90e63b8a0acd1b61e88dbefabfdb2e6a9a3facfc6f"}},{"ruleId":"D2","level":"warning","message":{"text":"Formatting.SetTagsAndReturnTrimmed (cognitive 28): Formatting.SetTagsAndReturnTrimmed has cognitive complexity 28 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Translate/Formatting.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d19bff89cff1985e560f8560282ac27a02e24e395019f2af9bd0aaab098a8f2"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaSetPositionViewModel.Initialize (cognitive 27): AssaSetPositionViewModel.Initialize has cognitive complexity 27 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaSetPosition/AssaSetPositionViewModel.cs"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b0af98da5cd25267bc0b324f23a01073213e4f6f5d2260ca1f52aefc4766341"}},{"ruleId":"D2","level":"warning","message":{"text":"ImportCsvXlsxCustomColumnsViewModel.LoadFile (cognitive 27): ImportCsvXlsxCustomColumnsViewModel.LoadFile has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportCsvXlsxCustomColumns/ImportCsvXlsxCustomColumnsViewModel.cs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"5319bc08c29c586504206dbd10c7679161778eb886ea15aaf67561824f497a6a"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.SnapSelectedLinesToNearestShotChange (cognitive 27): MainViewModel.SnapSelectedLinesToNearestShotChange has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":7850}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f037e067ed6ca76c6b35c91342057907e0201c41d38b75a7267fe9ee6b6ceb6"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.SubtitleGrid_PointerPressed (cognitive 27): MainViewModel.SubtitleGrid_PointerPressed has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":22077}}}],"partialFingerprints":{"codehealthFindingId/v1":"aec4dce64fe57ce7725aa9e051dc0f1074f44f9ee6c421c5ccaf177a71c84010"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.ShowNOcrSettings (cognitive 27): OcrViewModel.ShowNOcrSettings has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1543}}}],"partialFingerprints":{"codehealthFindingId/v1":"19a6cbc41ee44996be84d17eb2b2d8b24c8c6fbe819b8be734aeb069643f5591"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.ShowBinaryOcrSettings (cognitive 27): OcrViewModel.ShowBinaryOcrSettings has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1668}}}],"partialFingerprints":{"codehealthFindingId/v1":"54515871d12634f5ce0d3de9d9d7aac95f956d9668363f35fdafaed673bc33f5"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryEditViewModel.OnKeyDown (cognitive 27): BinaryEditViewModel.OnKeyDown has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":2368}}}],"partialFingerprints":{"codehealthFindingId/v1":"6893c6a3212e853fecdcfcb274ec84a8893da09b606c97e12ff8c53574bf0ec7"}},{"ruleId":"D2","level":"warning","message":{"text":"FullScreenVideoWindow.FullScreenVideoWindow.ctor (cognitive 27): FullScreenVideoWindow.FullScreenVideoWindow.ctor has cognitive complexity 27 (threshold 15). Most of this is not in the body itself: 11 of the 27 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 95, 137, 124, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/FullScreenVideoPlayer.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5dcc3578b66379c785eecef32fd4acfb54c21787310faf44108840b89d5a5bb"}},{"ruleId":"D2","level":"warning","message":{"text":"SsaPropertiesViewModel.LoadFromHeader (cognitive 27): SsaPropertiesViewModel.LoadFromHeader has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ssa/SsaPropertiesViewModel.cs"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e0fe2b98b167967279ac074cc8f758cd4f8ae546a0772455898f67af9578e63"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.OcrSingleBinaryImage (cognitive 27): BatchConverter.OcrSingleBinaryImage has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":1062}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcc4814abebbae1ffc79d4ea0017ac6ed9815b049277bf69e31c5e67422afd10"}},{"ruleId":"D2","level":"warning","message":{"text":"ReviewSpeechViewModel.SelectedEngineChangedAsync (cognitive 27): ReviewSpeechViewModel.SelectedEngineChangedAsync has cognitive complexity 27 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":1401}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e9cd8a5015cf2d7d210d87a6acb6eead4577892e4afb6de4a6a06055da7ba90"}},{"ruleId":"D2","level":"warning","message":{"text":"FindService.GetAllMatchesInLine (cognitive 27): FindService.GetAllMatchesInLine has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/FindService.cs"},"region":{"startLine":756}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbc263b72e52e47d29004c46c147edbca9d1321da803da997f2b26748914be54"}},{"ruleId":"D2","level":"warning","message":{"text":"FontHelper.FindFontFiles (cognitive 27): FontHelper.FindFontFiles has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/FontHelper.cs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"5061cb8b72ebb345aa1fafac5d9bf91c92b7bc80c959c27ab1abd3e006cb69ac"}},{"ruleId":"D2","level":"warning","message":{"text":"InsertService.InsertBefore (cognitive 27): InsertService.InsertBefore has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/InsertService.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"743a852180f8d519d43231f1196ec8ab43bc71c4dff641b28fab2163ff347300"}},{"ruleId":"D2","level":"warning","message":{"text":"MergeLinesSameTextUtils.MergeLinesWithSameTextInSubtitle (cognitive 27): MergeLinesSameTextUtils.MergeLinesWithSameTextInSubtitle has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/MergeLinesSameTextUtils.cs"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3102f7c368814723337f050a64ec4a618722e363f5e720af46abab50871fd9a"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporter.ImportTimeCodesInFramesAndTextOnSameLine (cognitive 27): UnknownFormatImporter.ImportTimeCodesInFramesAndTextOnSameLine has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dc60c58eed03fb6ae089fa9ce5d205bebbe24e13e17619fc54e7a95f225d544"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.SniffTextSampleKind (cognitive 27): MP4Parser.SniffTextSampleKind has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":940}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b48de8a70dd8ae29f8d281576467b619e408cb7a1ce3535c5f4c004ff525b9a"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.GetHeaderAndStylesFromSubStationAlpha (cognitive 27): AdvancedSubStationAlpha.GetHeaderAndStylesFromSubStationAlpha has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b7b868163e440bd951a2caa8016fcfb0a5f266394a4e139191c4375446e64af"}},{"ruleId":"D2","level":"warning","message":{"text":"AribB24Decoder.HandleEsc (cognitive 27): AribB24Decoder.HandleEsc has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AribB24Decoder.cs"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"2af9d44d75ed9969f78087a9c5681420bbfc0518adf109b4e6bd659396c57543"}},{"ruleId":"D2","level":"warning","message":{"text":"AvidDvd.LoadSubtitle (cognitive 27): AvidDvd.LoadSubtitle has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AvidDvd.cs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a54e518ad108e3324f2af5bd852931f78cc88ac0fddcc1f5659a2a91a283644"}},{"ruleId":"D2","level":"warning","message":{"text":"Dost.LoadSubtitle (cognitive 27): Dost.LoadSubtitle has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Dost.cs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"af4f4bcc2530fb176f1238e2693d26f67d9c92da5817114bc479b58ede1089df"}},{"ruleId":"D2","level":"warning","message":{"text":"SubStationAlpha.LoadStylesFromTimedText10 (cognitive 27): SubStationAlpha.LoadStylesFromTimedText10 has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubStationAlpha.cs"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"8442efa555d9f8a158dacb41034baa4e3fa34d125e7dd2c0b00e20318f437052"}},{"ruleId":"D2","level":"warning","message":{"text":"TextST.LoadSubtitleFromM2Ts (cognitive 27): TextST.LoadSubtitleFromM2Ts has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TextST.cs"},"region":{"startLine":1087}}}],"partialFingerprints":{"codehealthFindingId/v1":"c39ffee7d307a785124041d28bbf53272262f1e2065faa3f9a807c2646a5858e"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle99.LoadSubtitle (cognitive 27): UnknownSubtitle99.LoadSubtitle has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle99.cs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"21abb5af55072d2fded113c4b0dd659fafb39d0aef5a081748421c3ad50f77cd"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVTT.RemoveNativeFormatting (cognitive 27): WebVTT.RemoveNativeFormatting has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTT.cs"},"region":{"startLine":707}}}],"partialFingerprints":{"codehealthFindingId/v1":"a075e824366574f41f051fcb160eb4fda9f890ec80e5a5dacd4678bb31166372"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVTT.EscapeEncodeText (cognitive 27): WebVTT.EscapeEncodeText has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTT.cs"},"region":{"startLine":1158}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8a81ac20886355a90f102ce1d2463cc3cd9b0075d512b9e61a47ec947ff4e38"}},{"ruleId":"D2","level":"warning","message":{"text":"MultipleReplaceLoader.Apply (cognitive 27): MultipleReplaceLoader.Apply has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/MultipleReplaceLoader.cs"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"8023c4eaa20911280d1d9fd6a4ed5759f50dcfed15afb7014359e698f673ca7a"}},{"ruleId":"D2","level":"warning","message":{"text":"ExportImagesSection.ApplyTo (cognitive 27): ExportImagesSection.ApplyTo has cognitive complexity 27 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SeConvSettings.cs"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"8447e93a162d15f126b4f039611beafdbf4b3c628d9c6cbf96b5e25d1854e417"}},{"ruleId":"D2","level":"warning","message":{"text":"SubtitleConverter.PassThroughMatroskaPgsAsync (cognitive 27): SubtitleConverter.PassThroughMatroskaPgsAsync has cognitive complexity 27 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SubtitleConverter.cs"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"a81f095f815a79e9feff0b1babd1864bdbd4dd25e2dc08bae244635c1fe36430"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageRenderer.ReverseNumberAndLatinOnly (cognitive 27): ImageRenderer.ReverseNumberAndLatinOnly has cognitive complexity 27 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ImageRenderer.cs"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1cd6bf2ea4ccf1b39c95b2832404c3381dde0c2f5efc0b9a9896fd601dbec2d"}},{"ruleId":"D2","level":"warning","message":{"text":"FfmpegMediaInfo.ParseLog (cognitive 27): FfmpegMediaInfo.ParseLog has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Media/FfmpegMediaInfo.cs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb3bb20570f2560872e3ac3306ac00e015012cc1829ddb1157fcbbd8d7dbd2df"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrLineGenerator.TraceFrom (cognitive 27): NOcrLineGenerator.TraceFrom has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"6866d5fc16c45d13ab722f84ff491c49d0f6bcda6dfba179c83c78c40ebec072"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.OnTapped (cognitive 26): AudioVisualizer.OnTapped has cognitive complexity 26 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8163376a1523a7095febe62fab752fea08dac8d91af9654b948100bcf18da0c"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.FindDataBelowThresholdBackForStart (cognitive 26): AudioVisualizer.FindDataBelowThresholdBackForStart has cognitive complexity 26 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":3550}}}],"partialFingerprints":{"codehealthFindingId/v1":"86258cd0f5ac2fa3da467fa8ffcbbc83af711e5943f9c5581940eb071ac7ea60"}},{"ruleId":"D2","level":"warning","message":{"text":"TextDiffHighlighter.FindLongestCommonSubstrings (cognitive 26): TextDiffHighlighter.FindLongestCommonSubstrings has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/Compare/TextDiffHighlighter.cs"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb547547385dc184f1bdd8023699bab953a8d0d7f6f9a706fe7bb59be3d4c5eb"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.SpeechToTextSelectedLines (cognitive 26): MainViewModel.SpeechToTextSelectedLines has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":6657}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e19e0de5bf2f548fb52fa52d1e36f6188ffe0936ec716d4896c10ab4561d510"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrInspectViewModel.KeyDown (cognitive 26): NOcrInspectViewModel.KeyDown has cognitive complexity 26 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/NOcr/NOcrInspectViewModel.cs"},"region":{"startLine":624}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0faf1eaa0d8c545e4c750d71d247fcc67cb100abd8661216280caeafec73319"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConvertViewModel.EnsurePaddleOcrAvailable (cognitive 26): BatchConvertViewModel.EnsurePaddleOcrAvailable has cognitive complexity 26 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":1021}}}],"partialFingerprints":{"codehealthFindingId/v1":"d58d838ab04de0e11f435ef3c1df4cd43df08adb4fda21d8082ec357b011aecd"}},{"ruleId":"D2","level":"warning","message":{"text":"ColorService.SetColorTag (cognitive 26): ColorService.SetColorTag has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ColorService.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"924bc25b7916c172ec8119faac18d39f7e372af2a6e4589cacf2dd8a3eac297b"}},{"ruleId":"D2","level":"warning","message":{"text":"ShortcutManager.CheckShortcuts (cognitive 26): ShortcutManager.CheckShortcuts has cognitive complexity 26 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ShortcutManager.cs"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"b10d602ebdc7dde520360556288ab45e1e2187a0b0a9404f4b085270d741f8c2"}},{"ruleId":"D2","level":"warning","message":{"text":"CdgToImageList.MakeImageList (cognitive 26): CdgToImageList.MakeImageList has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/CDG/CdgToImageList.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"9741d5cff395dfa2fa945aed0fc46d0667b0ada826ff283986838a4369c8def2"}},{"ruleId":"D2","level":"warning","message":{"text":"Cea708.FlushText (cognitive 26): Cea708.FlushText has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Cea708/Cea708.cs"},"region":{"startLine":629}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dd15fe06f3e44a25692ec1cc0fa6262577fdfe454bec2c08241db7d3b96e2e9"}},{"ruleId":"D2","level":"warning","message":{"text":"DialogSplitMerge.IsDialog (cognitive 26): DialogSplitMerge.IsDialog has cognitive complexity 26 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/DialogSplitMerge.cs"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c9a67047c681bd0e1facbf38e8101b0fd6f62b947dee0aa135fdc16af3fb0a3"}},{"ruleId":"D2","level":"warning","message":{"text":"FileUtil.FindPythonModuleExecutableFileName (cognitive 26): FileUtil.FindPythonModuleExecutableFileName has cognitive complexity 26 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/FileUtil.cs"},"region":{"startLine":1048}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb5df22ffb0f16e2fa2a048645beb8797d61a6d0834e217458b55e76d5786a7e"}},{"ruleId":"D2","level":"warning","message":{"text":"SsaStyle.ToRawSsa (cognitive 26): SsaStyle.ToRawSsa has cognitive complexity 26 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SsaStyle.cs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"487b1aff4b648cf3ad6da3de81ef026dcdfa887289e5828b380366c0c8215ec3"}},{"ruleId":"D2","level":"warning","message":{"text":"SsaStyle.ToRawAss (cognitive 26): SsaStyle.ToRawAss has cognitive complexity 26 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SsaStyle.cs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1e62a5010a81f46f59a6022a4239a95837bd8f98f1a4fb88b95d1c0b07cb9cc"}},{"ruleId":"D2","level":"warning","message":{"text":"StringExtensions.FixExtraSpaces (cognitive 26): StringExtensions.FixExtraSpaces has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StringExtensions.cs"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"98ba69f90b6da5f9e3ba4535f71b612116e19b3e7504ae8b654f9230be5c9f54"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporter.ImportTimeCodesAndTextOnSameLineOnlySpaceAsSeparator (cognitive 26): UnknownFormatImporter.ImportTimeCodesAndTextOnSameLineOnlySpaceAsSeparator has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"37c7c759ce07a8f9c40e791d8bcbb7599f93f1d22687437e3f65ff4d4b6433ac"}},{"ruleId":"D2","level":"warning","message":{"text":"Traf.Traf.ctor (cognitive 26): Traf.Traf.ctor has cognitive complexity 26 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Boxes/Traf.cs"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d2ec05766e47fce027e5675fb0b3fca59776434d4d63a56aeb18177765160f0"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.ApplyTrexDefaults (cognitive 26): MP4Parser.ApplyTrexDefaults has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":669}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbbe39a29edbef43d7d854b52769274149474a19455fd80736d5cdc0e15afafe"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoveTextForHI.RemoveHearingImpairedTagsInsideLine (cognitive 26): RemoveTextForHI.RemoveHearingImpairedTagsInsideLine has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveTextForHI.cs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"3156946107efe7f2266ecc9b33c624c62e4bae88ba6083b5e752ae2ba1abe699"}},{"ruleId":"D2","level":"warning","message":{"text":"CsvNuendo.LoadSubtitle (cognitive 26): CsvNuendo.LoadSubtitle has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CsvNuendo.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"824ad72e3de4dae0d688c1c03be6793295a9a9bdd3fbbe24a4bd2f393ed40910"}},{"ruleId":"D2","level":"warning","message":{"text":"DCinemaInterop.FixInvalidItalicTags (cognitive 26): DCinemaInterop.FixInvalidItalicTags has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaInterop.cs"},"region":{"startLine":1017}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc9684699c82ff3693804a9c51ed72ed4630e931d86771aaa3fc5374e0095b0c"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonType5.LoadSubtitle (cognitive 26): JsonType5.LoadSubtitle has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType5.cs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"28cb415ff03934c9e107f1b0417cb99abbf311fa547f784f7be2920cafceb259"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonTypeOnlyLoad2.LoadSubtitle (cognitive 26): JsonTypeOnlyLoad2.LoadSubtitle has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonTypeOnlyLoad2.cs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"e83dba8807791690d530f5dd0dde9d90b0b15da8ae18827023458cdc5eeca76b"}},{"ruleId":"D2","level":"warning","message":{"text":"Pac.GetCodePage (cognitive 26): Pac.GetCodePage has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":2164}}}],"partialFingerprints":{"codehealthFindingId/v1":"c18f6039811bda1b5473874ffdce43cabe7e79ef21321f5420dacd3b95835f2c"}},{"ruleId":"D2","level":"warning","message":{"text":"Pac.GetLatinBytes (cognitive 26): Pac.GetLatinBytes has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":2223}}}],"partialFingerprints":{"codehealthFindingId/v1":"8779b1172fd337d44113d78e519c8abe1317a480d1c26d2b77bab663d7fc73b0"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle33.LoadSubtitle (cognitive 26): UnknownSubtitle33.LoadSubtitle has cognitive complexity 26 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle33.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"0abbfa4f1bac2f2becb867ba46163cc5fa00bbd62adfae3c8f84bb51b8ef978a"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle74.LoadSubtitle (cognitive 26): UnknownSubtitle74.LoadSubtitle has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle74.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6fb0df4c403a56c764e16736de8ad80769b17476058951c068e300a2457c466"}},{"ruleId":"D2","level":"warning","message":{"text":"Idx.Idx.ctor (cognitive 26): Idx.Idx.ctor has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/Idx.cs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"a461d13aaf9dfc81200a063aac2c21b617b7a615f544e8d1d19b386f8eecceab"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrFixReplaceList2.FixIor1InsideLowerCaseWord (cognitive 26): OcrFixReplaceList2.FixIor1InsideLowerCaseWord has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":788}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7445650ef1551fc7f6504b04666ccffb9c29245bea3fe3d7594ac5caa0c4bdb"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmapImageSplitter2.CropTopAndBottom (cognitive 26): NikseBitmapImageSplitter2.CropTopAndBottom has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa791b84b2da5ba59f42b3fffad65e118406457258907e5a2388dc360afbb06a"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmapImageSplitter2.SplitToLinesByMinTransparentHorizontalLines (cognitive 26): NikseBitmapImageSplitter2.SplitToLinesByMinTransparentHorizontalLines has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":568}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8b828ecf81b84e49f1de7e0877fcc2c454676a01520631890673544c9d9c58b"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaProgressBarViewModel.GeneratePreview (cognitive 25): AssaProgressBarViewModel.GeneratePreview has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaProgressBar/AssaProgressBarViewModel.cs"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"c14c24176db362a47a944243ef22192b5b1eb79e3d488e91fb2f759b33b14fa5"}},{"ruleId":"D2","level":"warning","message":{"text":"CsvImporter.Import (cognitive 25): CsvImporter.Import has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/MultipleReplace/CsvImporter.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5ffdfdad5b2b378a90c39b45289e3147834f675cfbfa9b8c4d4674f9c0c3c9b"}},{"ruleId":"D2","level":"warning","message":{"text":"ImportCsvXlsxCustomColumnsViewModel.RebuildPreview (cognitive 25): ImportCsvXlsxCustomColumnsViewModel.RebuildPreview has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportCsvXlsxCustomColumns/ImportCsvXlsxCustomColumnsViewModel.cs"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"44e7007976d01f71a602fab70f44b03c7c4e4accb8cfc3ddd3ca22ae8d65c3f0"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadPaddleOcrViewModel.OnTimerOnElapsed (cognitive 25): DownloadPaddleOcrViewModel.OnTimerOnElapsed has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadPaddleOcrViewModel.cs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"0073a7356f9e60912894d7770db42e3c5ce7d70947e5831e1c9950a990da18f3"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadLlamaCppViewModel.StartDownload (cognitive 25): DownloadLlamaCppViewModel.StartDownload has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/DownloadLlamaCppViewModel.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"801a0cbcfad8e61011fdc4d299cd9b0f7590bd28e636217a05a58b5618e5afba"}},{"ruleId":"D2","level":"warning","message":{"text":"ChatterboxTtsCpp.EnsureServerRunningAsync (cognitive 25): ChatterboxTtsCpp.EnsureServerRunningAsync has cognitive complexity 25 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"f298c987395adf398df32fff850a1a0cd86abd465596e1ffe9b4309378b7b05b"}},{"ruleId":"D2","level":"warning","message":{"text":"MergeManager.MergeSelectedLines (cognitive 25): MergeManager.MergeSelectedLines has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/MergeManager.cs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"220ba2e22eca13f4f2ad986fcf030d00ffe538589f254abd4da1dcd9f0e28ad9"}},{"ruleId":"D2","level":"warning","message":{"text":"NetflixCheckMaxLineLength.Check (cognitive 25): NetflixCheckMaxLineLength.Check has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/NetflixQualityCheck/NetflixCheckMaxLineLength.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e9fba0e1d5526cdc915f7bca9595f659ff01978c7ff4139f09f799a92f5c01f"}},{"ruleId":"D2","level":"warning","message":{"text":"UiTheme.ApplyScaleToExistingMenus (cognitive 25): UiTheme.ApplyScaleToExistingMenus has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/UiTheme.cs"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ea594e62a913b6f2823f25d2275b42975e8d692159dcd5df26b3aca26fa9a12"}},{"ruleId":"D2","level":"warning","message":{"text":"HtmlUtil.TryGetTagLength (cognitive 25): HtmlUtil.TryGetTagLength has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/HtmlUtil.cs"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dd74c46d67ac01d105165dfd5226e0c3a88c828175d5386fc28c1ae089149f3"}},{"ruleId":"D2","level":"warning","message":{"text":"HtmlUtil.RemoveColorTags (cognitive 25): HtmlUtil.RemoveColorTags has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/HtmlUtil.cs"},"region":{"startLine":1543}}}],"partialFingerprints":{"codehealthFindingId/v1":"da1558b6579ca93e693bf8c84f93fa9005e0787a8dfd60de74d2b34b12b9375b"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeWriterEffect.Transform (cognitive 25): TypeWriterEffect.Transform has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TextEffect/TypeWriterEffect.cs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebe796b099bd549753675cd9037034e75a2b6742a4d67786861bd0c6eb52f8b9"}},{"ruleId":"D2","level":"warning","message":{"text":"Mp4VobSubPalette.TryFindDecoderSpecificInfo (cognitive 25): Mp4VobSubPalette.TryFindDecoderSpecificInfo has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4VobSubPalette.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e8b5d9b0a2eb5af0173b01a44aa44e118692f867321256dc5d17db0dd1c36fc"}},{"ruleId":"D2","level":"warning","message":{"text":"FixDanishLetterI.Fix (cognitive 25): FixDanishLetterI.Fix has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixDanishLetterI.cs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb06262e487896a07d3d6284ee30ebb88ca1be84a0bf2391a4ff9b18d70def9f"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoveTextForHI.RemovePartialBeforeColon (cognitive 25): RemoveTextForHI.RemovePartialBeforeColon has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveTextForHI.cs"},"region":{"startLine":751}}}],"partialFingerprints":{"codehealthFindingId/v1":"65f88e322116e4e67b74ad50713f3fc8794267b61fc56d00fcdefcc52b1939ea"}},{"ruleId":"D2","level":"warning","message":{"text":"TimeCodesBeautifier.FixCue (cognitive 25): TimeCodesBeautifier.FixCue has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/TimeCodesBeautifier.cs"},"region":{"startLine":920}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef328c8e7378f2a2ac3a8e4de4096e60054fdffb93ac76ff6643a412ee1abc95"}},{"ruleId":"D2","level":"warning","message":{"text":"AvidCaption.LoadSubtitle (cognitive 25): AvidCaption.LoadSubtitle has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AvidCaption.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"0577899e43cab96b764a01de94a46116bbb742d7c3d8e4ef57bea43f95eef05f"}},{"ruleId":"D2","level":"warning","message":{"text":"AvidCaptionDropFrame.LoadSubtitle (cognitive 25): AvidCaptionDropFrame.LoadSubtitle has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AvidCaptionDropFrame.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"499ff65eb32d75868ad9a82750605fbb31219efe2b5aca963a83d89fe9dcca60"}},{"ruleId":"D2","level":"warning","message":{"text":"Cavena890.LoadSubtitle (cognitive 25): Cavena890.LoadSubtitle has cognitive complexity 25 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":1573}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2b879aeca7187803ea150230e7a0d9649dc72f636077cd96cd0c4ed25e73949"}},{"ruleId":"D2","level":"warning","message":{"text":"Chk.ReadParagraph (cognitive 25): Chk.ReadParagraph has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Chk.cs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"8500a46aa4031ae2e54dba7c690d22bc1ec172533b7ef16f96a72862090605ca"}},{"ruleId":"D2","level":"warning","message":{"text":"SonyDVDArchitectLineAndDuration.LoadSubtitle (cognitive 25): SonyDVDArchitectLineAndDuration.LoadSubtitle has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SonyDVDArchitectLineAndDuration.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f438d00a0c83058e93a12db0f5e8b45d011951f1f85e7b089e178fe42e1dc1f"}},{"ruleId":"D2","level":"warning","message":{"text":"SonyDVDArchitectLineDurationLength.LoadSubtitle (cognitive 25): SonyDVDArchitectLineDurationLength.LoadSubtitle has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SonyDVDArchitectLineDurationLength.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"e32635a0dc26c6979181e6bc91c8bc2ee88dc50ab89fa92d24ec654050d1c7bd"}},{"ruleId":"D2","level":"warning","message":{"text":"SonyDVDArchitectWithLineNumbers.LoadSubtitle (cognitive 25): SonyDVDArchitectWithLineNumbers.LoadSubtitle has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SonyDVDArchitectWithLineNumbers.cs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d1edbde30bbc4ba841403f6d13d54ae3d98725933a10e5a7795769d50bba928"}},{"ruleId":"D2","level":"warning","message":{"text":"Sptx.GetSptxParagraph (cognitive 25): Sptx.GetSptxParagraph has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Sptx.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"c24e2944ecbc9efbce0b78d23731fa49473ce765256a75a42d8499afe76758cb"}},{"ruleId":"D2","level":"warning","message":{"text":"SubRip.LoadSubtitle (cognitive 25): SubRip.LoadSubtitle has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubRip.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"717f23b6058f4af28ea59416150cdd8b1729b908e844d2e121860d2dd79362a0"}},{"ruleId":"D2","level":"warning","message":{"text":"Ted20.LoadSubtitle (cognitive 25): Ted20.LoadSubtitle has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ted20.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c331754873e98a99d34fd220bca06317a0a4713451effdc854c8a4e2c03d676"}},{"ruleId":"D2","level":"warning","message":{"text":"DialogPresentationSegment.DialogPresentationSegment.ctor (cognitive 25): DialogPresentationSegment.DialogPresentationSegment.ctor has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TextST.cs"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"f62820c29ea639b25521610ab1c3851db5ae201f3f19b1e8e6a53ff810faec53"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText10.IsMine (cognitive 25): TimedText10.IsMine has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"23a7de5c6649899fb66ad85f3023086bed66096b7544459bfd0e99ab378bea30"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle107.LoadSubtitle (cognitive 25): UnknownSubtitle107.LoadSubtitle has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle107.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"4827b81776153c3f08835029e33340e4d3129fa08b31a0bc5f7a795ac4640c50"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle41.LoadSubtitle (cognitive 25): UnknownSubtitle41.LoadSubtitle has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle41.cs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"f072841eb22f42be0dd9e5d02e1de4f2d8078872f022423e8f9e10d242be65cc"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle53.LoadSubtitle (cognitive 25): UnknownSubtitle53.LoadSubtitle has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle53.cs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"9355d967052cf02c6beb4dd70e71e28117fea6cf8d6899e0d380d1712d5ba7d4"}},{"ruleId":"D2","level":"warning","message":{"text":"CsvRules.Parse (cognitive 25): CsvRules.Parse has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/MultipleReplaceLoader.cs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"422037c10d7c2a408efef8540f7d8f6fdabdf3a9b29043cd43bb9fb39374fb39"}},{"ruleId":"D2","level":"warning","message":{"text":"Program.Main (cognitive 25): Program.Main has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Program.cs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddc3202c9ffc9c2ddb13ce2febe04b50337ee774c89d28b659124b60609a0e98"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrBitmap.IsLowercaseI (cognitive 25): BinaryOcrBitmap.IsLowercaseI has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"5811bf10ff5e57ce4925e477f0b19a6bf1862cb9fd60aeccae654e57489115b2"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrDb.LoadCompareImages (cognitive 25): BinaryOcrDb.LoadCompareImages has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrDb.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d952cceaade70e7de9ea2502215f18e68e0ee99dd6d2ca03ac66ab1ff7ef1a7"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedEffectBounceIn.ApplyEffect (cognitive 24): AdvancedEffectBounceIn.ApplyEffect has cognitive complexity 24 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectBounceIn.cs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"93053ee2ba4877b0ee3f690a5aec9db23df655488683380495b2e77b7d739fd0"}},{"ruleId":"D2","level":"warning","message":{"text":"ScriptSyncService.ExtractWordTimestamps (cognitive 24): ScriptSyncService.ExtractWordTimestamps has cognitive complexity 24 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportPlainText/ScriptSyncService.cs"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"22ef5f32b3ce3cd15d8322c613e0f78d2741d4e3cbebb179ba675c3776e11719"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.RunPlugin (cognitive 24): MainViewModel.RunPlugin has cognitive complexity 24 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":5426}}}],"partialFingerprints":{"codehealthFindingId/v1":"13c7ab1139f92909e1b7365a17e8ae90314849f92f2a3207d4da996dccc07c70"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.HandleFindResult (cognitive 24): MainViewModel.HandleFindResult has cognitive complexity 24 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":11522}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c59355572d58df5525cfd13112e49abaffc0717b33f84cf65cf4687ad229517"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.PromptForUnknownWordsAsync (cognitive 24): OcrViewModel.PromptForUnknownWordsAsync has cognitive complexity 24 (threshold 15). Most of this is not in the body itself: 0 of the 24 points are its own statements and the rest belongs to one function literal inside it that branches (line 3642). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3639}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c8cfc3c18f5b54b2eafe076b13d7b98a77b094b58804289c73471f7883e295a"}},{"ruleId":"D2","level":"warning","message":{"text":"PreProcessingSettings.CropTransparent (cognitive 24): PreProcessingSettings.CropTransparent has cognitive complexity 24 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/PreProcessingSettings.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e0ae5354cd0e2670b151849c307b3ef930419a5242f875ccd8c52ee4466d7bf"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryEditViewModel.ChangeSpeed (cognitive 24): BinaryEditViewModel.ChangeSpeed has cognitive complexity 24 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":1892}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ab59379716b4f88c4e926af9782571d6705e28f2ae837a3ed3261ba4aa52e5f"}},{"ruleId":"D2","level":"warning","message":{"text":"SpellCheckManager.IsWordCorrect (cognitive 24): SpellCheckManager.IsWordCorrect has cognitive complexity 24 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/SpellCheckManager.cs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad89bf0f27f3b1c30c6f18dd84e8e7de33cdb8ca78305fb64f9ce62a0d54e2b9"}},{"ruleId":"D2","level":"warning","message":{"text":"SplitBreakLongLinesViewModel.UpdatePreview (cognitive 24): SplitBreakLongLinesViewModel.UpdatePreview has cognitive complexity 24 (threshold 15). Most of this is not in the body itself: 0 of the 24 points are its own statements and the rest belongs to one function literal inside it that branches (line 90). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/SplitBreakLongLines/SplitBreakLongLinesViewModel.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f8147893e0bb04ae296364b8c45272cc48aef5e5573ee051266b763e8e63549"}},{"ruleId":"D2","level":"warning","message":{"text":"OpenAiSttChunker.ComputeAdjustedBoundaries (cognitive 24): OpenAiSttChunker.ComputeAdjustedBoundaries has cognitive complexity 24 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/OpenAiCompatible/OpenAiSttChunker.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"05b38f80966623e00e242285873807e604975f858fb12a00f4f0330544dd5d12"}},{"ruleId":"D2","level":"warning","message":{"text":"OpenAiSttService.ProcessSseEvent (cognitive 24): OpenAiSttService.ProcessSseEvent has cognitive complexity 24 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/OpenAiCompatible/OpenAiSttService.cs"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5c90b32319feb016d854809eb84b69c1111972ad6d23bf3a071ac11648d24cc"}},{"ruleId":"D2","level":"warning","message":{"text":"Se.SetDefaultValues (cognitive 24): Se.SetDefaultValues has cognitive complexity 24 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Config/Se.cs"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad093132871d11478b0fa8539ce421657a712e4b916cee9ec6b541681ec16948"}},{"ruleId":"D2","level":"warning","message":{"text":"InsertService.InsertAfter (cognitive 24): InsertService.InsertAfter has cognitive complexity 24 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/InsertService.cs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"98467007e8cd352bbf48cee3d45fdaa87c6fd917751e975b19a1913503ffb10a"}},{"ruleId":"D2","level":"warning","message":{"text":"Unpacker.Unpack7ZipVia77zExecutable (cognitive 24): Unpacker.Unpack7ZipVia77zExecutable has cognitive complexity 24 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/SevenZipExtractor/Unpacker.cs"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a9aaab67229845b48a1260faaf9ef69c3519284316f244e345a1af1e31c946a"}},{"ruleId":"D2","level":"warning","message":{"text":"ContinuationUtilities.IsFullLineQuote (cognitive 24): ContinuationUtilities.IsFullLineQuote has cognitive complexity 24 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":995}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cbbd97bb5e9760584f47dcca8458ced5192fdc60e05b919b7d0484f7a6bc8a9"}},{"ruleId":"D2","level":"warning","message":{"text":"PlainTextImporter.AutoSplitAddLine (cognitive 24): PlainTextImporter.AutoSplitAddLine has cognitive complexity 24 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/PlainTextImporter.cs"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"65aa71d43f5257cb94f65346286a009835d571967bfbce2e69d2771e15fcc4fb"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonParser.String (cognitive 24): JsonParser.String has cognitive complexity 24 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TinyJsonParser.cs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd8705c93a9960b24fc9a54e6e129ca6e4e9941a905030e5cd454bf4378aa0ba"}},{"ruleId":"D2","level":"warning","message":{"text":"ObjectDataSegment.FourBitPixelDecoding (cognitive 24): ObjectDataSegment.FourBitPixelDecoding has cognitive complexity 24 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/ObjectDataSegment.cs"},"region":{"startLine":586}}}],"partialFingerprints":{"codehealthFindingId/v1":"757505eed554c920c986f18490a372d34bd9e41c33d3c61a915b5a15ed9e3a6e"}},{"ruleId":"D2","level":"warning","message":{"text":"TransportStreamParser.ParseAribCaptions (cognitive 24): TransportStreamParser.ParseAribCaptions has cognitive complexity 24 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/TransportStreamParser.cs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"37dd3d077c17e6b507be1c02945162bc9c244a2428eee04fd1bc04c5a4232bcd"}},{"ruleId":"D2","level":"warning","message":{"text":"F4Text.LoadF4TextSubtitle (cognitive 24): F4Text.LoadF4TextSubtitle has cognitive complexity 24 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/F4Text.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"beeaecb121bae91f104f5640dded5d2a7c49819cf82c23986606b0bb85993d14"}},{"ruleId":"D2","level":"warning","message":{"text":"SubViewer10.LoadSubtitle (cognitive 24): SubViewer10.LoadSubtitle has cognitive complexity 24 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubViewer10.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"51b9f122369a3191a25918b5f391eb7e19dd400a61800951ce39aae10888a51e"}},{"ruleId":"D2","level":"warning","message":{"text":"FixCommonErrorsRunner.ResolveRuleIds (cognitive 24): FixCommonErrorsRunner.ResolveRuleIds has cognitive complexity 24 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/FixCommonErrorsRunner.cs"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bf82d5401c1928ce2f5768a6a08a5db628418ff28c59bf9c07530cb7d912b19"}},{"ruleId":"D2","level":"warning","message":{"text":"OffsetParser.Parse (cognitive 24): OffsetParser.Parse has cognitive complexity 24 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/OffsetParser.cs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"4940c4f926d60f5515fd2768ecbd2cfe3f0724bb651adb02c0f479366aecfd76"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrChar.RemoveDuplicates (cognitive 24): NOcrChar.RemoveDuplicates has cognitive complexity 24 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrChar.cs"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3dccc77b4b30233ab34cf2878404cea015373d82530222edc26c8253ff002a3"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrDb.IsExpandedLineMatch (cognitive 24): NOcrDb.IsExpandedLineMatch has cognitive complexity 24 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrDb.cs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"581766cbb0c92b6762a64c6c4397d8a7482ca33fc866128d4be6958c51962c73"}},{"ruleId":"D2","level":"warning","message":{"text":"SyntaxTextView.OnKeyDown (cognitive 23): SyntaxTextView.OnKeyDown has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/SyntaxTextEditorControl/SyntaxTextView.cs"},"region":{"startLine":1113}}}],"partialFingerprints":{"codehealthFindingId/v1":"dea2614ba57a46398cd8c721a6efbf4677978a96aeb642c3ed501fe3c539c8a3"}},{"ruleId":"D2","level":"warning","message":{"text":"MultipleReplaceViewModel.OnKeyDown (cognitive 23): MultipleReplaceViewModel.OnKeyDown has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/MultipleReplace/MultipleReplaceViewModel.cs"},"region":{"startLine":919}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee5cacc6223efb12cd66b874ea00cb55d00c3b806361cdf99a988a0226e0fa7f"}},{"ruleId":"D2","level":"warning","message":{"text":"ItunesTimedTextPropertiesViewModel.Initialize (cognitive 23): ItunesTimedTextPropertiesViewModel.Initialize has cognitive complexity 23 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesViewModel.cs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fed3e4ab6aad24aec2e1930553534ca008d3da44303f8c1c88a42d56b34090b"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.InitializeLibMpv (cognitive 23): MainViewModel.InitializeLibMpv has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":888}}}],"partialFingerprints":{"codehealthFindingId/v1":"34a706aef83a94cc7d63cf14dd052d1a93b4f1185e13ab1872e16c028d462082"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ShowAutoTranslate (cognitive 23): MainViewModel.ShowAutoTranslate has cognitive complexity 23 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":8590}}}],"partialFingerprints":{"codehealthFindingId/v1":"db7d1801b74ca4e9a2c3fe502a7fb8f768035c2d365021bcd329a97a7ab24216"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.SaveSubtitle (cognitive 23): MainViewModel.SaveSubtitle has cognitive complexity 23 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":18015}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a0c08da595068a555a8d919aa250cac3146e2e8348aeab9e9ab350976df6b78"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ToggleItalic (cognitive 23): MainViewModel.ToggleItalic has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":20361}}}],"partialFingerprints":{"codehealthFindingId/v1":"23ac16a620777f789cc925fa33a6e69d0a34870d3eb842640a37f9839f7dc873"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ToggleBold (cognitive 23): MainViewModel.ToggleBold has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":20420}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dfb654eea7fd315cafc6a9c1842dbab1509d259a75f9f4c98f14e318b5df7fc"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.AudioVisualizerOnPrimarySingleClicked (cognitive 23): MainViewModel.AudioVisualizerOnPrimarySingleClicked has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":24573}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d0955d2071a77a5a83f8994e642f8071b4f23c341c898302f1c5fd9f57dd7bc"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrFixLineResultExtensions.GetFormattedText (cognitive 23): OcrFixLineResultExtensions.GetFormattedText has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/FixEngine/OcrFixLineResultExtensions.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cc07fd385ab480e1884e93fafeb80be75278491de761c2e73b558e11095feec"}},{"ruleId":"D2","level":"warning","message":{"text":"AiReviewProtocol.ParseChanges (cognitive 23): AiReviewProtocol.ParseChanges has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/AiReview/AiReviewProtocol.cs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"44aec42095d222614b14165741791bb120a91b04081d86a6639dff94a9501c00"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.AssaChangeStyle (cognitive 23): BatchConverter.AssaChangeStyle has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":2253}}}],"partialFingerprints":{"codehealthFindingId/v1":"f139f253b12b927e6f9f25900ae321827ea7ddaee4438f3bc1073c6227a2f2a3"}},{"ruleId":"D2","level":"warning","message":{"text":"MergeShortLinesHelper.Merge (cognitive 23): MergeShortLinesHelper.Merge has cognitive complexity 23 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/MergeShortLines/MergeShortLinesHelper.cs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"929f45f01907024b15b8ab9632717874773b8cc2dbb4b5bdcbfad49af197968c"}},{"ruleId":"D2","level":"warning","message":{"text":"BurnInViewModel.FillCrf (cognitive 23): BurnInViewModel.FillCrf has cognitive complexity 23 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1757}}}],"partialFingerprints":{"codehealthFindingId/v1":"384eeb2b7a1aaee04f7abffd1978c8dcf51ed84488c93a1ed17a29d9d44528e7"}},{"ruleId":"D2","level":"warning","message":{"text":"ZipUnpacker.UnpackZipStream (cognitive 23): ZipUnpacker.UnpackZipStream has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Compression/ZipUnpacker.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"6da33c0e6ff2f5f2f165c5f43151545582d6f7c1236845c8d4c0f64bb627151a"}},{"ruleId":"D2","level":"warning","message":{"text":"NetflixCheckTextForHiUseBrackets.Check (cognitive 23): NetflixCheckTextForHiUseBrackets.Check has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/NetflixQualityCheck/NetflixCheckTextForHiUseBrackets.cs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f4015550e0b7aba00dc781c93ba345d892fb1263531e55e3b8f8cf6bf8114d6"}},{"ruleId":"D2","level":"warning","message":{"text":"CdgGraphics.BorderPreset (cognitive 23): CdgGraphics.BorderPreset has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/CDG/CdgGraphics.cs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"162f80f881f1e83a5b16bbf69eb29e73dd240d33018f6e62108541b221c00ff7"}},{"ruleId":"D2","level":"warning","message":{"text":"HtmlUtil.ToggleTag (cognitive 23): HtmlUtil.ToggleTag has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/HtmlUtil.cs"},"region":{"startLine":1271}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bc9e0161c62e4f77fe1c92d9e117605d8c0ae094ba790cf7e7d40962e840449"}},{"ruleId":"D2","level":"warning","message":{"text":"PlainTextImporter.NextWordInDoNotBreakList (cognitive 23): PlainTextImporter.NextWordInDoNotBreakList has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/PlainTextImporter.cs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae9921455a885e956423f53ac2c4ecfa93ee936c7930ee3f2f6eef54039858b7"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.GetColorFromAssa (cognitive 23): Utilities.GetColorFromAssa has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":2076}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f3b1faa02d137211361462d37c67507c5caf112ec9d3416e28ab6d98fc2fef1"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVttToAssa.WebVttToAssaInline (cognitive 23): WebVttToAssa.WebVttToAssaInline has cognitive complexity 23 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/WebVttToAssa.cs"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccb62322232368da9402e7a6f1a754641edf64ba1297e1d8eec9a981afd08b59"}},{"ruleId":"D2","level":"warning","message":{"text":"ObjectDataSegment.ProcessDataType (cognitive 23): ObjectDataSegment.ProcessDataType has cognitive complexity 23 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/ObjectDataSegment.cs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f403492a14f487a609c981df6e2ea1dd568010c3573e148378e9f1b4859a930"}},{"ruleId":"D2","level":"warning","message":{"text":"Helper.FixHyphensRemoveForSingleLine (cognitive 23): Helper.FixHyphensRemoveForSingleLine has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/Helper.cs"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebc91352e1e3aef218a20e4eae761b4007caa92a5a0b4b9392b10c4a0865e4df"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoveTextForHI.RemoveStartEndTags (cognitive 23): RemoveTextForHI.RemoveStartEndTags has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveTextForHI.cs"},"region":{"startLine":1329}}}],"partialFingerprints":{"codehealthFindingId/v1":"82ce07233629f41c385341b3783dadf0e10fa56fdcd65057ee872ba14935def4"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalCutProXml13.LoadSubtitle (cognitive 23): FinalCutProXml13.LoadSubtitle has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProXml13.cs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"097783ebb042dcfe5780fc9c87d5425f868c3937b1f1bc5a68840802759a4e1d"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalCutProXml14.LoadSubtitle (cognitive 23): FinalCutProXml14.LoadSubtitle has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProXml14.cs"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0282964733ab7939e309b6e8dad92b3f14cd655228ef0fa8a8108eaf4b039ee"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalDraftTemplate2.LoadSubtitle (cognitive 23): FinalDraftTemplate2.LoadSubtitle has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalDraftTemplate2.cs"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"85a1e33e015bcc6763bdbfbf480cbacf6bb11fc5c25e281e0b81e4bc1dbf0494"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageLogicAutocaption.LoadSubtitle (cognitive 23): ImageLogicAutocaption.LoadSubtitle has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ImageLogicAutocaption.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bd5418fc9a1c1980a48f9cd8336fab71f54058ae94f4c4b931639c656f03ecd"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonType19.LoadSubtitle (cognitive 23): JsonType19.LoadSubtitle has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType19.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ca01763b298b3623a7486dc79a6b89532c900f9e4a2042baee144fab619fe51"}},{"ruleId":"D2","level":"warning","message":{"text":"MacSub.LoadSubtitle (cognitive 23): MacSub.LoadSubtitle has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/MacSub.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2ef0c0c3540ea0b2f330c546c538ec35285190dd5aa67037d061ebf59ebeb9a"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle21.LoadSubtitle (cognitive 23): UnknownSubtitle21.LoadSubtitle has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle21.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3c91fcfae2967b96681c076c3c0eef64ec795de2f402bc4fda24515c5c4436f"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle66.LoadSubtitle (cognitive 23): UnknownSubtitle66.LoadSubtitle has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle66.cs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"920793d185557bb79750943396deea9e7a0a32aa7ae14079cb9545bdee6726d9"}},{"ruleId":"D2","level":"warning","message":{"text":"WhisperRaw2.LoadSubtitle (cognitive 23): WhisperRaw2.LoadSubtitle has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WhisperRaw2.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"31b5ac66a3b10413f217bf48cc05b5867c37f6f23419ed28736020268ffb99e6"}},{"ruleId":"D2","level":"warning","message":{"text":"ContainerSubtitleLoader.TryLoadTracks (cognitive 23): ContainerSubtitleLoader.TryLoadTracks has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/ContainerSubtitleLoader.cs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf059810f45db05d6f17048f555b3ef873cafb7df2a94dbaec8e53df96fd1725"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageOcrLoader.LoadTransportStreamDvbSub (cognitive 23): ImageOcrLoader.LoadTransportStreamDvbSub has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/ImageOcrLoader.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f73d4b734fa169df5469cb8466eb069db4d76ec1f820042d69bd7efd9359570"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.LoadParagraphs (cognitive 22): AudioVisualizer.LoadParagraphs has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":3268}}}],"partialFingerprints":{"codehealthFindingId/v1":"97a80b93d7b4dc42e312bbedf3a36875f9b5f33f3aebfa8aaca7704a9932435c"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedEffectFancyKaraoke.ApplyEffect (cognitive 22): AdvancedEffectFancyKaraoke.ApplyEffect has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFancyKaraoke.cs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f5731c86f57e457cc901775aebc6894c2ec9bdc0e6f52313e6ba0fc742d4f46"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedEffectGlitch.ApplyEffect (cognitive 22): AdvancedEffectGlitch.ApplyEffect has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectGlitch.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"c52f7368b4a27c5b9fbabad59688b2d514ecdc0ac77b14c2b8bf0eaf0561c1b5"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaDrawViewModel.ImportAssaDrawingFromText (cognitive 22): AssaDrawViewModel.ImportAssaDrawingFromText has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawViewModel.cs"},"region":{"startLine":919}}}],"partialFingerprints":{"codehealthFindingId/v1":"658ad5f9d05ee3041e06e7334989c5d07849a2f998afef810c0a34dbddaf96b5"}},{"ruleId":"D2","level":"warning","message":{"text":"ScriptSyncService.InterpolateUnmatched (cognitive 22): ScriptSyncService.InterpolateUnmatched has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportPlainText/ScriptSyncService.cs"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab44e41abd43057ff6e2db01c5e53a497757b75232694d146e72e27fe2d4b0eb"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsViewModel.ResetAllSettings (cognitive 22): SettingsViewModel.ResetAllSettings has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsViewModel.cs"},"region":{"startLine":2459}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7ba90d4ebaf5a52cc1775cd88bf128b083e353f0e72acfd3ad2920a6a4b8bc5"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConvertSettingsViewModel.OnOcrEngineChanged (cognitive 22): BatchConvertSettingsViewModel.OnOcrEngineChanged has cognitive complexity 22 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertSettingsViewModel.cs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d5ba26b3a96547187d23c1879084aff43a02b616955038043e8efc4ae319eba"}},{"ruleId":"D2","level":"warning","message":{"text":"AutoTranslateViewModel.UpdateTargetLanguages (cognitive 22): AutoTranslateViewModel.UpdateTargetLanguages has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f169049b283f947ce8dfb3779e10e279fd42b1fa87a4564e7e8fd83913e95b3"}},{"ruleId":"D2","level":"warning","message":{"text":"BurnInViewModel.Generate (cognitive 22): BurnInViewModel.Generate has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1229}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bc61f2535f45912ee3c2fb7999cf22ebcfa8fed227ba6e9376e62d557717531"}},{"ruleId":"D2","level":"warning","message":{"text":"CutVideoViewModel.AudioVisualizerOnPrimarySingleClicked (cognitive 22): CutVideoViewModel.AudioVisualizerOnPrimarySingleClicked has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/CutVideo/CutVideoViewModel.cs"},"region":{"startLine":1026}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c0767f9da160f59a2e12e9adbc1c776f8dc0093f84728f2fdec39a83d499c19"}},{"ruleId":"D2","level":"warning","message":{"text":"EmbeddedSubtitlesEditViewModel.FindTracks (cognitive 22): EmbeddedSubtitlesEditViewModel.FindTracks has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditViewModel.cs"},"region":{"startLine":644}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b693e55b73ff1ba55d8541265c4b4d8fbe09d9c3044c1e43114d5748b4507dc"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextEngineSettingsViewModel.DetectBackend (cognitive 22): SpeechToTextEngineSettingsViewModel.DetectBackend has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/EngineSettings/SpeechToTextEngineSettingsViewModel.cs"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a175493c5be75b3eccb3707d75009272973556cf8f17fde9e97b8f10df94757"}},{"ruleId":"D2","level":"warning","message":{"text":"KokoroTtsCpp.RefreshVoices (cognitive 22): KokoroTtsCpp.RefreshVoices has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/KokoroTtsCpp.cs"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"77ffa7366d9b5877780d3ff6de3a03d0a172cf7522da021751c5f3a17330c83a"}},{"ruleId":"D2","level":"warning","message":{"text":"MossTtsCrispAsr.EnsureServerRunningAsync (cognitive 22): MossTtsCrispAsr.EnsureServerRunningAsync has cognitive complexity 22 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs"},"region":{"startLine":606}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbe314595e7c995ce7249cb9c850a1c2d7265bdb3c59e3038e3b98d2bab4b0bb"}},{"ruleId":"D2","level":"warning","message":{"text":"OmniVoiceTtsCpp.Speak (cognitive 22): OmniVoiceTtsCpp.Speak has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceTtsCpp.cs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bff3104b5a2171e14bf6afaf42f4c5e681e37532f30bd1cf5b5e0c66f74306c"}},{"ruleId":"D2","level":"warning","message":{"text":"SeNamesList.Remove (cognitive 22): SeNamesList.Remove has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Dictionaries/SeNamesList.cs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"12c07270cba76fc60de944ffedd4f0f367540a44877e3648971c82ac5b6eb6ae"}},{"ruleId":"D2","level":"warning","message":{"text":"Unpacker.Extract7ZipSlow (cognitive 22): Unpacker.Extract7ZipSlow has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/SevenZipExtractor/Unpacker.cs"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e2d5e2b0c2583294bb09515fd9332e05037a6aa01c2668a9f5082ec1dfc8e6a"}},{"ruleId":"D2","level":"warning","message":{"text":"ActorConverter.FixActorsFromBeforeColon (cognitive 22): ActorConverter.FixActorsFromBeforeColon has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ActorConverter.cs"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"60b4630c7693805106c810e5c557fec08f3face94826c52499be035e8ae7237e"}},{"ruleId":"D2","level":"warning","message":{"text":"DialogSplitMerge.FixSpaces (cognitive 22): DialogSplitMerge.FixSpaces has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/DialogSplitMerge.cs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"86153485c7bb449e3f3920da9164a7d87f48933626a5c631bbb994749a55b2aa"}},{"ruleId":"D2","level":"warning","message":{"text":"CalcCjk.CountCharacters (cognitive 22): CalcCjk.CountCharacters has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TextLengthCalculator/CalcCJK.cs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c9bd22ab3eb326f7f79e83f2b98bfe72322022ee83ed7a756aece7c53c0d642"}},{"ruleId":"D2","level":"warning","message":{"text":"CalcCjkNoSpace.CountCharacters (cognitive 22): CalcCjkNoSpace.CountCharacters has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TextLengthCalculator/CalcCJKNoSpace.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bd7a9716a62a7961b0152fb524daacaf414bbdb9ed6e665426a13e00c12d62a"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.CanBreak (cognitive 22): Utilities.CanBreak has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"fedf0499016a152382f38c255535120899787df6210c2d954bf710879d7b3d64"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbSubPes.PrepareTeletext (cognitive 22): DvbSubPes.PrepareTeletext has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/DvbSubPes.cs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4bc2e73d534cea74e81f6e7451a9634cff59e3a603e540f9439364360d0a5c5"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbSubPes.GetImagePosition (cognitive 22): DvbSubPes.GetImagePosition has cognitive complexity 22 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/DvbSubPes.cs"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d24554558e9a1b3a3d8aeb8c31444396845d07541a0b8c080fb796dacfaafc1"}},{"ruleId":"D2","level":"warning","message":{"text":"ProgramMapTableParser.Parse (cognitive 22): ProgramMapTableParser.Parse has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/ProgramMapTableParser.cs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"77ddb870ae724bcae9dbf6d6cdd3d10d706f43f0730af4f57ec72623a5cf1b8f"}},{"ruleId":"D2","level":"warning","message":{"text":"NameList.Remove (cognitive 22): NameList.Remove has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Dictionaries/NameList.cs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"43be89bd40e494d913d5bdebd8a0c3ed1bf65568e115d35b2d018b8c8a3ce0c1"}},{"ruleId":"D2","level":"warning","message":{"text":"StringWithoutSpaceSplitToWords.SplitWord (cognitive 22): StringWithoutSpaceSplitToWords.SplitWord has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Dictionaries/StringWithoutSpaceSplitToWords.cs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"e050d0faaf354738c7b3946874bc5fb1a9f667679a1a6c59418c3a9b6446f1c5"}},{"ruleId":"D2","level":"warning","message":{"text":"TimeCodesBeautifier.FindConnectedSubtitlesBestCueFrame (cognitive 22): TimeCodesBeautifier.FindConnectedSubtitlesBestCueFrame has cognitive complexity 22 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/TimeCodesBeautifier.cs"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"05421c7dc93c9079cd7166412276fb200c52c1ab90adca758bd11fa573076ffd"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.GetHeaderAndStylesFromAdvancedSubStationAlpha (cognitive 22): AdvancedSubStationAlpha.GetHeaderAndStylesFromAdvancedSubStationAlpha has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e99e408ad5623ca97d3ec87dabe70b9bb28a9a711ccfbe53d57da1e9786261b"}},{"ruleId":"D2","level":"warning","message":{"text":"BdnXml.LoadSubtitle (cognitive 22): BdnXml.LoadSubtitle has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/BdnXml.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"06df0eb8c40fc75d91f92e7aa58869bee5801be78b8f831751b5bc26c0e5b30f"}},{"ruleId":"D2","level":"warning","message":{"text":"CapMakerPlus.Save (cognitive 22): CapMakerPlus.Save has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CapMakerPlus.cs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"e77a80046fa1f6775c03699e0c55ec49fccd9b97bf4d9f6019df5107b04aa381"}},{"ruleId":"D2","level":"warning","message":{"text":"Captionate.LoadSubtitle (cognitive 22): Captionate.LoadSubtitle has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Captionate.cs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"72f67804b2cf9844a185b861d289d5a1b48e1133ece6c3a6198cb485f1f9e5eb"}},{"ruleId":"D2","level":"warning","message":{"text":"Csv3.ReadText (cognitive 22): Csv3.ReadText has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Csv3.cs"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffe94d1a83f33803bec878410af0718aa7d38f31df35776677c3e71d2fafbb20"}},{"ruleId":"D2","level":"warning","message":{"text":"DvdStudioProSpaceGraphic.LoadSubtitle (cognitive 22): DvdStudioProSpaceGraphic.LoadSubtitle has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DvdStudioProSpaceGraphic.cs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"04217af86e69b0c71c8627db8cf11eaebf09acfdf8a2d1cf1a521add22930b7f"}},{"ruleId":"D2","level":"warning","message":{"text":"ESubXf.LoadSubtitle (cognitive 22): ESubXf.LoadSubtitle has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ESubXf.cs"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"a04aaefb65e8dbbf0d6f8731aac103423cc49e51db73d67fe697247acd132a0e"}},{"ruleId":"D2","level":"warning","message":{"text":"InqScribe.LoadSubtitle (cognitive 22): InqScribe.LoadSubtitle has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/InqScribe.cs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"47d19790e4baf8a1f7364f99701742825fbe87218037c888de5a554c86bcb761"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonType5.ToText (cognitive 22): JsonType5.ToText has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType5.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"db840e2f139f7cf49eda56fc4664fae090eff83a6d9f889d653ae05889cabe26"}},{"ruleId":"D2","level":"warning","message":{"text":"OtterAi.LoadSubtitle (cognitive 22): OtterAi.LoadSubtitle has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/OtterAi.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"0219590855c087fd1d3eb1e66a3146371dd7ac5ac4ae6d8e8fd91099171683d9"}},{"ruleId":"D2","level":"warning","message":{"text":"Ultech130.Save (cognitive 22): Ultech130.Save has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ultech130.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dd6b597e7139027a78b5e44946c0914758162587bce227321e51b6d7927cfa5"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle101.LoadSubtitle (cognitive 22): UnknownSubtitle101.LoadSubtitle has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle101.cs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"868dac47dcfe163545fbc36a4356f469f2560192aff4083e03be17246f532c09"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle45.LoadSubtitle (cognitive 22): UnknownSubtitle45.LoadSubtitle has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle45.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b27b064d10e6a41680e680e8499adf3b32a56cf05d43b57995d51f69d90ad4b"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle73.LoadSubtitle (cognitive 22): UnknownSubtitle73.LoadSubtitle has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle73.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f00b1b4f8948cfd8fc3b60710bc0bbe58740c8476a72815d22c95b73eb3c996"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle88.LoadSubtitle (cognitive 22): UnknownSubtitle88.LoadSubtitle has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle88.cs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9ddb5bca7afa28fa76fc95ae2de7ca31b8af7b44341c4012cd48a04d0438d59"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoIndexerJson.LoadSubtitle (cognitive 22): VideoIndexerJson.LoadSubtitle has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/VideoIndexerJson.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"ade6dd5d6127019762b1e33c805b6177d4b4d05ef143e787e881e06ba2f798a8"}},{"ruleId":"D2","level":"warning","message":{"text":"SubPicture.GenerateBitmap (cognitive 22): SubPicture.GenerateBitmap has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/SubPicture.cs"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"93403f074c470c61885bda0f61018cfbd6316a8454e0404634647ad26d5c9736"}},{"ruleId":"D2","level":"warning","message":{"text":"LibSEIntegration.ApplyOperation (cognitive 22): LibSEIntegration.ApplyOperation has cognitive complexity 22 (threshold 15). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":585}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d35d1629a95d3f9dc23b4b8f27620eaa0f88b5bf41e1d930c28aaa3c0ade5c0"}},{"ruleId":"D2","level":"warning","message":{"text":"SubtitleConverter.ApplyTransformsAndSaveAsync (cognitive 22): SubtitleConverter.ApplyTransformsAndSaveAsync has cognitive complexity 22 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SubtitleConverter.cs"},"region":{"startLine":683}}}],"partialFingerprints":{"codehealthFindingId/v1":"4549db2a18bbfe15e95e24a6da286b29916cbfe06760cf9ea2cc00f844741512"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageRenderer.DrawBoxBehindText (cognitive 22): ImageRenderer.DrawBoxBehindText has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ImageRenderer.cs"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a5eb28cf7d2204b3f5c67b53c61ac5d6b2613e97c965567a960b4048f68cb15"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmapImageSplitter2.SplitToLinesTransparentOrBlack (cognitive 22): NikseBitmapImageSplitter2.SplitToLinesTransparentOrBlack has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"551a33389bcfcce7136f13a6f3757e674cefbd1df1c0140dc28be834729d24b9"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrCaseFixer.FixUppercaseLowercaseIssues (cognitive 22): NOcrCaseFixer.FixUppercaseLowercaseIssues has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrCaseFixer.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0a5b0072f9701b551b8b94b50406feed9ab803d9baabeafefe7824d54b8c09e"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrChar.IsMatchPointForeGround (cognitive 22): NOcrChar.IsMatchPointForeGround has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrChar.cs"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"48cbaf6d633dc13ff0321f2f66f7fe187d6acc80dd262f175a466ef65c75543e"}},{"ruleId":"D2","level":"warning","message":{"text":"DoAutoTranslate.DoTranslate (cognitive 22): DoAutoTranslate.DoTranslate has cognitive complexity 22 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Translate/DoAutoTranslate.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"4557b0debcebca7625d4b87282bb7bff74a50f12afa36b73e7574d135c05241c"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedEffectFancyKaraoke.ParseActiveWord (cognitive 21): AdvancedEffectFancyKaraoke.ParseActiveWord has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFancyKaraoke.cs"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bdc6912f93e75add21995bce777753cc1fa5f147a40eb74435667adeef141ef"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.OnClosing (cognitive 21): MainViewModel.OnClosing has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":18602}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0e94faef5432846e94907813e57aa83cc31723f00715c3222f7e05b7b7937c5"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConvertViewModel.LoadSettings (cognitive 21): BatchConvertViewModel.LoadSettings has cognitive complexity 21 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":658}}}],"partialFingerprints":{"codehealthFindingId/v1":"c442bcfdc843ecff455e1f542d6fab55bfb97ab59035023286d292b077ebb2ef"}},{"ruleId":"D2","level":"warning","message":{"text":"ConvertActorsViewModel.UpdatePreview (cognitive 21): ConvertActorsViewModel.UpdatePreview has cognitive complexity 21 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/ConvertActors/ConvertActorsViewModel.cs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"398562b1de8c0647f2152150fd88e5888d1cf0c5f2e372b9de8c38fa104b84c6"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadSpeechToTextEngineViewModel.StartDownload (cognitive 21): DownloadSpeechToTextEngineViewModel.StartDownload has cognitive complexity 21 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs"},"region":{"startLine":498}}}],"partialFingerprints":{"codehealthFindingId/v1":"0538ceceba7aa33f773216e15769271f6790ab1aef82d4ccf59b8933c8d2b153"}},{"ruleId":"D2","level":"warning","message":{"text":"ReviewSpeechViewModel.TrimAndAdjustSpeed (cognitive 21): ReviewSpeechViewModel.TrimAndAdjustSpeed has cognitive complexity 21 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":1088}}}],"partialFingerprints":{"codehealthFindingId/v1":"d69dc83532e50d9163805de898e14b38ff1513a9adc59ae9a3a47261b8cd60fe"}},{"ruleId":"D2","level":"warning","message":{"text":"UserWordsHelper.LoadUserWordList (cognitive 21): UserWordsHelper.LoadUserWordList has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Dictionaries/UserWordsHelper.cs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2e48e33add3f3000afc0b89713a208dc575f9f425b906baffdb9457863796a8"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadHashManager.DetectCrispAsrLinuxVariant (cognitive 21): DownloadHashManager.DetectCrispAsrLinuxVariant has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Download/DownloadHashManager.cs"},"region":{"startLine":2153}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f789b67ebc5d0c30f0581e76ea4b2ecb7fc3be360b4d91908a830ab570fc580"}},{"ruleId":"D2","level":"warning","message":{"text":"InsertService.SetStyleForNewParagraph (cognitive 21): InsertService.SetStyleForNewParagraph has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/InsertService.cs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b506fe8bf21226ce25a9c04af45a27d20095a69340466a97cc8c7131e5b1e29"}},{"ruleId":"D2","level":"warning","message":{"text":"FfmpegGenerator.AlterEmbeddedTracksMp4 (cognitive 21): FfmpegGenerator.AlterEmbeddedTracksMp4 has cognitive complexity 21 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/FfmpegGenerator.cs"},"region":{"startLine":1460}}}],"partialFingerprints":{"codehealthFindingId/v1":"e50f9643ae2f58ff4f52afa51a516fd6827d1d3aa003ffc2be1e628b9ce4e9c8"}},{"ruleId":"D2","level":"warning","message":{"text":"Mp3DurationReader.TryParseFrame (cognitive 21): Mp3DurationReader.TryParseFrame has cognitive complexity 21 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/Mp3DurationReader.cs"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"cddda5226e405644f8e20690208bf676008fdc2da76175ff7be88a9c3f21b9d7"}},{"ruleId":"D2","level":"warning","message":{"text":"Unpacker.Unpack7ZipViaSystemExecutable (cognitive 21): Unpacker.Unpack7ZipViaSystemExecutable has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/SevenZipExtractor/Unpacker.cs"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"234accbd3e6064b3ca12d59ce091d0197601785d1ef5a102036b9c6c30899fda"}},{"ruleId":"D2","level":"warning","message":{"text":"XmlSourceSyntaxHighlighting.ColorizeLineContent (cognitive 21): XmlSourceSyntaxHighlighting.ColorizeLineContent has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/XmlSourceSyntaxHighlighting.cs"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"07ebc31625f872d4eef503f22c6242e10ab1ff7b3f062268b1285ee106792ad3"}},{"ruleId":"D2","level":"warning","message":{"text":"Program.SetupNativeMenu (cognitive 21): Program.SetupNativeMenu has cognitive complexity 21 (threshold 15). Most of this is not in the body itself: 4 of the 21 points are its own statements and the rest belongs to one function literal inside it that branches (line 333). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Program.cs"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c75025a8a4fd5410f58e9194d500cfbfa68615970c254a595ed3e92c24b5f3d"}},{"ruleId":"D2","level":"warning","message":{"text":"CsvUtil.CsvSplit (cognitive 21): CsvUtil.CsvSplit has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/CsvUtil.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"375e3f6dacdcb2950183c98624e4289e457de74123dfa6b4267a2985df98f3df"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporterJson.AutoGuessImport (cognitive 21): UnknownFormatImporterJson.AutoGuessImport has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterJson.cs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9e7449c336d24b0ac061311908e5d7e6787d66b0361aac8557285e402d6fdc0"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporterJson.ReadTextTag (cognitive 21): UnknownFormatImporterJson.ReadTextTag has cognitive complexity 21 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterJson.cs"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e72ba2c92bc3821c399777ae4062bf9210b1c3534edec206ed562b6a0e85a76"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporterOds.ConvertIsoDurationToTimeCode (cognitive 21): UnknownFormatImporterOds.ConvertIsoDurationToTimeCode has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterOds.cs"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"26a3e61c40ad96fb0bda6332e420b711364d2790504332a57ece113504efedfa"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.QualifiesForMerge (cognitive 21): Utilities.QualifiesForMerge has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":3327}}}],"partialFingerprints":{"codehealthFindingId/v1":"14343e0725ec69319ef986545ee4c122a6e3121b38701aa062ec9d39f95c16db"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVttHelper.GetCssProperties (cognitive 21): WebVttHelper.GetCssProperties has cognitive complexity 21 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/WebVttHelper.cs"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f4deb1c8f27df25e6a827c3bf457e828620f55cd1893976fd67e5ecb74d7b78"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.ReadFragmentedTextSamples (cognitive 21): MP4Parser.ReadFragmentedTextSamples has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dc08f91d4d637420d13d5de16a567da4f401fd9c62cab86c99d62268dde2510"}},{"ruleId":"D2","level":"warning","message":{"text":"TransportStreamParser.ProcessPackages (cognitive 21): TransportStreamParser.ProcessPackages has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/TransportStreamParser.cs"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"70603e6e6843b95630be5ea81cfd3ae99184b1a50e72e71d0c214834338153f3"}},{"ruleId":"D2","level":"warning","message":{"text":"FixSpanishInvertedQuestionAndExclamationMarks.Fix (cognitive 21): FixSpanishInvertedQuestionAndExclamationMarks.Fix has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixSpanishInvertedQuestionAndExclamationMarks.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"97f1eabfc15378757b84bd507d5fab1be97423f691417feaa55960f2707edda1"}},{"ruleId":"D2","level":"warning","message":{"text":"FixUnnecessaryLeadingDots.Fix (cognitive 21): FixUnnecessaryLeadingDots.Fix has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixUnnecessaryLeadingDots.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"515d052b6540ba915e4ad9926faeb5a12db6e0e198ed8937e52e8961a21a4722"}},{"ruleId":"D2","level":"warning","message":{"text":"Csv2.LoadSubtitle (cognitive 21): Csv2.LoadSubtitle has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Csv2.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd0a456da239eeb94c00a29884f6f29b6129183f19b9d6ac3f05a04d29ba0ac1"}},{"ruleId":"D2","level":"warning","message":{"text":"Csv4.LoadSubtitle (cognitive 21): Csv4.LoadSubtitle has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Csv4.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"6608c3707295d128b6abd47d2606a26bcbe2c018336a1e132ec4e1ec1afd1154"}},{"ruleId":"D2","level":"warning","message":{"text":"Csv5.LoadSubtitle (cognitive 21): Csv5.LoadSubtitle has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Csv5.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"c49577a3231d15edfe9fea4d0088fe64fce9e727cb62bbf3c37972a9a3489331"}},{"ruleId":"D2","level":"warning","message":{"text":"EdiusMarkerList2Frames.LoadSubtitle (cognitive 21): EdiusMarkerList2Frames.LoadSubtitle has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/EdiusMarkerList2Frames.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae4aa66140f496ba70ba38577c167a6692502d47376f7f15a579141345a7e733"}},{"ruleId":"D2","level":"warning","message":{"text":"EdiusMarkerList2Ms.LoadSubtitle (cognitive 21): EdiusMarkerList2Ms.LoadSubtitle has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/EdiusMarkerList2Ms.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3f7a815da79332cb674ee1e627cdf7ecb43107e05b92ff38a33b1eff50a996d"}},{"ruleId":"D2","level":"warning","message":{"text":"EdiusMarkerList3Frames.LoadSubtitle (cognitive 21): EdiusMarkerList3Frames.LoadSubtitle has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/EdiusMarkerList3Frames.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"323d267969d9c6ff6c7ac73891eadd074e7a42a432f03276069e1cbdc50ac18b"}},{"ruleId":"D2","level":"warning","message":{"text":"EdiusMarkerList3Ms.LoadSubtitle (cognitive 21): EdiusMarkerList3Ms.LoadSubtitle has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/EdiusMarkerList3Ms.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"384d6861e30572f494937f2bd9898d3b2210cebe9bf48ae00206dfda4bd8ed44"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalCutProXml14Text.LoadSubtitle (cognitive 21): FinalCutProXml14Text.LoadSubtitle has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProXml14Text.cs"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb2a93c826fb52576058ec9ecf5c3512e4da99fd8be1d50cec68e478ad3692c"}},{"ruleId":"D2","level":"warning","message":{"text":"FlashXml.LoadSubtitle (cognitive 21): FlashXml.LoadSubtitle has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FlashXml.cs"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"be68e03f808612b3486399a3349e39d9e889892cebaa7cb8ee42f76c27b4c76b"}},{"ruleId":"D2","level":"warning","message":{"text":"KaraokeCdgCreatorText.LoadSubtitle (cognitive 21): KaraokeCdgCreatorText.LoadSubtitle has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/KaraokeCdgCreatorText.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"f89abcfeebeeaa23bd242a8d68e9d687ba588b0ba2f0fa96403b09024b2fe6c6"}},{"ruleId":"D2","level":"warning","message":{"text":"LambdaCap.EncodeStyle (cognitive 21): LambdaCap.EncodeStyle has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/LambdaCap.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"44050807a965edb2a914ce081c599d979f5539c10554bba95306a7f761f53399"}},{"ruleId":"D2","level":"warning","message":{"text":"SatBoxPng.LoadSubtitle (cognitive 21): SatBoxPng.LoadSubtitle has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SatBoxPng.cs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2dadd7f3ac15d255c95f245c134569693eaacc1f5aa2a1b3b9765647841e860"}},{"ruleId":"D2","level":"warning","message":{"text":"ScenaristClosedCaptions.AutoBreakLineMax4Lines (cognitive 21): ScenaristClosedCaptions.AutoBreakLineMax4Lines has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ScenaristClosedCaptions.cs"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7dd2f634be09eb88f573e579779849068d47c95ad1d46628b7ee9934c728286"}},{"ruleId":"D2","level":"warning","message":{"text":"SmartTitler.LoadSubtitle (cognitive 21): SmartTitler.LoadSubtitle has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SmartTitler.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"39d016b7a530d536cecd7040551642faee64163e257aadc72c092df7bdec2746"}},{"ruleId":"D2","level":"warning","message":{"text":"SoftNicolonSub.ToText (cognitive 21): SoftNicolonSub.ToText has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SoftNiColonSub.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"e558b6004e9e66582f3c5b75b928e10411341466b021c6a61d2611b8b6c45ca1"}},{"ruleId":"D2","level":"warning","message":{"text":"SoftNiSub.ToText (cognitive 21): SoftNiSub.ToText has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SoftNiSub.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd085b5f1eaaa3937febbbfa1d279a5d44134e80e78d042361f8ae0e7c36519f"}},{"ruleId":"D2","level":"warning","message":{"text":"SubStationAlpha.GetHeaderAndStylesFromAdvancedSubStationAlpha (cognitive 21): SubStationAlpha.GetHeaderAndStylesFromAdvancedSubStationAlpha has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubStationAlpha.cs"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"5636557eb47e6e9de119f87540f72306e6e2c588547ffc4d684c51fc5e608f3f"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle46.LoadSubtitle (cognitive 21): UnknownSubtitle46.LoadSubtitle has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle46.cs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"32bb7a29bee5befecc2b361b9af8c26a498746101b3159a68cb3a0f3b6dcbae5"}},{"ruleId":"D2","level":"warning","message":{"text":"ContainerSubtitleLoader.LoadMp4 (cognitive 21): ContainerSubtitleLoader.LoadMp4 has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/ContainerSubtitleLoader.cs"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d5b9cca7a5714876d54c92d6dfb3038a4f0a7da11861c22c8599c3661c1909b"}},{"ruleId":"D2","level":"warning","message":{"text":"WhisperHelper.GetExecutableFileNameNoPath (cognitive 21): WhisperHelper.GetExecutableFileNameNoPath has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/AudioToText/WhisperHelper.cs"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"78140f88b9938558f82656c14d40195c03d8ff66860e3f93435ff77d80ffff77"}},{"ruleId":"D2","level":"warning","message":{"text":"ExportHandlerBluRaySup.MakeBluRaySupImage (cognitive 21): ExportHandlerBluRaySup.MakeBluRaySupImage has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerBluRaySup.cs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"c70b57b4e612c195eab97f303d3856096b06935c1352cdb9e9069b4ce38c60d1"}},{"ruleId":"D2","level":"warning","message":{"text":"LlamaCppServerManager.EnsureServerRunningAsync (cognitive 21): LlamaCppServerManager.EnsureServerRunningAsync has cognitive complexity 21 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/LlamaCpp/LlamaCppServerManager.cs"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"202c79496ebd5605b532583b666f9210cb9925ac6e0214d1a19420546fe8ee6f"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrBitmap.IsDash (cognitive 21): BinaryOcrBitmap.IsDash has cognitive complexity 21 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":573}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b9d6d9c6398d2858d37bd9be53816ed6f9abbbe664e219ebcd689d40550c553"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.DrawShotChanges (cognitive 20): AudioVisualizer.DrawShotChanges has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":3016}}}],"partialFingerprints":{"codehealthFindingId/v1":"add841ff2fff23a5c8b107eb49431d02e5afe983adfede1cdab70af5dc9d6555"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.FindDataBelowThresholdBack (cognitive 20): AudioVisualizer.FindDataBelowThresholdBack has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":3502}}}],"partialFingerprints":{"codehealthFindingId/v1":"baafb939119a04f11cae4cec30e403200489b55d76122287dceae793f779d729"}},{"ruleId":"D2","level":"warning","message":{"text":"RosettaPropertiesViewModel.ReadValuesFromXml (cognitive 20): RosettaPropertiesViewModel.ReadValuesFromXml has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs"},"region":{"startLine":618}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4ac1a3ca661e20abe6af72af5a86d61d38f16638d3f39afb09d36fa9304fa1a"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVttPropertiesViewModel.ReadValuesFromXml (cognitive 20): WebVttPropertiesViewModel.ReadValuesFromXml has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/WebVttProperties/WebVttPropertiesViewModel.cs"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"830348d3360dbfad10f4e49e2a9b8cd91d3f6f1ec813a57c32b1ff292e23c68f"}},{"ruleId":"D2","level":"warning","message":{"text":"ForcedAligner.RefineAsync (cognitive 20): ForcedAligner.RefineAsync has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportPlainText/ForcedAligner.cs"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"74551c94fcd8ba2588794047de8b07673d8e86f033d9448f37e75e0253cfbe0b"}},{"ruleId":"D2","level":"warning","message":{"text":"InitMenu.ToKeyGesture (cognitive 20): InitMenu.ToKeyGesture has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitMenu.cs"},"region":{"startLine":1124}}}],"partialFingerprints":{"codehealthFindingId/v1":"5033774758b4c86ab0786902ecd35270fd640b8931065c9a626a156ba151050b"}},{"ruleId":"D2","level":"warning","message":{"text":"DivXSubParser.ImportSubtitleFromDivX (cognitive 20): DivXSubParser.ImportSubtitleFromDivX has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainHelpers/DivXSubParser.cs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9ed6b0b63e0374a4783435a09df18f618e005c4b9511fa75053382630dc4299"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrInspectViewModel.OnLetterClicked (cognitive 20): BinaryOcrInspectViewModel.OnLetterClicked has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"88394d12f26887bd61a5a6abf2edb44b764bb763952d18152cdb97ecbd89f8d4"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.IsVerticalAngledLineTransparent (cognitive 20): OcrViewModel.IsVerticalAngledLineTransparent has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3314}}}],"partialFingerprints":{"codehealthFindingId/v1":"f56843e196357630fc776c160d919f2d3acc8c3f1883cd90b65b6d7cc4d52a52"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.RunTesseractOcr (cognitive 20): OcrViewModel.RunTesseractOcr has cognitive complexity 20 (threshold 15). Most of this is not in the body itself: 0 of the 20 points are its own statements and the rest belongs to one function literal inside it that branches (line 3969). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3962}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce27c437729d8a148b66936eed697d3ee7d772370531cc399bba1913faf97a47"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsViewModel.SaveSettings (cognitive 20): SettingsViewModel.SaveSettings has cognitive complexity 20 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsViewModel.cs"},"region":{"startLine":1539}}}],"partialFingerprints":{"codehealthFindingId/v1":"f35467ddd5451351125bb734c4591f6b6c140351ac20630ee0571b55073d89da"}},{"ruleId":"D2","level":"warning","message":{"text":"PositionMonitorControl.Render (cognitive 20): PositionMonitorControl.Render has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/PositionMonitorControl.cs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"73199fa2df1d15d0315b104b69e8b30798193bcc9a1d936e071686f84f28b649"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaInfoSyntaxHighlighting.ColorizeTrackDetails (cognitive 20): MediaInfoSyntaxHighlighting.ColorizeTrackDetails has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/MediaInfoView/MediaInfoSyntaxHighlighting.cs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2ae40b8a6b65330d8ca520c5d656e426b7c30dea2e2acc91fec1a31a85c31eb"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoPlayerUndockedViewModel.OnKeyDown (cognitive 20): VideoPlayerUndockedViewModel.OnKeyDown has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/Undocked/VideoPlayerUndockedViewModel.cs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcd713c83562e94c32d28d269b6cf396f7c6a1fadfa5e36348dd2a4918c28cc1"}},{"ruleId":"D2","level":"warning","message":{"text":"AdjustAllTimesViewModel.OnKeyDown (cognitive 20): AdjustAllTimesViewModel.OnKeyDown has cognitive complexity 20 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Sync/AdjustAllTimes/AdjustAllTimesViewModel.cs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd8f9242dc646ae0309cbdaf93490d2e59e8cbd6acb754757c7ce671c0bd75e2"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.MergeLinesWithSameText (cognitive 20): BatchConverter.MergeLinesWithSameText has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":2654}}}],"partialFingerprints":{"codehealthFindingId/v1":"e09d751c6309bb167d813915e29dd8cd9adf87e83e06fce2b924a5dd475401c3"}},{"ruleId":"D2","level":"warning","message":{"text":"F5TtsCrispAsr.EnsureServerRunningAsync (cognitive 20): F5TtsCrispAsr.EnsureServerRunningAsync has cognitive complexity 20 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"c601bd3960864f494d99105463679fd7791f36d50156fce8305fb969366bef63"}},{"ruleId":"D2","level":"warning","message":{"text":"IndexTtsCrispAsr.EnsureServerRunningAsync (cognitive 20): IndexTtsCrispAsr.EnsureServerRunningAsync has cognitive complexity 20 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4f38be7264e362ee41245fb712fc2cf14fcc6031e7911dba1439c6117258442"}},{"ruleId":"D2","level":"warning","message":{"text":"Qwen3TtsCrispAsr.EnsureServerRunningAsync (cognitive 20): Qwen3TtsCrispAsr.EnsureServerRunningAsync has cognitive complexity 20 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs"},"region":{"startLine":914}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba7bad296cc34ece0e8fe01f0da774cea5d7997088b07312d95ceb88f3de85c9"}},{"ruleId":"D2","level":"warning","message":{"text":"VoxCPM2CrispAsr.EnsureServerRunningAsync (cognitive 20): VoxCPM2CrispAsr.EnsureServerRunningAsync has cognitive complexity 20 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs"},"region":{"startLine":554}}}],"partialFingerprints":{"codehealthFindingId/v1":"efdc9f08752e477aafb5cc5872feb254126dafb2737d8aa069eecffbd98f2257"}},{"ruleId":"D2","level":"warning","message":{"text":"ZonosTtsCrispAsr.EnsureServerRunningAsync (cognitive 20): ZonosTtsCrispAsr.EnsureServerRunningAsync has cognitive complexity 20 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ZonosTtsCrispAsr.cs"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f14fc4b4f6b50765f2e9333f32a8ca9c12c3da7f7d7d7eafba3435b2795956f"}},{"ruleId":"D2","level":"warning","message":{"text":"TextToSpeechViewModel.SaveSettings (cognitive 20): TextToSpeechViewModel.SaveSettings has cognitive complexity 20 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1c797e01d0d9ed2f45b9fbec01fca7a2029d9763e69685de8eecd7a5011cbf3"}},{"ruleId":"D2","level":"warning","message":{"text":"TextToSpeechViewModel.GenerateTts (cognitive 20): TextToSpeechViewModel.GenerateTts has cognitive complexity 20 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":1175}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b2c8721b6dfc27baebde74dc414f40278a9d3c41b24fb2ace047cbe155a90c9"}},{"ruleId":"D2","level":"warning","message":{"text":"CropAreaSelector.HitTest (cognitive 20): CropAreaSelector.HitTest has cognitive complexity 20 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/VideoOcr/CropAreaSelector.cs"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc8a7bdbea6a5fc4b6d1a0697c3cf46c179d5edbe8200c2f5d916fce0884a0d2"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaFontEmbedder.EmbedUsedFonts (cognitive 20): AssaFontEmbedder.EmbedUsedFonts has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/AssaFontEmbedder.cs"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bea836f263d9eccbd4f152e0499cffd086e4bd4ceef21a8f6c8e1e00d6f485c"}},{"ruleId":"D2","level":"warning","message":{"text":"WavePeakGenerator2.GenerateSpectrogram (cognitive 20): WavePeakGenerator2.GenerateSpectrogram has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/WaveToVisualizer2.cs"},"region":{"startLine":950}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f3bb248dcba0c2062c494f125a347bda78b91f40442a1496cbe2f757319f467"}},{"ruleId":"D2","level":"warning","message":{"text":"NetflixCheckTimedTextFrameRate.Check (cognitive 20): NetflixCheckTimedTextFrameRate.Check has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/NetflixQualityCheck/NetflixCheckTimedTextFrameRate.cs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca2051cf9e32f130e8d2f730f9443444df6e68ca7b88b58f8ba27f57748c8064"}},{"ruleId":"D2","level":"warning","message":{"text":"Core.FetchAsync (cognitive 20): Core.FetchAsync has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Ocr/GoogleLens/Core.cs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd93564f8338d7964310add6720dbc1454674e810b57f898c69ac37691bf6d1f"}},{"ruleId":"D2","level":"warning","message":{"text":"NativeMethods.CrossLoadLibrary (cognitive 20): NativeMethods.CrossLoadLibrary has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibMpvDynamic/NativeMethods.cs"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"05365c752fa96d4fc22bb62cb9a3121bf6d79ae3d31de49d0d3d508282f638b2"}},{"ruleId":"D2","level":"warning","message":{"text":"CdgGraphics.TileBlock (cognitive 20): CdgGraphics.TileBlock has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/CDG/CdgGraphics.cs"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b8c8472a286bdf436419bb67caccd803e9e712d4cf747eaa46e16d2c669c483"}},{"ruleId":"D2","level":"warning","message":{"text":"Subtitle.SetFixedDuration (cognitive 20): Subtitle.SetFixedDuration has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Subtitle.cs"},"region":{"startLine":590}}}],"partialFingerprints":{"codehealthFindingId/v1":"25e3176890bb87dc1cc2cde7c2fdf5b509c177e78eabe5e412ab707ad14c1ca7"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporterJson.ReadParagraph (cognitive 20): UnknownFormatImporterJson.ReadParagraph has cognitive complexity 20 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterJson.cs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"96b56ed552c153c5f1b6c14724343667ec6287eaded6391fd819780e60b4efd6"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.GetOriginalParagraph (cognitive 20): Utilities.GetOriginalParagraph has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":1544}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff779607a4a2481423c3a7d87dc9770416edc148b97766957763dd716f02d0f8"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.RemoveSpaceBetweenNumbers (cognitive 20): Utilities.RemoveSpaceBetweenNumbers has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":2402}}}],"partialFingerprints":{"codehealthFindingId/v1":"e131cd5f6f3a87ee3b78a41ab30f539aac00e265f5ed0e79077643627d239a3b"}},{"ruleId":"D2","level":"warning","message":{"text":"VobSubColorIsolation.BinarizeForOcr (cognitive 20): VobSubColorIsolation.BinarizeForOcr has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/VobSubColorIsolation.cs"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"d238f09310e74cdfa9c797b1e5beb0530f005602a5ed71b23b63440f84135703"}},{"ruleId":"D2","level":"warning","message":{"text":"FixMissingOpenBracket.RestoreMissingOpenParenthesis (cognitive 20): FixMissingOpenBracket.RestoreMissingOpenParenthesis has cognitive complexity 20 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixMissingOpenBracket.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb44794cd081517a6d5b1f302352c39632323ec2b0af6083e2d9f4378acbfbdd"}},{"ruleId":"D2","level":"warning","message":{"text":"SplitLongLinesHelper.SplitLongLinesInSubtitle (cognitive 20): SplitLongLinesHelper.SplitLongLinesInSubtitle has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/SplitLongLinesHelper.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2271f443356d07cee92d63f526c621f5bccb68402730c736db9da421e83e4db"}},{"ruleId":"D2","level":"warning","message":{"text":"Csv.LoadSubtitle (cognitive 20): Csv.LoadSubtitle has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Csv.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cb3d2cdbc014c7a51316b9dcd51be17ebe22dfbde3e7b0953d97accf79aed57"}},{"ruleId":"D2","level":"warning","message":{"text":"EbuTtD.SplitToStyledSegments (cognitive 20): EbuTtD.SplitToStyledSegments has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/EbuTtD.cs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae3d39bb6420fb5abd9d77563120792930c8872d616ba2cd082338c904f48bc9"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonType13.LoadSubtitle (cognitive 20): JsonType13.LoadSubtitle has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType13.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"e022977ad2df04b3ca0fdeb5da4b23809acb1b680334c83c61d673c578c1aa44"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonTypeOnlyLoad1.LoadSubtitle (cognitive 20): JsonTypeOnlyLoad1.LoadSubtitle has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonTypeOnlyLoad1.cs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a5e2e8a893ac4bb6d2f9b9c0e7d33665166f3d6add08c63482661b39f1054b6"}},{"ruleId":"D2","level":"warning","message":{"text":"PlayStationSubs.LoadSubtitle (cognitive 20): PlayStationSubs.LoadSubtitle has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/PlayStationSubs.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"4527a0249464f3e723b6fe7c937762347f6af453c756b07625fea498f1455870"}},{"ruleId":"D2","level":"warning","message":{"text":"SwiftText.TryReadTimeCodesLine (cognitive 20): SwiftText.TryReadTimeCodesLine has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SwiftText.cs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b36e181fa82f36c3a598cd60ede23aa9480c6562d98544890f1d3f289dbe699"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText10.GetTimeCode (cognitive 20): TimedText10.GetTimeCode has cognitive complexity 20 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1320}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bfb66baccea6faf2fc9e80eb59b7c4916d742e1bc8a961697411d226c9ab6f4"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedTextImsc11.GetAssStyleFromRegion (cognitive 20): TimedTextImsc11.GetAssStyleFromRegion has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImsc11.cs"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ab879b3ed8849a3f522834b079796b7513202c5b930ea2301052ad6c67c8f22"}},{"ruleId":"D2","level":"warning","message":{"text":"Tsv1.LoadSubtitle (cognitive 20): Tsv1.LoadSubtitle has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Tsv1.cs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec55e972c9c32d136bf1b6661b45de23e7940df226b4b19ca852b376bab2348d"}},{"ruleId":"D2","level":"warning","message":{"text":"Tsv2.LoadSubtitle (cognitive 20): Tsv2.LoadSubtitle has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Tsv2.cs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d03625269acca5a82f0e3b27793808c0096a482232faef77bad33a8a39bdf8a"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle42.LoadSubtitle (cognitive 20): UnknownSubtitle42.LoadSubtitle has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle42.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"15fcb4d3c2ba58f89c316cf6316394534b257be8cfb5668bb3527599c04a03e1"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle8.LoadSubtitle (cognitive 20): UnknownSubtitle8.LoadSubtitle has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle8.cs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"62d5bf092778643d8245830afed7fef2bee16fc05b11aa1ca6f7531851a89417"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVTT.GetVoices (cognitive 20): WebVTT.GetVoices has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTT.cs"},"region":{"startLine":1107}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa2f2157b8d7bb55bb22b3ceb675a85a3553e4590f5f672225aeaa70e827f49"}},{"ruleId":"D2","level":"warning","message":{"text":"AutoTranslateRunner.Create (cognitive 20): AutoTranslateRunner.Create has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/AutoTranslateRunner.cs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"33cae31f73657e99f3f5d0227491749571c75a8c1428d24ce8f4950b46f736b9"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrChar.NOcrChar.ctor (cognitive 20): NOcrChar.NOcrChar.ctor has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrChar.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"de8772305571497e4d7eb2fc6c140c2c92b350d130671ff49b52a86ac5c8eebd"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrChar.IsMatchPointBackGround (cognitive 20): NOcrChar.IsMatchPointBackGround has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrChar.cs"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba8d91b1b23578c8edb0b4b87c9b36dd40442c0de640b8ea0e9b0ea7c0d50c28"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrDb.GetMatchSingle (cognitive 20): NOcrDb.GetMatchSingle has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrDb.cs"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe390ba8b8e5c753a7f2fbc0f30e1e04f897466e01306d359e780fcfc766df35"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrLineGenerator.LongestRunAlongLine (cognitive 20): NOcrLineGenerator.LongestRunAlongLine has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":1345}}}],"partialFingerprints":{"codehealthFindingId/v1":"1df8e66f5ee2e5518f3099aa71c9f5803001e0e59f372ea26cd66c7526416b27"}},{"ruleId":"D2","level":"warning","message":{"text":"SpellChecker.IsPartOfHtmlOrAssaTag (cognitive 20): SpellChecker.IsPartOfHtmlOrAssaTag has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/SpellCheck/SpellChecker.cs"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6f7ef4a0ddd432c9f6ed236b4ee070df822e459b37b0ff9d7e622c1c203b04a"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaApplyAdvancedEffectViewModel.Initialize (cognitive 19): AssaApplyAdvancedEffectViewModel.Initialize has cognitive complexity 19 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectViewModel.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8bb2e7562a44495eeeaf1a3673065590a97f01f4b34764a1350a35f44c19756"}},{"ruleId":"D2","level":"warning","message":{"text":"ExportEbuStlViewModel.CheckErrors (cognitive 19): ExportEbuStlViewModel.CheckErrors has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportEbuStl/ExportEbuStlViewModel.cs"},"region":{"startLine":509}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecc328d7fb2d595b1db250309f8bc92565298b4707140fa3047a9e28f8dcec78"}},{"ruleId":"D2","level":"warning","message":{"text":"ForcedAligner.ApplyTimeCodes (cognitive 19): ForcedAligner.ApplyTimeCodes has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportPlainText/ForcedAligner.cs"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"f78eba05901dd13d70b02bd31367cee48f7c5214d0277c1cec1b86deb42bfd95"}},{"ruleId":"D2","level":"warning","message":{"text":"InitNativeMacMenu.Sync (cognitive 19): InitNativeMacMenu.Sync has cognitive complexity 19 (threshold 15). Most of this is not in the body itself: 8 of the 19 points are its own statements and the rest belongs to one function literal inside it that branches (line 564). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitNativeMacMenu.cs"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"4994bb725c31304c6852f61378b7439657ee378f4522658fb1f8782c3011a019"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.SetDurationMaxCpsSelectedLines (cognitive 19): MainViewModel.SetDurationMaxCpsSelectedLines has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":4005}}}],"partialFingerprints":{"codehealthFindingId/v1":"be55200594ecfe7cb12abb8cb8ea7f0e2a47de07470475e627f40be364f7a839"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ShowToolsSplitBreakLongLinesSelectedLines (cognitive 19): MainViewModel.ShowToolsSplitBreakLongLinesSelectedLines has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":13269}}}],"partialFingerprints":{"codehealthFindingId/v1":"55f163c99409c6527a68cae078fed8c18aa0665cc8bbf15494e080ec731324bf"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ImportSubtitleFromTransportStream (cognitive 19): MainViewModel.ImportSubtitleFromTransportStream has cognitive complexity 19 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":17026}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd5123ca56df590779b309baf8d822ce536c6bd9e65af2b4c7e27595da8e4c55"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.LoadWaveformAndSpectrogram (cognitive 19): MainViewModel.LoadWaveformAndSpectrogram has cognitive complexity 19 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 9 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":19075}}}],"partialFingerprints":{"codehealthFindingId/v1":"08a0a8b9cfdc7b4de478de57f61822b1dd91fcb654757fd4fb5cd07f0159b1a0"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.OnSubtitleGridSingleTapped (cognitive 19): MainViewModel.OnSubtitleGridSingleTapped has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":23693}}}],"partialFingerprints":{"codehealthFindingId/v1":"47bb7c9ebe55c71240b25ef49ea79b460ee6e79799c65fe55f1920ece814e47f"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrCharacterAddViewModel.KeyDown (cognitive 19): BinaryOcrCharacterAddViewModel.KeyDown has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"942a831ccfa2a487ad963d99c16819d3116f8f00a980d7f6980bdd1ad437676a"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.ToggleItalic (cognitive 19): OcrViewModel.ToggleItalic has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1805}}}],"partialFingerprints":{"codehealthFindingId/v1":"444ee08876a7c75d9a4e10b62980e6e51d2c54e54f457a4558c5045eb1d9c44f"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.ToggleBold (cognitive 19): OcrViewModel.ToggleBold has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":2109}}}],"partialFingerprints":{"codehealthFindingId/v1":"09f0e14cc0aff25229b580725338f8405aa65bb6bf88e5cc218607102c266890"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.OcrFixLineAndSetText (cognitive 19): OcrViewModel.OcrFixLineAndSetText has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3871}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ab3b2794729ee38786b22ec27d4598a539736d91fa906cf34069717912fb42b"}},{"ruleId":"D2","level":"warning","message":{"text":"ProfileImportExport.ProfileImportExport.ctor (cognitive 19): ProfileImportExport.ProfileImportExport.ctor has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/ProfileImportExport.cs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"88611930164decc806903b38a9d402e84c73300d463ea0889c9f710d79a4c068"}},{"ruleId":"D2","level":"warning","message":{"text":"PickMatroskaTrackViewModel.Export (cognitive 19): PickMatroskaTrackViewModel.Export has cognitive complexity 19 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/PickMatroskaTrack/PickMatroskaTrackViewModel.cs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0cb5a64ecb53b62d68b815e513dd26fcb97b9b21ff57a5586f093bbe8583e68"}},{"ruleId":"D2","level":"warning","message":{"text":"SpellCheckViewModel.LoadImageSource (cognitive 19): SpellCheckViewModel.LoadImageSource has cognitive complexity 19 (threshold 15). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/SpellCheckViewModel.cs"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"438e0d4ccd0a9be9beee52608c4842d0d4292d0c438506604400c1bd94b98172"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConvertViewModel.Convert (cognitive 19): BatchConvertViewModel.Convert has cognitive complexity 19 (threshold 15). Most of this is not in the body itself: 5 of the 19 points are its own statements and the rest belongs to one function literal inside it that branches (line 969). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":921}}}],"partialFingerprints":{"codehealthFindingId/v1":"4afcffebaf828ce27ab07e93bdc393f72f02af26846c133284962f1016d4f078"}},{"ruleId":"D2","level":"warning","message":{"text":"ShotChangesViewModel.Ok (cognitive 19): ShotChangesViewModel.Ok has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/ShotChanges/ShotChangesViewModel.cs"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"313ca2a2ab70ab6de698854de00d1084607b3a048e8ea1eda78ff3eeccf0c891"}},{"ruleId":"D2","level":"warning","message":{"text":"DashScopeSttService.ParseTranscriptionResult (cognitive 19): DashScopeSttService.ParseTranscriptionResult has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/DashScope/DashScopeSttService.cs"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e3c2003cdcb79e2a770d8ffb986dd1a192d8b306b89ebdea994793b88fd8007"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextPostProcessor.AutoBalanceLines (cognitive 19): SpeechToTextPostProcessor.AutoBalanceLines has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextPostProcessor.cs"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"8acf524f6e43ae8442d87fa07ee8ea59fda27829125d02dc48a2d6eae45e30c3"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextViewModel.ProcessChatLlmTranscription (cognitive 19): SpeechToTextViewModel.ProcessChatLlmTranscription has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":814}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebdbf9e3e9cde719ebab20c364e029a45abedbc29cc9b4e2e946bf5d098d3b73"}},{"ruleId":"D2","level":"warning","message":{"text":"CosyVoice3CrispAsr.SeedVoicesFromQwen3TtsCppIfEmpty (cognitive 19): CosyVoice3CrispAsr.SeedVoicesFromQwen3TtsCppIfEmpty has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"9165f4d31b122ed0e187eff23a89186ba117dd556a90248c493fced96786021c"}},{"ruleId":"D2","level":"warning","message":{"text":"EdgeTts.Speak (cognitive 19): EdgeTts.Speak has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/EdgeTts.cs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd5ee4f17e5085275ade912bded512a82c342d594241f34dabb143c0036d3de6"}},{"ruleId":"D2","level":"warning","message":{"text":"F5TtsCrispAsr.SeedVoicesFromQwen3TtsCppIfEmpty (cognitive 19): F5TtsCrispAsr.SeedVoicesFromQwen3TtsCppIfEmpty has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"2547056ef2b6b2e0190b9bd3473ac81a013e516f7f9327ad45fed93becd4d0dd"}},{"ruleId":"D2","level":"warning","message":{"text":"MossTtsCrispAsr.SeedVoicesFromQwen3TtsCppIfEmpty (cognitive 19): MossTtsCrispAsr.SeedVoicesFromQwen3TtsCppIfEmpty has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dc55e236821bb00aa179674097399b0d7a17ecca43a14bfb699004cfd033b39"}},{"ruleId":"D2","level":"warning","message":{"text":"OmniVoiceCrispAsr.EnsureServerRunningAsync (cognitive 19): OmniVoiceCrispAsr.EnsureServerRunningAsync has cognitive complexity 19 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"745ed761dffff33f3483ac8f1eae0fbdf27b64f53d6c177f8421c3ecea470467"}},{"ruleId":"D2","level":"warning","message":{"text":"Qwen3TtsCpp.EnsureServerRunningAsync (cognitive 19): Qwen3TtsCpp.EnsureServerRunningAsync has cognitive complexity 19 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCpp.cs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea9f2a2a0369f4af4c813d38066944b9e31a5d3233560ab5d208a245bfcbeb39"}},{"ruleId":"D2","level":"warning","message":{"text":"Qwen3TtsCrispAsr.Speak (cognitive 19): Qwen3TtsCrispAsr.Speak has cognitive complexity 19 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs"},"region":{"startLine":726}}}],"partialFingerprints":{"codehealthFindingId/v1":"46859de50f28c1ac9e3e82634f74e04f36f0c5cc4cab3eec97fa6cc4202f8c5a"}},{"ruleId":"D2","level":"warning","message":{"text":"VoxCPM2CrispAsr.SeedVoicesFromQwen3TtsCppIfEmpty (cognitive 19): VoxCPM2CrispAsr.SeedVoicesFromQwen3TtsCppIfEmpty has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"29a56661f0d18dd9e2d616e927fdfa0548c7fd794da91b2249417096b318612a"}},{"ruleId":"D2","level":"warning","message":{"text":"WaveFileExtractor.GetCommandLineProcess (cognitive 19): WaveFileExtractor.GetCommandLineProcess has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/WaveFileExtractor.cs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c9e709cb2e7f562bdc39222f61be2cca26727304d94cfaadd2ef6904955b3ab"}},{"ruleId":"D2","level":"warning","message":{"text":"LibMpvDynamicPlayer.LoadFile (cognitive 19): LibMpvDynamicPlayer.LoadFile has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibMpvDynamic/LibMpvDynamicPlayer.cs"},"region":{"startLine":982}}}],"partialFingerprints":{"codehealthFindingId/v1":"21ec60f097e67aca62dac6ea0558a4e72e7f426b42ed1a7d51a82a1cb4db7de3"}},{"ruleId":"D2","level":"warning","message":{"text":"CsvUtil.CsvSplitLines (cognitive 19): CsvUtil.CsvSplitLines has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/CsvUtil.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"2de54b0f256a38dbb7d36339118554abcf5d1e8da52051808abf9996e3a97478"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmap.RunLengthEncodeForDvd (cognitive 19): NikseBitmap.RunLengthEncodeForDvd has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/NikseBitmap.cs"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"01fb3136bde453805cad8e8e8a6d0bad959147168695c532b610fea4a95520c1"}},{"ruleId":"D2","level":"warning","message":{"text":"StringExtensions.HasSentenceEnding (cognitive 19): StringExtensions.HasSentenceEnding has cognitive complexity 19 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StringExtensions.cs"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8df745dbba388ba45393ebd5b258ed3202b0ed508cf83f4d6fa39dd2c10d618"}},{"ruleId":"D2","level":"warning","message":{"text":"Subtitle.GetIndex (cognitive 19): Subtitle.GetIndex has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Subtitle.cs"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"1575f41b3c2afd68e2429b69b00549b5aba7b568edf02f84a2bca4b407de4525"}},{"ruleId":"D2","level":"warning","message":{"text":"CalcAll.CountCharacters (cognitive 19): CalcAll.CountCharacters has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TextLengthCalculator/CalcAll.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"f434f8f37312aa752bc2eb134690a1e8908cc50ad8393823134c142e6a201067"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporter.ImportSubtitleWithNoLineBreaks (cognitive 19): UnknownFormatImporter.ImportSubtitleWithNoLineBreaks has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":978}}}],"partialFingerprints":{"codehealthFindingId/v1":"73270eb7e929726b6dc423cef9bb2f82474a041f19a56f0253ee4f075a3bf475"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporter.ImportSubtitleWithNoLineBreaksWithExtraSpaces (cognitive 19): UnknownFormatImporter.ImportSubtitleWithNoLineBreaksWithExtraSpaces has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":1051}}}],"partialFingerprints":{"codehealthFindingId/v1":"db5da65b062aa75910af39bd0503ed0cb3900effe6c20b5b476bacb01b93d9ae"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.RemoveFromUserDictionary (cognitive 19): Utilities.RemoveFromUserDictionary has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":1254}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea70cedef73131be4068c15fe5a67d96763db01bd965baa20af7246cc62b3cf0"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.GetColorFromFontString (cognitive 19): Utilities.GetColorFromFontString has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":2143}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce7730f3f1d8453e16c197eaf1676e365735cfae113836351df6decabefc9f52"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVttHelper.GetStyles (cognitive 19): WebVttHelper.GetStyles has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/WebVttHelper.cs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"167970ef5d1b6399432d378ff9a16bb2bfa86a43b436a9dc2968ce0f3f5e8f40"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.ReadVttWithSize (cognitive 19): MP4Parser.ReadVttWithSize has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":1170}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca193c952d2821d1914f62712a6fdfcc388dbe62d90b242d3db5451a08721e65"}},{"ruleId":"D2","level":"warning","message":{"text":"ObjectDataSegment.DecodeImage (cognitive 19): ObjectDataSegment.DecodeImage has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/ObjectDataSegment.cs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"80a74c83d3005cefd1a3f24c357b34c7c40a70d53003ba8931108e3e9cc76f07"}},{"ruleId":"D2","level":"warning","message":{"text":"ObjectDataSegment.CalculateSize (cognitive 19): ObjectDataSegment.CalculateSize has cognitive complexity 19 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/ObjectDataSegment.cs"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"c023cdae60c605c9e156e07f12e986429941ccaffd43d3999b13a11ab6e3edc8"}},{"ruleId":"D2","level":"warning","message":{"text":"FixCommas.Fix (cognitive 19): FixCommas.Fix has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixCommas.cs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"304a26976b46975abc74455e7f90ba95f210e8fde18a9d5293fa94c565c813bc"}},{"ruleId":"D2","level":"warning","message":{"text":"FixMissingSpaces.FixSpaceAfter (cognitive 19): FixMissingSpaces.FixSpaceAfter has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixMissingSpaces.cs"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"65bc80d8964698bbb99c283d8dded71c119a1818e9960e8c152683147047a3a8"}},{"ruleId":"D2","level":"warning","message":{"text":"AribB24Decoder.HandleGraphicCharacter (cognitive 19): AribB24Decoder.HandleGraphicCharacter has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AribB24Decoder.cs"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"1854e358f98b5939d688c79602a860924560271d5694150f2ca40303a816ed9e"}},{"ruleId":"D2","level":"warning","message":{"text":"BelleNuitSubtitler.DecodeText (cognitive 19): BelleNuitSubtitler.DecodeText has cognitive complexity 19 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/BelleNuitSubtitler.cs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"20b3082dda4d1bde65647e413142a9ad0504e8a532a5e11d952a87d3abd7c6b9"}},{"ruleId":"D2","level":"warning","message":{"text":"Csv3.IsMine (cognitive 19): Csv3.IsMine has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Csv3.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"dea5040ac199181f3e04dfcb5ae56431072dd8529cd307eb40f113ef73e4a60a"}},{"ruleId":"D2","level":"warning","message":{"text":"CsvNuendo.IsMine (cognitive 19): CsvNuendo.IsMine has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CsvNuendo.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"19bd31eb3f0eb4a75bdbe5665cec2b8fbd3c5874a2d71be2b8a7439f546827a2"}},{"ruleId":"D2","level":"warning","message":{"text":"Json.ReadTag (cognitive 19): Json.ReadTag has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Json.cs"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4d5c4d2705fdc21bd9c3e0381cf4912c729ad5e80616ded9847940255183c16"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonType9.LoadSubtitle (cognitive 19): JsonType9.LoadSubtitle has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType9.cs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce6de01cfb64c98bc1e4a2e884c44ee10bec9331f347d3f1c6d3297fde6ad824"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonTypeOnlyLoad4.LoadSubtitle (cognitive 19): JsonTypeOnlyLoad4.LoadSubtitle has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonTypeOnlyLoad4.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"5382dec0f7354018c36c86e63704ead462e0d68739345c9d6d4cbaf22b7d392e"}},{"ruleId":"D2","level":"warning","message":{"text":"NVivoTranscript.LoadSubtitle (cognitive 19): NVivoTranscript.LoadSubtitle has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/NVivoTranscript.cs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"241831d02de37fff0ca34accd11a0983234ed0a3a20cea4657a2820f21af8087"}},{"ruleId":"D2","level":"warning","message":{"text":"Scenarist.LoadSubtitle (cognitive 19): Scenarist.LoadSubtitle has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Scenarist.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"562d76a635fc73c4e4e23c30eae37d25d5bea12560562f67efa63aa21fc7d41f"}},{"ruleId":"D2","level":"warning","message":{"text":"SubViewer20.LoadSubtitle (cognitive 19): SubViewer20.LoadSubtitle has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubViewer20.cs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"a39e962e50777adecebdc77ddbed16388bde2a64d6fe674b34312f06e4726cdf"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText10.GetIfBottomAligned (cognitive 19): TimedText10.GetIfBottomAligned has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1637}}}],"partialFingerprints":{"codehealthFindingId/v1":"63639b65be4af9da67979e791d4731a5252874aff2c3ab8c2333267c7fc896cd"}},{"ruleId":"D2","level":"warning","message":{"text":"UleadSubtitleFormat.LoadSubtitle (cognitive 19): UleadSubtitleFormat.LoadSubtitle has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UleadSubtitleFormat.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"705e029701fae539c68dcd45aef3b49f2b7eb8cdbf105f03bc419bc19de90498"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle104.LoadSubtitle (cognitive 19): UnknownSubtitle104.LoadSubtitle has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle104.cs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"0de33fe3720d7626c15a8fca87f233a65658df99fcd4de5bbeab1ba814a9bd1d"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle35.LoadSubtitle (cognitive 19): UnknownSubtitle35.LoadSubtitle has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle35.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"206508f4d634bcb0fa36983e72dd1302933dd738b5a2f34e148f07745faae829"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle4.LoadSubtitle (cognitive 19): UnknownSubtitle4.LoadSubtitle has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle4.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"c73e3ad78bf710aa50b7830117852e69720b887e3d97c3cd33138cf4a29e80eb"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle65.LoadSubtitle (cognitive 19): UnknownSubtitle65.LoadSubtitle has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle65.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"90fbc18010ca4a58e03744b3d3f33836f51b93429365fbead3f5d7ee77dc7c3e"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle69.LoadSubtitle (cognitive 19): UnknownSubtitle69.LoadSubtitle has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle69.cs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fc30639215ae0e82a497dd4e1bf9b229cb55b958ddb08d92890f8c3bc0866e2"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle72.LoadSubtitle (cognitive 19): UnknownSubtitle72.LoadSubtitle has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle72.cs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"29f77ec38d03af8cbf4ee763f458d88cb8d8ea7517c216df617165f6f5c24f27"}},{"ruleId":"D2","level":"warning","message":{"text":"WinCaps32.LoadSubtitle (cognitive 19): WinCaps32.LoadSubtitle has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WinCaps32.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e35b4c557f843b7f81f4f00b794fa33802500363bb1a9163136351169720764"}},{"ruleId":"D2","level":"warning","message":{"text":"Program.ExpandPatterns (cognitive 19): Program.ExpandPatterns has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Program.cs"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"db232ebab86b6933f90be6ecfff3daf84be8a9da4318cb3fa65089b73db8f464"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmap2.RunLengthEncodeForDvd (cognitive 19): NikseBitmap2.RunLengthEncodeForDvd has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmap2.cs"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7463f480f5b9c9f8e17aae26b5cfc206ccfaa14f1c0f0c20fe132e3472ae516"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrLineGenerator.EmitGreedyByLength (cognitive 19): NOcrLineGenerator.EmitGreedyByLength has cognitive complexity 19 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0c5d923d9dcecf7a8e16364eb349262e73d8a3cbe5d6e9cd33333749a483e30"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioVisualizer.DrawParagraphFooter (cognitive 18): AudioVisualizer.DrawParagraphFooter has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":2939}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb48e6ac48c5b1e08b4e3eac67d41b07932571feeec3b7d5b249cfff33890fda"}},{"ruleId":"D2","level":"warning","message":{"text":"TimeCodeUpDown.OnTextBoxKeyDown (cognitive 18): TimeCodeUpDown.OnTextBoxKeyDown has cognitive complexity 18 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/TimeCodeUpDown.cs"},"region":{"startLine":496}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b85a1818e19e1e4d99c8ce28c058919fba334f667c9c9945f46de21c709079d"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaImageColorPickerViewModel.Initialize (cognitive 18): AssaImageColorPickerViewModel.Initialize has cognitive complexity 18 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaImageColorPicker/AssaImageColorPickerViewModel.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"b72ac5971a630ca409d68080acc844d08cee1fc08c173f296e56de636e041437"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ShowSpeechToTextWhisper (cognitive 18): MainViewModel.ShowSpeechToTextWhisper has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":6488}}}],"partialFingerprints":{"codehealthFindingId/v1":"93edf9224fabbf220559f1b8d662c1bced1472dc893e9b58f19c1c280be9e5f7"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ShowReplace (cognitive 18): MainViewModel.ShowReplace has cognitive complexity 18 (threshold 15). Most of this is not in the body itself: 6 of the 18 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 11791, 11836, 11822). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":11759}}}],"partialFingerprints":{"codehealthFindingId/v1":"15015e10b1bfa4eae2eb55cb6c21d9189d0a2ddb4150d0076ab61955267bbe54"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrInspectViewModel.OnLetterClicked (cognitive 18): NOcrInspectViewModel.OnLetterClicked has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/NOcr/NOcrInspectViewModel.cs"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c5146dd473844145e3e0a5a23a2a6e33c3802fbf39abab0f9a1def441d6aa8a"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.DeleteSelectedLines (cognitive 18): OcrViewModel.DeleteSelectedLines has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":2246}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbeb21873b3efd26ded2613b8ed1ea49ead97bdb6d93cbc2608c8f857a5c1cbd"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.OcrFixLine (cognitive 18): OcrViewModel.OcrFixLine has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3777}}}],"partialFingerprints":{"codehealthFindingId/v1":"58a3ba8dd1425addb13bf035b3d8f3a1fb56432f7a1552bb5ceadb31c4beff8d"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.OnKeyDown (cognitive 18): OcrViewModel.OnKeyDown has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":4496}}}],"partialFingerprints":{"codehealthFindingId/v1":"766f6802323fbc44e1f5c498dcc73ad6871891ab7b1a8f5ea497d3bea7114ffd"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryEditViewModel.LoadMatroskaImageSubtitle (cognitive 18): BinaryEditViewModel.LoadMatroskaImageSubtitle has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":832}}}],"partialFingerprints":{"codehealthFindingId/v1":"e69708f36720e62e13363cd681afac4fd15260bc948be4556f8be81e1a7dbf6d"}},{"ruleId":"D2","level":"warning","message":{"text":"TextBoxTagToggler.ToggleTag (cognitive 18): TextBoxTagToggler.ToggleTag has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/TextBoxUtils/TextBoxTagToggler.cs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"61eead75ac77ed9e8cfd92bb489be39de73f4db92167d8fe5576943491db82c2"}},{"ruleId":"D2","level":"warning","message":{"text":"AiReviewChunker.BuildChunks (cognitive 18): AiReviewChunker.BuildChunks has cognitive complexity 18 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/AiReview/AiReviewChunker.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"deffdebd684b1d4aae3643baebd53c91ca5e5504680b2145d1370b4a31a7a3e9"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.WriteToImageBasedFormat (cognitive 18): BatchConverter.WriteToImageBasedFormat has cognitive complexity 18 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":1414}}}],"partialFingerprints":{"codehealthFindingId/v1":"e50f6bc82fb28c2f78c7137936fd51d9b4709d06c199d5420b5e18492370d238"}},{"ruleId":"D2","level":"warning","message":{"text":"SplitSubtitleViewModel.UpdateSplit (cognitive 18): SplitSubtitleViewModel.UpdateSplit has cognitive complexity 18 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/SplitSubtitle/SplitSubtitleViewModel.cs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"e912cd47f8ac53e3535fb10441bda77b720776d9394fa4eda6a1ef68e1220c56"}},{"ruleId":"D2","level":"warning","message":{"text":"AutoTranslateViewModel.StartTranslation (cognitive 18): AutoTranslateViewModel.StartTranslation has cognitive complexity 18 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":1309}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dc644043a00ec78f0e94fbedffa7e0eb5aa6955ffa3768795c0d89d0f5e2b11"}},{"ruleId":"D2","level":"warning","message":{"text":"BurnInViewModel.InitAndStartJobItem (cognitive 18): BurnInViewModel.InitAndStartJobItem has cognitive complexity 18 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a197b89c43b250cacc13b1b9d4e08986e05200cc0afc341a4b51d9577e3848e"}},{"ruleId":"D2","level":"warning","message":{"text":"OpenAiSttService.SanitizeEndpointForLog (cognitive 18): OpenAiSttService.SanitizeEndpointForLog has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/OpenAiCompatible/OpenAiSttService.cs"},"region":{"startLine":508}}}],"partialFingerprints":{"codehealthFindingId/v1":"d11d3de556072f1af5e6ab67ee549dc0ab5d4ac7d97d6673f91e9394f90737bd"}},{"ruleId":"D2","level":"warning","message":{"text":"Qwen3TtsCrispAsr.NormalizeVoiceSampleRatesOnce (cognitive 18): Qwen3TtsCrispAsr.NormalizeVoiceSampleRatesOnce has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"36bd8b5fd331f09b5a9d3e99fcf40acc07843b768c6188c469f34249823b3c66"}},{"ruleId":"D2","level":"warning","message":{"text":"ZonosTtsCrispAsr.SeedVoicesFromQwen3TtsCppIfEmpty (cognitive 18): ZonosTtsCrispAsr.SeedVoicesFromQwen3TtsCppIfEmpty has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ZonosTtsCrispAsr.cs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"90827e90c56795f5cdeb4c5edf5c09bec385b785dea4eb80e7640405b2eea43d"}},{"ruleId":"D2","level":"warning","message":{"text":"ReviewSpeechViewModel.OnClosing (cognitive 18): ReviewSpeechViewModel.OnClosing has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":1837}}}],"partialFingerprints":{"codehealthFindingId/v1":"61ffb6464d29b7612723d3039395023b874485269c5c8aec3e5bdc6a859ad957"}},{"ruleId":"D2","level":"warning","message":{"text":"FindService.FindPrevious (cognitive 18): FindService.FindPrevious has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/FindService.cs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ba2ebbcbf3f97e1288a92ef3f72283229ae5853c296b41329c5e6f335e4aafc"}},{"ruleId":"D2","level":"warning","message":{"text":"FindService.FindInListReverse (cognitive 18): FindService.FindInListReverse has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/FindService.cs"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbf1abf1a455030cf2e871da7e68b86e1c1da5c54bb3111ee6f4696502657530"}},{"ruleId":"D2","level":"warning","message":{"text":"FontNameService.SetFontName (cognitive 18): FontNameService.SetFontName has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/FontNameService.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"30425c8d95625c37ea33c0ad8740b25684ccdc02571263b2ffd02dce8e45807c"}},{"ruleId":"D2","level":"warning","message":{"text":"SpectrogramDrawer.GeneratePaletteForCurrentStyle (cognitive 18): SpectrogramDrawer.GeneratePaletteForCurrentStyle has cognitive complexity 18 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/WaveToVisualizer2.cs"},"region":{"startLine":1187}}}],"partialFingerprints":{"codehealthFindingId/v1":"84015cad12bdff1c418f963e04bf9c0c649303f993f8b179a764c778fdbe9cf1"}},{"ruleId":"D2","level":"warning","message":{"text":"MergeShortLinesUtils.MergeShortLinesInSubtitle (cognitive 18): MergeShortLinesUtils.MergeShortLinesInSubtitle has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/MergeShortLinesUtils.cs"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"b225d5b1ffdd0a348fde818401cc69a00fb3189a78377898c6a1afedde28435d"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonParser.Number (cognitive 18): JsonParser.Number has cognitive complexity 18 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TinyJsonParser.cs"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"a01955adc415738f3be5ef74cbec8d6e80b86cb7e93e46a6e499ebb148223d51"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.GetDictionaryLanguagesCultureNeutral (cognitive 18): Utilities.GetDictionaryLanguagesCultureNeutral has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":1025}}}],"partialFingerprints":{"codehealthFindingId/v1":"b012497f8689ae105b0f0f9151577428e6b9741c8a79d46aac7949c4fc1a1938"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.ToggleSymbols (cognitive 18): Utilities.ToggleSymbols has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":3599}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcf1aed3206082749b09a2f106f74757a340af2739299a4d5362951b0b0e30f9"}},{"ruleId":"D2","level":"warning","message":{"text":"Mdia.Mdia.ctor (cognitive 18): Mdia.Mdia.ctor has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Boxes/Mdia.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"a22415685b08c455d70e7bb360273a57858f0c79092a9be54369cb62dc739451"}},{"ruleId":"D2","level":"warning","message":{"text":"Moov.Moov.ctor (cognitive 18): Moov.Moov.ctor has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Boxes/Moov.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f117e23bd2e3fa84aa353621bdfe7c4b337b3a2e9df3bdf080eaca3b4852eb2"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.ExtractService1 (cognitive 18): MP4Parser.ExtractService1 has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"23c5d3803592bd6033f33579610034c703bcfd3574a7c5338a477859caa86004"}},{"ruleId":"D2","level":"warning","message":{"text":"Helper.GetBinaryString (cognitive 18): Helper.GetBinaryString has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/Helper.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"18a6164a4073e6ac8555bbedf351e4d183a7de0f250877a4d5d76dad73bd533e"}},{"ruleId":"D2","level":"warning","message":{"text":"FixMissingOpenBracket.Fix (cognitive 18): FixMissingOpenBracket.Fix has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixMissingOpenBracket.cs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"24d041122626301109bc890cb3de5627acd21d81a16c5366dd4ad9a9b5e91ae8"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoveTextForHI.RemoveTextBetweenTags (cognitive 18): RemoveTextForHI.RemoveTextBetweenTags has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveTextForHI.cs"},"region":{"startLine":1493}}}],"partialFingerprints":{"codehealthFindingId/v1":"da819869232b26486bf6e16600a63912bd50f107c38368ae8fa85457c4c41cd6"}},{"ruleId":"D2","level":"warning","message":{"text":"CaptionateMs.LoadSubtitle (cognitive 18): CaptionateMs.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CaptionateMs.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd7c25d42a321607c9bd4cf6d2c1683fbc976de67f3e174bf1c53de9345b19e1"}},{"ruleId":"D2","level":"warning","message":{"text":"CheetahCaption.IsMine (cognitive 18): CheetahCaption.IsMine has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CheetahCaption.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"09e086851c705c1f293d94fd80771f5c1f41338a545c51be4897e16f3f0372af"}},{"ruleId":"D2","level":"warning","message":{"text":"EbuTtD.MakeParagraph (cognitive 18): EbuTtD.MakeParagraph has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/EbuTtD.cs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fc19fe37451dd72a7b7ad9f88434baa9ca3c5b749e754c1f73e4d6259e215f7"}},{"ruleId":"D2","level":"warning","message":{"text":"EbuTtD.LoadSubtitle (cognitive 18): EbuTtD.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/EbuTtD.cs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebb2736c95f01e15aa210460e1e4215cd5e906d2a8c633a9734273d9293f3ddf"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalCutProXml14Text.ToText (cognitive 18): FinalCutProXml14Text.ToText has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProXml14Text.cs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce50ae537db80b7d89d58e8b78eb7bab115fd94688cabfef331d270162593b8d"}},{"ruleId":"D2","level":"warning","message":{"text":"Json.DecodeJsonText (cognitive 18): Json.DecodeJsonText has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Json.cs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"adcb10ced9d6a1ddf37f1b5c151a194c676b56cd219ec895562174d257fe69e3"}},{"ruleId":"D2","level":"warning","message":{"text":"MagicVideoTitler.LoadSubtitle (cognitive 18): MagicVideoTitler.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/MagicVideoTitler.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"420d3efbc8e2f20dd28a9cb66e3cd797333b323c3142337db52750dc19970944"}},{"ruleId":"D2","level":"warning","message":{"text":"OgmChapters.LoadSubtitle (cognitive 18): OgmChapters.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/OgmChapters.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a9e34cc6d69755d86b13cc4ae9740da1277e0d248e0b21774738d5fc6233d8f"}},{"ruleId":"D2","level":"warning","message":{"text":"OpenDvt.LoadSubtitle (cognitive 18): OpenDvt.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/OpenDvt.cs"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca9f7c69c7eaa93695de82535c1412f63204796524411613e9ade729a5b08044"}},{"ruleId":"D2","level":"warning","message":{"text":"PListCaption.LoadSubtitle (cognitive 18): PListCaption.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/PListCaption.cs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e74ee7d293c230f9c99165c14b9006932b71d5d10f1a8a97b9b709c74955159"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectionSubtitleList.LoadSubtitle (cognitive 18): ProjectionSubtitleList.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ProjectionSubtitleList.cs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"314cd5eabf6535f4ddc3c0a3706fce79fc636f29c1cdb6da70179e71165744ca"}},{"ruleId":"D2","level":"warning","message":{"text":"RxMarker.LoadSubtitle (cognitive 18): RxMarker.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/RxMarker.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dd9ac78f681201a15676e6830d89d5f1d3e9d6f38f80fbba9865ab6d0f2ba34"}},{"ruleId":"D2","level":"warning","message":{"text":"SonyDVDArchitectExplicitDuration.LoadSubtitle (cognitive 18): SonyDVDArchitectExplicitDuration.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SonyDVDArchitectExplicitDuration.cs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe5d2c8ffa85f1d2bad41549311efc5fc563cd1afcbbbbf6b3e4747a5d2916f3"}},{"ruleId":"D2","level":"warning","message":{"text":"SonyDVDArchitectTabs.LoadSubtitle (cognitive 18): SonyDVDArchitectTabs.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SonyDVDArchitectTabs.cs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"b82c669a9b0088cecd5fb23e31065cec14dbf83c744b7ca9bceb0ad79761ba8b"}},{"ruleId":"D2","level":"warning","message":{"text":"Spruce.LoadSubtitle (cognitive 18): Spruce.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Spruce.cs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c6b2591626c4787b0d4f79ef1a964b6e8b7964e314a942352f6245d581f92d7"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle23.LoadSubtitle (cognitive 18): UnknownSubtitle23.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle23.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"559a6135d8bcca9d39ae3fc20eadd1c19a3060126829d2bf2c075ea8e10dd04f"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle27.LoadSubtitle (cognitive 18): UnknownSubtitle27.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle27.cs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"07eceee85347985a7cac4290b89519d71c54c5339d7dbaae11be49fb3db535c2"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle79.LoadSubtitle (cognitive 18): UnknownSubtitle79.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle79.cs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"12fbbf1e8721c51ec56e8741861a102e0d923e3d927b32195761c5a37e58a58a"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle83.LoadSubtitle (cognitive 18): UnknownSubtitle83.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle83.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"475c752648736e816b594825a3280bb9a285e6f6a422e7b26c4efbad05ce6d87"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle86.LoadSubtitle (cognitive 18): UnknownSubtitle86.LoadSubtitle has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle86.cs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"12b5f638285deb67239998fe426e03d24fae2b12059c15acfc700f6de020ba3f"}},{"ruleId":"D2","level":"warning","message":{"text":"VobSubParser.Open (cognitive 18): VobSubParser.Open has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/VobSubParser.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9ccfc172e9211c5aedfd84a49a32b9b87a53a16f11029c7fa862959159cef37"}},{"ruleId":"D2","level":"warning","message":{"text":"LibSEIntegration.ApplyAssaPostProcess (cognitive 18): LibSEIntegration.ApplyAssaPostProcess has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":848}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a6c9131a4f27eecd6a88f8e06a3004a01eac305bfda62c6d76c2ff51505312c"}},{"ruleId":"D2","level":"warning","message":{"text":"SubtitleConverter.ResolveOutputFileName (cognitive 18): SubtitleConverter.ResolveOutputFileName has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SubtitleConverter.cs"},"region":{"startLine":789}}}],"partialFingerprints":{"codehealthFindingId/v1":"165c780fcb2a2f56c91c6defbf7a5964fc638c011643f75ba592e54316d8fb8c"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrFixReplaceList2.DeleteFromList (cognitive 18): OcrFixReplaceList2.DeleteFromList has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":945}}}],"partialFingerprints":{"codehealthFindingId/v1":"a34459bd3b440e3f99657dd1da185b9ac90c78c143c7538895e07a1125fdc99d"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmapImageSplitter2.CropTopAndBottom (cognitive 18): NikseBitmapImageSplitter2.CropTopAndBottom has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"b06ead9f1cc966da5bfa69896fb3b7b5503745a4bfaff371eeea5736af65d858"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrLineGenerator.GenerateEdgeHough (cognitive 18): NOcrLineGenerator.GenerateEdgeHough has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"2001115d21703ebe18a0053e5d273661aa89f879ab95e8766864d383968d9edd"}},{"ruleId":"D2","level":"warning","message":{"text":"SpellCheckWordLists.LoadUseAlwaysList (cognitive 18): SpellCheckWordLists.LoadUseAlwaysList has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/SpellCheck/SpellCheckWordLists.cs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b5ec7b2562fc55c1bb6caf523e4c16c75a5a4a54aa5908861353dd658817b7c"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedEffectHearts.ApplyEffect (cognitive 17): AdvancedEffectHearts.ApplyEffect has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectHearts.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"3774f5a98931593f74607cbe47089b95f8b9cd8bd0f01f7c613dfdca8e6b2e71"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaDrawViewModel.CloseShape (cognitive 17): AssaDrawViewModel.CloseShape has cognitive complexity 17 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawViewModel.cs"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"c74637d2e487797188ec49fde67c6d3dd1257b4e6413f0d5cd51ea713ea2a6bf"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaDrawViewModel.LoadFromText (cognitive 17): AssaDrawViewModel.LoadFromText has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawViewModel.cs"},"region":{"startLine":1001}}}],"partialFingerprints":{"codehealthFindingId/v1":"16ed066fbc5a5c2e6895e271100e59592e05bdc40a9fe14bfaa8f5583ac4b8a0"}},{"ruleId":"D2","level":"warning","message":{"text":"CsvImporter.ParseCsv (cognitive 17): CsvImporter.ParseCsv has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/MultipleReplace/CsvImporter.cs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"eff56fe3f280087a6a13863ae8f931398ee32a63329960cec0d24900470be5d5"}},{"ruleId":"D2","level":"warning","message":{"text":"DCinemaInteropPropertiesViewModel.Import (cognitive 17): DCinemaInteropPropertiesViewModel.Import has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/DcinemaInteropProperties/DCinemaInteropPropertiesViewModel.cs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6d8ef556beeaaea71e42a173d8468c81f1eea822678dff69f7e7dc0724f3c18"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.SubtitleOpenOriginal (cognitive 17): MainViewModel.SubtitleOpenOriginal has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":2058}}}],"partialFingerprints":{"codehealthFindingId/v1":"7861455e66102726758dd450d912dd7361de417043ef34fe8069f57ee2c00c4f"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ShowVideoOcr (cognitive 17): MainViewModel.ShowVideoOcr has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":6559}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a37a2536a2abf643b053e720ed2d804679d96dfc51dacdeb16d84cfd903dc60"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ShowFind (cognitive 17): MainViewModel.ShowFind has cognitive complexity 17 (threshold 15). Most of this is not in the body itself: 5 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 11433, 11454, 11478). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":11405}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dbe21e68a1c2192458aaef29b1e742e4fe9f593be1576850f1715f5b1af4f3e"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.ApplyLayoutDirectionForCurrentLanguage (cognitive 17): MainViewModel.ApplyLayoutDirectionForCurrentLanguage has cognitive complexity 17 (threshold 15). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 12256, 12214). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":12207}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbf67f82d0f1eecd97d0650e26951dfd222a4c8f46ad9c52fd3c30ab7c3dc171"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.GoToNearestTimeCode (cognitive 17): MainViewModel.GoToNearestTimeCode has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":12814}}}],"partialFingerprints":{"codehealthFindingId/v1":"f300e857044de005a7ea993da3204b4cff4732a1fffade9ff164e3ed14c6cbf2"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.VideoOpenFile (cognitive 17): MainViewModel.VideoOpenFile has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":18987}}}],"partialFingerprints":{"codehealthFindingId/v1":"d719000ea889b2ea0e8e60fcbd4b0c00b4b417a60925f818f8431ee4c97d0b06"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.VideoOnDrop (cognitive 17): MainViewModel.VideoOnDrop has cognitive complexity 17 (threshold 15). Most of this is not in the body itself: 2 of the 17 points are its own statements and the rest belongs to one function literal inside it that branches (line 24355). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":24345}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e1b4febb7591f508d1ec1c44a8278fadefeef4c8e6f2144cbac3e1bad5b404e"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.DetectLanguageCodeFromFileName (cognitive 17): OcrViewModel.DetectLanguageCodeFromFileName has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":536}}}],"partialFingerprints":{"codehealthFindingId/v1":"22a6fd8b6d0d31dfc6d7c68aed6ea90967b0318fba30b9bf7bed488aa461c28c"}},{"ruleId":"D2","level":"warning","message":{"text":"PickMp4TrackViewModel.Export (cognitive 17): PickMp4TrackViewModel.Export has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/PickMp4Track/PickMp4TrackViewModel.cs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ffe6a6370821be908bfc62c0170c7a307772091008ab9a2152f15380dec2d37"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.RunBinaryOcr (cognitive 17): BatchConverter.RunBinaryOcr has cognitive complexity 17 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":925}}}],"partialFingerprints":{"codehealthFindingId/v1":"45d818be93faa97c165d72d9597eef292b3eb5630d00b08bc9ea7ad5789badbf"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.SplitBreakLongLines (cognitive 17): BatchConverter.SplitBreakLongLines has cognitive complexity 17 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":1965}}}],"partialFingerprints":{"codehealthFindingId/v1":"2386ae34fbfedb1fe40306fa80b7197f11ea1ab4f3f1652dba3155e5b9027c5a"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConvertTransportStreamSplitter.LoadTransportStream (cognitive 17): BatchConvertTransportStreamSplitter.LoadTransportStream has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertItemSplitter.cs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"f50f578132a6a02d74b55199b06e60dbe666090db7be92b1297f1ceb459250a1"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConvertViewModel.ShowTargetFormatSettings (cognitive 17): BatchConvertViewModel.ShowTargetFormatSettings has cognitive complexity 17 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":1413}}}],"partialFingerprints":{"codehealthFindingId/v1":"a41e97cad5836c8c92fc7e763ba2eb54e57d42c7079a168da4e10d00ba8c8206"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConvertViewModel.UpdateTargetLanguages (cognitive 17): BatchConvertViewModel.UpdateTargetLanguages has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":2596}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec70cf89d08547c43bf086577c69c8cd13050cadd2265b55b974976a129c93fd"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoveTextForHearingImpairedViewModel.GeneratePreview (cognitive 17): RemoveTextForHearingImpairedViewModel.GeneratePreview has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/RemoveTextForHearingImpaired/RemoveTextForHearingImpairedViewModel.cs"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd2f5a7e34a58be1ad2e8477dd0c348894eb0d598ba260dac59ec0730e0e432f"}},{"ruleId":"D2","level":"warning","message":{"text":"TranslateSettingsViewModel.SaveValues (cognitive 17): TranslateSettingsViewModel.SaveValues has cognitive complexity 17 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/TranslateSettingsViewModel.cs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef4aac7beb4ebf53ed80cda13dad0c47046f6e8ef1a1b3beb38974159050e59a"}},{"ruleId":"D2","level":"warning","message":{"text":"ShotChangesViewModel.OutputHandler (cognitive 17): ShotChangesViewModel.OutputHandler has cognitive complexity 17 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 7 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/ShotChanges/ShotChangesViewModel.cs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"3249e748792141b8685fc48b4fecab4dee08a56e3f30f41e6947cb7627f2baa6"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextPostProcessor.AddPeriods (cognitive 17): SpeechToTextPostProcessor.AddPeriods has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextPostProcessor.cs"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"4875d788a3d51df7f7db3b89b50fb5beb2275a9bf317e3fcd865448d5f44084f"}},{"ruleId":"D2","level":"warning","message":{"text":"SpeechToTextViewModel.EngineChanged (cognitive 17): SpeechToTextViewModel.EngineChanged has cognitive complexity 17 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":4390}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f2a3ee6e76e2cdbf3e35a97617b1ace357fb3f2d7bc0ce659e814a6fc5ad64d"}},{"ruleId":"D2","level":"warning","message":{"text":"OmniVoiceSettingsViewModel.Redownload (cognitive 17): OmniVoiceSettingsViewModel.Redownload has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/OmniVoiceSettings/OmniVoiceSettingsViewModel.cs"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a63d1c665c88732d0c077783e8aa5bda637d4decdc3e1b18d51b9f2c98b9bc2"}},{"ruleId":"D2","level":"warning","message":{"text":"Qwen3TtsSettingsViewModel.Redownload (cognitive 17): Qwen3TtsSettingsViewModel.Redownload has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Qwen3TtsSettings/Qwen3TtsSettingsViewModel.cs"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"62ddbd355ebc2b8a9b640ec2cee7739421b8934b6e7642f6414450683d4f1468"}},{"ruleId":"D2","level":"warning","message":{"text":"ReviewSpeechViewModel.OnTimerOnElapsed (cognitive 17): ReviewSpeechViewModel.OnTimerOnElapsed has cognitive complexity 17 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 7 belong to one function literal inside it that branches. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"35634e61c303f9013212b0ba1dc77a44ac0843299a686f519a0efabef18f970e"}},{"ruleId":"D2","level":"warning","message":{"text":"Unpacker.Extract7Zip (cognitive 17): Unpacker.Extract7Zip has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/SevenZipExtractor/Unpacker.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"adef01a7a97f71d560334dd68206c83a766e903fc3545716a69c52fd5809254d"}},{"ruleId":"D2","level":"warning","message":{"text":"SubRipSourceSyntaxHighlighting.ColorizeSubRipFormat (cognitive 17): SubRipSourceSyntaxHighlighting.ColorizeSubRipFormat has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/SubRipSourceSyntaxHighlighting.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"e94fb2cf38cdf2b0c91027b28e1b71cae2d2f6fbc73a4f2575df927d425907e4"}},{"ruleId":"D2","level":"warning","message":{"text":"UiUtil.RestoreWindowPosition (cognitive 17): UiUtil.RestoreWindowPosition has cognitive complexity 17 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/UiUtil.cs"},"region":{"startLine":3230}}}],"partialFingerprints":{"codehealthFindingId/v1":"615899039a439596132370352e02d7c06a1aff77da6b8d65263293a32199880e"}},{"ruleId":"D2","level":"warning","message":{"text":"ContinuationUtilities.IsFullLineTag (cognitive 17): ContinuationUtilities.IsFullLineTag has cognitive complexity 17 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":930}}}],"partialFingerprints":{"codehealthFindingId/v1":"53282186b7deae8c8f9fd9bfa5e6c2dba46afb698f72adf45a7453e54c94bdf0"}},{"ruleId":"D2","level":"warning","message":{"text":"FileUtil.IsPlainText (cognitive 17): FileUtil.IsPlainText has cognitive complexity 17 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/FileUtil.cs"},"region":{"startLine":704}}}],"partialFingerprints":{"codehealthFindingId/v1":"c06ce3fc02fcc10631c449eb91f7e7e782e6f0d4066251661bd82be1c9a70ff5"}},{"ruleId":"D2","level":"warning","message":{"text":"FixCasing.FixCasingAfterTitles (cognitive 17): FixCasing.FixCasingAfterTitles has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/FixCasing.cs"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4ce8bd3620a0b4e23a815f780b2fcf38fd986f0080ecb439f04cc71ecc8c5f4"}},{"ruleId":"D2","level":"warning","message":{"text":"FixCasing.FixStutter (cognitive 17): FixCasing.FixStutter has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/FixCasing.cs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6cd9059b34c2b9cec5ed1e00e573216176822f2c27d944520e5b26af263aa5e"}},{"ruleId":"D2","level":"warning","message":{"text":"FixCasing.Fix (cognitive 17): FixCasing.Fix has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/FixCasing.cs"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"1847705f7e7b5376a84c05c47494fabc0fcc1668e4cee8f844ca8ce188e2d414"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmap.VobSubAntialize (cognitive 17): NikseBitmap.VobSubAntialize has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/NikseBitmap.cs"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f4a5f7e824811c3ae0da380b5b41d7dcddec5cdd20cabd2b6b29f0c2397fcc6"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmap.ConvertTo8BitsPerPixel (cognitive 17): NikseBitmap.ConvertTo8BitsPerPixel has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/NikseBitmap.cs"},"region":{"startLine":1127}}}],"partialFingerprints":{"codehealthFindingId/v1":"c14d8e1b6d1e3cf724f782af4a8742244a7adbe59bac41dea2961cee7cd1db05"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVttToAssa.ConvertSubtitle (cognitive 17): WebVttToAssa.ConvertSubtitle has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/WebVttToAssa.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ffd977364582420aaf95d2617527d1f46c67cc28edf38ea441dcf7ac3214c8e"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.ParseMp4 (cognitive 17): MP4Parser.ParseMp4 has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca694ea79f1169ca42ad98d2dba2b29196d21c35ee068ac1b5848410dea57788"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.ReadFragmentedTextSamplesPrecise (cognitive 17): MP4Parser.ReadFragmentedTextSamplesPrecise has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5b287d4ac7a79c295319a0a0cfa89344fdea794b7e4a9f0d7194d26ae249c06"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbSubPes.GetTeletext (cognitive 17): DvbSubPes.GetTeletext has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/DvbSubPes.cs"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"8748fc1efa8cd9a45ff69f4c6a596b5821d5427699f12f12d5001cbe0d25ac10"}},{"ruleId":"D2","level":"warning","message":{"text":"FixDoubleGreaterThan.Fix (cognitive 17): FixDoubleGreaterThan.Fix has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/FixDoubleGreaterThan.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bd7588c6fb33bf5a40370033dcceccc84f09769c2e53d40c14c522d2873636b"}},{"ruleId":"D2","level":"warning","message":{"text":"AdobeEncore.LoadSubtitle (cognitive 17): AdobeEncore.LoadSubtitle has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdobeEncore.cs"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"15a0e74092afbf493926c688648e6728fd844334ec9c00299b23680cc2a31375"}},{"ruleId":"D2","level":"warning","message":{"text":"AdobeEncoreWithLineNumbers.LoadSubtitle (cognitive 17): AdobeEncoreWithLineNumbers.LoadSubtitle has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdobeEncoreWithLineNumbers.cs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca60d508226cfe28440f1a132606ba1cba6618e5923840f21a3d526fbb6117f3"}},{"ruleId":"D2","level":"warning","message":{"text":"CaptionAssistant.LoadSubtitle (cognitive 17): CaptionAssistant.LoadSubtitle has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CaptionAssistant.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3d37ae89c6ca4e1ac1dbe8a5014f97672689787628beaf7041baf282e206f2d"}},{"ruleId":"D2","level":"warning","message":{"text":"DvdStudioPro.DecodeStyles (cognitive 17): DvdStudioPro.DecodeStyles has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DvdStudioPro.cs"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"a62a8420e434aabcb6305ea480b4eeb356af33dcb80e42f79a7d0091afd3fe5f"}},{"ruleId":"D2","level":"warning","message":{"text":"FLVCoreCuePoints.LoadSubtitle (cognitive 17): FLVCoreCuePoints.LoadSubtitle has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FLVCoreCuePoints.cs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"d22cce6cd11093305a83cef6c92018d612bede1f9276982d17447d80268d3d79"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonType10.LoadSubtitle (cognitive 17): JsonType10.LoadSubtitle has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType10.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbf337b16b06661e765bdbf9ba8d8189c7e6d9b46aa6ea140764454d517b16dc"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonType8.LoadSubtitle (cognitive 17): JsonType8.LoadSubtitle has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType8.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"e80877b487b06c35b9e5bfefe114963fbedde57e4032e12304c5da4f757fe8de"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonType8b.LoadSubtitle (cognitive 17): JsonType8b.LoadSubtitle has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType8b.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"17504812bea3ba34cffbaef852ca942caa0c5a5e55eb1558a934807258be110f"}},{"ruleId":"D2","level":"warning","message":{"text":"LambdaCap.LoadSubtitle (cognitive 17): LambdaCap.LoadSubtitle has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/LambdaCap.cs"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"16eb049fd78e164512068dfe721d948ea279c61b8c8271dd2a2fdf1df43a6abd"}},{"ruleId":"D2","level":"warning","message":{"text":"Rtf2.LoadSubtitle (cognitive 17): Rtf2.LoadSubtitle has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Rtf2.cs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"f00367f6e10e80eead1b9685681217cf427bcffd173a0a9ac7fb5d1d928be142"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText10.ConvertParagraphNodeToTtmlNode (cognitive 17): TimedText10.ConvertParagraphNodeToTtmlNode has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":647}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3d612e7c883c5d97d22927894c29f8671b0ea2a084b55ee29be7cf7313da705"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedTextNoNs.IsMine (cognitive 17): TimedTextNoNs.IsMine has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextNoNs.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"85e0e99670e1571d51d3c45f97a6d56dd07e7dc4bce8be5d800035a532fdcc92"}},{"ruleId":"D2","level":"warning","message":{"text":"Titra.LoadSubtitle (cognitive 17): Titra.LoadSubtitle has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Titra.cs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"98e9afc027cab7bb1579ba0b0e9d3d7c10542e945e3c928e801b42470669b4b2"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle38.LoadSubtitle (cognitive 17): UnknownSubtitle38.LoadSubtitle has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle38.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eb4436fd3b49e89d80f52e001b29468485ac771c9776dd5901b65f2616acb02"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle81.LoadSubtitle (cognitive 17): UnknownSubtitle81.LoadSubtitle has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle81.cs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4a552208bafadcee1dce259ce370ad4ed4e5fe312d52d7709d63433d0b81f33"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle98.LoadSubtitle (cognitive 17): UnknownSubtitle98.LoadSubtitle has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle98.cs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"34811f838757643ce64203cabab322f5018a46e3a4a1f5cf7236f50fe43bfb94"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVTT.GetXTimeStampSeconds (cognitive 17): WebVTT.GetXTimeStampSeconds has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTT.cs"},"region":{"startLine":473}}}],"partialFingerprints":{"codehealthFindingId/v1":"357a31b2fd3a28bef3869d588d3ce764eb27342aba748dbb6481263674274c85"}},{"ruleId":"D2","level":"warning","message":{"text":"WebVTT.SetEndTag (cognitive 17): WebVTT.SetEndTag has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTT.cs"},"region":{"startLine":773}}}],"partialFingerprints":{"codehealthFindingId/v1":"34c249745a888a28e6ab58694545e99fa6be806c0645a499abbdc0c92d90b628"}},{"ruleId":"D2","level":"warning","message":{"text":"CsvRules.ParseCsv (cognitive 17): CsvRules.ParseCsv has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/MultipleReplaceLoader.cs"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a7176d9ba261c1b9a45d17a05e07554257e66ce92340fd9fa1f787ba066cc72"}},{"ruleId":"D2","level":"warning","message":{"text":"Program.TryInjectPositionalFormat (cognitive 17): Program.TryInjectPositionalFormat has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Program.cs"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"edf633bd97a96e4be9d053aefeba7487318b1efbf87f7a94879fca103e79267f"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrBitmap.IsExclamationMark (cognitive 17): BinaryOcrBitmap.IsExclamationMark has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":630}}}],"partialFingerprints":{"codehealthFindingId/v1":"78256b81a02251029ccfa41095e7cb56e39997d24e739205633cf59ab7fa9489"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmap2.VobSubAntialize (cognitive 17): NikseBitmap2.VobSubAntialize has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmap2.cs"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"141282b1f74d62adaa421a00c204f21951905932a4f8774730ba111ebcd17245"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrDb.GetMatchExpanded (cognitive 17): NOcrDb.GetMatchExpanded has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrDb.cs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"d404e029d93eaf9655df27e29c076a42a28cafef8556eaa766488f73adfd27e7"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaDrawCanvas.Render (cognitive 16): AssaDrawCanvas.Render has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawCanvas.cs"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f9af60effa6e0562dcb0f255861e481d279f6f89599a69678222039b72b7d0d"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaDrawViewModel.AddPointToActiveShape (cognitive 16): AssaDrawViewModel.AddPointToActiveShape has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawViewModel.cs"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1e4bc6f58abf5d6e8b1946496dec19e576bad02c99c21ee6b67ca22a37c066a"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaDrawViewModel.ChangeLayer (cognitive 16): AssaDrawViewModel.ChangeLayer has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawViewModel.cs"},"region":{"startLine":457}}}],"partialFingerprints":{"codehealthFindingId/v1":"632b181364d28a11c4a224ff79cd562976006cef9d587cf1fa03c238fca90c66"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaResamplerHelper.ApplyResampling (cognitive 16): AssaResamplerHelper.ApplyResampling has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaResolutionResampler/AssaResamplerHelper.cs"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"103098b28aeb12bf0434a7aef7baa5d41660666ab4952ed0f1824faa48f674c5"}},{"ruleId":"D2","level":"warning","message":{"text":"AssaStylesViewModel.Initialize (cognitive 16): AssaStylesViewModel.Initialize has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":1010}}}],"partialFingerprints":{"codehealthFindingId/v1":"2861f6b154284079d082053a296457ec7eb55c9e4c77d76903f377253fe373d8"}},{"ruleId":"D2","level":"warning","message":{"text":"FontCollectorViewModel.MatchEmbeddedFonts (cognitive 16): FontCollectorViewModel.MatchEmbeddedFonts has cognitive complexity 16 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/FontCollector/FontCollectorViewModel.cs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb39a698c0250d70f2ad87c1cf33e7989db95b0eb78f8e12bf76afb64d1d1d24"}},{"ruleId":"D2","level":"warning","message":{"text":"DCinemaSmptePropertiesViewModel.Import (cognitive 16): DCinemaSmptePropertiesViewModel.Import has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"5aa1724c94c16f2409dd5bff56e5c4449570c2842e5e885277458eaf6aaa7c5e"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText10PropertiesViewModel.Initialize (cognitive 16): TimedText10PropertiesViewModel.Initialize has cognitive complexity 16 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/TimedText10Properties/TimedText10PropertiesViewModel.cs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0d202c1d6ec3893f78cfbee1e0d5662666da52d0acada36b4963221832548e9"}},{"ruleId":"D2","level":"warning","message":{"text":"InitWaveform.MakeWaveform (cognitive 16): InitWaveform.MakeWaveform has cognitive complexity 16 (threshold 15). Most of this is not in the body itself: 7 of the 16 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 638, 672, 506, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitWaveform.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"82a62ded811a5cae42001b4faca48bf636095d44bea2c0fa27a6cf83634072d1"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.LoadVobSubFromMatroska (cognitive 16): MainViewModel.LoadVobSubFromMatroska has cognitive complexity 16 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":17607}}}],"partialFingerprints":{"codehealthFindingId/v1":"21841f080c414134214982989ad8fe2b73f6141c588e60a457bd3e877132fbaf"}},{"ruleId":"D2","level":"warning","message":{"text":"MainViewModel.SelectCurrentSubtitleAtPlayhead (cognitive 16): MainViewModel.SelectCurrentSubtitleAtPlayhead has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":22527}}}],"partialFingerprints":{"codehealthFindingId/v1":"88321ca7bdfe2064be550e87b143214822f81476c36d22698a975965d0688cf0"}},{"ruleId":"D2","level":"warning","message":{"text":"TesseractOcr.ParseHOcr (cognitive 16): TesseractOcr.ParseHOcr has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/TesseractOcr.cs"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"332a1c398230c15fadf695cb204582261e71543abd7fe1e49b03a8ef93743a7d"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.PickFallbackDatabase (cognitive 16): OcrViewModel.PickFallbackDatabase has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1855}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf1ed815bb153ed163d95064a609888aae2a95cfb2540f7dae4319cd2058c2fa"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.GetTextWithMoreSpacesInItalic (cognitive 16): OcrViewModel.GetTextWithMoreSpacesInItalic has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3254}}}],"partialFingerprints":{"codehealthFindingId/v1":"a165c86951411c30c21161df01ea993cf9e53138eeaf033a8171256cfc0bb9de"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrViewModel.GetAlignment (cognitive 16): OcrViewModel.GetAlignment has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":5188}}}],"partialFingerprints":{"codehealthFindingId/v1":"360b95cc73cb158c850f54d5244dc348821f29744e51b424af04a8bf06495787"}},{"ruleId":"D2","level":"warning","message":{"text":"ColorPickerViewModel.OnKeyDown (cognitive 16): ColorPickerViewModel.OnKeyDown has cognitive complexity 16 (threshold 15). Most of this is not in the body itself: 5 of the 16 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 274, 261). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/ColorPicker/ColorPickerViewModel.cs"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"d80a940110d025ee9fea69e6b7d527c256af01148fbbbd183433b9b692115b1c"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoPlayerUndockedViewModel.Onloaded (cognitive 16): VideoPlayerUndockedViewModel.Onloaded has cognitive complexity 16 (threshold 15). Most of this is not in the body itself: 3 of the 16 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 211, 241, 182). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/Undocked/VideoPlayerUndockedViewModel.cs"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"bccc24e183fdbad730ff590969e8ee1f90184fb3c384a29c19242a0777cf782a"}},{"ruleId":"D2","level":"warning","message":{"text":"SpellCheckViewModel.LoadDictionaries (cognitive 16): SpellCheckViewModel.LoadDictionaries has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/SpellCheckViewModel.cs"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"95a6e57be90acad373ab9c8c4dd40a6d7982fe47fbbd50637ee2dfc369ffb6d5"}},{"ruleId":"D2","level":"warning","message":{"text":"SpellCheckViewModel.DoSpellCheck (cognitive 16): SpellCheckViewModel.DoSpellCheck has cognitive complexity 16 (threshold 15). Of this number, 9 points are the body\u0027s own statements and 7 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/SpellCheckViewModel.cs"},"region":{"startLine":1023}}}],"partialFingerprints":{"codehealthFindingId/v1":"45a4bb6eefabbde31de61c32db710225b705b8ce81a477534d23485f58462323"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConverter.RunNOcr (cognitive 16): BatchConverter.RunNOcr has cognitive complexity 16 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":723}}}],"partialFingerprints":{"codehealthFindingId/v1":"b874a5beb7db9de53790094a1b22695450852165ae194f2fb63294d0f9559969"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchConvertSettingsViewModel.SaveSettings (cognitive 16): BatchConvertSettingsViewModel.SaveSettings has cognitive complexity 16 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertSettingsViewModel.cs"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"cac78152076d10fc48e0bfb7bf51544434e5034a11fde0173e5568185493987d"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchErrorListViewModel.Initialize (cognitive 16): BatchErrorListViewModel.Initialize has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchErrorList/BatchErrorListViewModel.cs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b960a4fda41ddb54812bc4f0907955fd54bfb140661bd27c962f644f7fe2ee0"}},{"ruleId":"D2","level":"warning","message":{"text":"ShotChangesViewModel.LoadTextFile (cognitive 16): ShotChangesViewModel.LoadTextFile has cognitive complexity 16 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/ShotChanges/ShotChangesViewModel.cs"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fb00c6050005d8063975ca43bc53c3dbb54d72a36b7aa493b308602555d0ea2"}},{"ruleId":"D2","level":"warning","message":{"text":"OpenAiSttService.TranscribeCoreAsync (cognitive 16): OpenAiSttService.TranscribeCoreAsync has cognitive complexity 16 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/OpenAiCompatible/OpenAiSttService.cs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"d863be3e46d2552f5f1f407b53857f25f7637d37333f60c909765955b550864f"}},{"ruleId":"D2","level":"warning","message":{"text":"CosyVoice3CrispAsr.EnsureServerRunningAsync (cognitive 16): CosyVoice3CrispAsr.EnsureServerRunningAsync has cognitive complexity 16 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs"},"region":{"startLine":619}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f3e1e9b2d4800e8dc65a17fa4ea61608411aa8e5d165c701ce0d3817f142918"}},{"ruleId":"D2","level":"warning","message":{"text":"KokoroTtsCpp.EnsureServerRunningAsync (cognitive 16): KokoroTtsCpp.EnsureServerRunningAsync has cognitive complexity 16 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/KokoroTtsCpp.cs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce6c6739f24072a97a9b97f9fbd7439c567d9d900ee9272b3a1457b88fc2bcab"}},{"ruleId":"D2","level":"warning","message":{"text":"VibeVoiceCrispAsr.EnsureServerRunningAsync (cognitive 16): VibeVoiceCrispAsr.EnsureServerRunningAsync has cognitive complexity 16 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"4365cefa19b836df89d50fc0586027088af326db1c451bfecc196671e9c2d8b0"}},{"ruleId":"D2","level":"warning","message":{"text":"TextToSpeechViewModel.TestVoice (cognitive 16): TextToSpeechViewModel.TestVoice has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":1560}}}],"partialFingerprints":{"codehealthFindingId/v1":"db990d6528177b58c80444ce230be5a524e3efd9a7957efc04c066eb41fa115b"}},{"ruleId":"D2","level":"warning","message":{"text":"TextToSpeechViewModel.MergeAudioParagraphs (cognitive 16): TextToSpeechViewModel.MergeAudioParagraphs has cognitive complexity 16 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":2288}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0486f20be75f7ba75aa78e9c8e3dff5e324b92c57ad4ac859255ed9dc304eb2"}},{"ruleId":"D2","level":"warning","message":{"text":"Mp3DurationReader.ReadDurationSeconds (cognitive 16): Mp3DurationReader.ReadDurationSeconds has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/Mp3DurationReader.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"100c3c1a6a2d02488e5d37e96f7d3351243f1d15e95a32450302de7ec051127e"}},{"ruleId":"D2","level":"warning","message":{"text":"TextWithSubtitleSyntaxHighlightingConverter.ParseFontTag (cognitive 16): TextWithSubtitleSyntaxHighlightingConverter.ParseFontTag has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs"},"region":{"startLine":725}}}],"partialFingerprints":{"codehealthFindingId/v1":"f412aca4ba82bc616eb0b5f7f1bcc5003a3ea8dd4f6cead902985cbfb6fb0e2f"}},{"ruleId":"D2","level":"warning","message":{"text":"CdgGraphics.ToBitmap (cognitive 16): CdgGraphics.ToBitmap has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/CDG/CdgGraphics.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"3eeaba48109d9b232e31cb0e2d07c77885cdb59bde23e4da8131f779ac77a9cc"}},{"ruleId":"D2","level":"warning","message":{"text":"HtmlUtil.TagOff (cognitive 16): HtmlUtil.TagOff has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/HtmlUtil.cs"},"region":{"startLine":1420}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b827457249863b4b999c0d7e118bf6325a1375b8ce50e57f27b6085911113b4"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmap.CropTop (cognitive 16): NikseBitmap.CropTop has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/NikseBitmap.cs"},"region":{"startLine":817}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc325c06fd7c5c93aabd027f6e4095e8caee4f199881b1d8d8fb27823f7d3a8f"}},{"ruleId":"D2","level":"warning","message":{"text":"PlainTextImporter.SplitToThree (cognitive 16): PlainTextImporter.SplitToThree has cognitive complexity 16 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/PlainTextImporter.cs"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"284f954a5bba42f7e7a69872085d4136cdd58704324f37b8b65c8bbdc894da4e"}},{"ruleId":"D2","level":"warning","message":{"text":"StrippableText.ShouldStartWithUpperCase (cognitive 16): StrippableText.ShouldStartWithUpperCase has cognitive complexity 16 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StrippableText.cs"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b7f5017598bb767aa0a9560d66e7f228308f979e15b2361500f17bef4366ab5"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownFormatImporterOds.GetCellValue (cognitive 16): UnknownFormatImporterOds.GetCellValue has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterOds.cs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc78dba91c4983a0e73a237c37139566815b989d7cf18f65890d3f24e93c0d8e"}},{"ruleId":"D2","level":"warning","message":{"text":"Utilities.ReInsertHtmlTags (cognitive 16): Utilities.ReInsertHtmlTags has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":824}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a58f6ab84777551968a575c403c35039c0b77f1b4dec5e9de125e3c75128887"}},{"ruleId":"D2","level":"warning","message":{"text":"Vttc.Vttc.ctor (cognitive 16): Vttc.Vttc.ctor has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Boxes/Vttc.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2609563958d2b0d79cbfdd4693ef5360566a8d6328e01355e8fdcac77f19cae"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.DecodeMoovVideoCea708 (cognitive 16): MP4Parser.DecodeMoovVideoCea708 has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"f17d5ffefee022073c50c33a5b7b6efd0897dcd0fb3f75276e28ad311837373d"}},{"ruleId":"D2","level":"warning","message":{"text":"Mp4TtmlHelper.FindRootTag (cognitive 16): Mp4TtmlHelper.FindRootTag has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4TtmlHelper.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb783171cf3cacf3a54ec847311a109ea2c326128c3793fd3277256563511373"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbSubPes.DvbSubPes.ctor (cognitive 16): DvbSubPes.DvbSubPes.ctor has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/DvbSubPes.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"b48c2a1f8126775401913e5f4661be18541e48a3dabe70e6520f657ae3af9b4d"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbSubPes.DvbSubPes.ctor (cognitive 16): DvbSubPes.DvbSubPes.ctor has cognitive complexity 16 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/DvbSubPes.cs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"be7d2ee2f63841ddf878effee3725f85aa301d9d0f3e3fc87dbb8e05bb9a6021"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbSubPes.GetClutDefinitionSegment (cognitive 16): DvbSubPes.GetClutDefinitionSegment has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/DvbSubPes.cs"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"2228698baf74de7d65f89074c9ecaa1e49c4fadfd63b12edbfe511162a2fe03f"}},{"ruleId":"D2","level":"warning","message":{"text":"ObjectDataSegment.TwoBitPixelDecoding (cognitive 16): ObjectDataSegment.TwoBitPixelDecoding has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/ObjectDataSegment.cs"},"region":{"startLine":680}}}],"partialFingerprints":{"codehealthFindingId/v1":"b78186dea4854ae97f78986eff53ebeb40ca41e5461bda6c61a2c4f120060e4f"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoveTextForHI.RemoveLineIfAllUppercase (cognitive 16): RemoveTextForHI.RemoveLineIfAllUppercase has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveTextForHI.cs"},"region":{"startLine":1546}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfa93e12b755d5843f17f5ea77ca60184df183c4732518877e2f66bd465b32ca"}},{"ruleId":"D2","level":"warning","message":{"text":"AdobeEncoreTabs.LoadSubtitle (cognitive 16): AdobeEncoreTabs.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdobeEncoreTabs.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"e411924c4401ba69d44809313cae4cd006eee22802aed76f316e2826a8ed27f7"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.AddTagToHeader (cognitive 16): AdvancedSubStationAlpha.AddTagToHeader has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":894}}}],"partialFingerprints":{"codehealthFindingId/v1":"2574f34fc782327531242d3864750ffa2dfd2757ddfbcf3ae6b9df3fe735a4c8"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.GetSsaColor (cognitive 16): AdvancedSubStationAlpha.GetSsaColor has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":2114}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2c716b63f308224083eaeefec92130c71a56a913c5170bbe6c2886c6dd1d680"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSubStationAlpha.AddSsaStyle (cognitive 16): AdvancedSubStationAlpha.AddSsaStyle has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":2551}}}],"partialFingerprints":{"codehealthFindingId/v1":"46c05ca0a2f2369e9f46a7ad3be6e26f7536e5029c4c6a8095eea0cfd03e43e9"}},{"ruleId":"D2","level":"warning","message":{"text":"CheetahCaptionOld.LoadSubtitle (cognitive 16): CheetahCaptionOld.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CheetahCaptionOld.cs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"72fb354df2a95f213867dd4f055b9a898327634c779dac2ad1e7dfe766ca5f7b"}},{"ruleId":"D2","level":"warning","message":{"text":"ELRStudioClosedCaption.LoadSubtitle (cognitive 16): ELRStudioClosedCaption.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ELRStudioClosedCaption.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"1967b703b20705c0aca5bb62575c5b0b1bf8e9922d6494b752c9e6b8f4658936"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalCutProXml15.DecodeTime (cognitive 16): FinalCutProXml15.DecodeTime has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProXml15.cs"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"08dae490fd9fa1dc1344590f40fb7926f8ac38f57e5871447668f7f30ca940e4"}},{"ruleId":"D2","level":"warning","message":{"text":"Fte.LoadSubtitle (cognitive 16): Fte.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Fte.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7cb5c42ceceea1b92274d197c4a2bad4e1447c393176279651b32e18597fe52"}},{"ruleId":"D2","level":"warning","message":{"text":"Idx.LoadSubtitle (cognitive 16): Idx.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Idx.cs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"231478c8db90f972da6adf3ce853e39afd2bd4bc2df0939e5472526287f05652"}},{"ruleId":"D2","level":"warning","message":{"text":"IssXml.LoadSubtitle (cognitive 16): IssXml.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/IssXml.cs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"9593004a05f4ba5b851df6af77618e7c49d2d95eea260e4577c9ae90d602ef6b"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonType11.LoadSubtitle (cognitive 16): JsonType11.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/JsonType11.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b44b15c035ee689637e0c191aec1addd83b937984eec4118356d9927c7bc653"}},{"ruleId":"D2","level":"warning","message":{"text":"MidwayInscriberCGX.LoadSubtitle (cognitive 16): MidwayInscriberCGX.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/MidwayInscriberCGX.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"5feba7b0464d4173aff6acf6355e0151dfa1b0559be130ef7664fa62d18e2b16"}},{"ruleId":"D2","level":"warning","message":{"text":"Rtf1.LoadSubtitle (cognitive 16): Rtf1.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Rtf1.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"a099fb1630549055b8724459fc3dddb285096dda06625b90ff3585cf89afa3f9"}},{"ruleId":"D2","level":"warning","message":{"text":"SonyDVDArchitect.LoadSubtitle (cognitive 16): SonyDVDArchitect.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SonyDVDArchitect.cs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"33928791e847f1df6de24fded3bcfb68304e14562c298278fa468b28f56e5bda"}},{"ruleId":"D2","level":"warning","message":{"text":"SubUrbia.LoadSubtitle (cognitive 16): SubUrbia.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubUrbia.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"4be5625ad5e6b36c72e4f0be9c9dd1f8c5784609f12c9d011dfd8bc3dc198b50"}},{"ruleId":"D2","level":"warning","message":{"text":"TimeCodesOnly3.LoadSubtitle (cognitive 16): TimeCodesOnly3.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimeCodesOnly3.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"296a71984ffeb418b9318bfc1fd8ed6c8442e68aac0986267e084603e09b7847"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText10.GetRegionsTopFromHeader (cognitive 16): TimedText10.GetRegionsTopFromHeader has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1480}}}],"partialFingerprints":{"codehealthFindingId/v1":"7168a9d1040ce3ccdefcbc7ea6f642fe2d71c88a874a315fe7414734fafe8543"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText10.GetRegionsBottomFromHeader (cognitive 16): TimedText10.GetRegionsBottomFromHeader has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1526}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc204d1bf01270a70f67bc8c205d1080a5c12c6edfb68ca89730a624021e35ce"}},{"ruleId":"D2","level":"warning","message":{"text":"TimedText10.GetIfTopAligned (cognitive 16): TimedText10.GetIfTopAligned has cognitive complexity 16 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1572}}}],"partialFingerprints":{"codehealthFindingId/v1":"b40fba82f4145e43d8e3f5153fe5aa7c0d73bea1ce19e2c767e38643a0574d4e"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle100.LoadSubtitle (cognitive 16): UnknownSubtitle100.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle100.cs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"13842268eeec4936da7303112507b679d369f94b4f26147c2bcaeb6fc000036c"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle40.LoadSubtitle (cognitive 16): UnknownSubtitle40.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle40.cs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"be995d460e96bb3439bec2f1799e9870e0fd7a075b2975c154a76b120766cc3c"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownSubtitle47.LoadSubtitle (cognitive 16): UnknownSubtitle47.LoadSubtitle has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/UnknownSubtitle47.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcea81e1d7c365fb3e7a2d9745cf4d24aa89b7b8df1e60be55145e6bc8cd36b4"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrOcrEngine.Recognize (cognitive 16): BinaryOcrOcrEngine.Recognize has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/BinaryOcrOcrEngine.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fe8b8f7dfff62dc870b79906d38c66eb16e31eb5f697d591141ece5868cf05f"}},{"ruleId":"D2","level":"warning","message":{"text":"ContainerSubtitleLoader.LoadMxf (cognitive 16): ContainerSubtitleLoader.LoadMxf has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/ContainerSubtitleLoader.cs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"cac29c29e8fbe586c61f2bb678cb87beed2a8104f6b49320e4d2f519d7a0f339"}},{"ruleId":"D2","level":"warning","message":{"text":"LibSEIntegration.DetectEncodingWithFallback (cognitive 16): LibSEIntegration.DetectEncodingWithFallback has cognitive complexity 16 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"93724de643ff8e93ef9ed3890a1fd995f9543ec85c35d71d79c56572494697dc"}},{"ruleId":"D2","level":"warning","message":{"text":"NOcrOcrEngine.Recognize (cognitive 16): NOcrOcrEngine.Recognize has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/NOcrOcrEngine.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"adcbdff160097abb3915fd725359f0eb4c24b66f2877bf3713411db6d967c4c1"}},{"ruleId":"D2","level":"warning","message":{"text":"SubtitleConverter.PassThroughTransportStreamDvbAsync (cognitive 16): SubtitleConverter.PassThroughTransportStreamDvbAsync has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SubtitleConverter.cs"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7dbaf712166867b7cc831be08f6108161d3a772ec7ad68c5d8ccd8b4fc07927"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiTranslate.Translate (cognitive 16): GeminiTranslate.Translate has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/AutoTranslate/GeminiTranslate.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"e46ac2e4f3a226d0729fc316aff7e1e1d3bb7e306314a0d7e261b02f110072ba"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageRenderer.SplitIntoSegments (cognitive 16): ImageRenderer.SplitIntoSegments has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ImageRenderer.cs"},"region":{"startLine":481}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6efe4ddf2e1a80345be3ebe57daa0861dabbd958cc47a6a7d9441c9a6716c77"}},{"ruleId":"D2","level":"warning","message":{"text":"BinaryOcrBitmap.IsColon (cognitive 16): BinaryOcrBitmap.IsColon has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"511529c88e65c388c350a1c86706223c22cba918ddcee4e16741ee62665e5317"}},{"ruleId":"D2","level":"warning","message":{"text":"OcrFixReplaceList2.HasValidAttributes (cognitive 16): OcrFixReplaceList2.HasValidAttributes has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7a44a3dd0f0a0713bdc0fe6b5df7f711fcc776c0934929bb586e7414ece6d10"}},{"ruleId":"D2","level":"warning","message":{"text":"NikseBitmap2.CropTop (cognitive 16): NikseBitmap2.CropTop has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmap2.cs"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"17306d23e538f5ab011181b2ea23a84859e3d61141b8b876074a3cce669f59c6"}},{"ruleId":"D2","level":"warning","message":{"text":"SpellChecker.IsWordCorrect (cognitive 16): SpellChecker.IsWordCorrect has cognitive complexity 16 (threshold 15). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/SpellCheck/SpellChecker.cs"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"dac0f68007ef81d3b60b306bef236d080d7d4249f13e4ae7bb50d5927572613b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MainViewModel: TooManyMethods \u2014 12399 significant lines (blank, comment-only and punctuation-only lines excluded), 820 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5e30505457f7661b01e6ab28d372b522a65df6e7650fe5b40d773ee973c95f6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Main/MainViewModel.cs: FileTooLong \u2014 12587 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"269edccc28913754f6a60ae7640976d06f82d49cf7280aaa52934393a242f761"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Ocr/OcrViewModel.cs: FileTooLong \u2014 3014 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d8c523a326b4efd9b3922fcbb82e8d45d841a6662ee8e870d4f0093cc1ead77"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: OcrViewModel: TooManyMethods \u2014 2945 significant lines (blank, comment-only and punctuation-only lines excluded), 158 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a210dc0f68741ee9733ae0c0c7231fde189d4eeb2a84b4f40aa7aec061c60ae"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SpeechToText/SpeechToTextViewModel.cs: FileTooLong \u2014 2621 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbacfc31d24087366cee5f6c9f15d939d8971c5d19c5c89651aa112b43faee7a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BinaryEditViewModel: TooManyMethods \u2014 1518 significant lines (blank, comment-only and punctuation-only lines excluded), 132 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"beee1a01d0f7f3f49c7e85dc123e16ff73491458e84a073d40bb3e2fc6697283"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Common/Utilities.cs: FileTooLong \u2014 2029 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c86b8cf321fefeb9ce3aa07708322919c133d612b6c59498f3c189e2653c6f20"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: AudioVisualizerControl/AudioVisualizer.cs: FileTooLong \u2014 2016 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d7b95ac06b38bb0dff861b5ceb6790611048d175e96497297dd79895e2f7824"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SubtitleFormats/Pac.cs: FileTooLong \u2014 2001 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ae4bd46636525bbeafb153c601788c920d09f5b23e72dc0dfc6d60f2481f8d9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: TextToSpeech/TextToSpeechViewModel.cs: FileTooLong \u2014 1946 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f5373cdf2e014c7d31a939ab9901ae04c458b28e0b7b4d824f41b4c5772de9f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: LanguageGeneral: ClassTooLong \u2014 1472 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Config/Language/LanguageGeneral.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f36acbf83fcb82a922b61bd4c5c6cfa757576342bc7a36ec5d8fdd9d7f8dee65"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Settings/SettingsViewModel.cs: FileTooLong \u2014 1833 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ad027fd6529987518a1a04b9d411ffeb5771d4e2229b7063eaa5048b4526cbf"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: DownloadHashManager: ClassTooLong \u2014 1421 significant lines (blank, comment-only and punctuation-only lines excluded), 28 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Download/DownloadHashManager.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"03addca1531a5416d3f6f1bce973ade9df8fb42009f579f02536ed284b972195"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Logic/UiUtil.cs: FileTooLong \u2014 1767 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/UiUtil.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cabb6edc7997242d0f8eb809db84371d61b5c0383daa5bd0c751e4ca92a7406e"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Cavena890: ClassTooLong \u2014 1322 significant lines (blank, comment-only and punctuation-only lines excluded), 13 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7af09da1619c17386b2d63a41f2039db0c66bb272bd7410abe2406565f91fbe"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SpeechToTextViewModel: TooManyMethods \u2014 2581 significant lines (blank, comment-only and punctuation-only lines excluded), 99 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"54dc0a17b3efef871e011e29ad6452b96fcac42eb448e4335435fce856c7344b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: LanguageAutoDetect: ClassTooLong \u2014 1273 significant lines (blank, comment-only and punctuation-only lines excluded), 19 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d37ce0596cafe56a93f10391c166ea97873bcb0c3e8da69e1e7e573937879a4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Download/DownloadHashManager.cs: FileTooLong \u2014 1572 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Download/DownloadHashManager.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a924ce619222ca8a3707189603a3c8d2e90b8d8ec743fbb2abf388a18f995fb5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: BatchConvert/BatchConverter.cs: FileTooLong \u2014 1571 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23bdff97269d8601e5647dbfddcb4ebc7e266c2ed817b04a21f30a39199e3d62"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Utilities: TooManyMethods \u2014 2012 significant lines (blank, comment-only and punctuation-only lines excluded), 94 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8655580353336098e116993af3768c87a8833bfd059317abc7926da541883261"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SubtitleFormats/AdvancedSubStationAlpha.cs: FileTooLong \u2014 1559 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"921ff09b30056c252f67d09f933d817e51fcdd2e3f2d85f4bbd178200e8980eb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: BatchConvert/BatchConvertViewModel.cs: FileTooLong \u2014 1558 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6df2da2373f8e0717d6f817be5a03f02322817af94300350b2b9662be61ad995"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: BinaryEdit/BinaryEditViewModel.cs: FileTooLong \u2014 1554 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bb05e92bcddc2aade0613dbe335a57e92cbd047bd20b8b90cc2bfdb2df08d07"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SettingsViewModel: TooManyMethods \u2014 1791 significant lines (blank, comment-only and punctuation-only lines excluded), 90 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"321dbd4794b69401a24683e2bf65c10c86e8a194c884be4809f1bffcc8733fa0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SubtitleFormats/Ebu.cs: FileTooLong \u2014 1474 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bc688d7bf22c6dbb3cc636748867d31d5172ad70a61acedddbf0dec8cd19544"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Language/LanguageGeneral.cs: FileTooLong \u2014 1474 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Config/Language/LanguageGeneral.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6eb8af65941b62507e3af4c09007db5d280443890ea94a727cec4fe59234de9"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: InitListViewAndEditBox: ClassTooLong \u2014 1140 significant lines (blank, comment-only and punctuation-only lines excluded), 8 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitListViewAndEditBox.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3bff6dcd7765cea71430ba8c80c65b83bf0ebd9c7144f9241235bd2a04348ff"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Translate/AutoTranslateViewModel.cs: FileTooLong \u2014 1377 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ab1668c1464d7095ca17a9abbfcda267bbf31464efb3306b6f2d5690a53ab57"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TextToSpeechViewModel: TooManyMethods \u2014 1872 significant lines (blank, comment-only and punctuation-only lines excluded), 82 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0298914fe5d2e9d7f84f359c305c8127052050fdf6c3732cb01e675437eda603"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: BurnIn/BurnInViewModel.cs: FileTooLong \u2014 1339 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdba60fb07f886358f787780dfefcd45046fc04603a8b0a866461c5e60b4db49"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SubtitleFormats/Cavena890.cs: FileTooLong \u2014 1331 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"542f5aecdd0b4e886fd0f91c63822c9440bdb7311e85c5988f46fb10ca5acde7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AudioVisualizer: TooManyMethods \u2014 1908 significant lines (blank, comment-only and punctuation-only lines excluded), 79 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"604ddfb97b0a8f26f0e5837a7179bc5105e1d83585ee98c9e430e766e0161601"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SyntaxTextView: TooManyMethods \u2014 945 significant lines (blank, comment-only and punctuation-only lines excluded), 79 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/SyntaxTextEditorControl/SyntaxTextView.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0bdbf0d7c440319ac64253ae082ebf98913d503a976afdc76cb33807d744ded"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Common/LanguageAutoDetect.cs: FileTooLong \u2014 1307 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0589f534b77fd17bb1da129fee1a7647deb1be8a8c4fbee0966f468a5c9b15b5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: DownloadTts/DownloadTtsViewModel.cs: FileTooLong \u2014 1283 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d60dd6ae2da3d92aead40110fb60583bb1eba33085910714aa94fea4899066a9"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BurnInViewModel: TooManyMethods \u2014 1306 significant lines (blank, comment-only and punctuation-only lines excluded), 72 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a157e2a3cd34a67155bbca418ed4a67a2f62c5b4b321be07217dc1897db47ca"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: HtmlUtil: ClassTooLong \u2014 947 significant lines (blank, comment-only and punctuation-only lines excluded), 26 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/HtmlUtil.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a920972575ca0911ec700a27ba12e84530af0ac8a166d0b7877d1c48ec0b9b98"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AssaStylesViewModel: TooManyMethods \u2014 796 significant lines (blank, comment-only and punctuation-only lines excluded), 71 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5bdb3bd61ffce0af25075e6addb323bb740a936515f430d68897a4a9109954f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Layout/InitListViewAndEditBox.cs: FileTooLong \u2014 1175 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitListViewAndEditBox.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"66147db7911eace8516161e8b449da5427fda1e9cbc2e76b4c321ddc7a5e3c65"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BatchConvertViewModel: TooManyMethods \u2014 1509 significant lines (blank, comment-only and punctuation-only lines excluded), 69 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7781d14efb28a6744a68e8c79575f10787349a7fc11974abf173ad50a4f7901e"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TimedText10: ClassTooLong \u2014 900 significant lines (blank, comment-only and punctuation-only lines excluded), 27 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"781c3fb149c6b3bc18e8e30d6e31c192e85f29c8a286ba23ed72fb49e5148a5e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: NikseBitmap: TooManyMethods \u2014 904 significant lines (blank, comment-only and punctuation-only lines excluded), 67 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/NikseBitmap.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d01ca39edae1fcb15a001b1ff4b3ad255468b6c5f51681bfa2174b241492d3a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ScenaristClosedCaptions: ClassTooLong \u2014 878 significant lines (blank, comment-only and punctuation-only lines excluded), 23 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ScenaristClosedCaptions.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c30b0bf7a1e6f3c5920ffcd9d615617ddd5adfa761dca1610903293b5e3b29f2"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BatchConverter: TooManyMethods \u2014 1524 significant lines (blank, comment-only and punctuation-only lines excluded), 65 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d29d74313fc7ab7f6feed22930312ec1ee2959b297b6d5c31929d6a28743000"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ShortcutsMain: ClassTooLong \u2014 865 significant lines (blank, comment-only and punctuation-only lines excluded), 9 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ShortcutsMain.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"87d1c309c71d1252d72e9f51b3bf0f36414bd0635333f5cbc0175d70874acf2a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: RemoveTextForHI: ClassTooLong \u2014 837 significant lines (blank, comment-only and punctuation-only lines excluded), 22 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveTextForHI.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0992710702fdff2b8ce354918526d6a431f9c2efb564ac5bc9b7c0c7046c29c0"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SeJsonParser: ClassTooLong \u2014 834 significant lines (blank, comment-only and punctuation-only lines excluded), 5 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ea65f10c34deee61c1dc34f333c98692727727fb253d8ef3977e0125b8c4d1"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SettingsPage: ClassTooLong \u2014 802 significant lines (blank, comment-only and punctuation-only lines excluded), 24 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsPage.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e804c0268ad662e424e0decb1b337e519bab828555d7e4b2e7720937a72b6cc1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ReviewSpeech/ReviewSpeechViewModel.cs: FileTooLong \u2014 1002 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6123e3e58f0e71327d8813d575a38da32ae1b369669beceee6e218bffc41bd22"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SyntaxTextEditorControl/SyntaxTextView.cs: FileTooLong \u2014 990 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/SyntaxTextEditorControl/SyntaxTextView.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcc3ae37c56f3ef572c3c1a42966c9a1a4dcb221449bd76f695539cb724ead01"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Common/HtmlUtil.cs: FileTooLong \u2014 955 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/HtmlUtil.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e53f34975b2b070952bce49b4fbcb596300e961a8ffce236c2fc332019425621"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ReviewSpeechViewModel: TooManyMethods \u2014 967 significant lines (blank, comment-only and punctuation-only lines excluded), 57 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d298ac7150d5eb4d82f3f6c8fd85431b768e52afe79834921476e6326a1409df"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: FixCommonErrorsViewModel: TooManyMethods \u2014 560 significant lines (blank, comment-only and punctuation-only lines excluded), 57 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1bfd6b7b45b225ab14cefe53017964b8d7e9817a9b33ebd478f131bfea84538"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: OcrWindow: ClassTooLong \u2014 758 significant lines (blank, comment-only and punctuation-only lines excluded), 12 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd3cab9dd6de1f82b3f193536d57e55b2e772c3e1f85b9763205f78a0c1c197a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AutoTranslateViewModel: TooManyMethods \u2014 1342 significant lines (blank, comment-only and punctuation-only lines excluded), 56 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa197e99c64e49a9a4709c4b426d2103b86576f48ba923c6901eeb683be242be"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SsaStylesViewModel: TooManyMethods \u2014 615 significant lines (blank, comment-only and punctuation-only lines excluded), 56 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ssa/SsaStylesViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c6821985e2c7b6f003028944657754e623a20e2669e2ba135cf22fc6359f6cb"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Ebu: ClassTooLong \u2014 740 significant lines (blank, comment-only and punctuation-only lines excluded), 17 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"94f4298c297fc8d30f4eb721f9cea40b89b0b00979a1d93c4c6d17d347dcad05"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BinaryEditWindow: ClassTooLong \u2014 734 significant lines (blank, comment-only and punctuation-only lines excluded), 8 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1e32bd4b20c11b90458ff09e962564fba147bf473f64b746d035b77da5a4579"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Common/NikseBitmap.cs: FileTooLong \u2014 914 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/NikseBitmap.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"620a84b372de07fb979b7d4a89dbb1bd0da0c2186a15aff05c40b4927f975f54"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SubtitleFormats/TimedText10.cs: FileTooLong \u2014 910 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"049f9747be5ad0e39d8b6abf7fbe6faf3004dff70fcb2b9745d6e81477866784"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Logic/ShortcutsMain.cs: FileTooLong \u2014 888 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ShortcutsMain.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39ba490e11d28ecf2ec765de2390b3162efa337adf9b8f2518beb237cb6acce0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SubtitleFormats/ScenaristClosedCaptions.cs: FileTooLong \u2014 886 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ScenaristClosedCaptions.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b41a0eb302cc37c6232f608c385ffab8ecc19d8e4fedd5a0ad4c5e5650351e53"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TransparentSubtitlesViewModel: TooManyMethods \u2014 817 significant lines (blank, comment-only and punctuation-only lines excluded), 53 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc484cf73e0d4bcc7062a2ec4eabf1b7dcd04320600b54845352021882471830"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: LibMpvDynamic/LibMpvDynamicPlayer.cs: FileTooLong \u2014 879 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibMpvDynamic/LibMpvDynamicPlayer.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17fd4bfe071cb20b7532b499b7a3223c1d5449061cd384331b19c031e6a47141"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: InitWaveform: ClassTooLong \u2014 687 significant lines (blank, comment-only and punctuation-only lines excluded), 4 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitWaveform.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e98f061439d122e7e3c158cfdba3742c640520f6146fff1c47932d5629e90cb7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: TransparentSubtitles/TransparentSubtitlesViewModel.cs: FileTooLong \u2014 852 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3d82f0ed80192a9e46fda3bbad801ee80c91e7111548fe2abe94b9cae3d62a2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Common/SeJsonParser.cs: FileTooLong \u2014 851 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d915ce54189f9fb963e00fcb4de9006fe52a529853a5fd8c8b4ecd4f10fdfe41"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Forms/RemoveTextForHI.cs: FileTooLong \u2014 843 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/RemoveTextForHI.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a888c49faf37cfce29ed6feb09e9e6237a38121c8db76a579f120a96db1e20e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: LibMpvDynamicPlayer: TooManyMethods \u2014 849 significant lines (blank, comment-only and punctuation-only lines excluded), 50 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibMpvDynamic/LibMpvDynamicPlayer.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af87efefa1d4c2c2364adf552055443df4a37ff969d7e98b9678a5bd5c33327a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: InitMenu: ClassTooLong \u2014 661 significant lines (blank, comment-only and punctuation-only lines excluded), 6 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitMenu.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e265cdd303ca6225a3da401c5ea4c5ee5e00623e68a8a87d29ff4e3730b6228"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Settings/SettingsPage.cs: FileTooLong \u2014 823 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsPage.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"13e6197fa65ed03b60b9a8b569708f799b5d903a717c99bb3f563b6f0194fbe0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Assa/AssaStylesViewModel.cs: FileTooLong \u2014 821 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3afee913595d9306a73707adeb3b76f23ce74448a7509d23a2264dc060992eaf"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CutVideoViewModel: TooManyMethods \u2014 748 significant lines (blank, comment-only and punctuation-only lines excluded), 49 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/CutVideo/CutVideoViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"815c5f6d290c9886b7ffd3d1b59555dfa9e966550161e11a1ee6a43115331734"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ContinuationUtilities: TooManyMethods \u2014 724 significant lines (blank, comment-only and punctuation-only lines excluded), 49 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11430fa4cab0ded63a7117f94f0ab57e4d579b902b08bdc48defdf1681e466e8"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MultipleReplaceViewModel: TooManyMethods \u2014 708 significant lines (blank, comment-only and punctuation-only lines excluded), 49 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/MultipleReplace/MultipleReplaceViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2735969d1990c66804c258d4010cb0b727209b51bcaf8340e1a365041e6a1034"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Qwen3TtsCrispAsr: TooManyMethods \u2014 537 significant lines (blank, comment-only and punctuation-only lines excluded), 49 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be9284900ae316c0293feec0f515c5f5d3122e73282962e0d8b3c691e830beec"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Media/WaveToVisualizer2.cs: FileTooLong \u2014 805 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/WaveToVisualizer2.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc66aac47a6f0d18fe78878c643c43e0c0d5231f8565478f3dfc36a08b374e95"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AssaDrawViewModel: TooManyMethods \u2014 736 significant lines (blank, comment-only and punctuation-only lines excluded), 48 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ec768add6a59d18606d69db50ad767f3fa062bfc6bb020785b81a6765600339"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SccPositionAndStyleTable: ClassTooLong \u2014 637 significant lines (blank, comment-only and punctuation-only lines excluded), 0 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SccPositionAndStyleTable.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"014e4efb7ae7e226ffc1d68b918342eb19492d9170898b93a9c0d98864327664"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SpeechToTextWindow: ClassTooLong \u2014 635 significant lines (blank, comment-only and punctuation-only lines excluded), 10 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cdb7ed5f42fc04be872af4f66366d3a6ec7680263eba6d5e588ce6e5af578ca"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BurnInWindow: ClassTooLong \u2014 632 significant lines (blank, comment-only and punctuation-only lines excluded), 13 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"26c65b9e3110e217eb69fdda8c93689aa41bb4dec4a5bbadfdd02fd54ea7f9ca"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: WebVTT: ClassTooLong \u2014 629 significant lines (blank, comment-only and punctuation-only lines excluded), 26 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTT.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eacbf2df3d6d702e6fd5e9a160d6d9be6bd12fcec4c5e614bc057f4cbf11f7c0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Ocr/OcrWindow.cs: FileTooLong \u2014 785 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"df1dc8b8eb73a41ef2ddd19a9b757193d9992187423d547ceb6aa1bf047f6cdf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: CutVideo/CutVideoViewModel.cs: FileTooLong \u2014 781 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/CutVideo/CutVideoViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"87b957cec413b7bb2140dc1a359e43cfd65e36b556d9ea1997ff0226b91e086b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: RosettaPropertiesViewModel: ClassTooLong \u2014 617 significant lines (blank, comment-only and punctuation-only lines excluded), 11 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d89676571237e070e26f7631c5ef08624499ddac746fc19e2bf5eaf80f9dacc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Shortcuts/ShortcutsViewModel.cs: FileTooLong \u2014 770 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Shortcuts/ShortcutsViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"afa890f8fc07fae9d0059b4b3b153c1aeb441b8ea2e18e389511a61c434d6134"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: AssaDraw/AssaDrawViewModel.cs: FileTooLong \u2014 768 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaDraw/AssaDrawViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10a206f62026e09b7ada0742ee6d2197821a399fd2a8f968a40c5df15108e1cb"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MergeAndSplitHelper: TooManyMethods \u2014 543 significant lines (blank, comment-only and punctuation-only lines excluded), 46 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Translate/MergeAndSplitHelper.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3270d1f95282e2eb646bd7bc83b76122f908e289e794a13a5fe4771685192c5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MergeTwoSubtitlesViewModel: TooManyMethods \u2014 395 significant lines (blank, comment-only and punctuation-only lines excluded), 46 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/MergeTwoSubtitles/MergeTwoSubtitlesViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"acbb55fe295b2f186fcd130cf81a3f32f552b485ed126e7a64d9e084b9441e1b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: DCinemaInterop: ClassTooLong \u2014 608 significant lines (blank, comment-only and punctuation-only lines excluded), 11 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaInterop.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec261faccce089f95b521d7ee42fe6269894261b61d3dc979d7f5719a509abea"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: BinaryEdit/BinaryEditWindow.cs: FileTooLong \u2014 755 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4293c77497e5e99524d84fe55574b3c3124d3623a8da87bc38eb61e28525bdc"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: UnknownFormatImporter: ClassTooLong \u2014 603 significant lines (blank, comment-only and punctuation-only lines excluded), 15 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"16970189ed13260b9ee13225361c8ad3b68041290aecf80099aba9cd029b603d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SubtitleFormats/TextST.cs: FileTooLong \u2014 752 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TextST.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d10a218be3f14595a46d5a42713c0d207392cb9a0e78d0285c11962547cee2a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: OcrFixReplaceList2: ClassTooLong \u2014 601 significant lines (blank, comment-only and punctuation-only lines excluded), 26 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"31ff2c1403b594a99397bd36b9e0f7c8339a961033160489a34a9d8bb4298994"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ExportImageBasedViewModel: TooManyMethods \u2014 596 significant lines (blank, comment-only and punctuation-only lines excluded), 45 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportImageBased/ExportImageBasedViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dc065b65d38b46ea7065832cd5a5ff0aaa86ebe45e0236111838d63932d978e"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: NikseBitmapImageSplitter2: ClassTooLong \u2014 599 significant lines (blank, comment-only and punctuation-only lines excluded), 22 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eb557f69081dfe6131688d263ba24342984f22c31af386e2b718f5e11c3242a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Common/ContinuationUtilities.cs: FileTooLong \u2014 744 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/ContinuationUtilities.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ba37276a2d5dca521cb7e19ebe93399e28b425b4e21ad7ceff133810d480855"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Ocr/NOcrLineGenerator.cs: FileTooLong \u2014 744 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a89104494b1e72b75b4ad2c65cd4cbd0fc2ad6e15d09bbf4936a6b9f7c59095"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: PaddleOcr: ClassTooLong \u2014 594 significant lines (blank, comment-only and punctuation-only lines excluded), 26 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/PaddleOcr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"009fb29e348a13205d1c168374bdc23dd5b6c35ff038fec231281bf6ec663074"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: LanguageSettings: ClassTooLong \u2014 592 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Config/Language/Options/LanguageSettings.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fc06b1e3b4a8fa0036be317de96f24e380f56c770fe1044b87a2babf8741967"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: EbuTextTimingInformation: ClassTooLong \u2014 590 significant lines (blank, comment-only and punctuation-only lines excluded), 14 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b41fb3ed42db55cd8fe47e073f1e53071c8f5bda3172a55b8a1ceff2eb7c9fd5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: MultipleReplace/MultipleReplaceViewModel.cs: FileTooLong \u2014 732 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/MultipleReplace/MultipleReplaceViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"640000ee1e5955c6b3aea89850567e205c6473784c8c9a85a10d038680541673"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: DCinemaSmpte2010: ClassTooLong \u2014 581 significant lines (blank, comment-only and punctuation-only lines excluded), 8 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2010.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"efcaaa7f57830895ebc64f8820fb4f2f748677581019427e415cb7be3fe22790"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: NikseBitmap2: TooManyMethods \u2014 531 significant lines (blank, comment-only and punctuation-only lines excluded), 43 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmap2.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"503dd69c1dc2aa99d900605200204b256d96883bdd936c930fdb63321788eb59"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Layout/InitWaveform.cs: FileTooLong \u2014 714 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitWaveform.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e883fae825dc5f6d3441783945338d8fd25e119033b1ee79a82a745fe4a8aaa"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: LibVlcDynamicPlayer: ClassTooLong \u2014 561 significant lines (blank, comment-only and punctuation-only lines excluded), 27 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f74b62d83bdb8b7cadc5581f98730caf20d56a801721d41eca7219c2a4c71863"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: DCinemaSmpte2007: ClassTooLong \u2014 559 significant lines (blank, comment-only and punctuation-only lines excluded), 8 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2007.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"162bb9991cb58674b72471d00b3fba47a3ae40dcff9c351584cdd63ec9a067db"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SubtitleLineViewModel: ClassTooLong \u2014 549 significant lines (blank, comment-only and punctuation-only lines excluded), 30 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/SubtitleLineViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b82337889220250f1c743b542f869d643ddd8b3f6baecbbab6ba4178c260519"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CompareViewModel: TooManyMethods \u2014 526 significant lines (blank, comment-only and punctuation-only lines excluded), 41 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/Compare/CompareViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc9a8bceabee9c2e9565e1d2d446660861a85066f2784b36ae9816edec09b8a7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MossTtsCrispAsr: TooManyMethods \u2014 464 significant lines (blank, comment-only and punctuation-only lines excluded), 41 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8cc7ce0fef657f7ad2d57a1bb0ca07e3db6a6f00f96fd73a5126ac1c6a85711"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: FileUtil: TooManyMethods \u2014 459 significant lines (blank, comment-only and punctuation-only lines excluded), 41 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/FileUtil.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dbe9078317b6dc02c64d8a5dcfc55c1f6b32f077798e79cdf90fe1409588106"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: DCinemaSmpte2014: ClassTooLong \u2014 542 significant lines (blank, comment-only and punctuation-only lines excluded), 7 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2014.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"776309aacb4c67a9ca39cdd813ac373920dd4f29ef8f9f8532ff4d16d05333a9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Layout/InitMenu.cs: FileTooLong \u2014 677 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitMenu.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eebcff2e644d7f6801f6092f63fb58aadfac8ed2f3fb4d475e2635dea0df590"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Commands/ConvertCommand.cs: FileTooLong \u2014 675 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Commands/ConvertCommand.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6256ea6b39d51ceb3113d62024177a3a588fdbc69ba05634e10185bef8c1bdd"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: LibSEIntegration: ClassTooLong \u2014 539 significant lines (blank, comment-only and punctuation-only lines excluded), 29 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8db9fe874255e95b4eadfbcd3fd674e07c6aa45ee5bc6b085607ed81750e8add"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SubtitleFormat: ClassTooLong \u2014 539 significant lines (blank, comment-only and punctuation-only lines excluded), 25 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubtitleFormat.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be0ae683e6180fabd81b67eb9a1f5ca17c60852364f4142ac87a80f4b5a0de62"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Pac: TooManyMethods \u2014 1982 significant lines (blank, comment-only and punctuation-only lines excluded), 40 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa6ca70adc5dfd9ab87d3b32aa41524d46b65bcc1bb66ab09108accc12d2ddc7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SpellCheckViewModel: TooManyMethods \u2014 622 significant lines (blank, comment-only and punctuation-only lines excluded), 40 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/SpellCheckViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"13661d58257ffd3fb9e80e394047f04b7c6aca378108b80b6e87396e32d73139"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Subtitle: TooManyMethods \u2014 443 significant lines (blank, comment-only and punctuation-only lines excluded), 40 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Subtitle.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"92cdbac917accdff6a10166d17f6cc2d90f6e998ab435775890dd87bb008d9d5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: NOcrCharacterAddViewModel: TooManyMethods \u2014 402 significant lines (blank, comment-only and punctuation-only lines excluded), 40 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6207bf4cffe8407c5f2522ae02f7651a500ce42c023ad32236ff97cf29454720"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: VideoPlayerControl: ClassTooLong \u2014 533 significant lines (blank, comment-only and punctuation-only lines excluded), 28 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/VideoPlayer/VideoPlayerControl.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1934ce8e6791ce98a530090887ba24b3a3b464c8ce4e83f684a8edb2afcad92b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: VideoOcr/VideoOcrViewModel.cs: FileTooLong \u2014 663 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/VideoOcr/VideoOcrViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c68ff9bdfe6f2a1e7a5f86a10e29baeafc43902e7bf77290b3fcfbf6e37aa649"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: FixCommonErrorsWindow: ClassTooLong \u2014 525 significant lines (blank, comment-only and punctuation-only lines excluded), 4 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce9af25698d2479eb3a5d1dbb5fe234bbeaea815a0ca20ee5166265dbf3f622f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SpellCheck/SpellCheckViewModel.cs: FileTooLong \u2014 656 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/SpellCheckViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbf8256c8c6fd4018e754e21df11142713c937cdaaf1e777392e9ce27c20c6ae"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: InitLayout: ClassTooLong \u2014 524 significant lines (blank, comment-only and punctuation-only lines excluded), 19 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitLayout.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"680f69f5475388f8954e6d5fefb4ecfcace6912ca21142ea0db522e202080298"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SpeechToText/SpeechToTextWindow.cs: FileTooLong \u2014 651 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"53344c525985b431661c255927cfe892e7f4e913bb62012198e066286930bcac"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AdvancedSubStationAlpha: TooManyMethods \u2014 1549 significant lines (blank, comment-only and punctuation-only lines excluded), 39 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab861224cbcbff16e50f092d42417c197da4191fe6a10676f0e14cfb5a16afd3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MatroskaFile: TooManyMethods \u2014 512 significant lines (blank, comment-only and punctuation-only lines excluded), 39 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Matroska/MatroskaFile.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2870fa83eeb399002a4ad760f5885b189d78ef78a0a39ad0f659962019fcb47c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CosyVoice3CrispAsr: TooManyMethods \u2014 473 significant lines (blank, comment-only and punctuation-only lines excluded), 39 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c02bc53260ee5127ead82fe8b6e891ae34056f97d891574b6bcf20301447a820"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VoxCPM2CrispAsr: TooManyMethods \u2014 438 significant lines (blank, comment-only and punctuation-only lines excluded), 39 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d143e212dcc2fdee9e46c02f2f5ecbf79c04604210d50e12549f33bff5d9658b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: OmniVoiceCrispAsr: TooManyMethods \u2014 433 significant lines (blank, comment-only and punctuation-only lines excluded), 39 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1236f7f576dc8074e10ca73e4cdea4aaa2345f9bfba1ef476911cb2cbf5ae26"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ChatterboxTtsCpp: TooManyMethods \u2014 394 significant lines (blank, comment-only and punctuation-only lines excluded), 39 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11d219101046b704704d98097881fb2d5e00d404ac89fb06e0bfd6ac0c72192f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: BurnIn/BurnInWindow.cs: FileTooLong \u2014 647 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9da58e47f358309fa229fe9d35e7243f59ffbb6a5e366790bf2bf0cf35717ab"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TimeCodesBeautifier: ClassTooLong \u2014 516 significant lines (blank, comment-only and punctuation-only lines excluded), 21 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/TimeCodesBeautifier.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe856129329882cff4b55b8c7d14f314b2be1cf012b28a66249c8c7ccf261f02"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TextWithSubtitleSyntaxHighlightingConverter: ClassTooLong \u2014 513 significant lines (blank, comment-only and punctuation-only lines excluded), 19 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"84d091263e9125c8351734f25d51cba46b9cd576563f969ddbde14273fa2af3b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Common/SccPositionAndStyleTable.cs: FileTooLong \u2014 641 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SccPositionAndStyleTable.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c0ed579c605cc9ceb403a02cb3339b41a01295882ceeeeb44cd2eae9802388f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SubtitleFormats/WebVTT.cs: FileTooLong \u2014 638 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTT.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"04a66f6f880129a362dcf9625c2976c5da9031539f577c4f88eac91e6d761e28"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Ssa/SsaStylesViewModel.cs: FileTooLong \u2014 638 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ssa/SsaStylesViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e8be622ff2caef747e42d66696735ff98291c5630308798d93fc17944f10780"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: RealFFT: ClassTooLong \u2014 508 significant lines (blank, comment-only and punctuation-only lines excluded), 14 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Common/RealFFT.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e1c62917948a8d2367be6f1d34bdc1444f126d780ced1a09db887f7c7b4119e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: RosettaProperties/RosettaPropertiesViewModel.cs: FileTooLong \u2014 634 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"637db9dfedf24e7409321599c7e7d886b704f00aeeae04c695cdd5a6f9c66122"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ShortcutsViewModel: TooManyMethods \u2014 749 significant lines (blank, comment-only and punctuation-only lines excluded), 38 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Shortcuts/ShortcutsViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f983bf47ba47c3fa80ef28659b6c232a7c96751fcf5b7e7e7c52c9d18ab2537"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VideoOcrViewModel: TooManyMethods \u2014 633 significant lines (blank, comment-only and punctuation-only lines excluded), 38 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/VideoOcr/VideoOcrViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebf6e1521d5cec158538b756c8e9a17648a7cfbeadfa9ed9e9ccb6e8649c8a56"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: F5TtsCrispAsr: TooManyMethods \u2014 422 significant lines (blank, comment-only and punctuation-only lines excluded), 38 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bad6e78fcf7c8c73d553efc5f207bc2816564765f95c326faf786576f464d51"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SubtitleFormats/DCinemaInterop.cs: FileTooLong \u2014 629 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaInterop.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"168502acb03f99dbd7f43b8344869db5c7eef1d81422514435be03f84ca86b3c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ExportImageBased/ExportImageBasedViewModel.cs: FileTooLong \u2014 626 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportImageBased/ExportImageBasedViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc4dc5896b8f37d3854e91766eeccb8ba20e49c930854b4a47dcc2e23f8941ec"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AssaStylesWindow: ClassTooLong \u2014 500 significant lines (blank, comment-only and punctuation-only lines excluded), 12 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"95dd402b5afac1ddc41a1697ab94c6a09ee10a77e07f974a17b04583cd622189"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VisualSyncViewModel: TooManyMethods \u2014 347 significant lines (blank, comment-only and punctuation-only lines excluded), 37 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Sync/VisualSync/VisualSyncViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9d525eb909a65f0d43a0d0ff0f9649bf65581cc295bacabbf3947f151a56fda"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Common/UnknownFormatImporter.cs: FileTooLong \u2014 610 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporter.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9909cd3dd299d1e6cf792f215ef019ac40e161e085e9586c98c76fa115a68a4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Engines/PaddleOcr.cs: FileTooLong \u2014 609 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/PaddleOcr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec71d527d88efbe3a4ae1cff60aebfe990d414f2b6a29db2ee56298ada88b5b9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: FixEngine/OcrFixReplaceList2.cs: FileTooLong \u2014 608 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixReplaceList2.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"202462d9b9c74aae6f3a006c161ef9d98a9ea2aa3748c807a2af07e76bc5bc9b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Ocr/NikseBitmapImageSplitter2.cs: FileTooLong \u2014 608 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmapImageSplitter2.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e249248aede72de56f16bde1f67eeef13f280ce188fe01365baaa0e61cf5cf30"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: LanguageSettingsShortcuts: ClassTooLong \u2014 484 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Config/Language/Options/LanguageSettingsShortcuts.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2089245351d703ee4682516514c9dabdd7a01152099a278be6f37e81169cbaac"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Mp4/Mp4Parser.cs: FileTooLong \u2014 602 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cf2b4d2f0cf87b9d6c9839fc261e766c1b7c4a9ae613716ce9859c87fb493da"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Options/LanguageSettings.cs: FileTooLong \u2014 595 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Config/Language/Options/LanguageSettings.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"848322b4115ea011961235ed08986d9d03132ad9c0e97fcfaa858076c0a6792c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SubtitleFormats/DCinemaSmpte2010.cs: FileTooLong \u2014 593 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2010.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29ee59a1d6b955573b8809979124a50e13bc04a371b6e0f9e1490751f6b88398"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SsaStylesWindow: ClassTooLong \u2014 470 significant lines (blank, comment-only and punctuation-only lines excluded), 12 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ssa/SsaStylesWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6815abb5867922cd0935c65899228a512f93c7d66bb87116260ccc011b155be"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: FixCommonErrors/FixCommonErrorsViewModel.cs: FileTooLong \u2014 587 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"49cc9ce4b5789b28a76397a333df75a1cd3a3953055a791b024e479162c69ca4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Main/SubtitleLineViewModel.cs: FileTooLong \u2014 584 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/SubtitleLineViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be5992db8d3c6a5938595def1efaa4c546ae258644505d8df696d7ef777d57a4"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: IndexTtsCrispAsr: TooManyMethods \u2014 385 significant lines (blank, comment-only and punctuation-only lines excluded), 35 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ffc1d51c313ce55cef8cd643ad3546f28f7ef36ac09ce212e56dce9c3ac3250"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AssaProgressBarViewModel: TooManyMethods \u2014 317 significant lines (blank, comment-only and punctuation-only lines excluded), 35 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaProgressBar/AssaProgressBarViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdfc7b4b85b375ec222446743ecc91bb513b6fad59e22789802323bcc6e028d8"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TransparentSubtitlesWindow: ClassTooLong \u2014 463 significant lines (blank, comment-only and punctuation-only lines excluded), 11 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b7fd91cbd4036589d61ada0ce5b6e60d3403fd7875fc781072147569413abb4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: LibVlcDynamic/LibVlcDynamicPlayer.cs: FileTooLong \u2014 574 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e38d5f8233cf1822fce58b8319fde4ca0d60990b967a0032f2aadc80b6995850"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: InitNativeMacMenu: ClassTooLong \u2014 459 significant lines (blank, comment-only and punctuation-only lines excluded), 17 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitNativeMacMenu.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4da433c38ae8c51d9a647a5ffe6a248a556f4072421f40d63894bcb26f4c3a48"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TextToSpeechWindow: ClassTooLong \u2014 457 significant lines (blank, comment-only and punctuation-only lines excluded), 15 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"55da8196b299b84804c40d76588559ebe298df70ef7b55517dcca94357ecd0ba"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Cea708: ClassTooLong \u2014 456 significant lines (blank, comment-only and punctuation-only lines excluded), 4 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Cea708/Cea708.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ac34ffa8881ea07fb514ec04e72c2c5f96b5a74f19ec9a9de62ff39dcbb927d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SubtitleFormats/DCinemaSmpte2007.cs: FileTooLong \u2014 570 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2007.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f60c8a6def19a06a310c4a65c9bff1f454491cca6b51a493efa92eedfcdc2b65"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VibeVoiceCrispAsr: TooManyMethods \u2014 368 significant lines (blank, comment-only and punctuation-only lines excluded), 34 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aee2b64b026d955c7e1ab9f5544f2fc88e53189c483c40bac8d30102ed9ddf88"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Translate/MergeAndSplitHelper.cs: FileTooLong \u2014 565 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Translate/MergeAndSplitHelper.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8bcfb894ad14d7d5b2fb300a4395727b23b887fb93d598d3e6c28d48f159949"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Ocr/NikseBitmap2.cs: FileTooLong \u2014 556 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmap2.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cefee55437f308a2f661f305dc483bb553f057ef72fa05ae572f0ca7cf0cd05c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Engines/Qwen3TtsCrispAsr.cs: FileTooLong \u2014 556 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"872e95dacbcd8d8ab0db119b665d07d9611397421a0e1de498f54612a5cc9bcc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: VideoPlayer/VideoPlayerControl.cs: FileTooLong \u2014 554 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/VideoPlayer/VideoPlayerControl.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"51116a7b727f5dc2c64db92909d677ff54952515cdf873eaf5830699609ae87d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SubtitleFormats/DCinemaSmpte2014.cs: FileTooLong \u2014 553 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaSmpte2014.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e054c9f2bc915242247526336c779019a63dad78b32d397d9aa0aeb7d75a90a1"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ImageRenderer: ClassTooLong \u2014 441 significant lines (blank, comment-only and punctuation-only lines excluded), 16 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ImageRenderer.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"72afd4efca8f664e1ff02975b8ef579a91abe73a6eeadf5913bd4a53a748cbd2"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DownloadTtsViewModel: TooManyMethods \u2014 1256 significant lines (blank, comment-only and punctuation-only lines excluded), 33 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"61b852b48f17eda3d051a4a835c02564ab85ef2ec1d96bdde85c7bfa3be71d54"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ZonosTtsCrispAsr: TooManyMethods \u2014 367 significant lines (blank, comment-only and punctuation-only lines excluded), 33 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ZonosTtsCrispAsr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"63635b552328dd32d1d221c06d2901116a6fade1e06d25439c27087718ede036"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Forms/TimeCodesBeautifier.cs: FileTooLong \u2014 549 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/TimeCodesBeautifier.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dafb7afd7d2849fe8987cb5c2f6d26980990a3678cf5874215a2544e81b780f7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SubtitleFormats/SubtitleFormat.cs: FileTooLong \u2014 549 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubtitleFormat.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2e2220972cc8e5a87d328df127cfa9ced036f06e47f851465e0db75214febb3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Core/LibSEIntegration.cs: FileTooLong \u2014 547 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"189639989816ed5faa6ccd341e63c3f1b45333d1da3e031d30c1347d341bcd2c"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SubStationAlpha: ClassTooLong \u2014 436 significant lines (blank, comment-only and punctuation-only lines excluded), 10 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubStationAlpha.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c43c755bc9d06f079fa0f3aa6f35d087ddfe557d5e67f999803ed8b2b3b2d77"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Compare/CompareViewModel.cs: FileTooLong \u2014 545 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/Compare/CompareViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"65c5bc79ed1fdb0c4b420ddb493a82594276ece11bf59f4030eaed1711474e9f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: FixCommonErrors/FixCommonErrorsWindow.cs: FileTooLong \u2014 543 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfa04f7fabcb89d74703e9c4a4077dc7645f6c3b40c939c0fbededf312de9233"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs: FileTooLong \u2014 541 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ValueConverters/TextWithSubtitleSyntaxHighlightingConverter.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9da4feb697bedbbdc7460ebcd6a1ff6ccfd6bbfbc0d652d74d81f8eb72ee7626"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: NOcrInspectViewModel: ClassTooLong \u2014 432 significant lines (blank, comment-only and punctuation-only lines excluded), 28 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/NOcr/NOcrInspectViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c7f7af12de32b4ed16ca66acd51e011cf2fef5c39a06b06e81400f613b9fbec"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TtsEngineInstaller: ClassTooLong \u2014 432 significant lines (blank, comment-only and punctuation-only lines excluded), 4 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TtsEngineInstaller.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5544b63908dbdcd04feb992c9a2375d3afd4bd6a71eca8e88f277f2360d882d0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Layout/InitLayout.cs: FileTooLong \u2014 540 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitLayout.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeb8926bbf5c9f0b557a6eac4da229c77ceb5969cbd5b4bc86a3b5e76865fa7c"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AssSetBackgroundViewModel: ClassTooLong \u2014 428 significant lines (blank, comment-only and punctuation-only lines excluded), 26 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaSetBackground/AssSetBackgroundViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2673a717d16ebae1d4a1252160643db8d1247f9b4863e8215e9ecf64fda64888"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: NOcrLineGenerator: TooManyMethods \u2014 715 significant lines (blank, comment-only and punctuation-only lines excluded), 32 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NOcrLineGenerator.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad7e95610d1f9665a5eabe6a949d10f0a05b2e3248567658a6ac6155262d433e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: FindService: TooManyMethods \u2014 433 significant lines (blank, comment-only and punctuation-only lines excluded), 32 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/FindService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6498e1b6e56bfcacdc73e9758c9e72298fc55b153b9ecda916ee8e8c0ef9e0b5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SourceViewViewModel: TooManyMethods \u2014 419 significant lines (blank, comment-only and punctuation-only lines excluded), 32 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/SourceView/SourceViewViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de4e9f2b92fa6cc98f2684c3d4f00b09325c0b68c8f93e99092433031fed3112"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AiReviewViewModel: TooManyMethods \u2014 387 significant lines (blank, comment-only and punctuation-only lines excluded), 32 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/AiReview/AiReviewViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"231cd10a989c749b11ee6cfbca487aa8e4278acd38dc96b33e7dd635440666ec"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ReviewSpeechWindow: ClassTooLong \u2014 424 significant lines (blank, comment-only and punctuation-only lines excluded), 10 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c6392b277a28d752e2d07d9773377f33d92c13d3f1bb583a77e82c1a365e2bc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Matroska/MatroskaFile.cs: FileTooLong \u2014 527 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Matroska/MatroskaFile.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e749dd6e808872d4052d51136834cbdc48f7917d109393596950b02eac54c8c"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: LanguageAssa: ClassTooLong \u2014 421 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Config/Language/Assa/LanguageAssa.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"36e218fd42b1fd1aed4839baf6fb889b1bc117922303a0f85f4a1fff9f930df3"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TimedTextImscRosetta: ClassTooLong \u2014 414 significant lines (blank, comment-only and punctuation-only lines excluded), 14 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextImscRosetta.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e1e4a633ba68a0674f76c987695363cff38d589e84647c935fdf332f91aa8dd"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MP4Parser: TooManyMethods \u2014 580 significant lines (blank, comment-only and punctuation-only lines excluded), 31 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"933717df67945b590999a4c581493853cf6761ba8574803ae0eb433ff130d1b6"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BinaryOcrBitmap: ClassTooLong \u2014 412 significant lines (blank, comment-only and punctuation-only lines excluded), 27 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/BinaryOcrBitmap.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"460b059de5f49314a7dffe8acd8302f3832bbe4242c7e098d877d59b48107282"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: EmbeddedSubtitlesEditViewModel: ClassTooLong \u2014 411 significant lines (blank, comment-only and punctuation-only lines excluded), 27 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0144900e08bf65ec85002b38ef4c1778dfff6f916473316bfd25e418d8aba0c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Assa/AssaStylesWindow.cs: FileTooLong \u2014 513 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9d49b56b055ebc1c4e47c08892ea1f904eaf9ae441af46ad49490e73d0c8d50"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Common/RealFFT.cs: FileTooLong \u2014 511 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Common/RealFFT.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cc777d90b58bfddb3a56c212c193e607ed48601c7f94cb893abdc05edbd1fa8"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: StatisticsWindow: ClassTooLong \u2014 405 significant lines (blank, comment-only and punctuation-only lines excluded), 12 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/Statistics/StatisticsWindow.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2a3a7aeab86add6ba515293d7d902f8898ef7cab53b8d10fab02eb053563980"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SubtitleConverter: ClassTooLong \u2014 403 significant lines (blank, comment-only and punctuation-only lines excluded), 12 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/SubtitleConverter.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d76983658021bef75d943bb27f0515d4780478908ddef03d17686ffb28b45e0d"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ConvertCommand: ClassTooLong \u2014 402 significant lines (blank, comment-only and punctuation-only lines excluded), 7 methods. The type holds no instance state, so there is no shared data to group its members by. To reduce it, split it by area instead: give each cohesive family of members its own smaller type, so no one type has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Commands/ConvertCommand.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb6a695254ef6d44715045a140ad339f98143e1564218144b656a3175a77ca73"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ObjectDataSegment: ClassTooLong \u2014 401 significant lines (blank, comment-only and punctuation-only lines excluded), 14 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/ObjectDataSegment.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cb36b1b9a9dca35e7bc11550a94ade78724a8d3aa38fd39f135ac00ef362915"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (36 lines \u00D7 3): src/ui/Features/Main/Layout/InitLayout.cs:202-237 | src/ui/Features/Main/Layout/InitLayout.cs:288-323 | src/ui/Features/Main/Layout/InitLayout.cs:796-831 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitLayout.cs"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb82f9c5dec459aa2000f9971e771266460c2805b0883808dcb7fe10a4028fde"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (35 lines \u00D7 2): src/ui/Features/Shared/ColorPicker/ColorPickerWindow.cs:128-162 | src/ui/Features/Shared/ColorPicker/ColorPickerWindow.cs:172-206 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Shared/ColorPicker/ColorPickerWindow.cs:128\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/ColorPicker/ColorPickerWindow.cs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"5523ac8756935767b1587054a906ef0761af15df7b87f7c886b50b8585e3e734"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 6): src/ui/Features/Main/Layout/InitLayout.cs:390-425 | src/ui/Features/Main/Layout/InitLayout.cs:491-526 | src/ui/Features/Main/Layout/InitLayout.cs:540-575 | src/ui/Features/Main/Layout/InitLayout.cs:708-741 | src/ui/Features/Main/Layout/InitLayout.cs:752-785 | src/ui/Features/Main/Layout/InitLayout.cs:879-916 \u2014 all 6 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitLayout.cs"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"de266c4182b3f72c940e761328076120d6e8c534ecc513fda316fd1e658939b9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (33 lines \u00D7 2): src/ui/Features/Files/FormatProperties/TimedText10Properties/TimedText10PropertiesViewModel.cs:67-99 | src/ui/Features/Files/FormatProperties/TimedTextImsc11Properties/TimedTextImsc11PropertiesViewModel.cs:54-86 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/TimedText10Properties/TimedText10PropertiesViewModel.cs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"eab5bd0556918c04b0b8fb22a1e9f3fd408671d17e9fb5b445ad3eb62a176347"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 2): src/ui/Features/Main/Layout/InitLayout.cs:456-486 | src/ui/Features/Main/Layout/InitLayout.cs:663-693 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/Layout/InitLayout.cs:456\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitLayout.cs"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4f1eda6c411a7882bd43defccc1fd4792d18e65bad5f245cabd81c60886ea95"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 2): src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:612-642 | src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:712-742 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitListViewAndEditBox.cs"},"region":{"startLine":612}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f6080afe75d195b962fcf3f18fcab0b8a2d3d39d89a91f6b715ec0570f5d84a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2): src/ui/Features/Sync/PointSync/SetSyncPoint/SetSyncPointViewModel.cs:166-195 | src/ui/Features/Sync/VisualSync/VisualSyncViewModel.cs:191-220 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Sync/PointSync/SetSyncPoint/SetSyncPointViewModel.cs:166\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Sync/PointSync/SetSyncPoint/SetSyncPointViewModel.cs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"a75d8b6f555cd6e43e7bab3bfbefc7a98fff38cac526b1cd39a5c9a2fad5b3f0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 3): src/ui/Features/Main/MainViewModel.cs:8695-8723 | src/ui/Features/Main/MainViewModel.cs:8796-8824 | src/ui/Features/Main/MainViewModel.cs:8917-8945 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:8695\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":8695}}}],"partialFingerprints":{"codehealthFindingId/v1":"373e6af25004cf5437cf3f24342fa0d99b81b11bd2fc89214853bf20bd49b84e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2): src/ui/Features/Assa/AssaProgressBar/AssaProgressBarWindow.cs:406-434 | src/ui/Features/Assa/AssaProgressBar/AssaProgressBarWindow.cs:469-497 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaProgressBar/AssaProgressBarWindow.cs"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"6760a522ccd2cde4fd5c2da65998b19a32636b088049527ebf9e42b24901378c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2): src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs:647-675 | src/ui/Features/Files/FormatProperties/WebVttProperties/WebVttPropertiesViewModel.cs:151-179 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs:647\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs"},"region":{"startLine":647}}}],"partialFingerprints":{"codehealthFindingId/v1":"6db8adb6c8d053042bfc464ac9a7924d1bc5e326c2e4efb7a7cb304f01e48cb8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInWindow.cs:615-644 | src/ui/Features/Video/BurnIn/BurnInWindow.cs:683-711 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInWindow.cs:683\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInWindow.cs"},"region":{"startLine":615}}}],"partialFingerprints":{"codehealthFindingId/v1":"5db0b8d5183adfa69ff36f0cb4b22da6a779940b00c720026e6c68b3785ade9f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (28 lines \u00D7 2): src/ui/Features/Main/Layout/InitWaveform.cs:487-514 | src/ui/Features/Main/Layout/InitWaveform.cs:536-563 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitWaveform.cs"},"region":{"startLine":487}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f2b788c95f2c3e97dd5bc49721847ecc2379c0bf9c4bd2a4a9fa4384f6e5d38"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): src/ui/Features/Tools/BatchConvert/FunctionViews/ViewAutoTranslate.cs:56-87 | src/ui/Features/Tools/BatchConvert/FunctionViews/ViewChangeCasing.cs:71-97 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/BatchConvert/FunctionViews/ViewChangeCasing.cs:71\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/FunctionViews/ViewAutoTranslate.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b26bc845580d68dd0ca3db4fa6bd87c54a9025dfd71af8409240c48fc1afded"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): src/ui/Features/Ocr/OcrViewModel.cs:2750-2775 | src/ui/Features/Ocr/OcrViewModel.cs:2842-2867 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/OcrViewModel.cs:2750\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":2750}}}],"partialFingerprints":{"codehealthFindingId/v1":"551432cf5bdffe89397303c600539fed7b2e4d56d80fdff6471e49526144aecd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsWindow.cs:590-615 | src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsWindow.cs:736-761 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsWindow.cs"},"region":{"startLine":590}}}],"partialFingerprints":{"codehealthFindingId/v1":"50f518e17a3582b74e80a8ecad14b350be92c7888fef3f119684efde7c93f9b3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): src/ui/Features/Tools/BatchConvert/FunctionViews/ViewApplyDurationLimits.cs:22-46 | src/ui/Features/Tools/BatchConvert/FunctionViews/ViewMergeShortLines.cs:24-49 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/FunctionViews/ViewApplyDurationLimits.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"54bd5aff6e2179b5a00af4c032274163f9c3943dbc74c98f33e92abf1b9c1eda"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:2196-2220 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:1324-1348 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:2196\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":2196}}}],"partialFingerprints":{"codehealthFindingId/v1":"87a5889a687a5e1f55b0a0a49d89f8979093b63d71f88957afdf3f2c8a320672"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 3): src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:717-740 | src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs:744-767 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:754-777 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:717\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs"},"region":{"startLine":717}}}],"partialFingerprints":{"codehealthFindingId/v1":"836b8885270db035f06938833471447fdfb8fcb09e1e63dcc10938145aea813a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): src/ui/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectViewModel.cs:326-349 | src/ui/Features/Assa/AssaApplyCustomOverrideTags/AssaApplyCustomOverrideTagsViewModel.cs:284-307 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectViewModel.cs:326\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectViewModel.cs"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"f79a3a1823202bbae66f84feeb71c6536e533745fbe95d0aba075bb6d0ecd05a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1301-1324 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:949-972 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1301\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1301}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a911ddf49faca13c2e4dfb748b8b5f77a453e838f54b88d03d2b334a7c8911d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs:744-767 | src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs:1108-1131 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs:744\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"1207f6fed8fd3285770549c997947ae7cc45285d76bcecbfcf42450d89ca2d90"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): src/ui/Features/Assa/AssaImageColorPicker/AssaImageColorPickerViewModel.cs:91-113 | src/ui/Features/Assa/AssaSetPosition/AssaSetPositionViewModel.cs:181-203 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaImageColorPicker/AssaImageColorPickerViewModel.cs:91\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaImageColorPicker/AssaImageColorPickerViewModel.cs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fe7918e2c00220468b5e3de3092713f6a4830f33917a5a1bb34a0318023c03e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:1248-1270 | src/ui/Features/Ssa/SsaStylesViewModel.cs:865-887 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:1248\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":1248}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8e5ef6eadb01f618d41ce5a2e2dd68d356dd7ad453575e9593cb10c4ee75f80"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 4): src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:309-330 | src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:255-276 | src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs:307-328 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:283-304 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:309\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e3e6ecf29694cf0d7615e06654bf9b65f3707e974aa07a08f8f69437e5b6c19"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): src/ui/Features/Assa/AssaResolutionResampler/AssaResolutionResamplerViewModel.cs:87-108 | src/ui/Features/Assa/AssaResolutionResampler/AssaResolutionResamplerViewModel.cs:118-139 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaResolutionResampler/AssaResolutionResamplerViewModel.cs:87\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaResolutionResampler/AssaResolutionResamplerViewModel.cs"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"b72928de24357d81df21c2cc3efb50c6c26bb65bbe8dc1d482cbfc3af9d16b81"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): src/ui/Features/Main/AiAssistant/AiAssistantViewModel.cs:204-225 | src/ui/Features/Tools/AiReview/AiReviewViewModel.cs:214-235 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/AiAssistant/AiAssistantViewModel.cs"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"37fa08ad710d9f0a48bcf4f82869a836352440c7f49ac15253344eb56c745ab3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): src/ui/Features/Options/Settings/SettingsResetWindow.cs:27-48 | src/ui/Features/Options/Settings/SettingsResetWindow.cs:55-76 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Options/Settings/SettingsResetWindow.cs:27\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsResetWindow.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"71706530f0a42c32d835e340215c8111c1e2be4c043451663b14753c8688508f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:360-381 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:399-420 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:360\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7e93ce38a36142cfba7c81e7b600026348d43524339436497a236257c3c78e7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): src/ui/Features/Assa/AssaSetBackground/AssSetBackgroundViewModel.cs:668-689 | src/ui/Features/Video/OpenSecondarySubtitle/OpenSecondarySubtitleViewModel.cs:237-257 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaSetBackground/AssSetBackgroundViewModel.cs:668\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaSetBackground/AssSetBackgroundViewModel.cs"},"region":{"startLine":668}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6be0edfea09e7317d0448265ad85884940d5973762f51d55aad07a81e98fc32"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): src/ui/Features/Shared/DownloadFfmpegViewModel.cs:63-83 | src/ui/Features/Shared/DownloadLibMpvViewModel.cs:62-82 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Shared/DownloadFfmpegViewModel.cs:63\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/DownloadFfmpegViewModel.cs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"c48f0c86042ed759c83f16d5aa4f986e68649c70f6775e2c725e5849388e4bdb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:2249-2269 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:1377-1397 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:2249\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":2249}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cccfba11d731fcd3427f96ecb57f6f1549bc2d6d4293748178a074fb5478561"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:3713-3733 | src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:3812-3832 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:3713\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":3713}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a0592bc8532d96de3eac596358ff26bc7e5fb2aa6be2e9ec366db8415d6b4fe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 5): src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs:109-128 | src/ui/Features/Video/BurnIn/BurnInViewModel.cs:357-376 | src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:297-316 | src/ui/Features/Video/ReEncodeVideo/ReEncodeVideoViewModel.cs:142-161 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:290-309 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 5 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 5 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs:109\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"be87d4c48f272274a20e3d64076e6c6513a62bcd0b4bd118cf6066b6278cb8be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 3): src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:3668-3687 | src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:3715-3734 | src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:3814-3833 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:3668\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":3668}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6e6dd2cc12fa994da12951a0edd1dd0f30e607a69a9f376089ccbfede3ae76c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): src/ui/Features/Assa/AssaAttachmentsViewModel.cs:466-485 | src/ui/Features/Ssa/SsaAttachmentsViewModel.cs:434-453 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaAttachmentsViewModel.cs"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"56cbeb68a3027e940f7a7ff87e627955b6fa8e25a8984395af0ab141c93fe724"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): src/ui/Features/Ocr/Download/DownloadGoogleLensOcrViewModel.cs:56-75 | src/ui/Features/Shared/DownloadLibVlcViewModel.cs:59-78 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/Download/DownloadGoogleLensOcrViewModel.cs:56\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadGoogleLensOcrViewModel.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d6b601f8dd8c4d70415f0fdee256e4d412c15d51995fac8e3c0fef120d2f3c4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): src/ui/Features/Ocr/NOcr/NOcrDbEditViewModel.cs:137-156 | src/ui/Features/Ocr/NOcr/NOcrInspectViewModel.cs:244-263 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/NOcr/NOcrDbEditViewModel.cs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"2211120ef03afdc908867213651b4e79680630ae26e0ef5486d3798bdda85343"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): src/ui/Features/Ocr/OcrViewModel.cs:1496-1515 | src/ui/Features/Video/VideoOcr/VideoOcrViewModel.cs:309-328 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/OcrViewModel.cs:1496\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1496}}}],"partialFingerprints":{"codehealthFindingId/v1":"80b7ef5ee7b4aacae4361ecd404fa7007f6f0bf9919d6fcd1c5357c0137dafb9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): src/ui/Features/Ocr/OcrWindow.cs:625-644 | src/ui/Features/Ocr/OcrWindow.cs:665-684 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrWindow.cs"},"region":{"startLine":625}}}],"partialFingerprints":{"codehealthFindingId/v1":"672fec0581cc8448d576a63f0538ec7f1e5d3b8fae25e3067bf3a58be154a2bb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): src/ui/Features/Shared/PickMp4Track/PickMp4TrackViewModel.cs:296-315 | src/ui/Features/Shared/PickTsTrack/PickTsTrackViewModel.cs:219-239 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Shared/PickMp4Track/PickMp4TrackViewModel.cs:296\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/PickMp4Track/PickMp4TrackViewModel.cs"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5c9c150e6c9171a3f825514ae635fe503f293c13dec584ca4b8c1cdd3ff20f8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs:176-195 | src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:364-383 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs:176\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"472fbec66b0c77eb2a962566d9e0adb39f106b9edee2f49b9e89927844816099"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:154-173 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:130-149 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dbdf5aa48ca5cfe0f327cae66236ad75c6101f4dec0a7fa71185c0eb7a9b854"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:295-314 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:220-239 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:295\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa07e3985e8f9e5aa22bab152a4cb05bbd80c9df7f696eca9c3f7eabb52a13ae"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 4): src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs:492-510 | src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs:561-579 | src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs:590-608 | src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs:612-630 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"770b1ec92ed673b69bd91c600c1d3c41e712cad6357153e1817b05ec1c76ede9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 3): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:767-785 | src/ui/Features/Video/ReEncodeVideo/ReEncodeVideoViewModel.cs:318-336 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:581-599 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":767}}}],"partialFingerprints":{"codehealthFindingId/v1":"6656b8215395e905c05ab256c6237a1106e7d3360b9d166c8ce9a7b8d7aee6e5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:657-675 | src/ui/Features/Ssa/SsaStylesViewModel.cs:475-493 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:657\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":657}}}],"partialFingerprints":{"codehealthFindingId/v1":"8acacdaabbc54a516c41192fbace6a0723c639d248a3c66b0ae5c5e06f209b88"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:1405-1423 | src/ui/Features/Ssa/SsaStylesViewModel.cs:1022-1040 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:1405\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":1405}}}],"partialFingerprints":{"codehealthFindingId/v1":"715a0f3720407fad800d136878b76b8bf865b92e7df713d2e2b02ea24bcbdfea"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:1455-1473 | src/ui/Features/Ssa/SsaStylesViewModel.cs:1072-1090 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:1455\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":1455}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a6882ee56a2c2177dbe5ac24d7664b55f1fe30ddc561a6246514d93b89a0418"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/ui/Features/Assa/AssaStylesWindow.cs:175-193 | src/ui/Features/Assa/AssaStylesWindow.cs:332-350 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesWindow.cs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa8adf234c097c515102d46dd408e3e5fd1396ddf8fcaed5ff3747e0d8a903e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/ui/Features/Files/ExportImageBased/ImageBasedProfileViewModel.cs:75-93 | src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsProfileViewModel.cs:96-114 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Files/ExportImageBased/ImageBasedProfileViewModel.cs:75\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportImageBased/ImageBasedProfileViewModel.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e444e78125e70e2f49799afef75ac8f34b0cbe67eaf819c58cc468a94c1ba61"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:4664-4682 | src/ui/Features/Main/MainViewModel.cs:4700-4718 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:4664\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":4664}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd01897f27f1ef76ae2df1c04f324578ae5ace61d765c576cc7e4f3db7ab7b20"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:19952-19970 | src/ui/Features/Main/MainViewModel.cs:20035-20053 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:19952\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":19952}}}],"partialFingerprints":{"codehealthFindingId/v1":"e79b3601ccd7b3f8a0cecfe38847c2e11335df65e6ee1986fc0e2ef6187240f4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/ui/Features/Ssa/SsaStylesWindow.cs:176-194 | src/ui/Features/Ssa/SsaStylesWindow.cs:305-323 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ssa/SsaStylesWindow.cs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d55e8607f997894cbb4207dba72bf6219e091acddfa6ae14aabfc58897ec884"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:864-882 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:496-514 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:864\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":864}}}],"partialFingerprints":{"codehealthFindingId/v1":"7939aefc0d38d8e2f0dd0a1f407bb8d425151e2c614da1a0b477472db19037f4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/TtsEngineInstaller.cs:78-96 | src/ui/Features/Video/TextToSpeech/TtsEngineInstaller.cs:606-624 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/TtsEngineInstaller.cs:78\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TtsEngineInstaller.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"4eef529a87f66096dc572690bdada5d57af6edcfa4d2d28dfac183e94206f6d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 9): src/ui/Features/Video/TextToSpeech/ChatterboxTtsSettings/ChatterboxTtsSettingsViewModel.cs:83-103 | src/ui/Features/Video/TextToSpeech/CosyVoice3CrispAsrSettings/CosyVoice3CrispAsrSettingsViewModel.cs:115-132 | src/ui/Features/Video/TextToSpeech/F5TtsCrispAsrSettings/F5TtsCrispAsrSettingsViewModel.cs:91-108 | src/ui/Features/Video/TextToSpeech/IndexTtsCrispAsrSettings/IndexTtsCrispAsrSettingsViewModel.cs:103-123 | src/ui/Features/Video/TextToSpeech/MossTtsCrispAsrSettings/MossTtsCrispAsrSettingsViewModel.cs:100-117 | src/ui/Features/Video/TextToSpeech/OmniVoiceCrispAsrSettings/OmniVoiceCrispAsrSettingsViewModel.cs:97-114 | src/ui/Features/Video/TextToSpeech/Qwen3TtsCrispAsrSettings/Qwen3TtsCrispAsrSettingsViewModel.cs:93-113 | src/ui/Features/Video/TextToSpeech/VibeVoiceCrispAsrSettings/VibeVoiceCrispAsrSettingsViewModel.cs:100-120 | src/ui/Features/Video/TextToSpeech/VoxCPM2CrispAsrSettings/VoxCPM2CrispAsrSettingsViewModel.cs:94-111 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 9 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 9 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/ChatterboxTtsSettings/ChatterboxTtsSettingsViewModel.cs:83\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ChatterboxTtsSettings/ChatterboxTtsSettingsViewModel.cs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"c31362202fcc3a2c491f8611eefcb046847a4d189126d3ab999e2f64f17178c8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 5): src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:910-930 | src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:793-812 | src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs:905-922 | src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs:821-838 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:831-848 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:910\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"989d264b203b21af75e296b97ed57d84fa15ad41df10e521ee309f748c08c192"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 4): src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs:278-295 | src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:478-495 | src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditMp4ViewModel.cs:225-242 | src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditViewModel.cs:245-262 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 4 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 4 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs:278\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"045aaab8cf10c1fd252ef1c80ea940fb54bfe32afaf182c27fe88d778551021b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 4): src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs:791-810 | src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs:748-766 | src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs:715-733 | src/ui/Features/Video/TextToSpeech/Engines/ZonosTtsCrispAsr.cs:705-722 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs:791\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs"},"region":{"startLine":791}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c7dbf94d242ea3b319a21fa46adcef8c0cb5ef1fc036295c9a24a441fef3eb3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 3): src/ui/Features/Assa/AssaApplyCustomOverrideTags/AssaApplyCustomOverrideTagsViewModel.cs:146-163 | src/ui/Features/Assa/AssaSetBackground/AssSetBackgroundViewModel.cs:668-685 | src/ui/Features/Video/OpenSecondarySubtitle/OpenSecondarySubtitleViewModel.cs:237-254 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyCustomOverrideTags/AssaApplyCustomOverrideTagsViewModel.cs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f0a55c8b7f67ae676a14e88925acec9ff881e47bb25f64273809fd89b3d8fa9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 3): src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesViewModel.cs:211-228 | src/ui/Features/Files/FormatProperties/TimedText10Properties/TimedText10PropertiesViewModel.cs:198-215 | src/ui/Features/Files/FormatProperties/TimedTextImsc11Properties/TimedTextImsc11PropertiesViewModel.cs:172-189 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesViewModel.cs:211\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesViewModel.cs"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3f122dd593c054f6434ce91739cb9e01fff900f4f588a1e5d934a3e780cf01b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Assa/AssaAttachmentsViewModel.cs:198-215 | src/ui/Features/Ssa/SsaAttachmentsViewModel.cs:166-183 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaAttachmentsViewModel.cs:198\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaAttachmentsViewModel.cs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"50a3478292296e6febe2396e4e2a318ceaf4c027460d54fc664014c77a334bc7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:181-198 | src/ui/Features/Assa/AssaStylesViewModel.cs:576-593 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:181\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"76df6b25f618887e2b020bf38dcfb276be2f3e2dc04433512a3a5866be12c1c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:1148-1165 | src/ui/Features/Main/MainViewModel.cs:1224-1241 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:1148\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":1148}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1a63f19e02b72bbe11f16f551ec20efe110d7a60a66ae1d38be0ea41073ee40"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:8970-8987 | src/ui/Features/Main/MainViewModel.cs:9014-9031 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:8970\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":8970}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2fe71a1605b5a5d6ba17d8d5ceb6e1e25c8499af46636aafe1f76e03ab54669"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:20165-20182 | src/ui/Features/Main/MainViewModel.cs:20190-20207 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:20165\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":20165}}}],"partialFingerprints":{"codehealthFindingId/v1":"a438585a76e06f3f4e4221ac7d7b5c39e61e0f16ee555746a56bdeed73586ea9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:20215-20232 | src/ui/Features/Main/MainViewModel.cs:20240-20257 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:20215\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":20215}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d446c5a58c127f72e6ec1d5a7d811effbdd4d72e374ad042cfda9671bfb1561"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:20362-20379 | src/ui/Features/Main/MainViewModel.cs:20421-20438 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:20362\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":20362}}}],"partialFingerprints":{"codehealthFindingId/v1":"31799070d8c35702a8b03560ea374f3e84e296fb2c8617fc29df8ea4eb6874ff"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs:367-384 | src/ui/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs:557-574 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs:367\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3bf2f7b215b539d5d8d92944c62887b0904f92e9dad55263f244e7c592344b7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Ocr/Download/DownloadTesseractModelViewModel.cs:65-82 | src/ui/Features/Ocr/Download/DownloadTesseractViewModel.cs:63-83 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/Download/DownloadTesseractModelViewModel.cs:65\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadTesseractModelViewModel.cs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"0851c141a1ece96521280b6db24e3085f036c1031568fb3134e199e8e497de06"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Ssa/SsaStylesViewModel.cs:160-177 | src/ui/Features/Ssa/SsaStylesViewModel.cs:400-417 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ssa/SsaStylesViewModel.cs:160\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ssa/SsaStylesViewModel.cs"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4ffd2ef61ff49dfec9596571d013b446e8a2623be2b66bbbd34a8f5db4964c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Tools/BatchConvert/BatchConverter.cs:785-802 | src/ui/Features/Tools/BatchConvert/BatchConverter.cs:991-1008 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/BatchConvert/BatchConverter.cs:785\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"c60d95d68531110da23a7c40931bacdc0bf50a3c733b33ad5345fc79463beb3c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Tools/MergeTwoSubtitles/MergeTwoSubtitlesWindow.cs:256-273 | src/ui/Features/Tools/MergeTwoSubtitles/MergeTwoSubtitlesWindow.cs:383-403 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/MergeTwoSubtitles/MergeTwoSubtitlesWindow.cs:256\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/MergeTwoSubtitles/MergeTwoSubtitlesWindow.cs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1556058a3179a28cd8ead4a03adb7e2fe8a1dca09083d23cfc9cea41c249826"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:907-924 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:684-701 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:907\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":907}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce0d9959513b6c3aa3ac2139f0b7d533c5e944e3e243d0a2d3253e3499f904ab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1558-1575 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:1092-1109 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1558}}}],"partialFingerprints":{"codehealthFindingId/v1":"477349a1f3acf3525206a33c0c13f8ba527ae80d32bbb5ea2da34445f7d8d3d0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:719-737 | src/ui/Features/Video/ReEncodeVideo/ReEncodeVideoViewModel.cs:415-432 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/CutVideo/CutVideoViewModel.cs"},"region":{"startLine":719}}}],"partialFingerprints":{"codehealthFindingId/v1":"44ca0d33be66b54f7d9363ef03159fc96759eecdabc1eb5dbd469ec4f794cbff"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditMp4ViewModel.cs:406-423 | src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditViewModel.cs:466-484 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditMp4ViewModel.cs:406\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditMp4ViewModel.cs"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"56cc22a9e04c57d38aa83b21e2c368cfbd50102205e31766e0b0503858cc3c3b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/OmniVoiceSettings/OmniVoiceSettingsViewModel.cs:198-215 | src/ui/Features/Video/TextToSpeech/Qwen3TtsSettings/Qwen3TtsSettingsViewModel.cs:189-206 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/OmniVoiceSettings/OmniVoiceSettingsViewModel.cs:198\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/OmniVoiceSettings/OmniVoiceSettingsViewModel.cs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb89ebdb3b2d2fa9deb96092ed8d80024a6d71430f0f238372836505cbed6ae3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 4): src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:1448-1464 | src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:1512-1528 | src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:1576-1592 | src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:1640-1656 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":1448}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b06a290381705e02c9bab96f146c9b8a9ba51bbd58d0b3243a17000a1e193be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 4): src/ui/Features/Video/SpeechToText/Engines/WhisperEngineConstMe.cs:84-100 | src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCpp.cs:102-118 | src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCppCuBlas.cs:106-122 | src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCppVulkan.cs:110-126 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/Engines/WhisperEngineConstMe.cs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a58be10cb4405d74e8d372266e656c253f4d763e7df6362fb608e59f506db87"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 4): src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:772-788 | src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs:883-900 | src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs:799-816 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:809-826 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:772\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs"},"region":{"startLine":772}}}],"partialFingerprints":{"codehealthFindingId/v1":"65426a0cda93d60a25f5248768969049a1fd74fcffc64a8c311caafc2cf6984f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Assa/AssaPropertiesViewModel.cs:135-151 | src/ui/Features/Ssa/SsaPropertiesViewModel.cs:123-139 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaPropertiesViewModel.cs:135\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaPropertiesViewModel.cs"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"48a112adf6c05cd059255cf9b9a937e2d533e0cdd475c77f4ee1c263245664cf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Assa/AssaPropertiesViewModel.cs:161-177 | src/ui/Features/Ssa/SsaPropertiesViewModel.cs:149-165 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaPropertiesViewModel.cs:161\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaPropertiesViewModel.cs"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3bfbd834696f741bcbcee9b59f0a6ff107cafa58fafcb6747a294f141401476"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Files/Compare/CompareViewModel.cs:899-915 | src/ui/Features/Shared/PickLayerFilter/PickLayerFilterViewModel.cs:135-151 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Files/Compare/CompareViewModel.cs:899\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/Compare/CompareViewModel.cs"},"region":{"startLine":899}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b867197e736c79ef94037c5c5a563f8b215d00520dc8b9d1c9c90cabbc490a7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Files/FormatProperties/DcinemaInteropProperties/DCinemaInteropPropertiesViewModel.cs:98-114 | src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs:126-142 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/DcinemaInteropProperties/DCinemaInteropPropertiesViewModel.cs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"b94cb7a0c770a0888f3cfad06247b00e640637aaaa5559a29dfee2471c49ea25"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesViewModel.cs:123-139 | src/ui/Features/Files/FormatProperties/TimedText10Properties/TimedText10PropertiesViewModel.cs:119-135 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesViewModel.cs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"c81e799365821664698d7390b212bc22536c0a7a539f6034d854b24e7d9f5303"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs:563-579 | src/ui/Features/Files/FormatProperties/WebVttProperties/WebVttPropertiesViewModel.cs:67-83 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs:563\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa6b88f3164b65a5b73ac96f243976c5b719d9dad09f3b90b0f0b0452195ac26"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:12710-12727 | src/ui/Features/Main/MainViewModel.cs:12763-12779 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:12710\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":12710}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e9b7f8a8deee488f76fbc0ce933b22696274b0eac4fd11017b98c11dfb9c1bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs:590-606 | src/ui/Features/Ocr/NOcr/NOcrInspectViewModel.cs:655-671 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs:590\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs"},"region":{"startLine":590}}}],"partialFingerprints":{"codehealthFindingId/v1":"67610e6c40b6812bbbadc96716dba41879b1a854a7e662cccbf632435f5a47ae"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Ocr/OcrViewModel.cs:1807-1823 | src/ui/Features/Ocr/OcrViewModel.cs:2111-2127 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/OcrViewModel.cs:1807\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1807}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c74e09188506b024983e772798afa95150be7d637820172060078e1117450f7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Ocr/OcrViewModel.cs:3236-3252 | src/ui/Features/Tools/BatchConvert/BatchConverter.cs:905-921 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/OcrViewModel.cs:3236\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3236}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c5b62c44d0fc9b2923c253f1f48c5d33c4a1f25be067ee6ee35735300c6e737"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:486-502 | src/ui/Features/Video/BurnIn/BurnInLogoViewModel.cs:137-155 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:486\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":486}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e0ac0159fccbdb7a6fd07130ab977bfe0aebf8aed6dec28afbb96d418feef66"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Tools/AiReview/AiReviewProtocol.cs:191-207 | src/ui/Features/Translate/LlamaCppAdvanced/LlamaCppAdvancedProtocol.cs:225-241 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/AiReview/AiReviewProtocol.cs:191\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/AiReview/AiReviewProtocol.cs"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a07e791217e2162bccd2fc6a2d5c0110a6951e493f494e7afd7d9246c2dd0ac"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1240-1256 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:922-938 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1240\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1240}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d32bf7e8082d15324bfa66bc4516c63a0954a7e8a5c45b5502a9bf021cfd775"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1496-1512 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:534-550 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1496\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1496}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7e32cf4aa634b6c7e0d7d45233f683cbd845908b0a35c6d27672f618e4d7e6f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1903-1919 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:1182-1198 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1903\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1903}}}],"partialFingerprints":{"codehealthFindingId/v1":"a565288a1c5d2ef572a56b5f15bdad773ff93e8753a2d773dde0255a9862d853"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1941-1957 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:1222-1238 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1941\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1941}}}],"partialFingerprints":{"codehealthFindingId/v1":"e63711bed678ca211001d4b62e59a67b118cc13c217222e83eb8dd9c71f20bd5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:353-369 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:346-362 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:353\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/CutVideo/CutVideoViewModel.cs"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"851ebff326f0c5f63ce1abe4d691a15b4006933e4215e50b78708ec684d0823a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 9): src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:351-366 | src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:297-312 | src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs:289-304 | src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs:352-367 | src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs:317-332 | src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs:648-666 | src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs:274-289 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:325-340 | src/ui/Features/Video/TextToSpeech/Engines/ZonosTtsCrispAsr.cs:271-286 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:351\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e428557ab51cb85bd2cb637f99ca54e4c1cb6c9efbf01d4fa94efc51b2232c6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 6): src/ui/Features/Video/TextToSpeech/F5TtsCrispAsrSettings/F5TtsCrispAsrSettingsViewModel.cs:125-140 | src/ui/Features/Video/TextToSpeech/IndexTtsCrispAsrSettings/IndexTtsCrispAsrSettingsViewModel.cs:164-179 | src/ui/Features/Video/TextToSpeech/MossTtsCrispAsrSettings/MossTtsCrispAsrSettingsViewModel.cs:152-167 | src/ui/Features/Video/TextToSpeech/Qwen3TtsCrispAsrSettings/Qwen3TtsCrispAsrSettingsViewModel.cs:149-164 | src/ui/Features/Video/TextToSpeech/VibeVoiceCrispAsrSettings/VibeVoiceCrispAsrSettingsViewModel.cs:155-170 | src/ui/Features/Video/TextToSpeech/VoxCPM2CrispAsrSettings/VoxCPM2CrispAsrSettingsViewModel.cs:134-149 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 6 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 6 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/F5TtsCrispAsrSettings/F5TtsCrispAsrSettingsViewModel.cs:125\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/F5TtsCrispAsrSettings/F5TtsCrispAsrSettingsViewModel.cs"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a41ac16be5aa6bcdaf5f54791bc074d5dd7a43161457e0cabbeef54cc8fc382"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 4): src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCpp.cs:81-96 | src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCppCuBlas.cs:86-101 | src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCppVulkan.cs:90-105 | src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCTranslate2.cs:68-83 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCpp.cs:81\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCpp.cs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f8ed636eac3073a6b4b5c67b7eebf0ec27b3a7faad452a402046fdf3bb30241"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 3): src/ui/Features/Ocr/OcrViewModel.cs:4065-4080 | src/ui/Features/Ocr/OcrViewModel.cs:4241-4256 | src/ui/Features/Ocr/OcrViewModel.cs:4280-4295 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/OcrViewModel.cs:4065\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":4065}}}],"partialFingerprints":{"codehealthFindingId/v1":"90f1d621ced2195974be6282f29eb9a7d506a6d891e1203bfe4b6b2457207f56"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Assa/AssaAttachmentsViewModel.cs:263-278 | src/ui/Features/Ssa/SsaAttachmentsViewModel.cs:231-246 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaAttachmentsViewModel.cs:263\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaAttachmentsViewModel.cs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0292612512513d07d8c7dc11206287b324b920494e7bc272575f50a798bd1be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:1199-1214 | src/ui/Features/Ssa/SsaStylesViewModel.cs:816-831 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:1199\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":1199}}}],"partialFingerprints":{"codehealthFindingId/v1":"12ac4165525090097df8f98a58c6ded1fb6b66bb97d3a7fa857c19b76fb1cddb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:1358-1373 | src/ui/Features/Ssa/SsaStylesViewModel.cs:975-990 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:1358\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":1358}}}],"partialFingerprints":{"codehealthFindingId/v1":"899c5d222acb5c2188c682408a3d013e4bea94b8dfe28a85f272b0cf8f652dc4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Edit/Find/FindViewModel.cs:105-120 | src/ui/Features/Edit/Replace/ReplaceViewModel.cs:112-127 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Edit/Find/FindViewModel.cs:105\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/Find/FindViewModel.cs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fee4029547b5761dee31ff8f031059034edec4a8dc99ae42e55117400d8f790"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Files/FormatProperties/DcinemaInteropProperties/DCinemaInteropPropertiesViewModel.cs:139-154 | src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs:209-225 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/DcinemaInteropProperties/DCinemaInteropPropertiesViewModel.cs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"02848eab1268ebeee010a8f446a6cc258fbe847eaeed761c852425bebb2aa9c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Files/FormatProperties/DcinemaInteropProperties/DCinemaInteropPropertiesViewModel.cs:258-273 | src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs:354-369 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/DcinemaInteropProperties/DCinemaInteropPropertiesViewModel.cs"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dfabd53b53b3e41ef58f4e226583ee9c7c9c90cf263991a0bc28a9040601ff1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:3336-3351 | src/ui/Features/Main/MainViewModel.cs:3402-3417 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:3336\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":3336}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbc686a9a4657717da9634f3758aac23e4b6bbff6f6be0cb490a1c52bae487b0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:5034-5049 | src/ui/Features/Main/MainViewModel.cs:5094-5109 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:5034\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":5034}}}],"partialFingerprints":{"codehealthFindingId/v1":"0592fee14a1a93e8dafb7d6e6450cd79f37f24b332e0b4804bf0f7e6bad693e5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:8008-8023 | src/ui/Features/Main/MainViewModel.cs:8054-8069 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:8008\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":8008}}}],"partialFingerprints":{"codehealthFindingId/v1":"35c4ad5f0db170134488afe0ff214fd6400bab0745aa3956a8099ecb1bb83e4f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:14478-14493 | src/ui/Features/Main/MainViewModel.cs:14506-14521 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:14478\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":14478}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8c23fdef80c6f4f4eb0319ddd24361e42f670abd1475394d0ad5df942e65c23"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs:489-504 | src/ui/Features/Ocr/NOcr/NOcrInspectViewModel.cs:639-654 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs:489\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8fa3de89d31b1fa43a7d6308a3f829abafdf18d934c18cd10f6e206b6ba47fb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Ocr/Download/DownloadPaddleOcrViewModel.cs:172-187 | src/ui/Features/Shared/DownloadLibVlcViewModel.cs:105-121 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/Download/DownloadPaddleOcrViewModel.cs:172\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadPaddleOcrViewModel.cs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfb8d6ba1639c401590e9c952b8eb4cd5f0a669e7ca1c126c43527b3b0b2b028"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Ocr/Engines/GoogleLensOcr.cs:116-131 | src/ui/Features/Ocr/Engines/GoogleLensOcr.cs:197-212 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/Engines/GoogleLensOcr.cs:116\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/GoogleLensOcr.cs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"35068ce7adfe8329bfbcc83c4d928694b26154498884e3eca114d1fe3a9ddee2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Ocr/Engines/PaddleOcr.cs:1012-1027 | src/ui/Features/Ocr/Engines/PaddleOcr.cs:1071-1086 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/Engines/PaddleOcr.cs:1012\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/PaddleOcr.cs"},"region":{"startLine":1012}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f3303d8251bedf76ecc7397f1a186a13965aa3da8a5df5260c170b671c39a8e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Ocr/OcrViewModel.cs:1430-1445 | src/ui/Features/Video/VideoOcr/VideoOcrViewModel.cs:242-257 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/OcrViewModel.cs:1430\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1430}}}],"partialFingerprints":{"codehealthFindingId/v1":"8054d6998fa9bec10ecd9e0c156a04ca139f3cf035f218a628e96f308d7e9ed3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Tools/BatchConvert/BatchConverter.cs:1288-1304 | src/ui/Features/Tools/BatchConvert/BatchConverter.cs:1346-1361 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/BatchConvert/BatchConverter.cs:1288\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":1288}}}],"partialFingerprints":{"codehealthFindingId/v1":"38ee1e253b3c23ec1a9a2b9cee11476aa49995c50993f91ae8540df9263d229e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:2163-2178 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:1291-1306 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:2163\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":2163}}}],"partialFingerprints":{"codehealthFindingId/v1":"33b1e5d458569428f51698a051e2826519ec353df44ddc894f842e102cd5ad6c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:551-566 | src/ui/Features/Video/ReEncodeVideo/ReEncodeVideoViewModel.cs:349-364 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:551\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/CutVideo/CutVideoViewModel.cs"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ec7137cd905b41b0c148c46f724230096854d328a1f3f9e284a014e7defcc50"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs:380-395 | src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs:402-417 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs:380\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c8648efc2602a866be84da9f4bdeed06615533c728439455e8aaa97617e5ad9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 10): src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs:314-330 | src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:528-542 | src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:401-415 | src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs:401-415 | src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs:453-467 | src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs:428-442 | src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs:823-837 | src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs:388-402 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:441-455 | src/ui/Features/Video/TextToSpeech/Engines/ZonosTtsCrispAsr.cs:367-381 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs:314\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"e97624745c79104aebceeed76ed749be5897ce0d942ab05b8587b4a4cf80284a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 6): src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:952-966 | src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:834-848 | src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs:943-957 | src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs:859-873 | src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs:540-554 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:869-883 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:952\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs"},"region":{"startLine":952}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a2251c3acd4f38448417c90708115db0e531a4b061b8057d8cf14c0b504166"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3): src/ui/Features/Ocr/NOcr/NOcrCharacterHistoryViewModel.cs:143-157 | src/ui/Features/Ocr/NOcr/NOcrDbEditViewModel.cs:143-157 | src/ui/Features/Ocr/NOcr/NOcrInspectViewModel.cs:250-264 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/NOcr/NOcrCharacterHistoryViewModel.cs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"146a32faa1d23e02d816b011433b11554150fce3dbf90cd1efa4755e24d4475f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3): src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:1283-1301 | src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:1308-1322 | src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:1384-1398 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":1283}}}],"partialFingerprints":{"codehealthFindingId/v1":"85911fceca6e8511824f4ec65c83eae1bf3de203d9bb36bd92eedbe5f9905ab6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3): src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1583-1597 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1630-1644 | src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs:364-379 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1583\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs"},"region":{"startLine":1583}}}],"partialFingerprints":{"codehealthFindingId/v1":"050417574385d433a96014875fc9a01cdaf8739465555b403bddc83403d8075f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3): src/ui/Features/Video/TextToSpeech/Engines/KokoroTtsCpp.cs:89-103 | src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceTtsCpp.cs:97-111 | src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCpp.cs:103-117 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/KokoroTtsCpp.cs:89\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/KokoroTtsCpp.cs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d6f381ddbb36a1ab9e1e0ab4a53fcabf57ea51725e5632480d040f17e853754"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Assa/AssaAttachmentsViewModel.cs:174-188 | src/ui/Features/Ssa/SsaAttachmentsViewModel.cs:142-156 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaAttachmentsViewModel.cs:174\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaAttachmentsViewModel.cs"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fb8df8bbf0f43378af6de3b62c4a7c517d1f36a685af094c59b8d85ac7be6e5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Assa/AssaAttachmentsViewModel.cs:419-433 | src/ui/Features/Ssa/SsaAttachmentsViewModel.cs:387-401 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaAttachmentsViewModel.cs:419\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaAttachmentsViewModel.cs"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a2572329401491fd375eba8c013e12700a49dc8e415cc33f2a3f0c61640e5a4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Assa/AssaPropertiesViewModel.cs:198-212 | src/ui/Features/Ssa/SsaPropertiesViewModel.cs:186-200 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaPropertiesViewModel.cs:198\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaPropertiesViewModel.cs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"b49b79d18c3d40d5e3b0f50f6db5865137591be9f1ba3ba246afe5f5544e9533"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:4524-4538 | src/ui/Features/Main/MainViewModel.cs:4588-4602 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:4524\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":4524}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d393a3149501ed9cbbf49cfae57732914953fc7ac3cf3e3af2cbfd9db32d8a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:11586-11600 | src/ui/Features/Main/MainViewModel.cs:11633-11647 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":11586}}}],"partialFingerprints":{"codehealthFindingId/v1":"2de628ad40de2cd01ec9b09556f1ab423add3646de43b763d4b3a548c1bed8e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:13913-13927 | src/ui/Features/Main/MainViewModel.cs:13946-13960 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":13913}}}],"partialFingerprints":{"codehealthFindingId/v1":"a075326549e6afe9d60a7bafff28852187e02460ade43112c2688e6099ebe5c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:14212-14226 | src/ui/Features/Main/MainViewModel.cs:14243-14257 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":14212}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbc8fb6852ea5d43a8286e4e2c0477a7175d8601303ed8f198bb0579b822f75f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs:259-273 | src/ui/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs:312-326 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs:259\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"88f6a457491108f05882791de3658272d6f9b3e5d1b76009b59e99efa6acc5e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Ocr/BinaryOcr/BinaryOcrDbEditViewModel.cs:77-91 | src/ui/Features/Ocr/NOcr/NOcrDbEditViewModel.cs:112-126 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/BinaryOcr/BinaryOcrDbEditViewModel.cs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"86a60c23e4633c87336a78711688c0ae2bc32141a95435b79512f3f85903f416"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Ocr/OcrViewModel.cs:843-857 | src/ui/Features/Sync/PointSyncViaOther/PointSyncViaOtherViewModel.cs:149-163 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":843}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed2766bd57e943a32eda24455e92335f2e96c66bb9f172e1a3d5eb78a246cce3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Ocr/OcrViewModel.cs:2506-2520 | src/ui/Features/Ocr/OcrViewModel.cs:2525-2539 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":2506}}}],"partialFingerprints":{"codehealthFindingId/v1":"242f6ad47af11105f70fe833efa329cff2f2a5c5a6746cb06f4b8be05f2a653f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs:2409-2423 | src/ui/Features/Tools/JoinSubtitles/JoinSubtitlesViewModel.cs:579-593 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs:2409\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":2409}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8115589b53530dbe93bfc8da93964ce55a4d6c71f9c06ef8672d60bca1620e7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Tools/MergeSubtitlesWithSameText/MergeSameTextViewModel.cs:272-286 | src/ui/Features/Tools/MergeSubtitlesWithSameTimeCodes/MergeSameTimeCodesViewModel.cs:317-331 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/MergeSubtitlesWithSameText/MergeSameTextViewModel.cs:272\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/MergeSubtitlesWithSameText/MergeSameTextViewModel.cs"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d1fb7353e7a1b160d22879a2ed3fd8d801088eb234f66210301fc4a0e958fe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Tools/MergeTwoSubtitles/MergeTwoSubtitlesViewModel.cs:214-228 | src/ui/Features/Tools/MergeTwoSubtitles/MergeTwoSubtitlesViewModel.cs:239-253 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/MergeTwoSubtitles/MergeTwoSubtitlesViewModel.cs:214\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/MergeTwoSubtitles/MergeTwoSubtitlesViewModel.cs"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9b491e034111204b647c416227703e1d1b9d97d5a951ebc02f95c8beb1cef61"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs:370-384 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:848-862 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs:370\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"afd552e7c280f7dd3def17f4995c481cec7f83aecd5133156977a9f7fee2fc94"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:323-337 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:246-260 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:323\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2d228515aca7fc06205a3c83b3c0d67390e0659490e3a4a5a1327c8b2e97062"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditMp4ViewModel.cs:708-722 | src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditViewModel.cs:712-726 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditMp4ViewModel.cs"},"region":{"startLine":708}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b46c98f9b1e35aff58c326786389c42d33e00f748ea9d4918c31fa110b058b7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:344-358 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:499-513 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"5835934eb0c92b13f17368560d2e8c88a97198f93ce4da7dc6ea3c61fe585577"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 11): src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs:771-784 | src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:860-873 | src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:744-757 | src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs:728-741 | src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs:855-868 | src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs:771-784 | src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCpp.cs:532-545 | src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs:1135-1148 | src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs:695-708 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:781-794 | src/ui/Features/Video/TextToSpeech/Engines/ZonosTtsCrispAsr.cs:685-698 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"43c8765dbd9f9ca937bf80479854742bcd1b8ee15749310eb7381dcfb853a26f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 5): src/ui/Features/Ocr/Download/DownloadTesseractModelViewModel.cs:91-104 | src/ui/Features/Ocr/Download/DownloadTesseractViewModel.cs:91-104 | src/ui/Features/Shared/DownloadFfmpegViewModel.cs:104-117 | src/ui/Features/Shared/DownloadLibMpvViewModel.cs:123-136 | src/ui/Features/Shared/DownloadYtDlpViewModel.cs:91-104 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 5 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 5 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/Download/DownloadTesseractModelViewModel.cs:91\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadTesseractModelViewModel.cs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0b0471344d97de082fa1c2c6d20e4ebb35c2476cf64a813c71047ff30ffdae7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 5): src/ui/Features/Ocr/OcrViewModel.cs:3973-3986 | src/ui/Features/Ocr/OcrViewModel.cs:4067-4080 | src/ui/Features/Ocr/OcrViewModel.cs:4128-4141 | src/ui/Features/Ocr/OcrViewModel.cs:4243-4256 | src/ui/Features/Ocr/OcrViewModel.cs:4282-4295 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/OcrViewModel.cs:3973\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":3973}}}],"partialFingerprints":{"codehealthFindingId/v1":"b262de0335f25f6271393585318ce81a75cf29deacd1772c0db4709a26cbf52c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 5): src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:416-432 | src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:464-480 | src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs:556-572 | src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs:491-504 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:504-520 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:416\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a2e8700a0a223470ac09ddbae957e2991e59e78c4f7922a83cdf8cd2b198a5a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 4): src/ui/Features/Files/Compare/CompareViewModel.cs:950-963 | src/ui/Features/Files/Compare/CompareViewModel.cs:987-1000 | src/ui/Features/Files/ImportImages/ImportImagesViewModel.cs:179-192 | src/ui/Features/Files/ImportPlainText/ImportPlainTextViewModel.cs:632-645 \u2014 there are 4 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Files/Compare/CompareViewModel.cs:950\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/Compare/CompareViewModel.cs"},"region":{"startLine":950}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7af245062123f66a1552ed0f923704f5fc205b02c435e91d31737839e8437dc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 4): src/ui/Features/Ocr/Download/DownloadCrispEmbedViewModel.cs:146-159 | src/ui/Features/Ocr/Download/DownloadGoogleLensOcrViewModel.cs:108-121 | src/ui/Features/Ocr/Download/DownloadPaddleOcrViewModel.cs:187-200 | src/ui/Features/Shared/DownloadLibVlcViewModel.cs:121-134 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 4 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 4 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/Download/DownloadCrispEmbedViewModel.cs:146\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadCrispEmbedViewModel.cs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f20fcf3200962e0d4f9f3dcfc511330eac09db9912ba1b2bbfbba2dcf525c89"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs:519-532 | src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs:599-612 | src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs:630-643 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"0362db8f652fad5b59bbd1aa4047b5cf24d9470413cf3ec74753941915e28789"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:966-979 | src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:594-607 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:743-756 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":966}}}],"partialFingerprints":{"codehealthFindingId/v1":"76555e3fb91c9637ac25044b7ba88145ea24876e7288778033ef8e968a6a5b53"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs:1538-1551 | src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs:1557-1570 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs:1538\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":1538}}}],"partialFingerprints":{"codehealthFindingId/v1":"53a7331858afd8936ebb4c237f4986c06c6b1151427f727ee2bf0aeb15abbc6b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Assa/AssaAttachmentItem.cs:28-41 | src/ui/Features/Ssa/SsaAttachmentItem.cs:28-41 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaAttachmentItem.cs:28\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaAttachmentItem.cs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"199bb5c2cce1ceacaee4f901d93e6a8654743d438fec7f6408e70c28c40b86be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:308-321 | src/ui/Features/Ssa/SsaStylesViewModel.cs:196-209 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:308\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed5d0812e857a557468ffd09d1064035cd7d9dcf4f1401e71ae05d9047b339fb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:347-360 | src/ui/Features/Ssa/SsaStylesViewModel.cs:235-248 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:347\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d275bb560a5b65124c55bd8f64166665dcc9525857f4d88424f8f88aa26f698"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:429-442 | src/ui/Features/Ssa/SsaStylesViewModel.cs:317-330 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:429\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":429}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1f61c4678499e6c3e144b12dda51c26937702f308cc8270567e35adb94a9c77"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:742-755 | src/ui/Features/Ssa/SsaStylesViewModel.cs:560-573 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:742\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":742}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b3c29fe0bd28d18c09e27312df69ef7c540170a1c804262c40cf1a898366731"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Edit/Find/FindViewModel.cs:131-144 | src/ui/Features/Edit/Replace/ReplaceViewModel.cs:144-157 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Edit/Find/FindViewModel.cs:131\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/Find/FindViewModel.cs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"372c07ff82a0c144477d1566cb071c0ab0c47245737c3f5cf30aa6771e315667"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs:587-600 | src/ui/Features/Files/FormatProperties/WebVttProperties/WebVttPropertiesViewModel.cs:91-104 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs"},"region":{"startLine":587}}}],"partialFingerprints":{"codehealthFindingId/v1":"8375f067bb0a751773872e8fa9edd300a0dff4e7a35f31085ff5ac6170f5e63a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:1378-1391 | src/ui/Features/Main/MainViewModel.cs:1439-1452 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:1378\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":1378}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e8af48a8c3275816f58e38466c9b41257a4e9d57bd8a8c5467f089ed81d1c50"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:3516-3529 | src/ui/Features/Main/MainViewModel.cs:3577-3590 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":3516}}}],"partialFingerprints":{"codehealthFindingId/v1":"528eaa0ec7e77acb28dab3822b7ef63cee84f5b60680873d334c09459cf4cbd5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:14534-14547 | src/ui/Features/Main/MainViewModel.cs:14557-14570 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:14534\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":14534}}}],"partialFingerprints":{"codehealthFindingId/v1":"a45785b23e9779a883a5d6b002e1b9819a915310b195b8ad391a6f2239d74282"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:14882-14895 | src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:605-618 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":14882}}}],"partialFingerprints":{"codehealthFindingId/v1":"4db8907d710768d61ddd1202cd530555fb7246dd56731c8019c27fd99d3a5b4e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:14907-14920 | src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:625-638 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":14907}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec529234ad657f062ed7f69ecd993a08a943bde8fdd8bc8355d52ca10aaf911b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:16138-16151 | src/ui/Features/Main/MainViewModel.cs:16186-16199 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:16138\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":16138}}}],"partialFingerprints":{"codehealthFindingId/v1":"66ca060e8d099efbba21ee3782917e00e43c8a4f1e5f42dfd68c059c11fb3db9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:18861-18874 | src/ui/Features/Main/MainViewModel.cs:18882-18895 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:18861\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":18861}}}],"partialFingerprints":{"codehealthFindingId/v1":"371198c0b33a6da242514e2e09f866c10a4373f70ff768acb61fcb20b0681a2d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs:154-167 | src/ui/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs:198-212 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs:154\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"b09ff1dc8cc852caabb3ff7d1c6d845c24f30c14c8a62e17f309f038e96c1161"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Ocr/OcrViewModel.cs:4132-4145 | src/ui/Features/Ocr/OcrViewModel.cs:4207-4220 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":4132}}}],"partialFingerprints":{"codehealthFindingId/v1":"0677675108879ea7b45eb8749d27cd585611c97f9d9c620e2735d6baabdaf018"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Shared/BinaryEdit/BinaryAdjustAllTimes/BinaryAdjustAllTimesViewModel.cs:49-62 | src/ui/Features/Sync/AdjustAllTimes/AdjustAllTimesViewModel.cs:74-87 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Shared/BinaryEdit/BinaryAdjustAllTimes/BinaryAdjustAllTimesViewModel.cs:49\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryAdjustAllTimes/BinaryAdjustAllTimesViewModel.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8904de1b4c5c9e048daed956cee8be8eefd8eab55c69a6cae194558ffa91571"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Sync/ChangeFrameRate/ChangeFrameRateViewModel.cs:88-101 | src/ui/Features/Sync/ChangeFrameRate/ChangeFrameRateViewModel.cs:114-127 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Sync/ChangeFrameRate/ChangeFrameRateViewModel.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"f05cbd8a86d29cf0d38de40898b3d04f319c62244411a098bec3694df9b86a0e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Tools/BatchConvert/BatchConverter.cs:749-762 | src/ui/Features/Tools/BatchConvert/BatchConverter.cs:943-956 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/BatchConvert/BatchConverter.cs:749\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":749}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f65f3fd4ce6686a160815595760b4063d8d65bfb0b85a9bf0979f2627e42c2c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs:2577-2590 | src/ui/Features/Translate/AutoTranslateViewModel.cs:636-649 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs:2577\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":2577}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7b8cc36199fab3f799de27edebeafcbe7e91942472055193e7680f7312400a2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1018-1031 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:761-774 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1018\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1018}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bdf18e19ee6cc186c7698c24fba551ae9173cae1fb49ee9ae168b4680de49a5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1877-1890 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:1156-1169 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1877\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1877}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f2888ab6b3bf8bd05608b6941f5c07c3e277f16b7cd017031717607df0a1177"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCppCuBlas.cs:62-75 | src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCppVulkan.cs:66-79 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCppCuBlas.cs:62\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCppCuBlas.cs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac7336b6fee2c4ff3537321373198113e09748486d053456f54605e06cecda1a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Video/SpeechToText/EngineSettings/SpeechToTextEngineSettingsViewModel.cs:238-251 | src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:4743-4758 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/SpeechToText/EngineSettings/SpeechToTextEngineSettingsViewModel.cs:238\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/EngineSettings/SpeechToTextEngineSettingsViewModel.cs"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"dda9aa7ec32023bf9722cb840e4e2b90a833b5398c8d02e57a49b7f082c9dd89"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:4652-4665 | src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:4703-4716 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:4652\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":4652}}}],"partialFingerprints":{"codehealthFindingId/v1":"eef589e530ea3e18f8d21ce3afce11d169c8dd5bca70a4334ecb89f7e8f375de"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs:1540-1553 | src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs:3634-3647 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs:1540\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":1540}}}],"partialFingerprints":{"codehealthFindingId/v1":"c154a33fc1d23560b070fe9466815a068928c245d95d9d124c923b051e385209"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/ui/Logic/Compression/ZipUnpacker.cs:52-65 | src/ui/Logic/Compression/ZipUnpacker.cs:107-120 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Compression/ZipUnpacker.cs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"33eceece2b13995d6f5dea070e59bd071ac4721b89cd09517e670f86cb782930"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 10): src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs:348-360 | src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:555-567 | src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:428-440 | src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs:428-440 | src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs:480-492 | src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs:455-467 | src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs:850-862 | src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs:415-427 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:468-480 | src/ui/Features/Video/TextToSpeech/Engines/ZonosTtsCrispAsr.cs:394-406 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs:348\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"acf2a0ea18fa1d82283011fa300fe305e97b25a1727810936b9fbf00a8f4a336"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 6): src/ui/Features/Translate/LlamaCppEngineSettings/LlamaCppEngineSettingsViewModel.cs:91-103 | src/ui/Features/Video/SpeechToText/EngineSettings/SpeechToTextEngineSettingsViewModel.cs:128-140 | src/ui/Features/Video/TextToSpeech/KokoroTtsSettings/KokoroTtsSettingsViewModel.cs:81-93 | src/ui/Features/Video/TextToSpeech/OmniVoiceSettings/OmniVoiceSettingsViewModel.cs:82-94 | src/ui/Features/Video/TextToSpeech/PiperSettings/PiperSettingsViewModel.cs:84-96 | src/ui/Features/Video/TextToSpeech/Qwen3TtsSettings/Qwen3TtsSettingsViewModel.cs:82-94 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 6 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 6 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Translate/LlamaCppEngineSettings/LlamaCppEngineSettingsViewModel.cs:91\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/LlamaCppEngineSettings/LlamaCppEngineSettingsViewModel.cs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"4031f7a473f9f088c08efa2b75e6565b67d2e4c6f06ae914688a4d00948a9f97"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 5): src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:321-333 | src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs:310-322 | src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs:387-399 | src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs:298-310 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:360-372 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:321\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"201658cc809d9fd0e80aa1455c909776c467fa1c410e97ea5e8e253a87adf44a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:414-426 | src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:350-362 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:343-355 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:414\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbf2d639ef9c1969590c33303b935e121fe09b128e6d5e38a00217dea7159a05"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Assa/AssaPropertiesViewModel.cs:52-64 | src/ui/Features/Ssa/SsaPropertiesViewModel.cs:51-63 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaPropertiesViewModel.cs:52\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaPropertiesViewModel.cs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d702f942f83048abccba3546cd81a49664e5ba5e45362b1a56b5cb97c9c316e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Assa/AssaPropertiesViewModel.cs:280-292 | src/ui/Features/Ssa/SsaPropertiesViewModel.cs:268-280 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaPropertiesViewModel.cs:280\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaPropertiesViewModel.cs"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"935b40343a3537aba46d7a54ad1b22fefe39b52f015c8699fb1dbd55b904923c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:91-103 | src/ui/Features/Ssa/SsaStylesViewModel.cs:75-87 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"78eeda25de314863bff5bb1d7efa5255ab458bad4e8477a631305c52fef020fa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:327-339 | src/ui/Features/Ssa/SsaStylesViewModel.cs:215-227 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"92fe2223158c17451e621dbfce005883083e20fdf14e5a66b2a002e597dbf526"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:485-497 | src/ui/Features/Ssa/SsaStylesViewModel.cs:375-387 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:485\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8cd8b467f73613fee4727f5147d5132be71243aac0bc316b395d5ccb5d9902c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:619-631 | src/ui/Features/Ssa/SsaStylesViewModel.cs:437-449 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":619}}}],"partialFingerprints":{"codehealthFindingId/v1":"0219a1e0a98fd916cfb5d691e91ca49c6afe938c2ead5d09651ff22bf8806aa5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:1231-1243 | src/ui/Features/Ssa/SsaStylesViewModel.cs:848-860 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:1231\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":1231}}}],"partialFingerprints":{"codehealthFindingId/v1":"813e9bca0fd7c0d009b71e2c12c97c066b972d7433445c610c325edf2c430e7f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Files/FormatProperties/TimedText10Properties/TimedText10PropertiesViewModel.cs:146-158 | src/ui/Features/Files/FormatProperties/TimedTextImsc11Properties/TimedTextImsc11PropertiesViewModel.cs:118-130 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Files/FormatProperties/TimedText10Properties/TimedText10PropertiesViewModel.cs:146\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/TimedText10Properties/TimedText10PropertiesViewModel.cs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"4080e1997061f0a0f022bb9a4c27eec76b605a371c384ee43446c9f909324ba4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Files/Statistics/StatisticsViewModel.cs:803-815 | src/ui/Features/Files/Statistics/StatisticsViewModel.cs:847-859 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Files/Statistics/StatisticsViewModel.cs:803\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/Statistics/StatisticsViewModel.cs"},"region":{"startLine":803}}}],"partialFingerprints":{"codehealthFindingId/v1":"951fef6aa3197dfa3d39ede3795a25c4149b80fc5d608406028529034a4cc4c1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Main/Layout/InitLayout.cs:91-103 | src/ui/Features/Main/Layout/InitLayout.cs:138-150 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/Layout/InitLayout.cs:91\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitLayout.cs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfdb63a3a7f202985fb1cef518712f4b1ae9b93330f42ba5c1c53c4462ae9ba9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Main/Layout/InitLayout.cs:112-124 | src/ui/Features/Main/Layout/InitLayout.cs:159-171 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/Layout/InitLayout.cs:112\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitLayout.cs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"152ce915639a3c45167b59ee74673f34e8764d7251a8d82c0e3c410c00eb9e21"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:7791-7803 | src/ui/Features/Main/MainViewModel.cs:7938-7950 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":7791}}}],"partialFingerprints":{"codehealthFindingId/v1":"1228d01a486acec570b6f788de14996e933a0e2350b8462ad0b7e6b305149ac5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:8936-8948 | src/ui/Features/Main/MainViewModel.cs:9071-9083 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:8936\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":8936}}}],"partialFingerprints":{"codehealthFindingId/v1":"157495b053d88f5908494f0e1df7efea2ff94a91dc417abed1a28281e656f164"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:9528-9540 | src/ui/Features/Main/MainViewModel.cs:13076-13088 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:9528\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":9528}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae32c2ab1053bc517c733cb5527d7a4fc18e96f2a4587272fe5b6abb8e96d900"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:13813-13825 | src/ui/Features/Main/MainViewModel.cs:13854-13866 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:13813\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":13813}}}],"partialFingerprints":{"codehealthFindingId/v1":"010cbb6334ebc075af697b6ccc2da1a93edc0758fe606f6e8c8c47b632b75842"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Ocr/BinaryOcr/BinaryOcrDbEditViewModel.cs:233-245 | src/ui/Features/Ocr/NOcr/NOcrDbEditViewModel.cs:270-282 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/BinaryOcr/BinaryOcrDbEditViewModel.cs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3cb6bace0d29407010c24982e5842649ae604204f4e0a8656a4c191ad81266f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs:569-581 | src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs:642-654 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditWindow.cs"},"region":{"startLine":569}}}],"partialFingerprints":{"codehealthFindingId/v1":"18df7deb4dc3e4cf18b6ced7e2936b89cf7c77158c90ea05cce7290d44c2183a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Shared/PickSpellCheckDictionary/PickSpellCheckDictionaryViewModel.cs:87-99 | src/ui/Features/SpellCheck/SpellCheckViewModel.cs:257-269 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Shared/PickSpellCheckDictionary/PickSpellCheckDictionaryViewModel.cs:87\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/PickSpellCheckDictionary/PickSpellCheckDictionaryViewModel.cs"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"91026352a559710ae6ae730b558ddb3faab26abc184f9f7f5ef0bb5afaff78e8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Ssa/SsaStylesViewModel.cs:324-336 | src/ui/Features/Ssa/SsaStylesViewModel.cs:567-579 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ssa/SsaStylesViewModel.cs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfe27b593edba802ad5f89e577966c4dbe02e6f48d99a74e04943bc803d2c99f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Sync/PointSync/SetSyncPoint/SetSyncPointViewModel.cs:275-287 | src/ui/Features/Sync/VisualSync/VisualSyncViewModel.cs:302-314 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Sync/PointSync/SetSyncPoint/SetSyncPointViewModel.cs:275\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Sync/PointSync/SetSyncPoint/SetSyncPointViewModel.cs"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"41dd002dcf9e5d99a1a881cd5480bc7d9e9eee56305e04c33d9df82356c285ec"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs:2622-2634 | src/ui/Features/Translate/AutoTranslateViewModel.cs:691-703 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs:2622\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs"},"region":{"startLine":2622}}}],"partialFingerprints":{"codehealthFindingId/v1":"1caf997200328e1b2534e26734d1f1bf5993931a2f9dd022383cd2448e1ee12a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Translate/AutoTranslateViewModel.cs:977-989 | src/ui/Features/Video/VideoOcr/VideoOcrViewModel.cs:249-261 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Translate/AutoTranslateViewModel.cs:977\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":977}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e92295b4ac274a3a5c00d60a59e7fa399035bfacd6f9a04764bc52454c1a249"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1467-1479 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:1060-1072 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1467\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1467}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea0afbbfd8e6f2439ee977dba0d0a2a92cfc66911796da0f5a6fbeed21f388e7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Video/ReEncodeVideo/ReEncodeVideoViewModel.cs:221-233 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:370-382 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/ReEncodeVideo/ReEncodeVideoViewModel.cs:221\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/ReEncodeVideo/ReEncodeVideoViewModel.cs"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a0acf1e7435b025b640f1e14aa8b109ab08c639dfa772285de1624a9175d995"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs:61-73 | src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs:124-139 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca0e3e0f63e0030778f6d9f9a1b5d4d7cac7d7413d11d97fc5c062f3d79db083"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs:128-140 | src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs:161-173 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs:128\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"1801bd3f10be6486d059b8940df20071244e0063693ebf14b2906249216fe6d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 5): src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFireflies.cs:28-39 | src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectMatrix.cs:34-45 | src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectOldMovie.cs:20-31 | src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectRain.cs:20-31 | src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectSnow.cs:21-32 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFireflies.cs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"f04f1bf89d58fefda1841da86ebc81dcf22ce5f3784a7fbfc933e05cd22c37b5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 4): src/ui/Features/Ocr/Download/DownloadTesseractViewModel.cs:139-150 | src/ui/Features/Shared/DownloadFfmpegViewModel.cs:214-225 | src/ui/Features/Shared/DownloadLibMpvViewModel.cs:209-220 | src/ui/Features/Shared/DownloadYtDlpViewModel.cs:132-143 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 4 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 4 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/Download/DownloadTesseractViewModel.cs:139\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadTesseractViewModel.cs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"aea7ef1d8bfebcfd0f77965d6dbe83c37f6cf0300792d55461986b7798ef133f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:936-947 | src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:956-974 | src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:984-996 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:936\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitListViewAndEditBox.cs"},"region":{"startLine":936}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9129378fb74568ee608d4fec26bef5b6c13288e5f7a44848f0de9e7dd4d0e9b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): src/ui/Features/Main/MainViewModel.cs:2997-3008 | src/ui/Features/Main/MainViewModel.cs:3028-3039 | src/ui/Features/Main/MainViewModel.cs:3059-3070 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:2997\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":2997}}}],"partialFingerprints":{"codehealthFindingId/v1":"2524abb10035369328522b1175bbaf71c40887e9e6c1e1ff9772a59c3c2de1ad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): src/ui/Features/Shared/AddToNamesList/AddToNamesListViewModel.cs:62-73 | src/ui/Features/Shared/AddToOcrReplaceList/AddToOcrReplaceListViewModel.cs:65-76 | src/ui/Features/Shared/AddToUserDictionary/AddToUserDictionaryViewModel.cs:57-69 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/AddToNamesList/AddToNamesListViewModel.cs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"29c42325a1bc0f96a5929301e99d15d8522b4cf10361b135f440af5ccc62556d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs:2093-2104 | src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs:2272-2294 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs:2093\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":2093}}}],"partialFingerprints":{"codehealthFindingId/v1":"53c0b2d02ab29234544657a009bd3fc020463849784940c5c108196e7146d14f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectSlowZoomIn.cs:21-32 | src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectSlowZoomOut.cs:21-32 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectSlowZoomIn.cs:21\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectSlowZoomIn.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"946277fd71b0d7144ef4e19a213d15108278ff3c8a00eb6d4266f0f457b80229"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:393-404 | src/ui/Features/Ssa/SsaStylesViewModel.cs:281-292 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:393\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1787c8736663947ffde7f58358056fedcbb4c49d44691287ceb16dda5502f0a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:708-719 | src/ui/Features/Ssa/SsaStylesViewModel.cs:526-537 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:708\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":708}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9cb1116d001a4dc8e701c88d46668b0e7a504eaea2ab669e12a58a38b6c3798"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Files/ExportEbuStl/ExportEbuStlWindow.cs:298-309 | src/ui/Features/Files/ExportEbuStl/ExportEbuStlWindow.cs:310-321 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportEbuStl/ExportEbuStlWindow.cs"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea0bc74eac2708b16d42fde042ead9c2405a0a2e3c1968de5f6ef1db6a2ada53"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Main/Layout/LayoutWindow.cs:140-152 | src/ui/Features/Main/Layout/LayoutWindow.cs:161-172 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/Layout/LayoutWindow.cs:140\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/LayoutWindow.cs"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"95cdcb69dc073b3c75455e198b55d08b857f4251863755a386c5ac5c6625019c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:1130-1141 | src/ui/Features/Main/MainViewModel.cs:1206-1217 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:1130\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":1130}}}],"partialFingerprints":{"codehealthFindingId/v1":"1086f05e8c016cc52d837ab45517feba404180ef0a8ffab1aa3666f53b1848c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:11614-11625 | src/ui/Features/Main/MainViewModel.cs:11660-11671 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:11614\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":11614}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ebbcf27f3c5ad203d3d67834d3b5dfefd431e8c8e88e889a7139456a8dfd1f3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:16893-16904 | src/ui/Features/Main/MainViewModel.cs:16914-16925 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:16893\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":16893}}}],"partialFingerprints":{"codehealthFindingId/v1":"753d6d2d79246c552df79b9c61dcb244887d7088eaee4a0e9f8fd23b066d1b66"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs:200-211 | src/ui/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs:249-260 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs:200\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"9516133450ae0dc3d7b36e8a1bc2239e402b3378437c8048cd4b9c343ce272b4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs:314-325 | src/ui/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs:485-496 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs:314\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"b433981b79ff318863579aa503109635cac58b51aedf2250fefaf9bda8bd2184"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs:77-88 | src/ui/Features/Ocr/NOcr/NOcrInspectViewModel.cs:86-97 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b9b78dc99a497504321d425530c5e8991cdc38a6e9732a35bfeb23f1790246b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Ocr/Download/DownloadCrispEmbedViewModel.cs:247-258 | src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs:338-349 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/Download/DownloadCrispEmbedViewModel.cs:247\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadCrispEmbedViewModel.cs"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b3196be20b5b2e0115c7a1f98e019e4f19e65c0fcc3440a2d787aca49000860"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:951-962 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:727-738 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:951\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":951}}}],"partialFingerprints":{"codehealthFindingId/v1":"25a87cc1e8464e45aa4c549af4679eba8c32b84b9f188cece9a30fb445a55f3b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1172-1183 | src/ui/Features/Video/ReEncodeVideo/ReEncodeVideoViewModel.cs:378-389 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1172\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1172}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd2e439c24af343c517c68e2e8725e4e2b2d694856eb62c1b1584eb693fca550"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:274-285 | src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditViewModel.cs:111-122 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:274\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/CutVideo/CutVideoViewModel.cs"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bcf05c1565bc9e641b26faa36913ce9c5cebec01ba2533e694e9d79cf85d147"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:578-589 | src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditViewModel.cs:279-290 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:578\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/CutVideo/CutVideoViewModel.cs"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"b77d746d0f394e3ee6064bd6e30d301c42bbb387974f848dfc178df091244a04"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Video/SpeechToText/SpeechToTextPostProcessingWindow.cs:83-94 | src/ui/Features/Video/SpeechToText/SpeechToTextPostProcessingWindow.cs:95-106 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextPostProcessingWindow.cs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c42e45fa68ddfb4e4946c20b582b6d162daed6c6db789c887af05589f04e4dc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs:79-90 | src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs:128-139 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c40b419970c514bda6a14366ba0443553f748577fd1da90709972b041df359b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Video/SpeechToText/SpeechToTextWindow.cs:452-463 | src/ui/Features/Video/SpeechToText/SpeechToTextWindow.cs:464-486 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextWindow.cs"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7f02953039e04140b14ea6786b82a0b736d6deeededf0b1dcdbc4fea8ab32c7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/Engines/AzureSpeech.cs:63-74 | src/ui/Features/Video/TextToSpeech/Engines/Murf.cs:74-85 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/AzureSpeech.cs:63\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/AzureSpeech.cs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"728becc4d85d58177cd292ead926993b8af7521b5af3c1017c03d503d691b017"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/Engines/ElevenLabs.cs:61-72 | src/ui/Features/Video/TextToSpeech/Engines/GoogleSpeech.cs:65-76 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/ElevenLabs.cs:61\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ElevenLabs.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1c45fcc2eefd4905ad03b9339984d0788aa81777a3b9acb95ff596c625a7936"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/OmniVoiceSettings/OmniVoiceSettingsViewModel.cs:124-135 | src/ui/Features/Video/TextToSpeech/Qwen3TtsSettings/Qwen3TtsSettingsViewModel.cs:124-135 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/OmniVoiceSettings/OmniVoiceSettingsViewModel.cs:124\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/OmniVoiceSettings/OmniVoiceSettingsViewModel.cs"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"87e74c2c0ee8d7cf058b1e136e5b3eaa8c3285f0a98202e75a57bfa90b39a114"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs:750-761 | src/ui/Features/Video/TextToSpeech/VoiceSettings/VoiceSettingsViewModel.cs:394-405 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs:750\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":750}}}],"partialFingerprints":{"codehealthFindingId/v1":"486d5da682335781cc10f7576fe968de96664d5e74a817c9d139ecbdb7c7d3fe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 10): src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs:368-378 | src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:575-585 | src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:448-458 | src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs:448-458 | src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs:500-510 | src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs:475-485 | src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs:870-880 | src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs:435-445 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:488-498 | src/ui/Features/Video/TextToSpeech/Engines/ZonosTtsCrispAsr.cs:414-424 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs:368\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce15c2387d0108cb68d2b462223b49c26df7000a3065aac7f2356e3d677e07a3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): src/ui/Features/Shared/BinaryEdit/BinaryAdjustDuration/BinaryAdjustDurationViewModel.cs:226-236 | src/ui/Features/Shared/BinaryEdit/BinarySettings/BinarySettingsViewModel.cs:45-55 | src/ui/Features/Tools/AdjustDuration/AdjustDurationViewModel.cs:193-203 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Shared/BinaryEdit/BinaryAdjustDuration/BinaryAdjustDurationViewModel.cs:226\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryAdjustDuration/BinaryAdjustDurationViewModel.cs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa2d0d59ff5f2719f30faac84550aeb1ae39a9ccec9c6873d9b25195c968bf1d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesWindow.cs:312-322 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesWindow.cs:385-411 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesWindow.cs:441-468 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesWindow.cs:312\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesWindow.cs"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"683fe5034f15bff068047a08b708289d9347fb61216c5ef8e43e4e1ba43eea43"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:452-462 | src/ui/Features/Ssa/SsaStylesViewModel.cs:342-352 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:452\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6d99542308edde5c5ccdb663ace96e34151d541a8085637ef319817e99b37e2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:765-775 | src/ui/Features/Ssa/SsaStylesViewModel.cs:585-595 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:765\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":765}}}],"partialFingerprints":{"codehealthFindingId/v1":"42f31e7e84bd9f12aa6b0ad7c02897089343e8b1c5ed3447a423a7a7b9f95fce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Edit/MultipleReplace/MultipleReplaceViewModel.cs:814-824 | src/ui/Features/Edit/MultipleReplace/MultipleReplaceViewModel.cs:836-846 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Edit/MultipleReplace/MultipleReplaceViewModel.cs:814\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Edit/MultipleReplace/MultipleReplaceViewModel.cs"},"region":{"startLine":814}}}],"partialFingerprints":{"codehealthFindingId/v1":"45b852b96c7fa9c6ca1b9b44b09fd9f615898b65309e315dff4b4ae11c3115d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Files/ExportEbuStl/ExportEbuStlWindow.cs:168-178 | src/ui/Features/Files/ExportEbuStl/ExportEbuStlWindow.cs:200-210 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportEbuStl/ExportEbuStlWindow.cs"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b671e923973c03f624dc3b13728b6862c380d89f7c7d65b00e867963a31ec1c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs:122-132 | src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs:161-172 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs:122\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b9da294954e630c364360389499e5ef8e9ae648a23886ce3309376eebc3d1d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Main/AiAssistant/AiAssistantViewModel.cs:231-241 | src/ui/Features/Tools/AiReview/AiReviewViewModel.cs:632-642 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/AiAssistant/AiAssistantViewModel.cs"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"48e94a40631972f133b7b209593ac4c8059c4a21b3d08a199c9f617abb6a9f93"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Main/Layout/InitMenu.cs:545-555 | src/ui/Features/Main/Layout/InitMenu.cs:957-969 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/Layout/InitMenu.cs:545\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitMenu.cs"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b7987040340883f36e016e8639ade942e4da93d23b3e6eaed4e7bb81fe3e289"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:4339-4349 | src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:1193-1203 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:4339\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":4339}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcdfbc8ce7b910e6e8fb2f5d204a37ef2516d1318a2f61dc13506d211a4c7dac"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:8306-8316 | src/ui/Features/Main/MainViewModel.cs:8335-8345 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:8306\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":8306}}}],"partialFingerprints":{"codehealthFindingId/v1":"7385e2a01c567593d7fdec884f86b37a100919568c297527272664ea128796db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:9099-9109 | src/ui/Features/Main/MainViewModel.cs:9196-9206 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:9099\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":9099}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ff402e14ecf75da7f9748f7f88bca5c2bfedf0421f4e9c564c775f579a923a0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:9138-9149 | src/ui/Features/Main/MainViewModel.cs:9191-9201 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":9138}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d3af835c310377ea366bac6e7db3e667074f5a6bd82c117f2adee5670e44943"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:9994-10004 | src/ui/Features/Main/MainViewModel.cs:10030-10040 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:9994\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":9994}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d741ad650c6eb4aecee482d4cf3497288fc524453ec5b5b82c34a2726c14275"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Ocr/OcrViewModel.cs:1010-1020 | src/ui/Features/Ocr/OcrViewModel.cs:1063-1073 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1010}}}],"partialFingerprints":{"codehealthFindingId/v1":"751f86f26c1952819beb34193069043c6292fb08564652cdac11b8be209bb45d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Sync/PointSync/SetSyncPoint/SetSyncPointViewModel.cs:108-118 | src/ui/Features/Sync/VisualSync/VisualSyncViewModel.cs:139-149 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Sync/PointSync/SetSyncPoint/SetSyncPointViewModel.cs:108\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Sync/PointSync/SetSyncPoint/SetSyncPointViewModel.cs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"c31dcc281e5f9addb475dc29c71ae2bcecd3ebb2290888c3dd080875d2c33f29"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Tools/MergeSubtitlesWithSameText/MergeSameTextWindow.cs:143-153 | src/ui/Features/Tools/MergeSubtitlesWithSameText/MergeSameTextWindow.cs:214-224 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/MergeSubtitlesWithSameText/MergeSameTextWindow.cs:143\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/MergeSubtitlesWithSameText/MergeSameTextWindow.cs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"715612f7fb36eaf5dea9cb13ae95c8e0f343f27a9cce4466224fb408df23ca32"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Tools/MergeSubtitlesWithSameTimeCodes/MergeSameTimeCodesWindow.cs:151-161 | src/ui/Features/Tools/MergeSubtitlesWithSameTimeCodes/MergeSameTimeCodesWindow.cs:222-232 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/MergeSubtitlesWithSameTimeCodes/MergeSameTimeCodesWindow.cs:151\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/MergeSubtitlesWithSameTimeCodes/MergeSameTimeCodesWindow.cs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"c44a7936559edce3272658ffb6108c2d7713953797cddd7db60455fddcafaef9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1199-1210 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:883-893 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1199\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1199}}}],"partialFingerprints":{"codehealthFindingId/v1":"5db2169c08d5ec93591ea3bd73e1ec0a8fab3bb2208e26da4f37d0555a418d9e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1215-1226 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:898-908 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1215\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1215}}}],"partialFingerprints":{"codehealthFindingId/v1":"c06acec254a0230c870827e3a821c2bc631ff847bba4877cfe7d5022cc0332dc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:2150-2160 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:1278-1288 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:2150\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":2150}}}],"partialFingerprints":{"codehealthFindingId/v1":"08f4972a71f3c81b6fb9f594277fc3a68d70c6147ff9069c9476b75c55147d6f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 5): src/ui/Features/Files/ExportEbuStl/ExportEbuStlWindow.cs:142-151 | src/ui/Features/Files/ExportEbuStl/ExportEbuStlWindow.cs:153-162 | src/ui/Features/Files/ExportEbuStl/ExportEbuStlWindow.cs:163-172 | src/ui/Features/Files/ExportEbuStl/ExportEbuStlWindow.cs:197-206 | src/ui/Features/Files/ExportEbuStl/ExportEbuStlWindow.cs:223-232 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportEbuStl/ExportEbuStlWindow.cs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5ab76d168ec6ade582f5642caad6ffeedb1df8c465e63fa0e3880ebce6f3079"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 5): src/ui/Features/Video/BurnIn/BurnInWindow.cs:495-504 | src/ui/Features/Video/BurnIn/BurnInWindow.cs:506-515 | src/ui/Features/Video/BurnIn/BurnInWindow.cs:637-646 | src/ui/Features/Video/BurnIn/BurnInWindow.cs:647-656 | src/ui/Features/Video/BurnIn/BurnInWindow.cs:703-712 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInWindow.cs:637\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInWindow.cs"},"region":{"startLine":495}}}],"partialFingerprints":{"codehealthFindingId/v1":"850aa1781e7d4d9047a2f7f5059c926413ddbe96a50d438649ea52eeb178cfa4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): src/ui/Features/Options/Settings/ProfilesWindow.cs:239-248 | src/ui/Features/Options/Settings/ProfilesWindow.cs:250-259 | src/ui/Features/Options/Settings/ProfilesWindow.cs:260-269 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Options/Settings/ProfilesWindow.cs:239\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/ProfilesWindow.cs"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a533f712c886ac2f0e5a945a6f3816deefe66c768a80b5c743de70d96f85d11"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): src/ui/Features/Video/TextToSpeech/TtsEngineInstaller.cs:128-137 | src/ui/Features/Video/TextToSpeech/TtsEngineInstaller.cs:159-168 | src/ui/Features/Video/TextToSpeech/TtsEngineInstaller.cs:556-565 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/TtsEngineInstaller.cs:128\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TtsEngineInstaller.cs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"710829e7c0636133b5b6376bd6fbb115752faf9ee12333bc7df237193766fe6c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesWindow.cs:334-344 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesWindow.cs:405-415 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesWindow.cs:463-472 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesWindow.cs:334\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesWindow.cs"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"868603ffc73942569f42d3755a0a7cf9f4672e473c8b3a81b26b4da9a63734f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Assa/AssaAttachmentsViewModel.cs:151-160 | src/ui/Features/Ssa/SsaAttachmentsViewModel.cs:119-128 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaAttachmentsViewModel.cs:151\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaAttachmentsViewModel.cs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c91b1e4bcd79bdb376f377f72436fdc9ea13a4c8b1caa24e268b371d20efccb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Assa/AssaAttachmentsViewModel.cs:361-370 | src/ui/Features/Ssa/SsaAttachmentsViewModel.cs:329-338 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaAttachmentsViewModel.cs:361\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaAttachmentsViewModel.cs"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5a797f250e3bca3316209f2c321c7bc93ac30ef20cd2bea3b97d44f9ad461c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Assa/AssaProgressBar/AssaProgressBarWindow.cs:189-199 | src/ui/Features/Assa/AssaProgressBar/AssaProgressBarWindow.cs:200-209 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaProgressBar/AssaProgressBarWindow.cs:189\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaProgressBar/AssaProgressBarWindow.cs"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"f31c53470d5ad682c6e9a594134afe3ff0dcb9a2f60b16d510bb8e878a85668f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Assa/AssaPropertiesViewModel.cs:229-238 | src/ui/Features/Ssa/SsaPropertiesViewModel.cs:217-226 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaPropertiesViewModel.cs"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c884fdfbb59feb43289b1fb2af72591b1515b341c9542eb91510ec82d1e8e8e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Files/ExportImageBased/ExportImageBasedWindow.cs:321-330 | src/ui/Features/Files/ExportImageBased/ExportImageBasedWindow.cs:331-340 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportImageBased/ExportImageBasedWindow.cs"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"cce3704643b1e95df72baa5094542e794becae2f06216309593dfe250f0ea001"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:3297-3306 | src/ui/Features/Main/MainViewModel.cs:3317-3326 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:3297\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":3297}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c10db024356ebaa5d2cb1cd3b2e481a897d58e1a13ff1b3b3ca26e46d12b822"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:10589-10598 | src/ui/Features/Main/MainViewModel.cs:10641-10650 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:10589\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":10589}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd40b81e624a579c6143d51851056b03d89083bbdf90086c5cc416327f6c964b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:19874-19883 | src/ui/Features/Main/MainViewModel.cs:19911-19920 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:19874\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":19874}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7f109f47df68a54609823eea2b29e829880d908180bf2dd4ba76eb355e6bfd8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:20400-20409 | src/ui/Features/Ocr/OcrViewModel.cs:1818-1827 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:20400\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":20400}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3d3f3f3a73d2ce5168418b85d9b7a4f3bffa5e2bf9e30c82f2ba991e234f927"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:20459-20468 | src/ui/Features/Ocr/OcrViewModel.cs:2122-2131 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:20459\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":20459}}}],"partialFingerprints":{"codehealthFindingId/v1":"72506979b8d6097ec16f8d726f78e35d22fc1acbdec8a77c8cab92f3d05c22cd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:24535-24544 | src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs:2714-2725 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:24535\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":24535}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d2bf8b63bbdfd02bd32bf68c17c56c0cc56ff9135d7d31ccc88ad2133872119"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Ocr/Download/DownloadGoogleLensOcrViewModel.cs:148-157 | src/ui/Features/Ocr/Download/DownloadPaddleOcrViewModel.cs:261-270 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/Download/DownloadGoogleLensOcrViewModel.cs:148\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadGoogleLensOcrViewModel.cs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"4677576511bfc6d4fd38869e4918ea91f36aa2031b9c205836032c6fa34ab3f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Ocr/Engines/LlamaCppOcr.cs:110-119 | src/ui/Features/Ocr/Engines/OllamaOcr.cs:163-172 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/Engines/LlamaCppOcr.cs:110\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/LlamaCppOcr.cs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"af92001345f85969ce34a3084d57b09f16c04636b355312ab827587e1bda2a60"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Ocr/PreProcessingSettings.cs:125-135 | src/ui/Features/Ocr/PreProcessingSettings.cs:209-218 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/PreProcessingSettings.cs:125\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/PreProcessingSettings.cs"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"635d73153e7abb4621155d066aff963fd8ceb5b5d8397b1f6660a7dd1af01fca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:550-559 | src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:2309-2318 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1d92ae1ca32e5c680113752225b6afbb4c74e1ed4645d3f85915a773eda631c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsWindow.cs:197-206 | src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsWindow.cs:207-216 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsWindow.cs"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e86be4ad3d6e86d3208bb18691fdda8de2811c0360eecbe2ad6c46a816bf02e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Translate/TranslateSettingsWindow.cs:101-110 | src/ui/Features/Translate/TranslateSettingsWindow.cs:116-126 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/TranslateSettingsWindow.cs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"060763a2a9bb53461140c9cb9566d80a823819cd865e634acb3ea213421e1372"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs:310-319 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:610-619 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs:310\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb2b64cf303519aa8c3a8a2db6fd9bcfbc8f42111022e57bb02dabc9f0f40c3c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:847-856 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:657-666 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:847\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":847}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce52ba21685bc13193f707985bfd459d4b02412591056cbb6020784541fa2598"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1851-1860 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:1127-1139 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1851\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1851}}}],"partialFingerprints":{"codehealthFindingId/v1":"907700b6892b1ea00713ff158cce74e3f69b5c94f30cddede48b8f4a9d53b1d6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditMp4ViewModel.cs:169-178 | src/ui/Features/Video/ReEncodeVideo/ReEncodeVideoViewModel.cs:192-201 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditMp4ViewModel.cs:169\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditMp4ViewModel.cs"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"409c38cbd250800b655877112a60129447336db2aedcb4344147d84299bac3d1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/ui/Features/Video/SpeechToText/SpeechToTextAdvancedWindow.cs:157-166 | src/ui/Features/Video/SpeechToText/SpeechToTextAdvancedWindow.cs:172-182 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextAdvancedWindow.cs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"35adbc9fab7eaeca1dc1dd3817a1b7c6ecff7c1bb86953e4f9ad099305f71782"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 10): src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1759-1767 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1819-1827 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1842-1850 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1865-1873 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1888-1896 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1932-1940 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1955-1963 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1978-1986 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:2001-2009 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:2024-2032 \u2014 all 10 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1759\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs"},"region":{"startLine":1759}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c4c50669dca75fd3535f132aa2d8027e5fc3f6878f0868dff9e4f7e58023547"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:789-797 | src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:542-550 | src/ui/Features/Video/ReEncodeVideo/ReEncodeVideoViewModel.cs:340-348 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:789\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":789}}}],"partialFingerprints":{"codehealthFindingId/v1":"788e50c2a4838f5dace96198c052094fc8eaf261d102f0fae84cafad2b792b26"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:4587-4595 | src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:4651-4659 | src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:4702-4710 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs:4587\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":4587}}}],"partialFingerprints":{"codehealthFindingId/v1":"05cbd60e4ce4868ce8753af08ccd4a03aa0a3c9650b6e90ec394d7b239358309"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1796-1804 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1909-1917 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:2081-2089 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1796\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs"},"region":{"startLine":1796}}}],"partialFingerprints":{"codehealthFindingId/v1":"d299a5fad808d8374f00e006c226e981ddc6f1eb28e1c117f2652f18a9b5941c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/ui/Features/Assa/AssaProgressBar/AssaProgressBarViewModel.cs:440-448 | src/ui/Features/Assa/AssaProgressBar/AssaProgressBarViewModel.cs:451-459 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaProgressBar/AssaProgressBarViewModel.cs:440\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaProgressBar/AssaProgressBarViewModel.cs"},"region":{"startLine":440}}}],"partialFingerprints":{"codehealthFindingId/v1":"7421e9746b59290994aed9a78f7b233e0d48e7634716e47b1dfd7dacbfd0c50b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:19890-19898 | src/ui/Features/Main/MainViewModel.cs:19927-19935 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:19890\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":19890}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bf81d81bf30e1026f000a12fc8ab7087654f266fd6a7687dd83bc525bfeef2e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/ui/Features/Ocr/Download/DownloadCrispEmbedViewModel.cs:285-293 | src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs:511-519 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadCrispEmbedViewModel.cs"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"565684f2d9fe07eee82c11e763c73db8198953277ee4c0dc5c14ef56648b8b2e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/ui/Features/Ocr/Download/DownloadTesseractModelViewModel.cs:160-168 | src/ui/Features/SpellCheck/GetDictionaries/GetDictionariesViewModel.cs:397-405 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Ocr/Download/DownloadTesseractModelViewModel.cs:160\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadTesseractModelViewModel.cs"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"079bde3d41d710099117f0505cbb72d09a7e0b98ddc7df91d619a8efb34da766"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:1764-1772 | src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:1801-1809 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs:1764\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":1764}}}],"partialFingerprints":{"codehealthFindingId/v1":"be58ef546452ffd90283133a9cb082ba9300065e794b03942e3661b0ef2f3b8e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/ui/Features/Shared/BinaryEdit/SetText/SetTextWindow.cs:177-185 | src/ui/Features/Shared/BinaryEdit/SetText/SetTextWindow.cs:188-196 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/SetText/SetTextWindow.cs"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"deb76df597cbb064c21d1f2e4c65b42834a0435723056a3ff46e6d952036049d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/ui/Features/Tools/AiReview/AiReviewClient.cs:114-122 | src/ui/Features/Translate/LlamaCppAdvanced/LlamaCppAdvancedClient.cs:150-158 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/AiReview/AiReviewClient.cs:114\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/AiReview/AiReviewClient.cs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9670b0a0442cd034031e72572ae4ef8d42386e438cd2a0481ca30a65d74906c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1335-1343 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:983-991 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1335\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1335}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c9aa18d6f23aecbb64b6c402f6fdebd09012a2215a1c8e0b75e5b1d04d7dd87"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1388-1396 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:1007-1015 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1388\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1388}}}],"partialFingerprints":{"codehealthFindingId/v1":"58c4353918976fdb96a06595b42ea366bccff945bbfb9eeba4dcbce4fc63b519"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:1038-1046 | src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:1052-1060 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/CutVideo/CutVideoViewModel.cs:1038\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/CutVideo/CutVideoViewModel.cs"},"region":{"startLine":1038}}}],"partialFingerprints":{"codehealthFindingId/v1":"be5d3f9cced6cd8b6b677a8ee1728814b631ca408ada90386aef44509dea339a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditMp4ViewModel.cs:140-148 | src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditViewModel.cs:148-156 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditViewModel.cs:148\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditMp4ViewModel.cs"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc1d315a008dc3af1e978c916d1a4394916dadedad0495414521a58e4cf21fe2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3Languages.cs:46-54 | src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsrLanguages.cs:46-54 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3Languages.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"97a7057bf414991f8c720897a54e838e2177a414ad6ce1c2a049b0f208bdabb1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/ui/Logic/ColorService.cs:127-135 | src/ui/Logic/ColorService.cs:205-213 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ColorService.cs"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b2b2907a77cff4f7d7ca1ac0634963779121e40e36d2f6a5963448ac4bb1f32"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 10): src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:373-380 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:598-605 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:704-711 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:792-799 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:876-883 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:991-998 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1077-1084 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1163-1170 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1249-1256 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1388-1395 \u2014 all 10 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:373\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"666b66b478459249c86a34b82ee9aa9aa69036b2702f9e7798c893a498beaf3b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 9): src/ui/Features/Video/SpeechToText/Engines/ChatLlmCppEngine.cs:140-148 | src/ui/Features/Video/SpeechToText/Engines/Qwen3AsrCppEngine.cs:184-192 | src/ui/Features/Video/SpeechToText/Engines/WhisperEngineConstMe.cs:116-124 | src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCpp.cs:162-170 | src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCppCuBlas.cs:139-147 | src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCppVulkan.cs:143-151 | src/ui/Features/Video/SpeechToText/Engines/WhisperEngineCTranslate2.cs:113-121 | src/ui/Features/Video/SpeechToText/Engines/WhisperEngineOpenAi.cs:81-88 | src/ui/Features/Video/SpeechToText/Engines/WhisperEnginePurfviewFasterWhisperXxl.cs:205-213 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/SpeechToText/Engines/ChatLlmCppEngine.cs:140\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/Engines/ChatLlmCppEngine.cs"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9ce5f17591a33bd1dcc0d886001c80ea7269e1b83d0e50ab31f744c4b912659"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 6): src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs:509-516 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1694-1701 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1778-1785 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1794-1801 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1907-1914 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:2079-2086 \u2014 there are 6 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 6 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs:509\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs"},"region":{"startLine":509}}}],"partialFingerprints":{"codehealthFindingId/v1":"e972567f32e30bdb963590718c933b9004fd2d1897e1c5cd7176160f08116bd7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): src/ui/Features/Assa/AssaAttachmentsViewModel.cs:404-411 | src/ui/Features/Assa/AssaPropertiesViewModel.cs:324-331 | src/ui/Features/Assa/AssaStylesViewModel.cs:1118-1125 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaAttachmentsViewModel.cs"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"546debfdd84b5ac43d50caa3edf6b9961d07620d970dd6e41058419949c544cf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): src/ui/Features/Ssa/SsaAttachmentsViewModel.cs:372-379 | src/ui/Features/Ssa/SsaPropertiesViewModel.cs:300-307 | src/ui/Features/Ssa/SsaStylesViewModel.cs:721-728 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ssa/SsaAttachmentsViewModel.cs"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"156d5c35509f969f33f0170e9b740621806e18c1a4cc39edd945c6ba224faf33"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): src/ui/Features/Video/TextToSpeech/ElevenLabsSettings/ElevenLabsSettingsWindow.cs:121-129 | src/ui/Features/Video/TextToSpeech/ElevenLabsSettings/ElevenLabsSettingsWindow.cs:130-138 | src/ui/Features/Video/TextToSpeech/ElevenLabsSettings/ElevenLabsSettingsWindow.cs:139-146 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/ElevenLabsSettings/ElevenLabsSettingsWindow.cs:121\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ElevenLabsSettings/ElevenLabsSettingsWindow.cs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ea85d51f17d8db65a3c471b852d2624d9ca1f6717c8ffe9afbd690029386d4e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechWindow.cs:597-605 | src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechWindow.cs:606-614 | src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechWindow.cs:615-622 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechWindow.cs:597\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechWindow.cs"},"region":{"startLine":597}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc58a6de5bf85d9057b934f1673420a908f3178db71f9f280f3981e877965200"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/ui/Features/Assa/AssaStylesViewModel.cs:1320-1327 | src/ui/Features/Ssa/SsaStylesViewModel.cs:937-944 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaStylesViewModel.cs:1320\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaStylesViewModel.cs"},"region":{"startLine":1320}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bb735dc7f664434922043e817d366ddedebb8a36e6425e6c0a124f71e2bf9ec"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesWindow.cs:193-201 | src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesWindow.cs:202-209 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesWindow.cs:193\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesWindow.cs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fcfbf8293c5c744f08f21a13b2e995194049ce8e0ba8da63489fb708947670b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:5704-5711 | src/ui/Features/Main/MainViewModel.cs:5798-5805 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:5704\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":5704}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9bb43c4e6de163ac8d622e3df4744f89f49ece40885d207ef0cbef79b3a1bb6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/ui/Features/Options/Settings/ProfilesViewModel.cs:34-41 | src/ui/Features/Shared/PickRuleProfile/PickRuleProfileViewModel.cs:31-38 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Options/Settings/ProfilesViewModel.cs:34\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/ProfilesViewModel.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d0e1923c758326b01c5a7512d5ea2e9af4f63d06c128e53026d3a9f2a9b8bb6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/ui/Features/Ssa/SsaPropertiesWindow.cs:169-176 | src/ui/Features/Ssa/SsaPropertiesWindow.cs:212-219 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ssa/SsaPropertiesWindow.cs"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8b202ac2b7819c19408cefa172af40c3459213558aa05ed88d2b8ed7e5507af"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/ui/Features/Tools/ApplyMinGap/ApplyMinGapItem.cs:27-34 | src/ui/Features/Tools/BridgeGaps/BridgeGapDisplayItem.cs:27-34 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/ApplyMinGap/ApplyMinGapItem.cs:27\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/ApplyMinGap/ApplyMinGapItem.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"34737731b9d8e24c8aaf68d75d29584293368f9dbb8829f637f284ebc15b5cce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/ui/Features/Video/SpeechToText/OpenAiCompatible/OpenAiSttService.cs:397-409 | src/ui/Features/Video/SpeechToText/OpenRouter/OpenRouterSttService.cs:187-194 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/SpeechToText/OpenAiCompatible/OpenAiSttService.cs:397\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/OpenAiCompatible/OpenAiSttService.cs"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e42c3735c655f5a551bf9954c3c794c16bc273768e42696083c696996911857"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/ui/Features/Video/SpeechToText/SpeechToTextPostProcessor.cs:324-331 | src/ui/Features/Video/SpeechToText/SpeechToTextPostProcessor.cs:423-430 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/SpeechToText/SpeechToTextPostProcessor.cs:324\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextPostProcessor.cs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"05ce334b9f498e79bffe2d9e806c1bad79027ba064e710d546d59ed02044b997"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1740-1747 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:2063-2070 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1740\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs"},"region":{"startLine":1740}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed1dd1a2dc85cf42c08d6ea42ca2165f47ee76484edae02c13ea8d21ce4d03a1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 11): src/ui/Features/Ocr/Download/DownloadPaddleOcrViewModel.cs:100-106 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:376-382 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:601-607 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:707-713 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:795-801 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:879-885 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:994-1000 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1080-1086 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1166-1172 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1252-1258 | src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs:1391-1397 \u2014 there are 11 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 11 sites; resolving a subset leaves the remainder to drift apart. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadPaddleOcrViewModel.cs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a3588b5a077c38ab93b5dede370d018ec14a9cbdc435cb2f1a7d339367f9042"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): src/ui/Features/Tools/BatchConvert/BatchConverter.cs:711-717 | src/ui/Features/Tools/BatchConvert/BatchConverter.cs:1287-1293 | src/ui/Features/Tools/BatchConvert/BatchConverter.cs:1345-1351 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/BatchConvert/BatchConverter.cs:711\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d5d9fa4c07eaa87d9b7567feb6caa3da40ba6f028e632b02afca6f4b1b3db4d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs:2414-2420 | src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs:2585-2591 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":2414}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c3545ea68da74a25ee7ed90f1b9f29953a2dc5632625fac5bbe9a63779748e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/ui/Features/Assa/AssaPropertiesWindow.cs:114-120 | src/ui/Features/Assa/AssaPropertiesWindow.cs:121-127 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaPropertiesWindow.cs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c1c1578daaf11b45eb65f72d8b08dc91f006d4d16c6b18eda944d55c88ec8c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/ui/Features/Assa/AssaPropertiesWindow.cs:167-173 | src/ui/Features/Assa/AssaPropertiesWindow.cs:206-212 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaPropertiesWindow.cs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c1c3b706b2c6cc5603f45b32924e397aa2c70671befbe842eb98ff2b38e513a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/ui/Features/Assa/AssaSetBackground/AssSetBackgroundViewModel.cs:385-391 | src/ui/Features/Assa/AssaSetBackground/AssSetBackgroundViewModel.cs:468-474 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaSetBackground/AssSetBackgroundViewModel.cs"},"region":{"startLine":385}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa9b54e1873dfd76023fd9858de52ec4ce4d4a786cf766a3834913b9c733b105"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/ui/Features/Files/ExportCavena890/ExportCavena890Window.cs:66-73 | src/ui/Features/Files/ExportCavena890/ExportCavena890Window.cs:74-80 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportCavena890/ExportCavena890Window.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"c24dc72c3c9270d7648b4e8d4eb64397c7e479c2e61b5489646fbb46968beb39"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/ui/Features/Main/AiAssistant/AiAssistantWindow.cs:124-130 | src/ui/Features/Main/AiAssistant/AiAssistantWindow.cs:265-272 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/AiAssistant/AiAssistantWindow.cs:265\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/AiAssistant/AiAssistantWindow.cs"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"19efd6ab545e1f122899af20809547f609b3a37466a28374ac02a707d0a3a247"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:838-845 | src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:881-887 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitListViewAndEditBox.cs"},"region":{"startLine":838}}}],"partialFingerprints":{"codehealthFindingId/v1":"d71ef666f12d1de3c79eb6cd830ce087de59dd0af65a307aae750aecc80d1e02"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/ui/Features/Options/Settings/CustomContinuationStyleWindow.cs:214-221 | src/ui/Features/Options/Settings/CustomContinuationStyleWindow.cs:224-230 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/CustomContinuationStyleWindow.cs"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a04d721eb5874a9f0b4afdf876f732f76676630c702cc0152b82cebac3efbcc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/ui/Features/Shared/PickMatroskaTrack/PickMatroskaTrackViewModel.cs:162-168 | src/ui/Features/Shared/PickMp4Track/PickMp4TrackViewModel.cs:196-202 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Shared/PickMatroskaTrack/PickMatroskaTrackViewModel.cs:162\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/PickMatroskaTrack/PickMatroskaTrackViewModel.cs"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8b41830abe29866f198b5693bb2aa7a83a92e6d6a789ac17380452418fd32d1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/ui/Features/Ssa/SsaPropertiesWindow.cs:114-120 | src/ui/Features/Ssa/SsaPropertiesWindow.cs:121-127 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ssa/SsaPropertiesWindow.cs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c20d656af4e95e6d0f62b287249dfa7ec02016ce6cafd186ace9af66438f078"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/ui/Features/Tools/AiReview/AiReviewWindow.cs:141-147 | src/ui/Features/Tools/AiReview/AiReviewWindow.cs:480-487 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/AiReview/AiReviewWindow.cs:480\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/AiReview/AiReviewWindow.cs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9d8574d33fb9248d935ba16f78fccbe9ea1c68a55146ad53866466e65092104"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/ui/Features/Tools/BatchConvert/FunctionViews/ViewAdjustDuration.cs:69-75 | src/ui/Features/Tools/BatchConvert/FunctionViews/ViewAssaChangeResolution.cs:71-78 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/BatchConvert/FunctionViews/ViewAdjustDuration.cs:69\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/FunctionViews/ViewAdjustDuration.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bf86e7fd0d524718e1c0e9774b82b3d39d49bcd2a69c3a8c8c7d3cbf71381d0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/Engines/Piper.cs:252-258 | src/ui/Features/Video/TextToSpeech/Engines/Piper.cs:265-271 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Video/TextToSpeech/Engines/Piper.cs:252\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/Piper.cs"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"77554a1960303a3ec8a92423001808f210fa656cde18819d803bdb1ce0adb357"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/ui/Features/Assa/AssaAttachmentsViewModel.cs:439-444 | src/ui/Features/Ssa/SsaAttachmentsViewModel.cs:407-412 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaAttachmentsViewModel.cs:439\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaAttachmentsViewModel.cs"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"06d692bfa6a90a92b54de101c51a9d26bfd8e3a5cb4433c10dbbbc302c3e0e56"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/ui/Features/Assa/AssaPropertiesViewModel.cs:83-88 | src/ui/Features/Ssa/SsaPropertiesViewModel.cs:82-87 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaPropertiesViewModel.cs:83\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaPropertiesViewModel.cs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b4235c22e27b50bf144830e3179624f22393426fc31d29390e746d868671afd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/ui/Features/Assa/AssaSetBackground/AssSetBackgroundViewModel.cs:479-484 | src/ui/Features/Assa/AssaSetBackground/AssSetBackgroundViewModel.cs:506-515 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Assa/AssaSetBackground/AssSetBackgroundViewModel.cs:479\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaSetBackground/AssSetBackgroundViewModel.cs"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f6be7fdc1ddb148894c7a7ffa421fbc4fe2e99e2016e7a2931f5377bc984336"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/ui/Features/Main/Layout/InitNativeMacMenu.cs:302-307 | src/ui/Features/Main/Layout/InitNativeMacMenu.cs:411-430 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/Layout/InitNativeMacMenu.cs:302\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitNativeMacMenu.cs"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"09528da8ccf462a45ecc6b9f55bc99f6ae43de69d5b40c20d02d5005d28d2c55"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/ui/Features/Shared/BinaryEdit/BinaryAdjustDuration/BinaryAdjustDurationViewModel.cs:197-202 | src/ui/Features/Tools/AdjustDuration/AdjustDurationViewModel.cs:163-168 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Shared/BinaryEdit/BinaryAdjustDuration/BinaryAdjustDurationViewModel.cs:197\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryAdjustDuration/BinaryAdjustDurationViewModel.cs"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"173857682180cfaf93e10f179767d72613fd8ca4efb386dca9cf3068ef38d0af"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/ui/Features/Shared/BinaryEdit/BinaryAdjustDuration/BinaryAdjustDurationViewModel.cs:210-215 | src/ui/Features/Tools/AdjustDuration/AdjustDurationViewModel.cs:178-183 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Shared/BinaryEdit/BinaryAdjustDuration/BinaryAdjustDurationViewModel.cs:210\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryAdjustDuration/BinaryAdjustDurationViewModel.cs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"e42554de6b97730f6246b866f1a5f2d48122bd51c737f4e1b0e34980a5a2fa31"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/ui/Features/Tools/ChangeFormatting/FormattingReplacer.cs:66-71 | src/ui/Features/Tools/ChangeFormatting/FormattingReplacer.cs:74-79 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Tools/ChangeFormatting/FormattingReplacer.cs:66\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/ChangeFormatting/FormattingReplacer.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b595b6a645e2c873345424bb4b0f8935f8393acaeec94fe60e98553b99f9f44"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs:519-524 | src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs:556-561 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeb66598b429e3947ad6a30c1ea1799327476282f24b6ccb6429a5b1b249b6f6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/ui/Logic/AvaloniaColorExtensions.cs:34-39 | src/ui/Logic/AvaloniaColorExtensions.cs:41-46 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Logic/AvaloniaColorExtensions.cs:34\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/AvaloniaColorExtensions.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7d9d4739141e58fb0068e6d138fced19c9ffa9d245e26f98116fa959c3c3ff7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 5): src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:883-887 | src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:936-948 | src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:955-966 | src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:973-985 | src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:992-996 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/Layout/InitListViewAndEditBox.cs:936\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitListViewAndEditBox.cs"},"region":{"startLine":883}}}],"partialFingerprints":{"codehealthFindingId/v1":"c29cca991c5c0ef96a1a2e343b5a0186b8986c1a5e75b760f1fde283397bb791"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): src/ui/Features/Main/MainViewModel.cs:19767-19771 | src/ui/Features/Video/ShotChanges/ShotChangesViewModel.cs:205-209 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/ui/Features/Main/MainViewModel.cs:19767\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":19767}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec8b1e3e1a307b28fbd5f083e71b6aae94d72d52cdd37776fdaf6a076d2bac9e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): src/ui/Features/Video/BurnIn/BurnInViewModel.cs:1380-1384 | src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs:999-1003 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1380}}}],"partialFingerprints":{"codehealthFindingId/v1":"93314163f7dadb50ae4e4164bf2ce394c98c81735edb39af9a31537ffafbf759"}},{"ruleId":"D11","level":"error","message":{"text":"Flaky test: UITests::UITests.Features.Edit.Find.FindWindowHistoryTests.UITests.Features.Edit.Find.FindWindowHistoryTests.HistoryButton_MouseClick_OpensFlyoutWithItems: Passed 2\u00D7, failed 1\u00D7 across repeated runs."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"491b8f76e9cbc969dc35a06da4c891b6e52733eb9484e86c42186a4067393a6d"}},{"ruleId":"D12","level":"warning","message":{"text":"Prerelease dependency: Microsoft.Extensions.DependencyInjection: Microsoft.Extensions.DependencyInjection resolves to 11.0.0-preview.2.26159.112, a prerelease build. Prerelease packages carry no support policy, may change breaking between previews and can be unlisted \u2014 pin a stable release before shipping, or record the reason this preview is required."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4e8afe1bbf2c19f8fc6a2494d768ec56f3700f0a25f98099eda6e5ca917dceb0"}},{"ruleId":"D12","level":"warning","message":{"text":"Prerelease dependency: Microsoft.Extensions.DependencyInjection.Abstractions: Microsoft.Extensions.DependencyInjection.Abstractions resolves to 11.0.0-preview.2.26159.112, a prerelease build. Prerelease packages carry no support policy, may change breaking between previews and can be unlisted \u2014 pin a stable release before shipping, or record the reason this preview is required."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f62ec82a1020e3fea6adc487db800feda9ee03928371d9a16e7ac5fbb24a8964"}},{"ruleId":"D12","level":"warning","message":{"text":"Prerelease dependency: Microsoft.Extensions.Http: Microsoft.Extensions.Http resolves to 11.0.0-preview.2.26159.112, a prerelease build. Prerelease packages carry no support policy, may change breaking between previews and can be unlisted \u2014 pin a stable release before shipping, or record the reason this preview is required."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3d709d87eb1baf7fdf4088308374d5bafbecac3aa18c2c5466425c0d7a2361e1"}},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bebf65ffb440562abd5fa346ca616f49e7ee7fe557a08d5d6857a238a1db1eef"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/ui/Features/Main/MainViewModel.cs: src/ui/Features/Main/MainViewModel.cs changed 464 times in last 90 days, max complexity 153. 163 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, cover the area it touches with tests, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"49732597be46e61b755410b29e597f8d8d80766e9856d115def64d0371098a23"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs: src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs changed 93 times in last 90 days, max complexity 74. 15 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, cover the area it touches with tests, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3d4cf25d0bdd6333349ae0c9f53df94d41bec0ab0335aacd95ae8e18178bdc3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs: src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs changed 40 times in last 90 days, max complexity 169. 8 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, cover the area it touches with tests, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/DownloadTts/DownloadTtsViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b60022ea176bf1a0e131c7b791de89cf6ce49e8656ab3073693d0c16d49dd597"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs: src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs changed 96 times in last 90 days, max complexity 54. 22 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, cover the area it touches with tests, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"047935298866104d8fd969b31908f4b4f44d6c565db4d81b4791f66c66ab2ad2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs: src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs changed 43 times in last 90 days, max complexity 88. 8 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, cover the area it touches with tests, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6eb8895e4ff95911a21fd533d029b815b61b914f0c9eaae8e88fee1a3fa0149"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/ui/Features/Ocr/OcrViewModel.cs: src/ui/Features/Ocr/OcrViewModel.cs changed 73 times in last 90 days, max complexity 49. 30 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, cover the area it touches with tests, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a8c02bbe76c89467148b6bd20ef24238654d868a7617775efbcfa004971f5d5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs: src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs changed 89 times in last 90 days, max complexity 29. 25 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, cover the area it touches with tests, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b678a25aa0a6034b4201ba77cb31403d2a6b562549928951751a42762d413e7e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/libse/Common/Utilities.cs: src/libse/Common/Utilities.cs changed 21 times in last 90 days, max complexity 121. 6 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, cover the area it touches with tests, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/Utilities.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cb293361575a2ce9c5e78e8d221472cf25af38d50170617f692982cee374301"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/ui/Features/Translate/AutoTranslateViewModel.cs: src/ui/Features/Translate/AutoTranslateViewModel.cs changed 48 times in last 90 days, max complexity 50. 9 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, cover the area it touches with tests, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5598d53f90d7a07d23bab1ff9deb9a79318bfc8fbe14b46fa84627e67664c7c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/ui/Features/Tools/BatchConvert/BatchConverter.cs: src/ui/Features/Tools/BatchConvert/BatchConverter.cs changed 28 times in last 90 days, max complexity 74. 7 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, cover the area it touches with tests, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"21c91d6429aa068ace9f7256751ecda2325f2495a78d24aef40b7366a93a6feb"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 425 significant file(s) lose their only recent owner: src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs, src/ui/Logic/Download/DownloadHashManager.cs, src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs, src/ui/Logic/UiUtil.cs, src/ui/Logic/ShortcutsMain.cs, src/ui/Features/Tools/BatchConvert/BatchConvertViewModel.cs, src/ui/Features/Translate/AutoTranslateViewModel.cs, src/ui/Features/Video/BurnIn/BurnInViewModel.cs (\u002B417 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9c3b511aeae50d9efd0d50483e2a120b321c48fdbd971c01a984afe634de17ae"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 15 significant file(s) lose their only recent owner: src/libse/SubtitleFormats/DvdStudioPro.cs, src/libse/SubtitleFormats/Ayato.cs, src/libse/Common/SeJsonValidator.cs, src/libse/SubtitleFormats/NciCaption.cs, src/libse/SubtitleFormats/Pns.cs, src/libse/SubtitleFormats/AvidStl.cs, src/libse/SubtitleFormats/Ted20.cs, src/libse/SubtitleFormats/CheetahCaptionOld.cs (\u002B7 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7859bd84ae30ed9a87494c4d6bfcce4b3dd178b06b3a7eb76ec7c45db6959565"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #3: If anonymized user #3 becomes unavailable, 11 significant file(s) lose their only recent owner: src/ui/Features/Shared/BinaryEdit/BinaryAdjustDuration/BinaryAdjustDurationWindow.cs, src/ui/Features/Shared/BinaryEdit/BinaryAdjustDuration/BinaryAdjustDurationViewModel.cs, src/ui/Features/Ocr/BinaryOcr/BinaryOcrDbEditViewModel.cs, src/ui/Features/Ocr/BinaryOcr/BinaryOcrDbEditWindow.cs, src/ui/Features/Shared/BinaryEdit/BinaryResizeImages/BinaryResizeImagesViewModel.cs, src/ui/Features/Shared/BinaryEdit/BinaryAdjustAllTimes/BinaryAdjustAllTimesViewModel.cs, src/ui/Logic/Config/Language/Tools/LanguageImageBasedEdit.cs, src/ui/Features/Shared/BinaryEdit/BinaryAdjustAllTimes/BinaryAdjustAllTimesWindow.cs (\u002B3 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dc473df28f2075735c69423d014bbb7eb3d2b1f82333aaec09b0f87e4e760fdd"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #4: If anonymized user #4 becomes unavailable, 5 significant file(s) lose their only recent owner: src/ui/Features/Assa/AssaImageColorPicker/AssaImageColorPickerWindow.cs, src/ui/Features/Tools/BatchConvert/BatchConvertAssaWindow.cs, src/ui/Features/Video/BurnIn/BurnInSettingsWindow.cs, src/ui/Logic/FontNameService.cs, src/ui/Features/Shared/IndeterminateProgressHelper.cs. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4fd0473c46cb4ce925c3bdeca0dc2cffaac89cbf0f56dea3fec0ff00ebcaa95b"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 3 other contributor(s) are each the sole owner of a small amount of code below the off-boarding threshold \u2014 folded into the bus-factor score and metrics (461 single-owned of 1360 analysed files in total, counted over production source files of roughly 100 lines or more, excluding tests, vendored, generated and example/demo trees, largest first). They are anonymized user #5 (3 file(s)), anonymized user #6 (1 file(s)), anonymized user #7 (1 file(s)) \u2014 spread or document their files in the same way, at lower priority than the named off-boarding risks above."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac528f2429e724e1a97ed868f79eefbcf1888dab4af9a9e673429369bb5b2f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: ??? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Cea708/Cea708.cs"},"region":{"startLine":574}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf51d1cb9b53aad2b87d6f9fda21f78759d4cc19d809a897a8841c2901b1d449"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 8 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Cea708/Cea708.cs"},"region":{"startLine":575}}}],"partialFingerprints":{"codehealthFindingId/v1":"80ec52ed65ef8a38cfcd0f6e818e1905c758029b57a34db84913ba74f99f174e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: improve italic support \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Cea708/VancDataWriter.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c68166778e4cb552550fa0846ae0b3418fd97d3c8201cb9b235d2088fc136e8"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Cea708/VancDataWriter.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"001f4797078c7f2c6dd1f744fdb0a28bc3d02bfb8884af9152ea82268b2b9dcc"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":1512}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc17c7cd1fc995b69a2a3ce30485551ef10fcf5cdd6e235a64580d529396aa4b"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":1520}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8b95a1abdafef5d1559866e59d62e322db2261b214a4c9e98ddc7280e54b4ed"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Smil30.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3af21936a4e8283c96c63876d4b75b646908318e32f51f0dfab22d4a6eb96ebe"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Smil30.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9d51dde3df7bce7e3fea8818c1a245f97c970171f28f67045e0637f0f273027"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/AutoTranslate/KoboldCppTranslate.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"beaa70557f393c713bc0b5d2c99edad8436ae093312c3361e1851e50bcd9c181"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerBluRaySup.cs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"8956cfbb3d887a34ef39258c22d8268b2371173468ef1b8ddcfb1dd806702ec0"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs"},"region":{"startLine":708}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f767ae75918f8df9a6dcdcf201a4963c830c4c472f8c209b855cef28cd04b6c"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/WebVttProperties/WebVttPropertiesViewModel.cs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2f1c8fb8661cc6420b0986136d147ae271975e66d7f8930a266ac526a7ce621"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":12142}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb877810f007b8c3f333866446b6f93c68693d870aa84c5cf011b2f3033a08f1"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrSubtitle/OcrSubtitleBdn.cs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d33fca8e513d709e9e4306138c28476e8556f8990e4baff15755816465d14ef"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/libse/Core/StringExtensionsTest.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e53c50165440d8b74e27a6e0a9f9d69fa34b1cd64339a523812e620f248eaf2"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/DvdSubtitleLanguage.cs"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"24f401be1fd2194514c7a63a620b426a4f8b7601174724c8f355fe5f5079ce64"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/FileUtil.cs"},"region":{"startLine":831}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f3df61885a3cb241fbfcd53f25ce550305079c660cd1217c2b89c7c14eadb4c"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/FileUtil.cs"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff21a05f444dbb722b32d1d2ab3958c815029d1777c31dcf416269e06fb28e4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/LanguageAutoDetect.cs"},"region":{"startLine":1984}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc62aa9715de4e067fe8d739f7a328e05ad1209328863e4b16e1695a40ab1b9f"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeLogger.cs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc595e875257782e5efea0d5b816a955dec6ee083a3d0db230eefba620d9f9ef"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeLogger.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"7742dde9232b6e6f84109a50046089864d943027a963dc2ca8d4e35a5403974d"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterJson.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"1928449a5d6dd288d7da93ff69a82e2bbf4bbd3f3b77482b94066d764931052f"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterJson.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"455d118796b1f7a60cd746191f45c633c041c0ab37e8d7686b9833d403517d30"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/UnknownFormatImporterJson.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"a17a7909250280d7b7875f44503774bb4fd2cbea82e80f9ea8ae1acde60e2b56"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ad3329c9c48da2a80d752d18b916dba8a9877a1f79fbe0ed853eaee91423763"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/CapMakerPlus.cs"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d2b318c10fb59869f9dbb25d71b09a2fa25367505a0ddcdb576eaad5ef718e7"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/DCinemaInterop.cs"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"06dcf9d30ef271f8bd8880ac2a8dd6fafc89c92e6763ab0e4ac555a826380f0b"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProImage.cs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"b63842c483043025c0a72625b74113ebb7c43e5f3fd914cf7ff3667b455bac86"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProTest2Xml.cs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"03abfafb4c0b71acb93ed2b498939ae9ce849516f86017fe01d48498e4aef088"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProTextXml.cs"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"e69874a80927685ecb55f25c9b7dafb2b9a822901579cd523635ca4af1fe7d5e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProXml.cs"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb267e2594548989dc19a7305af22a29f3b53c425feb431930aaa4af118ba8ec"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/ItunesTimedText.cs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"2da3c381ba8c27777e4430a0640aa891936962eb26024887ac9502c98b27853b"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/NetflixTimedText.cs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"030ffe63a636d8998d8dbab84d718f72ed081b73748365cd5946ac855f8e470a"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":2156}}}],"partialFingerprints":{"codehealthFindingId/v1":"febd5648b09a31abd5e9be81787d9aaf9e71a20600a978854d7096d31dfded91"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/PlayCaptionsFreeEditor.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f75a2e34e0f4779727264117905473332571c1e60dd0e8511c17a85bddacdcd"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SmpteTt2052.cs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3b05f76ffcdeba9383e88291e746353f9ac7298f17ca8b6c375dd83636f6af1"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SubStationAlpha.cs"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"c588fd4a647fc89ffde298453244a1de86f3574f2b5c356bb69a84d197a81851"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9878c1ee333a93f1a9d773554e7cfd1fce3b6d1d4337e40de55b6514d122f99"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4c0661cc4a1d923839a2b6090ac40f01b8adb66a0d037d7f481c0728cb51bf7"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":847}}}],"partialFingerprints":{"codehealthFindingId/v1":"c445d28d88a3e3af773f71020d2bc5fcdf79fac299634437cafc47f34fa550b2"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1444}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f6b407b1e5e3c078adbf248c093af6ddf322200b521dbeb5a903b90a5ac598a"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1474}}}],"partialFingerprints":{"codehealthFindingId/v1":"c76b50f638a3edc6e05ec48f30abccbf8770ebda786ecb518eb0ea827a182371"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1518}}}],"partialFingerprints":{"codehealthFindingId/v1":"498285c9be1f562895a35638472e9e9f50d06502781747f6cff9a68218d39a7c"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedText10.cs"},"region":{"startLine":1564}}}],"partialFingerprints":{"codehealthFindingId/v1":"76d359381f2a00ae75d0cc6390b81f7b587f9658500e6122900aff45ee3fa66c"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimedTextNoNs.cs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"afb42c140117bcf1e51da48cd838775d916595dddb2486d6eda36acbc7e9bd66"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/VocapiaSplit.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0f0cb96884f418430b7ece04107f25bb71463b244e0cc2984b21b88d9aea596"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/AutoTranslate/GoogleTranslateV2.cs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"31de2c858107169087845af38b29bc19fdc197a76ba05bb8b3eb9d45e9b30f23"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/AutoTranslate/MyMemoryApi.cs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab0fe76f41633625db1e33deac40f1204e6fe56088dfbfbe2d2176fc16c68b76"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Http/LegacyDownloader.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"98dbfa177e87470d76241a9cd9793dda18f1074843eaee053623b65d617b34a6"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/SpellCheckRegex.cs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b73cb818e99e536260309b02ed504b4d508689395614b64e1b302d1a3087dbf"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/TesseractDictionary.cs"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"38d01e34086755fbb9274611b8df83bcc18495ccbc1bdce85ff6d0ebef0e4bee"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/SpellCheck/SpellCheckDictionaryDisplay.cs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ffb5386ed69a20a6f6a8270cc5561a8149a90abce3addc5e7613c07d813712c"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/SpellCheck/SpellCheckDictionaryDisplay.cs"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"3559bda4b7bfd15c604276319a3eef5f6ddcd59d87d121b671904778f7d0da94"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":657}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2813bce040d36b91c6ac80c0059074b006fea77ab2837b10cacf7ccdd15c770"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/PaddleOcrEngine.cs"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"83ee39b124cb2d8c96c23344dd1e3cf7e8abc093d6cf5700f41a5afd66dd20b4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/VideoPlayer/VideoPlayerControl.cs"},"region":{"startLine":583}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a614360a447881f8f1fdd6fd60e3d8d99a7ce9e77f0f3b534dc1371eede31bf"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/VideoPlayer/VideoPlayerControl.cs"},"region":{"startLine":645}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e033382e62efee92ad73fa1e6e7c86b4c5aaf20fbe81075f36b3311fdbf0ab3"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectViewModel.cs"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"91ec7a565bef42d9e491ba52b1878a91d03396584904eec4c61855d4753a9c11"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaApplyCustomOverrideTags/AssaApplyCustomOverrideTagsViewModel.cs"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bebb8da659f5ab0216f2e1c96f20ba92bd4b169e30d8bcf9f2a30e690724a03"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaSetBackground/AssSetBackgroundViewModel.cs"},"region":{"startLine":746}}}],"partialFingerprints":{"codehealthFindingId/v1":"46d7e27a25f125f97beb202d31f71ad6209ebe4aa98d8dc097b52c02e94aab1f"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesViewModel.cs"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"4693e4a7b2f72e0b7e656294de5f831f826b8a804105e265dc0970129d44222e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/ItunesTimedTextProperties/ItunesTimedTextPropertiesViewModel.cs"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"8038628fb56c7c703b4fbee35ca3c1499f01dd341cc464552bbded57057d6da5"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs"},"region":{"startLine":671}}}],"partialFingerprints":{"codehealthFindingId/v1":"49e0032732bf882967d8d184eddfa688f5c86dc076e0219ff56c552098b4f335"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs"},"region":{"startLine":718}}}],"partialFingerprints":{"codehealthFindingId/v1":"08119eeae3a6b31bc87d66dc2cf269ca70d511378f8384a32124e3d874b7785b"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/TimedText10Properties/TimedText10PropertiesViewModel.cs"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c20afd817a7d72c62ed7adb2774597db43dff7489193ee1599afbbeea88f975"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/TimedText10Properties/TimedText10PropertiesViewModel.cs"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"184b2d237778b554ea339f2e21ffa0bc180d84fb171237ac79f6acab09dd502a"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/TimedTextImsc11Properties/TimedTextImsc11PropertiesViewModel.cs"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"eebefdea7c1b8a7a0d0a3ada8d394aeb498251ae627a22ebb6a07c8f1489e2e4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/TimedTextImsc11Properties/TimedTextImsc11PropertiesViewModel.cs"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"8857fdb39c01e3bfae3ee5d4c497f91462c5232abb6062b808765786d4af8509"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/WebVttProperties/WebVttPropertiesViewModel.cs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e727774920a688f091a2aa8753234ce846de54a061e682af5265dcceac0641c"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/WebVttProperties/WebVttPropertiesViewModel.cs"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb142c91108b941fb295a4f781691fce04a02f1148290fb6155ccb2d5a87a3bf"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportImages/ImportImageItem.cs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dbcd5158a1158653ac9e689873c865b4fef6d78da7e72e266b696806f6b21b4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportPlainText/ImportPlainTextViewModel.cs"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"e59a26949a810d26c7847eadf7990120b9a46f1c0f2f5c718230fd0bb88a29d1"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainHelpers/SubtitleFileService.cs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"24a87d69e03b938edcda48a23a0421a201db01f3854eca7c5d399ed6ffa4b016"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":805}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b8076b9d953eb0eee055b5371b170da92d246458c345c7634944e9f9c44658b"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":911}}}],"partialFingerprints":{"codehealthFindingId/v1":"c44868f053526873448b2d3d457a56516e9105291ab382afa1951d82d27e656a"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":16097}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd85209e4f99662917b45b06ebc91c52bb9f12a5da948e66c171c88a47fa5ffe"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":18596}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b4a4d1be71bbe7ed5794b814847e72bcdbe463bd70c1968ba3ef41bca652d3c"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":19736}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a6f33eeaa54735e2046cbe7a7f139d352bedc073c42e0ef730a358b93358dfe"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":19790}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7d1b40de835ab7edd7b6bf64fac652b6ab9674dbb5dd7b8821fda42cbe1fd78"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":23229}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fdf084e2b50852d5f3f9e60b0dfbbe58087047e1638f1dcfedeb7851132659e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":23370}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2a5e8849b1644fc3ba0853f6714dce39763d4fd4e1af2fe0a00a2b65cc977e6"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":23428}}}],"partialFingerprints":{"codehealthFindingId/v1":"46678923962d53f58e47a3cb98c86feb00316e5e092e0ea98adc49e687481fc6"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Download/DownloadCrispEmbedViewModel.cs"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4b0662cf0611fe551b7e573238b5b23ca39da2ab0351fa41faad3ad6d33f268"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/CrispEmbedOcr.cs"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"20526ed093849ffd289da1fec32a00a0b7f028087dd6efff1eae39a73735cdca"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/CrispEmbedOcr.cs"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"4640442c751e5436b2fbd24efb74313c88b86927fdf9938ad369005075b8d9cb"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/CrispEmbedOcr.cs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"a36eacac95d32e520514e69020b68f66a1299941c17f599f6dc2be958b378d58"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/PaddleOcr.cs"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"f19b782c6521612fd6863ce865bea3a781f7712515d7a645b85066e81be3fc86"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/PaddleOcr.cs"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"92b40460c367e8d01c5687522018b265fc0a9d074168062aab6d743f5210eb41"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/PaddleOcr.cs"},"region":{"startLine":478}}}],"partialFingerprints":{"codehealthFindingId/v1":"cacc3be0a9bd17fada740cada4f8dec2d26b8c7a84399bea6672a447663765c0"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/PaddleOcr.cs"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"d20c8373f11e49a9eb10991c3fd028e1c77728f896b485e8f56d00ee4501e56f"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrSubtitle/OcrSubtitleBdn.cs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"a631dea299b4e71dce04623ff14796a6ddd61d833c1d67565c526474730f48fb"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b9fa7c673239ac82a884430f6ba33f14057cbbc27c78ef61bcbfa1a8b2b8314"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":4366}}}],"partialFingerprints":{"codehealthFindingId/v1":"8840136d2cca600a4899e79ffb418bbfd063fb2c6d08f245006308010e50c581"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsViewModel.cs"},"region":{"startLine":2341}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0187459bf01116df5f60b87865a98dab0afbbc9cf1ff525ad310aea5fae4d4f"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsViewModel.cs"},"region":{"startLine":2356}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a5b1e3d8caf8d731b4f43c7c497414834044858f927a64a623965cb7a551736"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsViewModel.cs"},"region":{"startLine":2391}}}],"partialFingerprints":{"codehealthFindingId/v1":"a86c5074688d7209cb1d0384566ddc9623639ee29c3ca06ce2806457149a70b8"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/DownloadYtDlpViewModel.cs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"80f7eac0c57315af6b60085702ff4cc6c8ca5987427fe952365acd56d58ce778"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/FullScreenVideoPlayer.cs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"836256dcf1ed05eecc68c54f60c2aa337dcdaeb2092cab0c220483ed98babe63"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/IndeterminateProgressHelper.cs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"8162427353a3e0e43e37c8564d75b0b71ae3b9a8b0faaf79d9fbf8a276f25623"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/Undocked/VideoPlayerUndockedViewModel.cs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1246ed0d1b1ec7f9a6a593ef6e860e6115e755e94973716b33c7809f25614e9"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/SpellCheckViewModel.cs"},"region":{"startLine":720}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4a4ada631ceb5df642d068e409287274fbcd00279417a2b3990aafd27c15d75"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/SpellCheckViewModel.cs"},"region":{"startLine":1182}}}],"partialFingerprints":{"codehealthFindingId/v1":"292c2f5ac34bd4e3800acb61f0f5002289262b75d2dc0709d2ba548106f20bc3"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/WordSpellCheck.cs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0550f006fd0c738f9af9fa1cb1db6c69bf17d2647f57a3b770a8b93c94612ea"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/WordSpellCheck.cs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0b5c6135d38f7ea0d025e53a73cd34e45148b49b6d3516a7ed5af2a7d90235d"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/WordSpellCheck.cs"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"faf8b8574a2aa6259bb91761627502f51d723a4944af89593d0256d718ea9036"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/SpellCheck/WordSpellCheck.cs"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"cec07aca4b7d4b646ee5d904892dfb6156af45051efcc6402fbd08d94a63fd9d"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsViewModel.cs"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c7a5453aa9042328d6d9958e61c42e51752a68750d53c413a7b6e999c18ad40"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":1640}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2e93618f2ccc6def0de1b4e8b18df0d9e721893ae38fa4223a777f95edb4cc0"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/DownloadLlamaCppViewModel.cs"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cf5af6ca4a99188471dec4dc5dbae8b549bce50cbc8635dfb210f494646d66e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":644}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5fc7e848b49678fd4afac51d0e1aa3662e742ddab9d8e9720611720fdd63084"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":2018}}}],"partialFingerprints":{"codehealthFindingId/v1":"57ddd319ac2d31311121efb0382cbc1db06f96d0546985367a812967ca0aa0d6"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":2306}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc5496371d7ac1a6d2cd407124c75b490962e98b29c788e5334d052390757aa7"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":2318}}}],"partialFingerprints":{"codehealthFindingId/v1":"71682cde08b7c8adcac491f87c09b75df5a46420713160357b3181c405fd0fc1"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/CutVideo/CutVideoViewModel.cs"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"717b94478b147e52ced1ae4820cd132c0fc951ce9f918a728744b4c2b6e835a7"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditMp4ViewModel.cs"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaea5b1a274a16248638364282358773453b15904edff130612e95f61ef71e87"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/OpenSecondarySubtitle/OpenSecondarySubtitleViewModel.cs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"8270a7db2961cb1b3d9b906fbe224b610cb1711ae5c4272ceec093076da40bb4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/ShotChanges/ShotChangesViewModel.cs"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f2a66240f06ea95fd3c694400e2ff6b647ad491b0b54917f352697de8dcbe77"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/DownloadSpeechToTextEngineViewModel.cs"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"d90a7fb893a509cc02d3d03ed50ce971b4391699baacb634a2ec8c9e02d5881a"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/DownloadSpeechToTextModelsViewModel.cs"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"19fccb33de61af367181c7889b40397a8c561dd8a27115b9022b5376d3f28b3f"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/DownloadSpeechToTextModelsViewModel.cs"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ac23cc136e5229ffd786e12afc012a305cc966681919b979b2ce52735b1d022"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/DownloadSpeechToTextModelsViewModel.cs"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"d444548b2f5868bf446d56ac0f8f9deb870049e53c6ee901f077715b83c90c18"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":1113}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb1d37b08caffc1b4f8219a020386e05ca09350d3f8941dbd10c4ff3f42422f2"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":2088}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbd24c5d48a689cb70442c2b3604849e97d68203c4b9796b51f920b577a8b363"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":2487}}}],"partialFingerprints":{"codehealthFindingId/v1":"97f483210c8ae4931e9f444378c5e66266e72a4615916085f8ad1f6797bfae42"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":2502}}}],"partialFingerprints":{"codehealthFindingId/v1":"aee8625b066809b44f7837fe3de3fccc1108424ec96375371c9015e7aa770238"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":3595}}}],"partialFingerprints":{"codehealthFindingId/v1":"33bb2b2e256b32f9a0e0faf692cb98b50d0dda122542f2b00a01081c88a5d856"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":4051}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b9528db99bb3f99b6dba5c89569ab099e52862889eeac541a7d807826b1ad04"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"831797262f966220c1c5c82ce40092eba25ac5af0659218a0584cf7b7d0c4b71"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/EdgeTts.cs"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"6181156559f376e4e38cc4579cc1431badaf9c5e6a5420cbae3399b23a95bf02"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"e878f8f9b269f91beef89cc52da276b379fc4c2ea27c97299b59f5be202882cb"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8b119c64886a795ad51bf1b12224708d34c12e33c21103c554b07ba7758e6ba"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceCrispAsr.cs"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"b05e48a48b49cb5727434f780e7b2f747e701a4bf4607e41ad7764e39b991cc8"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/VoxCPM2CrispAsr.cs"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e49b80edcfa65836f6aa7df3add54630b9ed9e731319ff11e3ac93da173b0bc"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/ZonosTtsCrispAsr.cs"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"f16e886a8e01584d0f860d0a373f6fd046800ac15d3afdb893672532f81e34cc"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs"},"region":{"startLine":1891}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb13794dc3b668ae6612849bfefdd4484ea75d91068c28f44aca2f49dad52e1f"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":2383}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a10ebadad8e347f05dbec4d06e5f458f342ddd7839a07608eec66da01b71a69"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TtsPostProcessor.cs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fbf978b0161a987b62cb59d37e491c2db2f93cf0c3bfd2e5b85eeae14d58a08"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TtsVoiceInstaller.cs"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"69f1093df919d59e89e596936dc2638b9da0246cb55706f4afd13e5b9f21c175"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs"},"region":{"startLine":1434}}}],"partialFingerprints":{"codehealthFindingId/v1":"96c58116b96fd77877c7b408a80303d6c7ef3757c127855c3292ec22b4c276da"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs"},"region":{"startLine":1446}}}],"partialFingerprints":{"codehealthFindingId/v1":"81a74efb1f6100a9d063b6312e21a2c8883f4e0ddcaf51609ca681069b5bb22e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/VideoOcr/VideoOcrViewModel.cs"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"518db4a976ae26fd4b2355d6705c60a921aa5f2e7be1b8cf426256522476b567"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/VideoOcr/VideoOcrViewModel.cs"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"e84dc1965544366d551a46209a877342a6c1e676ec03af037474a3423e3b9247"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/VideoOcr/VideoOcrViewModel.cs"},"region":{"startLine":544}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d1eb31df8350889754f6b193d8005012d3a8e5e3fa7cfb1e32a92ab0fecc3ad"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/VideoOcr/VideoOcrViewModel.cs"},"region":{"startLine":679}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a406cc7adc8938a0dfd192052ea448de514b85a800176a36581bbb44e662e2d"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/VideoOcr/VideoOcrViewModel.cs"},"region":{"startLine":740}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ff6596daf348419f7df694e19077ad0ed9d2410fe4d900b37a84e3994ec4192"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/VideoOcr/VideoOcrViewModel.cs"},"region":{"startLine":1126}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e56ae0ba75591eb4ff5f80cd1872871e432c8844aaa14509f21c31be2aa8f9e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/AutoBackupService.cs"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"69d1b0cd25e94d728c40cc9c42eeb1ffc6d16dddeb51490cdca33324fd086694"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/AutoBackupService.cs"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7b48a0f4356c71cb3b4f3ae7c91bd2d4d10eaa0eaef5f26ff8613ac54906f78"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ClipboardHelper.cs"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"2408ee622b29ee731f4cfdacafb4a95298f9916bea9abdfed6e338be9926b4ef"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ClipboardHelper.cs"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2a1a0ce6912b820a2f558a8a73fab333856afb5dea8a7b193fe96516d4a90e3"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ClipboardHelper.cs"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d0342c70fa85538bf41c8c2ee83f6fec80b0f433ea62f5355d3251f1261093c"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ColorService.cs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbed2e15b4b140027cb500ce447465f05adc6cfd6fd370b77b97badb449c9cc4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ColorService.cs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca79b37f35ab2c9b0cf0c6da73aca65575b102c9e3fccd2b72069a98ff57dbcc"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ColorService.cs"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"adb34a7594478525ad6d24c328d76497d9434280a3878c5c66ab6f9805148b79"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ColorService.cs"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"e798c19ee6cafb2201b8942e15afd5f4953aa7936bf40973cb6f80a855ed44fa"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Config/Se.cs"},"region":{"startLine":685}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa96524436b2628740a972a4516ec9f7bc9c9bff84433aa4045de92ab9121cfe"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Config/Se.cs"},"region":{"startLine":689}}}],"partialFingerprints":{"codehealthFindingId/v1":"77a24e9fcd67f9dab1084f471bfa99244389ab6ad15f6f453e509d522eb31733"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Config/Se.cs"},"region":{"startLine":748}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3f7c50994082e9f38d20bbafadb837ac0d9c4067b018f1f51b3407ce914b989"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Config/Se.cs"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"368e93ba06dbac983a89745b3fd560ae1c9db514866eec692ea9a15d15abf08a"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/FfmpegMediainfo2.cs"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"803625f6813e71ccc1019ae1230d815c53b0c99c704d18e8bc29e52658a8ea5f"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/FileHelper.cs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e1baec6421fef7972418ec4d48e18baebf7c3857728649c0bca5c88d65e0ce1"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/FileHelper.cs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"969bb3e5bd65fb8edcc9361465a7623c04fdaae0dfc532b91cacb374cca0f4db"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/FileHelper.cs"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cdf4fb2716b854c73907aba38c45a5df19c5080d6ec6a9c7fa8526e9c058fa2"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/MpvReloader.cs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"38e8bb9f10e922805507736d9741873195c5322eb8b6d89a221ecf3493ab18a7"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/MpvReloader.cs"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b8a0350603f8e38effddcd949b6db4a69d96b64466a7c2a6bc77d4c23c6057f"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/VlcReloader.cs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"0072c3761e45da4bfafa495f7487761bd60c6ffbc3cca103ce5b15891582ccb7"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/VlcReloader.cs"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"2261983a122c065df4ec46b589732d019cdb76ad916ae6c4c9f21bba0920e765"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/WaveToVisualizer2.cs"},"region":{"startLine":429}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3f42ca45cce5ee7495f13d4a5ed4087c6c0dd86a43f58598a45b7473ab40b41"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs"},"region":{"startLine":693}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d073df69af734dccb10ce4721963d096f7bb791e59032dd9f72854944b22bf6"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs"},"region":{"startLine":876}}}],"partialFingerprints":{"codehealthFindingId/v1":"9103eb520df6c4e7b37763cd08037aa830270c42cbd4bbcccc68ba5546c5d596"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs"},"region":{"startLine":957}}}],"partialFingerprints":{"codehealthFindingId/v1":"3168c6a359b9b51d068ac0603a85e5e302c32955e20502de9da73846d43fc966"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs"},"region":{"startLine":996}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b5032753f822394ba4d3f7ede88640abaab32de7369b338b8ac7961f18da7e8"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs"},"region":{"startLine":1122}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5e8e0de1deebb5f59f4d382e22a12fc7253e8871a5e4a7d4e1ad1f6d29d38de"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":1425}}}],"partialFingerprints":{"codehealthFindingId/v1":"e299b321e1f446cdfac9597a5529f6ed99d97a55ede6e6b26259336d5bbd4ca3"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":1439}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae2d7dbfdac17eae0550e19e2281faac3a5061be5462873e7c68c36e9e9096d8"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":1452}}}],"partialFingerprints":{"codehealthFindingId/v1":"c16b392fba6f39e2e88336af1e7d7e589e79beea86dbf2c6c80eca8112e83d1a"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":1468}}}],"partialFingerprints":{"codehealthFindingId/v1":"46a815bd55703026c6b3d1acf99da56c1d9d4c1e5680312a34b2dd8da798585e"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/SeJsonParser.cs"},"region":{"startLine":1494}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7b1c0209c5a992830a183b177b2ad231ea847bba74f09ac06dfc2b4408d1171"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/TeletextHamming.cs"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"f591f2f521c666a18bfa3e81feefbb45e9801bda9167721fb2592142b29f409c"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"22c6ee2dcee4e44d36e3a5e6b6d3f543e4a2dcc084e6923f62d89817b3f15a87"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Chk.cs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a234afc61885ad06035e03215fc277f5c1f7dc06530d22d0de443e8dec852de"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Smil30.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"642f562e83159d7817e5b1a8273ea674a871676960c280b3536f51b5bfe8f074"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Smil30.cs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3043a882534bf3a86c326b3eb1841b7b8706e1cdb41e1a8a1b1dc41e7bc53b8"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Smil30.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cb62a9fdc420693068a2de2ea5cf1f3a81f5301808f1eb57a866591935ad250"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Smil30.cs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"525885cbcccd53556128f3e35f273556eb2e7544d7983c103b948ea68cb93bb8"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/VobSubMergedPack.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c3fa307b2ecf2234beffebbdab11dfbd3efeb117c89d0c0956e5c0e8ad9d19c"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/VobSubMergedPack.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"91b9d835f62cdbcf55b1abc5a6cbba44e8e6b49cb24cd1e570313bcf3b6f7437"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerDCinemaInteropPng.cs"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"56552592cf7a7f4d047fc97e86979ae6d96ab0e11c118a071b53e46f24655f70"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerDCinemaSmpte2014Png.cs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"f49940aab08bdef7345bda3c790e059cc8f11a4866d989cd101f459bf14296df"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerFcp.cs"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"895460b882ed2787381548236546c2c2561ed44d8504bb02d9e4dfc9e6dfd5b2"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerFcp.cs"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2ce8b837d612070993edf434caf208b6c877d1c7882aa065af6b67ec8f45fcb"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerFcp.cs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"771b4c99d979bb47a8f287958488628537ece397f2e5195bd231450a8e0638d3"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerFcp.cs"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"85b141f16df123e72acd6bb17aebb72aeb26ef9ace346de15de9978bef34b7e4"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerFcp.cs"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c58fde74377113858f3917ce4ef3aa5327564cf8b8103825f5a1d63ac1108c5"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerFcp.cs"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"60d43edd593c3bb9ca460ec93100afbf098dbf84bcd674e46c7e907aac731bf5"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmap2.cs"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"cee3daadb20c51d55d75a07cfa9efd6a1de5a2e9b94611b5e72874e61574ce11"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/VideoPlayer/VlcVideoPlayer.cs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc0132988db3ed9a9179057063bc10ccb90937ecbf3ca4da982bd07628d6d4ef"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/VideoPlayer/VlcVideoPlayer.cs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"c919847502b38c146df64c61880f6928ab3af3b684d0bc8eaff4b5d27988c573"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/VideoPlayer/VlcVideoPlayer.cs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2020af86f2826ccc05b94c4f067c8c83617360ff10c0fae7186b7f2afbff611"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/VideoPlayer/VlcVideoPlayer.cs"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3cc7c29570598a6be5e16211aadfd6c7d75ec5da63f17d41f4e83dbcab3da61"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainHelpers/SubtitleFileService.cs"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"b41c295974e5e6316a7fb16f21c564341881424d140b9c861721e2641fad5eb1"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainHelpers/SubtitleFileService.cs"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"56384a446f3d33a4f8c73841394056a7723f14f9c45dde63e3877d96c6223e47"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":2289}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e21558313dd50c89a842e74fe112fdf29493646d9fda16aa03accd4d28601e4"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInEffectViewModel.cs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"d132d2ce30c2e5b817308b513d116544e85f873ef29ac2085bf8daafe0fb9916"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs"},"region":{"startLine":4134}}}],"partialFingerprints":{"codehealthFindingId/v1":"febe976cbd2b102d5109f1084abbd3149ca2e125db48937c568e79db83a9eb3d"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/MergeManager.cs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe53a97e25e48ae54509c7fae2e15e5740bfda73bc48822a0f4449fc0e70cdff"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/MergeManager.cs"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"843b7fea5153a87ab778d4b62b98cdb7832ee583703d3bf2f2ceb49205841f75"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibMpvDynamic/LibMpvDynamicPlayer.cs"},"region":{"startLine":1288}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6094578a2aabb8e3f57179fdb2c1da05ac944799e8da195ccd1e324e3fc24eb"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibMpvDynamic/LibMpvDynamicPlayer.cs"},"region":{"startLine":1369}}}],"partialFingerprints":{"codehealthFindingId/v1":"727bbf7344ea5109ef5ca0d292bc3b377c0b4e5cfc65b95b70ba00e70ffe75ab"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibMpvDynamic/LibMpvDynamicPlayer.cs"},"region":{"startLine":1415}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aceb9736dd6c07c5dc061c152724e89e2318b51f98934c5ca3124df344c267e"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 7 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/StringExtensions.cs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"98937e9a698ecc52b9f9c38c30b3fb0e1834f7cd79f6233a7f30191f8b6215ee"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 7 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerFcp.cs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f444f3da60cf7c4b0f65b5ce01683b1b422f774b5afd53e0822a486a745ed95"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable 1591 \u2014 the disable has no matching restore, so it does not end with the construct that needed it: it runs to the end of the file and silences the rule for everything written below, including code added years later. Close it with the matching restore directive immediately after the construct it covers, or fix the cause and drop the directive entirely."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Common/TinyJsonParser.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"2436b310e00b141e2acc42d5966cfd9701a55d52cca5e0e11f114887aae346c3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: How to find this? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Boxes/Mdia.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"c12fa5ffcd2cb93e0a407c917a3d902659d0b9f4315b40633da11293d4024450"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: cea 608 or 708 cc? What is the content? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Boxes/Stbl.cs"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"55f0a3c8a0194acddd7aa0f1273e74311b866f643b11d9bf1ec12dc975272450"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: can there be more than one? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/Mp4/Mp4Parser.cs"},"region":{"startLine":764}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b6d78d5154d33e5a38f93b0fc0c8cf505fd2a1e570232eecb7845741444d51f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Return default clut \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/DvbSubPes.cs"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"b34a8046eab1bdc85ba9ed7a9ace58e1bc2f84d9568ceeb5a0a863be8cd33e57"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: Well, this is not ETS 300 706 kosher, however we are interested in DATA_UNIT_EBU_TELETEXT_SUBTITLE only \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/Teletext.cs"},"region":{"startLine":508}}}],"partialFingerprints":{"codehealthFindingId/v1":"83a77b8bb7046120a39282f07cf55d9029e0ced868555ff7cf3a25cbd7370ea8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/Teletext.cs"},"region":{"startLine":647}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdec47097eda1256d182fb50109d7c1367dacc0885112b797eb4f5d36871fa23"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/Teletext.cs"},"region":{"startLine":674}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5139c823d7b61f7a05b30f5be82154d6a1be7e1c96e7d0b8c05dcb8351df897"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: Cast exception??? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/ContainerFormats/TransportStream/TeletextHamming.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8fe09e862677c3ed7b99c8b4e1f8780896dbbb6a65472c149d6387e33402fa2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: extract to own rule \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/Forms/FixCommonErrors/AddMissingQuotes.cs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"2195a28626e27aa20ee6be0c5000359dc99a5bf3db79ab8a5156600de9d0cc16"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Alignment tags \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":1983}}}],"partialFingerprints":{"codehealthFindingId/v1":"9503552a35fc238fcc5a583270a8161c94ed4cded6ddbcac8db4ed78d68c7bb4"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 6 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a638da69b2f227b1004f440b35fd471458556e162c8be1a0617b648d616b478"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 6 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmap2.cs"},"region":{"startLine":762}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e943840648d5711ee68fef7b84fb745e64ece7dec8b126e6b83078730e76b93"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 6 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":856}}}],"partialFingerprints":{"codehealthFindingId/v1":"17302ba64d939aa2f7d480d1c86ba25258ee1cf9daf40ac5bdb6e14910b41737"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 6 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/VideoPlayer/VlcVideoPlayer.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"32e62c7f8bf915cbfbfc71c9b5752fd30cec97e0e9e7952ee064fb44e5d2ff2e"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 6 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/libse/Core/LanguageAutoDetectLanguagesTest.cs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"55635861d240e00a3c13769220f1d8cfea60b6e85e3e60949641f7ae18fd99d2"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 10 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/AdvancedSubStationAlpha.cs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ee40453ee3fc79712e9089064abc093496fc2b5ccba7057b1911eda931e8281"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: Use bytes directly and not encoding \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":481}}}],"partialFingerprints":{"codehealthFindingId/v1":"11e1dce71f53720f3a782d96db8b03f34c1d7142f4286f814b3ee9fde660b3ea"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: Use bytes directly and not encoding \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":775}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bc21d255fa6a640e4dace9a2e71c9f8c0b7d5fcd37dcc4b2031977e5a61f598"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: we use new byte list - remove old code \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Ebu.cs"},"region":{"startLine":561}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c718ae374f075de9b9ce558b42d9fed84bd0ba696c0462e3eadb12f4485340d"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 13 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/FinalCutProTextXml.cs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"adf227a142882e96ec276aad880b64a9fd2f7d77f87ba3c9b2eb2b95b5038434"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Working on added edit capabilities for idx files... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Idx.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7ffd5e0fd796d321a6caade0cc54c3379dfc8501700cff061486b308f7e8b71"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Set variables... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/IssXml.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"63c6b04c9166b0ce90a9cdf992e6269c9df499bc116134a65143ce7b21e94c87"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // These bytes seems to be PAC files... TODO: Verify! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Pac.cs"},"region":{"startLine":1519}}}],"partialFingerprints":{"codehealthFindingId/v1":"bda207a234e79b67c37e6d506c77647cdfd9fbaa2292b9431ac25aaf486382c3"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Smil30.cs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"95848c69eeeb337ab36751fe486e04f44f0744f9ca5c6e61bc08fe4d5b0e0e86"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Smil30.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"18fe2b365bf1a043bf2a0a796ba8a7e901a82e5204c48fa815372a8cca2aa7f8"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Smil30.cs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8416e7a3398a8f50cd608d766889c687b7c7f3be27a379fb7217c417d17e3d0"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Smil30.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaadc80027440446af55f06aed6c1f5a7ba0dcfc1edb0608914be68e7915ac55"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Smil30.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c2bd16be38caa17aecd35ae12cf03f45d2421e934f14cb68212f7e3b26384ec"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Smil30.cs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3f726c05e65f82424a921c64e000719b136cad1d5e6528290a03a374e58b3a0"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/PacketizedElementaryStream.cs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe93f0e22a45dfa0ad8d750478091dd1663a1a884fe35eda30738c9370cd092e"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/PacketizedElementaryStream.cs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"4577a6c5ffcba92188a7d34386fb6fde134187e20e9503c238ff17ebbe7460eb"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerFcp.cs"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"5480ce934aceeb8b9ab410222109a9aa402ca51a27a5deea14af612c1c48dbad"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/NikseBitmap2.cs"},"region":{"startLine":807}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6845bc0fad8f72358731fa0635e49f2131fdadb2d9f653f9b8925f19d69392a"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/VideoPlayer/VlcVideoPlayer.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"137f9ca1fc6a717aefc62d03fd98ee397b5aa3eb5539b520e8075b480ce31e80"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/ReEncodeVideo/ReEncodeVideoWindow.cs"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"5848fd1f602307a08ce363327d02fd56ffd0919ae0cfefd0b05e953b461a5011"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/SkBitmapExtensions.cs"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"b83e401f5f67a1035c5914a895df121bc939e9f0158fa0ccbe71a2b8193fc435"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/libse/Core/LanguageAutoDetectLanguagesTest.cs"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"d17a78338824a8eae6ec7fc47bd539cdcd3c9ab89a61cbd19b3dc084298e36c0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Improve end tags \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SpruceWithSpace.cs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"52c20a0b33801c552af5f3bbde60c92f4344fc855effdc2a73e0f9c361be909d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: Frame rate \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/SwiftInterchange2.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"23bad98aa0509310d6229b1a73d96451ef37a9d0e3fd0758723683283e8a44fb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: check max \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TextST.cs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfa0dad45bb775dc57c18778ec94ab699e13524923c73c1771835ff227b703bb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: check max \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TextST.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"407ed3cae95eed265769ee10cc3f2a61f6e34a1367091a32d11e8ee0830345c5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: check max \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TextST.cs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3e94e44c81559acce4471e34aad97ff0c4c01b8658ca64284e90da48ac6ab48"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: check max \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TextST.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"44040bb788342e7cccb3cd940a8f7071ef406676a54107124d6d88ef4a48af30"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: merge ts packets \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TextST.cs"},"region":{"startLine":1146}}}],"partialFingerprints":{"codehealthFindingId/v1":"deed19968fd6ec2f7d82d7ef0bf12bc00f1a2e1957f6354a5bd4dd4620d94493"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: figure out how to get time code from these 7 bytes! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/TimelineMvt.cs"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"2528b9f4d3367ca347227df1ff0782184c0f0d564a98840e799f9afde01a16c2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: fix \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/WebVTT.cs"},"region":{"startLine":803}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ceaa868b17bd808b763e7798aa7a55fa039e9648788077a922714fa9f50f182"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Set fourColors \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/VobSub/SubPicture.cs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb9c8d3f35b189f45168cb6b90f17af7fd2c8d1a9b41d29a56625cc5d85589b2"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 15 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Export/ExportHandlerFcp.cs"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a32a7448bc32aa1dfd307ad6a73d9c51330dbc31fc18d310a5ecc79cbfc048a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: check for multi-word names here too (look ahead in splitLine.Words, with e.g. \u0022-\u0022) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/Ocr/FixEngine/OcrFixEngine.cs"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"a81434892dd32628100f357422013d4be495e640050108f255373324c0194ac9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: some auto corrections? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libuilogic/SpellCheck/SpellChecker.cs"},"region":{"startLine":450}}}],"partialFingerprints":{"codehealthFindingId/v1":"153199c255674a5ff48919e6c470f75729d2ef2000d2c7eb5864907eb2383026"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Beautify time codes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/LibSEIntegration.cs"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"111ab21a28a9b2603e8299a976127591eebf217b1886ac28aa25475b3fc6416e"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 14 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/VideoPlayer/VlcVideoPlayer.cs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"281dbfc47bd01c1e152cc7ce8e530309b6b3048ed2dfcbd5a1dbbcb75983ed87"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment repeated across 72 files: The identical HackComment appears in 72 files (72 occurrences) \u2014 almost certainly one boilerplate line from a single migration or decision, not 72 independent debts. Fix the systemic cause once rather than file-by-file. Text: \u0022// hack to make OnKeyDown work\u0022. Source code is not a task system: track the cleanup where tasks live. (Every occurrence still counts toward the score and metrics.)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Assa/AssaSingleStyleWindow.cs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"8af4952654359b0d67d758f359bf641a8adc4f916d0d9054cbea026d7c6f3896"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // hack to make drag and drop work on the grid - also on empty rows \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/Compare/CompareWindow.cs"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"d539601d794cb31a33568615f99b774c615e18be4a900c079962f97a790b348e"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // hack to make drag and drop work on the grid - also on empty rows \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportImages/ImportImagesWindow.cs"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"d97b71948102ce5ba1de22f9c8c6baae77f96a029cbd46f5173440f805f4ca5a"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // hack to make drag and drop work on the grid - also on empty rows \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ImportPlainText/ImportPlainTextWindow.cs"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"90b215931e28a9c12e1d1022854012de48164ec06dc8370ff7978ad7688ead2b"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // hack to make drag and drop work on the grid - also on empty rows \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitListViewAndEditBox.cs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"110789671e9954875b0e48521e5eb146a53ef40dce533b5611ac421cffdb8762"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // hack to make drag and drop work on the grid - also on empty rows \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/SpeechToTextWindow.cs"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f6e54c084dced18a1c9f778869f8fb68c4fc1345ff4504b8515283b16474302"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: use default encoding \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportCustomTextFormat/ExportCustomTextFormatViewModel.cs"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa2aeecd36c4ecd1c50b2179e0a50c01ee30d14d1dc4a1e6f8d74c61191fe752"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 9 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/RosettaProperties/RosettaPropertiesViewModel.cs"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e1ca637f50f3a0ebcb7d1a148d7d1ca1d72f23d91588d2f59b9e457605ce818"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 9 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/FormatProperties/WebVttProperties/WebVttPropertiesViewModel.cs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b21f582f457caad8be22f2df292dabe7f4dd44f3463d640c669e69ca9a730cf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: find better way to top-align with textbox \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/Layout/InitListViewAndEditBox.cs"},"region":{"startLine":1313}}}],"partialFingerprints":{"codehealthFindingId/v1":"7459900361a9cb98aac70cedd70628b37fece86d220f23356909cfbc0df1f181"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: customizable \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":7872}}}],"partialFingerprints":{"codehealthFindingId/v1":"45da4b5489552e7f8f3baf4237caf798265c7982b323699e1e00e2a76e7927cc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: customizable \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":7876}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4ae3b3adf050acf6b74153d47e53d50a1fba3a32890e3cc75d17aa0ac904b35"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: customizable \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":7911}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b6840ce05bb03a5181e820948395293046803ccfd5e437e7216b68c48a90d3f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: fix to get actual count from database \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/BinaryOcr/BinaryOcrSettingsViewModel.cs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"660396e4439b5d6c8faeb3f58b498dae22879980d8417e31315dbd8a47bcacdd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrSubtitle/OcrSubtitleBdn.cs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa213b4aeb17d852297f558338fd649cb9457bdbf2877938d4b3fdb5c230e5bf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrSubtitle/OcrSubtitleBdn.cs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"534a986dfd44805e743fa1f706d1c51c130f6db05614889f0b06cd35ecc1bcb8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Download/TesseractDownloadService.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4766cc42d4a8a4551c2745c492deaa0d77766b0ba32034aeabc380900fdee38"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: spell check \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":1843}}}],"partialFingerprints":{"codehealthFindingId/v1":"028f1e0829e5fe2c21cecf39dcdd892d2eb02c331a13ac990e494cefad03bcad"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: spell check \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":2146}}}],"partialFingerprints":{"codehealthFindingId/v1":"20a47974af51c07938cb4050564d6f8bb758028d53895e10de25253c94e9878d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: spell check? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":5043}}}],"partialFingerprints":{"codehealthFindingId/v1":"4147454746be1ce78965d39806c28386d4ca97d8b578fd419009284d246e2809"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add to language resources \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryApplyDurationLimits/BinaryApplyDurationLimitsWindow.cs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"924b587d98950937e106de0ed13da7855d0e15808175ba704888d785fa5cc63d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add to language resources \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/BinaryEdit/BinaryApplyDurationLimits/BinaryApplyDurationLimitsWindow.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f685d700e869607f7f7588bab395727474b1d63e0f2a78b9407b496770e3be7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: might be in use... save to temp file instead \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/DownloadLibMpvViewModel.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"91dcbb35dca8c7280e5e900e02d7b9120c6dcf98f30147af9bad101e04d80858"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: Se.Settings.Waveform.cen; \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Shared/GetAudioClips/GetAudioClipsViewModel.cs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"7365fb10fd9327dcf22dbfd55129d1a7355eeb9a2092b57d87bffb5a654c4069"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: not implemented \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/ApplyDurationLimits/ApplyDurationLimitsViewModel.cs"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"2655a20f8fb672aa00ca6afbc79f8c5c318bea3b7921f6ced7029df261c58ed7"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // hack to make drag and drop work on the file grid - also on empty rows \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConvertWindow.cs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"59c8bc887e2045f45249cbae3f22e9309b79405e30f2980aca79bf9db6a30050"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: multi track \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/BatchConvert/BatchConverter.cs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"207ed2cd26d76ccb98f01e52227cac2ecc41e12d08c665aa7b2fcdaf4b654196"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: Implement logging functionality \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsViewModel.cs"},"region":{"startLine":1003}}}],"partialFingerprints":{"codehealthFindingId/v1":"76bc423d19d0afda168decddc979c2dab9f749cc885eaf1a9b5ff7fe988dec80"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: Implement logging functionality \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/FixCommonErrors/FixCommonErrorsViewModel.cs"},"region":{"startLine":1008}}}],"partialFingerprints":{"codehealthFindingId/v1":"75d6234e1ebd764b894b84c8111b15edcb4e36641e4c0c2067e9fe9f92230455"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // hack to make drag and drop work on the DataGrid - also on empty rows \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/JoinSubtitles/JoinSubtitlesWindow.cs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f1af5ab47c5ad64a77b95ae2cec18a073402faf2656b251cb4ca96f8ab885e4"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable CS4014 \u2014 the disable has no matching restore, so it does not end with the construct that needed it: it runs to the end of the file and silences the rule for everything written below, including code added years later. Close it with the matching restore directive immediately after the construct it covers, or fix the cause and drop the directive entirely."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/AutoTranslateViewModel.cs"},"region":{"startLine":1427}}}],"partialFingerprints":{"codehealthFindingId/v1":"432c7d7689899a3476fe58bcaebfa8de068306c81957f8d33a772a191a7decdc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: UiUtil.MakeNumericUpDown \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/TranslateSettingsWindow.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd89c758b15bda50abd7ca8ef7f0e17d0e5de95cb5b6fd371cfea3a50ec8be2d"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable repeated across 11 files: The identical BarePragmaDisable (\u0060#pragma warning disable CA1416\u0060) appears in 11 files (28 occurrences) \u2014 a single repo-wide policy (e.g. a Directory.Build.props decision or an idiomatic suppression), not 28 independent debts. Decide it once centrally rather than file-by-file. (Every occurrence still counts toward the score and metrics.)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BlankVideo/BlankVideoViewModel.cs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"9315d06d551e9c3c7506aa5ac9ec9b92ce8116817d89b8a92b22ac56e466e66a"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 11 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":674}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a9fd1772687cfe6f45b22e676fd46aa09140a7512ad6de2e005ce1a04e9e5a7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: (Color)Application.Current!.Resources[ThemeNames.BackgroundColor]; \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewRow.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"493bc0a507079a659563baa545844dfd1c2c2f4015236392e3baf661e65d501b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: WhisperEngineCpp.StaticName; \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Config/SeAudioToText.cs"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4a50575d3995722d7f1463bcac119f3f5882d5c8fad703581e0839d67347f37"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: libvlc 4 beta... check when final version is out \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"effa9dd56fe9049702926b2332d0ede925fe083d72182d578f307a3dd72c5c24"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: libvlc 4 beta... check when final version is out \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc582bfe5023454393c2affca46f4b3b7d673c2b1a1bab4088bd57c4b9bc96d4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: does this work on mac? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/WindowsService.cs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"041165a85590938e91b1040c41415eefa3b3d78a3bfd0bac9fb8f756bcc7480c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: does this work on mac? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/WindowsService.cs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"6943429db7ee5e155ab041bab30312e2494590c0bfcb8d701ec98b3866505172"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: CS0618 \u2014 this warning is switched off for the WHOLE project, in every file it builds, including code written years from now: nothing at the call site records that the rule was ever silenced, so the next reader has no reason to look here. Fix what the rule is reporting and drop the code from the list, or \u2014 if some occurrences really are legitimate \u2014 narrow the suppression to those sites and give each one its reason, so the rule keeps protecting the rest of the project."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/benchmarks/UiBenchmarks.csproj"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"c69accfd14fc996863a62e6e4708ad0bbba9abe332f87832fe1d4aa881063fb5"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: GetSpectrogram: Method GetSpectrogram \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs"},"region":{"startLine":3438}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8b085e113031d92d6f2e06c06defd317c80cca39c6d032a40a22254f30a4be5"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: RemoveAfterParenthesisAndTrim: Method RemoveAfterParenthesisAndTrim \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Files/ExportEbuStl/ExportEbuStlViewModel.cs"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"01d99c5b2ba1c0ceb420f8d65a9ba3a2a39c60f62f4e8d1b7ca1dc377f82c9b2"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: SubtitleTextOriginalChanged: Method SubtitleTextOriginalChanged \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":23247}}}],"partialFingerprints":{"codehealthFindingId/v1":"0abc0edd250975bbfc9c5e12d43b6a0f0a65e4da095b045b9f55e4278ee05afa"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: AudioVisualizerOnStatus: Method AudioVisualizerOnStatus \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":23556}}}],"partialFingerprints":{"codehealthFindingId/v1":"4066059272508aeee410cbbcf5d47c97a5504228e034f44455d8c64fef28f37c"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: OnWaveformDoubleTapped: Method OnWaveformDoubleTapped \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Main/MainViewModel.cs"},"region":{"startLine":24558}}}],"partialFingerprints":{"codehealthFindingId/v1":"10c8244175a41e4ba9b981bfb60040dbacf368515b279d5ab2ac7e34626b8d76"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: MakeTransparentBlack: Method MakeTransparentBlack \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/PaddleOcr.cs"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"703611fbe9e4437f2a9a81fc515d9b94235584549aaf85c77735f10ad8734d77"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: OutputHandler: Method OutputHandler \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/Engines/PaddleOcr.cs"},"region":{"startLine":1002}}}],"partialFingerprints":{"codehealthFindingId/v1":"82fd7926b7fc846980976137ef8eab6bb44fb628b4bb8c4260cc28bd175ec8db"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: DrawModeChanged: Method DrawModeChanged \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs"},"region":{"startLine":638}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcd90a1abfdbc9dcc33d5ccd85cc6535cf4458a789d2365deb8268551b8e706e"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: TextBoxDatabaseNameKeyDown: Method TextBoxDatabaseNameKeyDown \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/NOcr/NOcrDbEditViewModel.cs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"d40e812cdd88bd81879663f173a31149e7de1207756ce5509cf0d2f6cbce9ed1"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: DrawModeChanged: Method DrawModeChanged \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/NOcr/NOcrDbEditViewModel.cs"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"59bc5f4749de10b975be8fc46bf53d56e612ac76edefcdc129d814e238fd199e"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: ApplyCustomColors: Method ApplyCustomColors \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrSubtitle/OcrSubtitleBdn.cs"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"b355cfa1a865e990a2695f5d4bca0f64e907273bc53ff54f5294504f634dee8f"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: DataGridTracksSelectionChanged: Method DataGridTracksSelectionChanged \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":4545}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3eabaf6e208890e5fc5723be318234c25c4d58b0416d84ae73dfddbafc1fc08"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: SplitImageToLines: Method SplitImageToLines \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Ocr/OcrViewModel.cs"},"region":{"startLine":5342}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f05c52599e5ea7b462b7f6a2e701c1e85adb33e2b537e65f5109b8937eea991"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: GetTranslationModifierFromSetting: Method GetTranslationModifierFromSetting \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsViewModel.cs"},"region":{"startLine":1131}}}],"partialFingerprints":{"codehealthFindingId/v1":"edac9aeceb2a40ce39c42d320c860bdf1d7bfd27125bfbde790acaad8a6b74c4"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: ValueChanged: Method ValueChanged \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Tools/SortBy/SortByViewModel.cs"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c17779e2682d11df260bc91a127ea6db2acb08a352d4a439c990d3e46cd0288"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: SplitHelper: NamedType SplitHelper \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Translate/SplitHelper.cs"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"41ec50dec862e1cb13fd125a886a4e143223c03dc8db9b419d0017717e70c1f6"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: TextBoxChanged: Method TextBoxChanged \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/BurnIn/BurnInViewModel.cs"},"region":{"startLine":1984}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9b8f4db31978ed0de2ce0775c6d64afb41a5bce11edee524a7aac41c721cff4"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: OutputHandlerKeyFrames: Method OutputHandlerKeyFrames \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/EmbeddedSubtitlesEdit/EmbeddedSubtitlesEditViewModel.cs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dcbf1ee2c1b0da5c9d0bfd5676b6c55b3d84971445df69965e10a348d79643c"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: TextBoxChanged: Method TextBoxChanged \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TransparentSubtitles/TransparentSubtitlesViewModel.cs"},"region":{"startLine":1467}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec4152db7a04e7727a6cebfae4623fa5217ce500147827dc57e571794fd2d6c2"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: RegisterClipboardFormatW: Method RegisterClipboardFormatW \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ClipboardHelper.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"81c5f55ffa7ea69cb2b9454b317987f1adb0cb542e0b754d442995968901e6bd"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: CreateCompatibleDC: Method CreateCompatibleDC \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ClipboardHelper.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"80694ab0b54d192d72aa59d76ddb33ed0fc0ff833289739e62c650e97bcfde9a"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: CreateDIBSection: Method CreateDIBSection \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ClipboardHelper.cs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d615de35abfb27936bd4169e78d2a4feb9ee395b820fbc81ace222c5d28b196"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: SelectObject: Method SelectObject \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ClipboardHelper.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9764b870736b9682a6c302c6a809bceb8d6b51a54da8f52acc3d880b9169c7c"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: DeleteDC: Method DeleteDC \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ClipboardHelper.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"a95cc343604406c11077c646119b1b619e4c5a75c0dc770d014aaf7510a897e1"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: GetDC: Method GetDC \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ClipboardHelper.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"92d3d860736f286bc09e6e38e7bdb208eff8e6fbf81aa4c4d90ae3e8af4b7043"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: ReleaseDC: Method ReleaseDC \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/ClipboardHelper.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ea7d9d51b6fca20bcffb49c9b71faaaebb962f849ab127e61100308ac35e9fe"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: CGEventSourceGetCursorPosition: Method CGEventSourceGetCursorPosition \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/CursorPositionHelper.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"7468637a419ff2f2e87f726c850ac36821d33f84cc2d46e945ca89b0bfccf5bf"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: GoogleTtsResponse: NamedType GoogleTtsResponse \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Download/TtsDownloadService.cs"},"region":{"startLine":754}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e09f71d98890e4a04a4c690ef6ab55120dba2054a6e6c2b3bf73a0b9e7aeb27"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: GetSampleDataWriter: Method GetSampleDataWriter \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/Media/WaveToVisualizer2.cs"},"region":{"startLine":918}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea99f0e8f731f26365a33fbef6894f24e6d8ae6d1338c0064bf4d552154411f2"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: GetGridLinesVisibility: Method GetGridLinesVisibility \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/UiUtil.cs"},"region":{"startLine":3021}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b9f1199e1c2efc9481e821302a5ff14708fd71d4fa71b1c722bfd5ae2e104a0"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: ReplaceControl: Method ReplaceControl \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/UiUtil.cs"},"region":{"startLine":3037}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f86066a3abbf61c9f738752e21347b849f03b0306a682198098288398bec9f6"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: LoadLibrary: Method LoadLibrary \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibMpvDynamic/NativeMethods.cs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fb89ed63fdd87e5c4cd5f07c6184f1dcc233d32b7992f7473aa5fb7f17dc9e5"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: setlocale: Method setlocale \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Logic/VideoPlayers/LibMpvDynamic/NativeMethods.cs"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"9445413e6b45ea61d045bb12ec098eff06bac1696076e0a9f4e4c8a997200aeb"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: TestInitializer: NamedType TestInitializer \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/libse/TestInitializer.cs"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"a989441f55205cdead15bcd5750146fb8580009f570d709cd5734349ded700c2"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: Bootstrap: NamedType Bootstrap \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Core/Bootstrap.cs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"df111f7d48794cd008b580638edd820d691f322de23122351936b16ec2110a3d"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found at common paths; consider documenting architectural decisions in Docs/ADL/ or similar."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D22","level":"warning","message":{"text":"Redundant/Conflicting Position Representation: PcsObject uses a custom struct \u0060BluRayPoint\u0060 for its origin, while PcsData (which likely contains the same logical data) exposes a different type \u0060Position\u0060 via a method. This creates confusion about which type to use for positioning.: Unify the position type. Either have PcsData return \u0060BluRayPoint\u0060 or have PcsObject use the \u0060Position\u0060 type, ensuring a single source of truth for spatial coordinates. (signatures: Nikse.SubtitleEdit.Core.BluRaySup.BluRaySupParser.PcsObject.Origin | Nikse.SubtitleEdit.Core.BluRaySup.BluRaySupParser.PcsData.GetPosition())"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d43e2af6368ac94df2048703e6d3e3cf0b4fd2e9fb59ffcc4b3994671efa95d7"}},{"ruleId":"D22","level":"warning","message":{"text":"Inconsistent Exposure of Frame Rates: Frame rate constants are exposed as public static fields (e.g., \u0060Fps24P\u0060), but there is no corresponding method or property to retrieve them, and the naming convention (\u0060Fps\u0060 prefix) is inconsistent with other utility classes like \u0060ToolBox\u0060 which use methods. Additionally, \u0060FpsTrg\u0060 is a field while others are fields, but the lack of a unified \u0060GetFrameRate(string type)\u0060 or similar API makes them feel like scattered constants rather than a cohesive API.: Encapsulate these constants in a static \u0060FrameRate\u0060 class with static properties or a \u0060GetFrameRate(string standard)\u0060 method to provide a cleaner, more discoverable API. (signatures: Nikse.SubtitleEdit.Core.BluRaySup.Core.Fps24P | Nikse.SubtitleEdit.Core.BluRaySup.Core.Fps23975 | Nikse.SubtitleEdit.Core.BluRaySup.Core.Fps24Hz | Nikse.SubtitleEdit.Core.BluRaySup.Core.FpsPal | Nikse.SubtitleEdit.Core.BluRaySup.Core.FpsNtsc | Nikse.SubtitleEdit.Core.BluBarSup.Core.FpsPalI | Nikse.SubtitleEdit.Core.BluRaySup.Core.FpsNtscI | Nikse.SubtitleEdit.Core.BluRaySup.Core.FpsTrg)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"91e6437ed20f56d19e06d7583d4b7b21045b8d318ba827d308618d5e24f87bc3"}},{"ruleId":"D22","level":"warning","message":{"text":"Inconsistent Parsing Method Signatures: The parser uses multiple methods with identical signatures \u0060(int a, int b)\u0060 for different parsing tasks (\u0060ParseChars\u0060, \u0060ParseCmd\u0060, etc.). This is a code smell indicating that the parser is likely a state machine or switch-case block internally, but exposed as distinct public methods. It makes the API feel like an implementation detail rather than a clean interface.: If these are internal implementation details, make them private. If they are part of the public API, consider a single \u0060Parse(byte[] data)\u0060 or \u0060ProcessChunk\u0060 method that handles the state, rather than exposing every low-level parsing step. (signatures: Nikse.SubtitleEdit.Core.Cea608.CcDataC608Parser.ParseChars(int a, int b) | Nikse.SubtitleEdit.Core.Cea608.CcDataC608Parser.ParseCmd(int a, int b) | Nikse.SubtitleEdit.Core.Cea608.CcDataC608Parser.ParseMidRow(int a, int b) | Nikse.SubtitleEdit.Core.Cea608.CcDataC608Parser.ParsePac(int a, int b))"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"632daf3aa6d9b83a39bd754df15a9d9f8c6185d71ba77411db8a493e44a24a3b"}},{"ruleId":"D23","level":"note","message":{"text":"Bounded contexts not declared: At 450k LoC across 9 projects the codebase is large and multi-module, so explicit bounded contexts are needed. Name this codebase\u0027s bounded contexts (\u22652 module groups, e.g. per subsystem) so cross-boundary type coupling can be assessed. Declare them in \u0060.codehealth/config.yaml\u0060 at the repository root (create it if absent), mapping each context name to the module-path or namespace prefixes that belong to it \u2014 e.g. \u0060architecture:\u0060 \u2192 \u0060contexts:\u0060 \u2192 \u0060Billing: [\u0022src/billing\u0022, \u0022Acme.Billing\u0022]\u0060, \u0060Catalog: [\u0022src/catalog\u0022, \u0022Acme.Catalog\u0022]\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1c7e276c9c682731f01819ed5378b90ca320cde1b583c90920172911598362b3"}},{"ruleId":"D26","level":"note","message":{"text":"Split UI: A generic catch-all name that is huge (283k LoC) and sprawls over 232 namespaces. Suggested: by namespace: UI/Navigation, UI/Interaction, UI/Layout"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"87b37f4b72fd5fc7cbc9a1235d0e739b7c7d3eb7fc33ceb08b805a2cb78a4b47"}},{"ruleId":"D26","level":"note","message":{"text":"Split LibSE(netstandard2.1): Generic catch-all name that is large (132k LoC) and spans 24 namespaces. Suggested: by namespace: SE/Serialization, SE/Security, SE/Utilities"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"62920cda762113b9e42712a5c9e0a1080d088aa909dc6a5d1c2665c8b8361be5"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2764878abea779206aab2beb6f3cce886aa7a301f49dcb6e8367d65785c9cfa0"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bf460c0cfade038130e2efde2d1dda0cb90a9ee977528bd09906f431e2b3afd5"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6244ef994a981ccaa89adab37dc6a86ed85c30b23e32bbbaeee440e86a8b7bb6"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5d1885765af0e67eb16b46dcf0194333fef007c53fdf2cedd3857c5884be4374"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"10658b7df57db48544e93bd47883bb1e45bb146281354110f9619a06d34b7a7e"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e72bcc4e1b1d5562750c159db2447ab2bf0521c1842054fd471446b709deebbc"}},{"ruleId":"D28","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3cdfd7beb31b791ae18dcb425e21eb157c842e7bbcd522cc330573c1a6538db1"}},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fa8d3aa23fcea477bfcf650f619f88e2491e7d8620da1342f1090bebdcbabf7f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2c1c438fa6973e51294cf7e77ed9879928b515d5f6be7f01f63c94af69260f28"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ad0675281c11564365e9f1b4334bcb2f1f6395dc55fda213c1589f88ffb06cfd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"755484b68b38b86a456f50b7ee0326e689ae0cde5896601e03b63edb222c4b3f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d5e28b2c6956dc7cd10589aee30379a1eb55016fbe0407bbf4226901bb625072"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3b6e2c7ed705c298a024c65bc0ac331f529e6910516b151ab207dee5b3b2e034"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4d1aad688e2196eeef51451e9a2ac42d58ca0652d3c4fe3008152a7aa5192f8d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"877760060663731594e68afefef873ad16f669ff6a0932a8ce54553922e1598c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d24c7e3adf0c91ee148d1a42a7e9220bb204fa2a28404609ffc9173a7c33456b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fa6855ecc99a9ac543096b08a76c54c62651172eff2da09c6d16e4c2b24cf3e1"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d1849dae3210228e579cee571a65bd88f1ea9edd4b9a299629e0d5161c445932"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"687069e42d7778eb60e970eac5160d5442e12d8c3e23c430ee95ced74b3c8e7d"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d8e025b0844880d8c084b50d7965f2d3067ba3cf2b11c3c4e69e2825adea1147"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d8a6cf40f003fbe7673059b712644a9a9f6f78786b134dc4e6e09ae7533041a7"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"af1a3fbb158a8faeada01daf16abde9168d853589109b558ab01d3f175e0ab2b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"35f6e0495edf6c18b637d615ed3bd28db61eff9f0efc64f5ffe85dcf71250d75"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ff5cd874e382eb27e35894410f7c01a6bc57b8b4dc1cec7c130c5d5553c41e08"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e1ea42d80bf1f72b8edb6eb9c520a328784244d7b4f23b8f9693c7e16e9ab4a1"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a745631ea7b703a387ffee0953ec1884e599f0ad1f77d670fd2fdbfd5e7ee587"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"450f698e35a77a7034d8ba55b7d0bac41e2611fd7d6cd146d2251a9f8a35b1cd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bb4d4990e29f77ae475fd0e7c1b21d7a85b210d7fd39681bb337f102c11d88ef"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a5258b955f919ae2dabdd3b14feba529ea8fdb997c7656333a121a8331d7887e"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"79b074c2bea893d25dfecd5b649765e1c7884007590be0b8e5e598e407dbd0f8"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1d1e482d2fdf9e987928633f435b71c0c05ad5bfca51363d1f771610e845a7fd"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3c4cf8be7f3876935af75841d555c68dd1fa5fbe940b64eea1b7cc66dfff7541"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2362744458a372c8849a9a90180e588be2ebe4b1f8c2074552754bfaec1936f2"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9961f1eb4326bfa3b981fb1698c6d42753788bd0a22935fbecc369eeca2c939a"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"519b10574af4621e1e46d9e3b584918a4985cd9fcb6108a3cef7b6f3a6484b5b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"417360c41b60c3f8c908a170c7e24cbf29c348afce93fdf8a578d6aa48b6f82b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"804d34d83fb4596d52625d91daa67befe1a26bd67f0b1c1ae40f1e220df1cc12"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aff0a8b0581212787ec212d8976128b3f7a8e7346766f23aedaf22bdd26790ee"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"96db9605e3f1c24e119b4bbb48a14092f18079adb0523b651a4540de1987246b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b298a39d0bebac8b08e45748b2b6ed2da10f2446bfeb97811827769192297fdd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d56fd2018be9dc5c4451e2badeb48b9e214e75f69f9aee8f4cb46ecdf50bd727"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2dfe9aeb8827306e46fb23e8c6ea081de3cd37e26a12b2d9d7708a0694f2b457"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4232b62dfb5b6c85d6c630bf4bd3fae3e900f6511e939531dc0ce53cf27362c7"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"acd83ab0ee4ef132fa2303e2752699dce83e207225f0a652461aaf49b270ffe0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bab56c03091109b9041dae5ea1ac42a0628b624a2814a7d970d7d5c8e03b8cde"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3d0f10966722a94e564863379c2e376a88ba4da090422e1b0aef6c5492c7fdb6"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8c28f5f4329a2a7f2196bcca4e33088a317729a6b21e97fa9e0667d08a2bb3f1"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aa21d9c3932d54829ff1eecd45e41793baf0227bc70fa3b93c1c99fc30db16f2"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"64e354799a18c0e86eb9c3aaa7fd3ffad0a3ddbe3c250dbf46b37d920c94889c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a01ee560e72b021fc6982a2d9a9e3eb89486fea66971aeffe7e8d542c5571819"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"43d5e215c47b3fd0946e11fbad7433ef60a14d380ce00f818f1c104c7433a3a8"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1dde249494906fbf8a5d185484d313224c9664d31c275f99f16d27e82c610068"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"85986d87f2b82fd1057b339c282f8e7104ff31bb0dedca146fc03b2d183ccc59"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8c6748f745bbadcaa7283792a765c367d03b02ec92f66b1c5a573c7cfb9f7739"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cd334786ef6328cb9a4d44f5550ed7eb74807ea0dab405429511906364f7a16f"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"75d981b250ac5881e5a96a9b36be5023d331ee3a7825ed14022e72039dd1dc23"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1f9a21f28ccc572e394e965f080abd2f4bfbe9ba80525a9e16d43a4390ba91c7"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D34","level":"note","message":{"text":"Further orphaned files (smaller): 5 of 1530 analysed file(s) have no living knowledge left \u2014 their last meaningful change has decayed away, so if one breaks, no one currently understands it (counted over production source files of roughly 100 lines or more, excluding tests, vendored, generated and example/demo trees, largest first). None is large enough to earn a read-through of its own, so this row stands in for the per-file rows rather than raising one each \u2014 largest first: src/libse/Common/ConvertColorsToDialogUtils.cs, src/libse/Common/ListExtensions.cs, src/libse/Forms/MergeLinesWithSameTimeCodes.cs (and 2 more). Attach the read to the next change that touches one of them: have a second person review that change, and leave behind a short comment or test recording what the file is for, so the knowledge comes back at the cost of a change you were making anyway."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ce861fd78f6935114d3a342cb90ad25870f984e1042954fcbbe27c0e23be3658"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling clique: Se4ShortcutsImporter.cs, LanguageSettingsShortcuts.cs, ShortcutsMain.cs: 3 files \u2014 \u0060src/ui/Features/Options/Shortcuts/Se4ShortcutsImporter.cs\u0060, \u0060src/ui/Logic/Config/Language/Options/LanguageSettingsShortcuts.cs\u0060, \u0060src/ui/Logic/ShortcutsMain.cs\u0060 \u2014 all change together with no explicit dependency: a fully-connected co-change clique, not 3 separate couplings. They share one concern (thin parallel siblings over a common abstraction), so extract the shared part into ONE unit and the whole clique\u0027s coupling clears at once \u2014 you do not need to break each pair individually."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Shortcuts/Se4ShortcutsImporter.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aff0d38d65b3bae56c928f44fc391881012715524a1e06e427fa42021c9dcb7"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: IndexTtsCrispAsr.cs \u2194 VibeVoiceCrispAsr.cs: \u0060src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs\u0060 and \u0060src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs\u0060 change together 86% of the time (12 of the 14 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well). They sit in the same directory, and in this ecosystem sibling files there normally share one namespace/package \u2014 so a direct reference between them needs no import and this pass cannot see whether one exists. Read the pair before acting: if one file only DECLARES what the other consumes (a constants/types file beside its user), the co-change is definitional and the question is whether the split earns its keep; if they duplicate structure, extract the common part into a shared function or type they both call; if neither holds, the coupling is hidden and worth breaking."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10d1e748f8aa0c37593100390847afdbfe5b354291de2f8bf53d567ff3e40fee"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: SettingsPage.cs \u2194 LanguageSettings.cs: \u0060src/ui/Features/Options/Settings/SettingsPage.cs\u0060 and \u0060src/ui/Logic/Config/Language/Options/LanguageSettings.cs\u0060 change together 74% of the time (58 of the 78 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well). They sit in different directories, but in this ecosystem the namespace is declared in the FILE, not by the folder \u2014 so the two may well share one namespace and reference each other with no import for this pass to see. Read the pair before acting: if one derives from or overrides the other, the dependency is explicit in the type declaration and the co-change is definitional; if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE and the thing to add is a comment saying so; if they simply belong together, co-locate them; if none of these holds, the coupling is hidden and worth breaking."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsPage.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"69264e7160035922e0e51ed9b6b542a19f8f295bcfd53ecb1c4e8d1a1f1d244b"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: SettingsViewModel.cs \u2194 LanguageSettings.cs: \u0060src/ui/Features/Options/Settings/SettingsViewModel.cs\u0060 and \u0060src/ui/Logic/Config/Language/Options/LanguageSettings.cs\u0060 change together 73% of the time (57 of the 78 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well). They sit in different directories, but in this ecosystem the namespace is declared in the FILE, not by the folder \u2014 so the two may well share one namespace and reference each other with no import for this pass to see. Read the pair before acting: if one derives from or overrides the other, the dependency is explicit in the type declaration and the co-change is definitional; if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE and the thing to add is a comment saying so; if they simply belong together, co-locate them; if none of these holds, the coupling is hidden and worth breaking."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Options/Settings/SettingsViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25673d5d0c2d4c2a649d14006d524fdb1ae29d035f75fe0d77be058597ed72e8"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling clique: CrispAsrVersion.cs, CrispAsrDownloadService.cs, DownloadHashManager.cs: 3 files \u2014 \u0060src/ui/Features/Video/SpeechToText/Engines/CrispAsrVersion.cs\u0060, \u0060src/ui/Logic/Download/CrispAsrDownloadService.cs\u0060, \u0060src/ui/Logic/Download/DownloadHashManager.cs\u0060 \u2014 all change together with no explicit dependency: a fully-connected co-change clique, not 3 separate couplings. They share one concern (thin parallel siblings over a common abstraction), so extract the shared part into ONE unit and the whole clique\u0027s coupling clears at once \u2014 you do not need to break each pair individually."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/SpeechToText/Engines/CrispAsrVersion.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbe320b30d349126107baef2546cace8a52bfd46d968f61d869832a35254ec5c"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: CosyVoice3CrispAsr.cs \u2194 F5TtsCrispAsr.cs: \u0060src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs\u0060 and \u0060src/ui/Features/Video/TextToSpeech/Engines/F5TtsCrispAsr.cs\u0060 change together 71% of the time (10 of the 14 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well). They sit in the same directory, and in this ecosystem sibling files there normally share one namespace/package \u2014 so a direct reference between them needs no import and this pass cannot see whether one exists. Read the pair before acting: if one file only DECLARES what the other consumes (a constants/types file beside its user), the co-change is definitional and the question is whether the split earns its keep; if they duplicate structure, extract the common part into a shared function or type they both call; if neither holds, the coupling is hidden and worth breaking."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"70de9cbaf5836e089da7c3e123841dbb404071a4e5b311dee3168fc8eba1a493"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: ConvertCommand.cs \u2194 HelpDisplay.cs: \u0060src/seconv/Commands/ConvertCommand.cs\u0060 and \u0060src/seconv/Helpers/HelpDisplay.cs\u0060 change together 70% of the time (16 of the 23 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well). They sit in different directories, but in this ecosystem the namespace is declared in the FILE, not by the folder \u2014 so the two may well share one namespace and reference each other with no import for this pass to see. Read the pair before acting: if one derives from or overrides the other, the dependency is explicit in the type declaration and the co-change is definitional; if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE and the thing to add is a comment saying so; if they simply belong together, co-locate them; if none of these holds, the coupling is hidden and worth breaking."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/seconv/Commands/ConvertCommand.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"21b997a700662aaacb7c2d6d07103b6f1a7646efc188b8b8f0d00e604935dd95"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: TextToSpeechViewModel.cs \u2194 SeVideoTextToSpeech.cs: \u0060src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs\u0060 and \u0060src/ui/Logic/Config/SeVideoTextToSpeech.cs\u0060 change together 67% of the time (18 of the 27 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well). They sit in different directories, but in this ecosystem the namespace is declared in the FILE, not by the folder \u2014 so the two may well share one namespace and reference each other with no import for this pass to see. Read the pair before acting: if one derives from or overrides the other, the dependency is explicit in the type declaration and the co-change is definitional; if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE and the thing to add is a comment saying so; if they simply belong together, co-locate them; if none of these holds, the coupling is hidden and worth breaking."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac76cf6364103a30318edb1421b32d76164849f4c9541a069de49e9ca3bf4778"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1b213f6eedd4b140d0bc37bdf1496f72811a643f34064f12518b32e9e83bcfc7"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eb00976a698a5d68999b7ee6d27206fd374e916853e7ff1ead5eed42386f043f"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"90f83b4fa27db32740afe9540c905f3c0499caed87f61049a8a903ecc95b41c3"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0752d0df7434000fcabf1048e2de30a7a1a8b982b3db9a19898c4dec199856b4"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d657599f6f99da1927d3377533dfc0888b34c4d84aa7d5579841fd72d0e39bce"}},{"ruleId":"D39","level":"note","message":{"text":"IL efficiency: 328 authored method(s) exceed the IL budget: 328 of 6464 first-party methods compile to oversized IL bodies (\u003E 250 instructions); worst: Nikse.SubtitleEdit.Core.SubtitleFormats.Cavena890.FixText @ src/libse/SubtitleFormats/Cavena890.cs:1693, 2690 IL instructions; large bodies don\u0027t JIT-inline, which pulled this dimension to 9.0/10; splitting the hottest bodies recovers the most."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/libse/SubtitleFormats/Cavena890.cs"},"region":{"startLine":1693}}}],"partialFingerprints":{"codehealthFindingId/v1":"e13fa8c94c5a8dcfd45fc2974ae30e56ff8a867dfe435102cdffdd8dd1aca4bb"}}],"taxonomies":[{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d","organization":"MITRE","informationUri":"https://cwe.mitre.org/","isComprehensive":false,"shortDescription":{"text":"The MITRE Common Weakness Enumeration (CWE)."},"taxa":[{"id":"CWE-1357","guid":"e4d2e772-757e-0a5c-bd7d-77052949d866","name":"Reliance on Insufficiently Trustworthy Component","shortDescription":{"text":"Reliance on Insufficiently Trustworthy Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1357.html"},{"id":"CWE-1395","guid":"800e09e7-c11a-8654-9fa6-86f398995fed","name":"Dependency on Vulnerable Third-Party Component","shortDescription":{"text":"Dependency on Vulnerable Third-Party Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1395.html"},{"id":"CWE-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"CWE-353","shortDescription":{"text":"CWE-353"},"helpUri":"https://cwe.mitre.org/data/definitions/353.html"},{"id":"CWE-494","guid":"b8a65e0d-e459-4a55-a931-fc1136482375","name":"Download of Code Without Integrity Check","shortDescription":{"text":"Download of Code Without Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/494.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Command Injection","shortDescription":{"text":"Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"OS Command Injection","shortDescription":{"text":"OS Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Cross-site Scripting (XSS)","shortDescription":{"text":"Cross-site Scripting (XSS)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"SQL Injection","shortDescription":{"text":"SQL Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-937","guid":"16f316ae-415c-b354-a59b-1f7905f756e9","name":"Using Components with Known Vulnerabilities","shortDescription":{"text":"Using Components with Known Vulnerabilities"},"helpUri":"https://cwe.mitre.org/data/definitions/937.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Code Injection","shortDescription":{"text":"Code Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"}]}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":63,"secretScannerRunsExcluded":0}},"redactionTokens":["A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."]}]}