{"$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":"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":"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":"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"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"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":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"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"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"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"]},{"target":{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"],"owasp":"A05:2025"}},{"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"]},{"target":{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"],"owasp":"A03:2025"}},{"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"]},{"target":{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"],"owasp":"A03:2025"}},{"id":"D43","name":"Malicious Dependencies","shortDescription":{"text":"Malicious Dependencies"},"helpUri":"https://codehealth.canine.dev/dimensions/D43","relationships":[{"target":{"id":"CWE-506","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-506"],"owasp":"A08:2025"}},{"id":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX4","name":"Dependency direction","shortDescription":{"text":"Dependency direction"},"helpUri":"https://codehealth.canine.dev/dimensions/AX4"},{"id":"AX6","name":"Interface segregation","shortDescription":{"text":"Interface segregation"},"helpUri":"https://codehealth.canine.dev/dimensions/AX6"},{"id":"AXB2","name":"Runtime readiness","shortDescription":{"text":"Runtime readiness"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB2"},{"id":"ED5","name":"Idempotency","shortDescription":{"text":"Idempotency"},"helpUri":"https://codehealth.canine.dev/dimensions/ED5"},{"id":"GD1","name":"Unfinished \u0026 placeholder code","shortDescription":{"text":"Unfinished \u0026 placeholder code"},"helpUri":"https://codehealth.canine.dev/dimensions/GD1"},{"id":"IC1","name":"Incompleteness \u0026 stubs","shortDescription":{"text":"Incompleteness \u0026 stubs"},"helpUri":"https://codehealth.canine.dev/dimensions/IC1"},{"id":"M1","name":"Documentation (README)","shortDescription":{"text":"Documentation (README)"},"helpUri":"https://codehealth.canine.dev/dimensions/M1"},{"id":"M2","name":"Architecture documentation","shortDescription":{"text":"Architecture documentation"},"helpUri":"https://codehealth.canine.dev/dimensions/M2"},{"id":"M3","name":"Folder \u0026 project structure","shortDescription":{"text":"Folder \u0026 project structure"},"helpUri":"https://codehealth.canine.dev/dimensions/M3"},{"id":"M4","name":"Documentation accuracy","shortDescription":{"text":"Documentation accuracy"},"helpUri":"https://codehealth.canine.dev/dimensions/M4"},{"id":"P1","name":"CI/CD gates","shortDescription":{"text":"CI/CD gates"},"helpUri":"https://codehealth.canine.dev/dimensions/P1"},{"id":"P10","name":"Library API \u0026 versioning","shortDescription":{"text":"Library API \u0026 versioning"},"helpUri":"https://codehealth.canine.dev/dimensions/P10"},{"id":"P12","name":"CI test-gate honesty","shortDescription":{"text":"CI test-gate honesty"},"helpUri":"https://codehealth.canine.dev/dimensions/P12"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"PF3","name":"Async \u0026 latency hygiene","shortDescription":{"text":"Async \u0026 latency hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/PF3"},{"id":"R1","name":"Type Safety","shortDescription":{"text":"Type Safety"},"helpUri":"https://codehealth.canine.dev/dimensions/R1"},{"id":"R10","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/R10"},{"id":"R11","name":"Import Boundaries","shortDescription":{"text":"Import Boundaries"},"helpUri":"https://codehealth.canine.dev/dimensions/R11"},{"id":"R2","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/R2"},{"id":"R3","name":"Large Files","shortDescription":{"text":"Large Files"},"helpUri":"https://codehealth.canine.dev/dimensions/R3"},{"id":"R4","name":"Test Coverage","shortDescription":{"text":"Test Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/R4"},{"id":"R6","name":"Tooling","shortDescription":{"text":"Tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/R6"},{"id":"R7","name":"Dead Code","shortDescription":{"text":"Dead Code"},"helpUri":"https://codehealth.canine.dev/dimensions/R7"},{"id":"R8","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/R8"},{"id":"R9","name":"Circular Imports","shortDescription":{"text":"Circular Imports"},"helpUri":"https://codehealth.canine.dev/dimensions/R9"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X1","name":"Async correctness","shortDescription":{"text":"Async correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X1"},{"id":"X10","name":"Duplicated predicate","shortDescription":{"text":"Duplicated predicate"},"helpUri":"https://codehealth.canine.dev/dimensions/X10"},{"id":"X12","name":"Unreachable branch","shortDescription":{"text":"Unreachable branch"},"helpUri":"https://codehealth.canine.dev/dimensions/X12"},{"id":"X13","name":"Undrained process stream","shortDescription":{"text":"Undrained process stream"},"helpUri":"https://codehealth.canine.dev/dimensions/X13"},{"id":"X14","name":"Bypassable address classification","shortDescription":{"text":"Bypassable address classification"},"helpUri":"https://codehealth.canine.dev/dimensions/X14"},{"id":"X15","name":"Unvalidated length from an untrusted reader","shortDescription":{"text":"Unvalidated length from an untrusted reader"},"helpUri":"https://codehealth.canine.dev/dimensions/X15"},{"id":"X16","name":"Unfloored truncation loop","shortDescription":{"text":"Unfloored truncation loop"},"helpUri":"https://codehealth.canine.dev/dimensions/X16"},{"id":"X17","name":"Uncapped recursion over a caller-supplied document","shortDescription":{"text":"Uncapped recursion over a caller-supplied document"},"helpUri":"https://codehealth.canine.dev/dimensions/X17"},{"id":"X18","name":"Disposal-pattern correctness","shortDescription":{"text":"Disposal-pattern correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X18"},{"id":"X19","name":"Unrestored process-global state","shortDescription":{"text":"Unrestored process-global state"},"helpUri":"https://codehealth.canine.dev/dimensions/X19"},{"id":"X20","name":"Mistyped argument guard","shortDescription":{"text":"Mistyped argument guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X20"},{"id":"X21","name":"Side-effecting pattern guard","shortDescription":{"text":"Side-effecting pattern guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X21"},{"id":"X22","name":"Contradicted release guard","shortDescription":{"text":"Contradicted release guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X22"},{"id":"X23","name":"Unguarded diagnostic materialisation","shortDescription":{"text":"Unguarded diagnostic materialisation"},"helpUri":"https://codehealth.canine.dev/dimensions/X23"},{"id":"X24","name":"Document value interpolated into markup unescaped","shortDescription":{"text":"Document value interpolated into markup unescaped"},"helpUri":"https://codehealth.canine.dev/dimensions/X24"},{"id":"X25","name":"Inert configuration knob","shortDescription":{"text":"Inert configuration knob"},"helpUri":"https://codehealth.canine.dev/dimensions/X25"},{"id":"X26","name":"Unsynchronised callback handoff","shortDescription":{"text":"Unsynchronised callback handoff"},"helpUri":"https://codehealth.canine.dev/dimensions/X26"},{"id":"X27","name":"Collection changed while being enumerated","shortDescription":{"text":"Collection changed while being enumerated"},"helpUri":"https://codehealth.canine.dev/dimensions/X27"},{"id":"X28","name":"Index access outside its own emptiness guard","shortDescription":{"text":"Index access outside its own emptiness guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X28"},{"id":"X29","name":"Per-element action decided by a fixed element","shortDescription":{"text":"Per-element action decided by a fixed element"},"helpUri":"https://codehealth.canine.dev/dimensions/X29"},{"id":"X3","name":"Exception handling","shortDescription":{"text":"Exception handling"},"helpUri":"https://codehealth.canine.dev/dimensions/X3"},{"id":"X30","name":"Support guard that admits what it rejects","shortDescription":{"text":"Support guard that admits what it rejects"},"helpUri":"https://codehealth.canine.dev/dimensions/X30"},{"id":"X32","name":"Type resolved by simple name across every loaded assembly","shortDescription":{"text":"Type resolved by simple name across every loaded assembly"},"helpUri":"https://codehealth.canine.dev/dimensions/X32"},{"id":"X5","name":"Nullable reference types","shortDescription":{"text":"Nullable reference types"},"helpUri":"https://codehealth.canine.dev/dimensions/X5"},{"id":"X6","name":"Hand-rolled structured-format parsing","shortDescription":{"text":"Hand-rolled structured-format parsing"},"helpUri":"https://codehealth.canine.dev/dimensions/X6"},{"id":"X7","name":"Silent fallback defaults","shortDescription":{"text":"Silent fallback defaults"},"helpUri":"https://codehealth.canine.dev/dimensions/X7"},{"id":"X9","name":"Subsumed condition operand","shortDescription":{"text":"Subsumed condition operand"},"helpUri":"https://codehealth.canine.dev/dimensions/X9"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"utils.getSegments (cyclomatic 87): utils.getSegments has cyclomatic complexity 87 (threshold 15). Of this number, 53 points are the body\u0027s own statements and 34 belong to 3 function items 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":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"b36ce1f09b26bff1b89f5d8a8c08f7bcc85a0dbc57031dfac8692d044fe8700b"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 57): fetch has cyclomatic complexity 57 (threshold 15). Most of this is not in the body itself: 1 of the 57 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 137, 82, 108, \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":"packages/xgplayer-dash/src/m4s/mpd.js"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"279ad48a90641d8f93205020133a2b0756fb900d8f79c4c7fca7b75e9695fc5a"}},{"ruleId":"D1","level":"warning","message":{"text":"media.parseMediaPlaylist (cyclomatic 54): media.parseMediaPlaylist 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":"packages/xgplayer-hls/src/hls/manifest-loader/parser/media.js"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"35f7026c896a447f95c987e8ae6bb02bf4d0ef8a39773c0b66bd7d7b80c0ba10"}},{"ruleId":"D1","level":"warning","message":{"text":"MP4Parser.moovToTrack (cyclomatic 53): MP4Parser.moovToTrack 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":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":980}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c1c3fd6fc634f25149cb9d36a4b516b24e2ee0080691421f9e0baa355d3c6ab"}},{"ruleId":"D1","level":"warning","message":{"text":"TsDemuxer._createVideoSample (cyclomatic 50): TsDemuxer._createVideoSample has cyclomatic complexity 50 (threshold 15). Most of this is not in the body itself: 2 of the 50 points are its own statements and the rest belongs to one function literal inside it that branches (line 244). 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":"packages/xgplayer-transmuxer/src/mpeg-ts/index.ts"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"65a96563a2d17e67e518b0b4f33c0c745ca720ebee568174c81bec25710fc97f"}},{"ruleId":"D1","level":"warning","message":{"text":"AVC.parseSPS (cyclomatic 49): AVC.parseSPS 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":"packages/xgplayer-transmuxer/src/codec/avc.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"9da59fb0094dbe735b6cc5b0ad7829b32e1f2ad48bfd937b1cf58c31ba47ebb0"}},{"ruleId":"D1","level":"warning","message":{"text":"HEVC.parseSliceHeader (cyclomatic 46): HEVC.parseSliceHeader has cyclomatic complexity 46 (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":"packages/xgplayer-transmuxer/src/codec/hevc.ts"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"c301cf307f97884db37054ca41b83ac40b8317feb58c13b739f373c6fcc2d858"}},{"ruleId":"D1","level":"warning","message":{"text":"FlvDemuxer._parseVideo (cyclomatic 46): FlvDemuxer._parseVideo has cyclomatic complexity 46 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 21 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":"packages/xgplayer-transmuxer/src/flv/index.js"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee07cbea5661a4b670fb9c3628cdd1dd57f40c80fb42d54747f07125b63728e5"}},{"ruleId":"D1","level":"warning","message":{"text":"MP4Demuxer.demuxPart (cyclomatic 46): MP4Demuxer.demuxPart 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":"packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"10496bc25a82a42aba5b310d26805e2c1502f896dee951a5717009f6f4c8685b"}},{"ruleId":"D1","level":"warning","message":{"text":"MP4Loader.loadMetaProcess::OnProgressHandle (cyclomatic 44): MP4Loader.loadMetaProcess::OnProgressHandle 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":"packages/xgplayer-mp4-loader/src/loader.js"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"71e695d8ab0c349f26d066c5b9f1e57ac98b5ad048360b8a8444a7f3061e75d6"}},{"ruleId":"D1","level":"warning","message":{"text":"BufferService.appendBuffer (cyclomatic 38): BufferService.appendBuffer has cyclomatic complexity 38 (threshold 15). Of this number, 37 points are the body\u0027s own statements and 1 belongs to one function item 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":"packages/xgplayer-flv/src/flv/services/buffer-service.js"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"57b6c9a84fa917786b9decf9cca9b1087c9cb04613c424c7c00ba8d67dde4119"}},{"ruleId":"D1","level":"warning","message":{"text":"load (cyclomatic 37): load has cyclomatic complexity 37 (threshold 15). Most of this is not in the body itself: 15 of the 37 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 141, 132, 115, \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":"packages/xgplayer-streaming-shared/src/net/fetch.js"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4eb22a9185a8fc071a51dce3f2a9498ce9781f93069a1bbd4342361ffbe19a1"}},{"ruleId":"D1","level":"warning","message":{"text":"saveAs.saveAs (cyclomatic 36): saveAs.saveAs has cyclomatic complexity 36 (threshold 15). This file\u0027s own header attributes it to another copyright holder, so it is code this repository carries rather than code it wrote: restructuring the body in place forks it from upstream and turns every future re-sync into a manual merge. The performable moves are to leave the body as close to its upstream form as possible and keep it behind a narrow interface of your own, and to re-sync it when upstream changes \u2014 or, if it has already diverged far enough that you maintain it here, adopt it deliberately and then split the body into named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/download/saveAs.js"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a531acef2d0fa1c7579bc8bdc758c4364adb0c7900b99eefc82e32843b412dd"}},{"ruleId":"D1","level":"warning","message":{"text":"Xml2Json.parseDOMChildren (cyclomatic 33): Xml2Json.parseDOMChildren 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":"packages/xgplayer-dash/src/m4s/xml2json.js"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"0af4d89727c2a42c4e76c5eec67e7d2b4363c4eca75a6b3b529401d04c05d85f"}},{"ruleId":"D1","level":"warning","message":{"text":"FlvDemuxer.demux (cyclomatic 32): FlvDemuxer.demux 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":"packages/xgplayer-transmuxer/src/flv/index.js"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fd44e2c95a172fbf3fc8bdb42cbe785f2ab9aca9a4aa482e91cd7df73778d66"}},{"ruleId":"D1","level":"warning","message":{"text":"TsDemuxer.demux (cyclomatic 32): TsDemuxer.demux 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":"packages/xgplayer-transmuxer/src/mpeg-ts/index.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"8571ed7b958323e158a9d01d1cf8fb730df4dd30dc00ae7edd1c61e9792f7a55"}},{"ruleId":"D1","level":"warning","message":{"text":"FMP4Demuxer.demuxPart (cyclomatic 31): FMP4Demuxer.demuxPart has cyclomatic complexity 31 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 11 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":"packages/xgplayer-transmuxer/src/mp4/fmp4-demuxer.js"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"08718bde298da626f1474177fae5076f5923dc69f9259871e13dacfa1260a87b"}},{"ruleId":"D1","level":"warning","message":{"text":"TsFixer._fixVideo (cyclomatic 31): TsFixer._fixVideo has cyclomatic complexity 31 (threshold 15). Of this number, 28 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":"packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f0b274be666cd26da023037988ba4fa961d292b6e2b7d33b8072f7108410c90"}},{"ruleId":"D1","level":"warning","message":{"text":"appendBuffer (cyclomatic 31): appendBuffer has cyclomatic complexity 31 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 1 belongs to 2 function items 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":"packages/xgplayer-hls/src/hls/buffer-service/index.js"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceba641ab51bdc551887ded691dabbb74d6181d5f06ae9abb77ca7efaa12ece5"}},{"ruleId":"D1","level":"warning","message":{"text":"TsFixer._fixHevcBoundary (cyclomatic 30): TsFixer._fixHevcBoundary has cyclomatic 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"d40d788f758b49ce75753b5c4b8c6e181edcf053db3dd9f43f1073b711896e0d"}},{"ruleId":"D1","level":"warning","message":{"text":"BufferService.createSource (cyclomatic 29): BufferService.createSource 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":"packages/xgplayer-hls/src/hls/buffer-service/index.js"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"7488bd626084a8d6775a8f2c1cd9fec166c6be028d623d42ae8c2ac767d55478"}},{"ruleId":"D1","level":"warning","message":{"text":"ManifestLoader.load (cyclomatic 29): ManifestLoader.load 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":"packages/xgplayer-hls/src/hls/manifest-loader/index.js"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eb145016c0602a69e3f75c663c194adbd2809b3627fd3fbbabd2b70dee9dab0"}},{"ruleId":"D1","level":"warning","message":{"text":"Player._startInit (cyclomatic 27): Player._startInit 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":"packages/xgplayer/src/player.js"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c2de8abbbf14d56c113d505f95323f0de45b1a88e20c35911a19fb8d183a2f7"}},{"ruleId":"D1","level":"warning","message":{"text":"FlvFixer._doFixAudioInternal (cyclomatic 27): FlvFixer._doFixAudioInternal 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":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"26e7c60fcb18917772a3909ec1b242bce28bc58967d0d0afe87247730285f776"}},{"ruleId":"D1","level":"warning","message":{"text":"config.getBuildConfig (cyclomatic 27): config.getBuildConfig has cyclomatic complexity 27 (threshold 15). Of this number, 24 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":"scripts/utils/config.js"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"c53d35f5eb64b7feeefcf7999a0ca9886427befd7c9ea16a952e26d6bdc8b7a5"}},{"ruleId":"D1","level":"warning","message":{"text":"util.debounce (cyclomatic 26): util.debounce 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 10 function items inside it that branch (shouldInvoke, debounced, trailingEdge, \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/utils/util.js"},"region":{"startLine":977}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cd4f0a488de57946f12da3ef5674e6833fc02f1e4647eb848e62bd79f2e642f"}},{"ruleId":"D1","level":"warning","message":{"text":"ImaAdManager.onAdEvent (cyclomatic 26): ImaAdManager.onAdEvent 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":"packages/xgplayer-ads/src/imaAdManager.js"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"e917ba5957892e8cf38804d1cadb0a42e9250a7359c889bbfa4316003f13a970"}},{"ruleId":"D1","level":"warning","message":{"text":"utils.trafToSegments (cyclomatic 26): utils.trafToSegments 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":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"18c7278897adcd8094de6cbec945aaa330f2325bbb1735c74c18506bf1254687"}},{"ruleId":"D1","level":"warning","message":{"text":"index.main (cyclomatic 26): index.main has cyclomatic complexity 26 (threshold 15). Of this number, 25 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":"scripts/commands/release/index.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b53d306f883c2f9edf37b443f946a7ba1636237ce0771b2411703837688ebce"}},{"ruleId":"D1","level":"warning","message":{"text":"register (cyclomatic 26): register has cyclomatic complexity 26 (threshold 15). Of this number, 25 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":"packages/xgplayer/src/plugin/pluginsManager.js"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bae803fdf8556b4d67caaa34b71b4d75f3963ca50fecededfaee5e97c924773"}},{"ruleId":"D1","level":"warning","message":{"text":"MP4Parser.moofToSamples (cyclomatic 25): MP4Parser.moofToSamples has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 4 of the 25 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 1165, 1189). 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":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":1157}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a00c066a6aeeee5790161abc2a6b3e89dc5a5734d077337c8e4d36be985cab2"}},{"ruleId":"D1","level":"warning","message":{"text":"FetchLoader._loadChunk::pump (cyclomatic 24): FetchLoader._loadChunk::pump 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":"packages/xgplayer-streaming-shared/src/net/fetch.js"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2af4fbb29e77e4312297c90480dcc39a79040e3dcab75f94e57d8daa9335a9b"}},{"ruleId":"D1","level":"warning","message":{"text":"beforePlayerInit (cyclomatic 24): beforePlayerInit has cyclomatic complexity 24 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 4 belong to 7 function items 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":"packages/xgplayer-hls/src/plugin.js"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e574eb076812f8e0ad275064ecb7951665c97c728cac79ae88930a6b97c8c33"}},{"ruleId":"D1","level":"warning","message":{"text":"Player.resize (cyclomatic 23): Player.resize 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":"packages/xgplayer/src/player.js"},"region":{"startLine":2217}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a0dca9f2efe6f112b021f19510673951e5668a6ad42c1e357f7a82d4912d4dd"}},{"ruleId":"D1","level":"warning","message":{"text":"utils.isValidDaterange (cyclomatic 22): utils.isValidDaterange 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":"packages/xgplayer-hls/src/hls/manifest-loader/parser/utils.js"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"094e18927a7b48ba86ef42e55aff8ce90df4838b3e85da48aaff2219fb9b41cf"}},{"ruleId":"D1","level":"warning","message":{"text":"master.parseMasterPlaylist (cyclomatic 22): master.parseMasterPlaylist 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/manifest-loader/parser/master.js"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"30992f0851061744ad4db03445295993cfe02acbd1fdbf893c22dc4b77d5bc5d"}},{"ruleId":"D1","level":"warning","message":{"text":"NALu.parseAnnexB (cyclomatic 22): NALu.parseAnnexB 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":"packages/xgplayer-transmuxer/src/codec/nalu.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc640dc52a3d6a574a22f0d2f8893da2b40d1b5d6d939b79463d7dee9b95431a"}},{"ruleId":"D1","level":"warning","message":{"text":"AMF._parseValue (cyclomatic 22): AMF._parseValue 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":"packages/xgplayer-transmuxer/src/flv/amf.js"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca0d6ca8a3cfba92154b0ef4ea6ee4c40c43a98161ec4f4800915d9cca42d81c"}},{"ruleId":"D1","level":"warning","message":{"text":"Player.resizePosition (cyclomatic 20): Player.resizePosition 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":"packages/xgplayer/src/player.js"},"region":{"startLine":2105}}}],"partialFingerprints":{"codehealthFindingId/v1":"304776870fa61fae71238ec3beda4a617695c31b285f041c84c2fa32efb80705"}},{"ruleId":"D1","level":"warning","message":{"text":"PIP.requestPIP (cyclomatic 20): PIP.requestPIP has cyclomatic complexity 20 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 9 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":"packages/xgplayer/src/plugins/pip/index.js"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b6702f8f736e57af26046ccbe17ca1c8f8cbcf7dbb350b0bf6cf8b38e50a170"}},{"ruleId":"D1","level":"warning","message":{"text":"MP3Loader.loadSegment (cyclomatic 20): MP3Loader.loadSegment 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":"packages/xgplayer-mp3/src/loader.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f4cc56a55ab22dbcf2888736b9dfd869f808eac7cb2fa3f53309962324a387b"}},{"ruleId":"D1","level":"warning","message":{"text":"MP3.loadSegment (cyclomatic 20): MP3.loadSegment 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":"packages/xgplayer-mp3/src/mp3.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cbf47a1c76a0855c503e545f06bbc07c05877a59551cdad247e7a02e34d3cd6"}},{"ruleId":"D1","level":"warning","message":{"text":"Task.exec::request (cyclomatic 20): Task.exec::request 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":"packages/xgplayer-streaming-shared/src/net/task.js"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"edf4c70dbfedb7205fbd021d0e9d5ebc7fa01d8a5b8ca837b40b02c23d1f36a2"}},{"ruleId":"D1","level":"warning","message":{"text":"FlvFixer._fixVideo (cyclomatic 20): FlvFixer._fixVideo 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 cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b041e864e9390869853c1d94c0d635e34bb891d35c8a467a242fe7025c7f249"}},{"ruleId":"D1","level":"warning","message":{"text":"MP4Demuxer.demux (cyclomatic 20): MP4Demuxer.demux 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":"packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"22e1e48b062ef814e2fbc6f7559efaf4b092721266e56b07fae869b76d1e2652"}},{"ruleId":"D1","level":"warning","message":{"text":"Keyboard.onBodyKeyDown (cyclomatic 19): Keyboard.onBodyKeyDown 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":"packages/xgplayer/src/plugins/keyboard/index.js"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e93261493ebb0107dddc280b93f7298373adc8b69499c12828ef129941b09c4"}},{"ruleId":"D1","level":"warning","message":{"text":"GapJump.onGapJump (cyclomatic 19): GapJump.onGapJump 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":"packages/xgplayer/src/plugins/gapJump/index.js"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"e65d3cdfa1923d997be02801d2b6df5801ad38502e210b40499449ef7869797a"}},{"ruleId":"D1","level":"warning","message":{"text":"CastPlugin._resumeMSEPlugin (cyclomatic 19): CastPlugin._resumeMSEPlugin 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":"packages/xgplayer-cast/src/plugin.ts"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"94b2d334c4c0067aad2390a09e8aa072a1aaea4ae5a42de24841dfcad894ad00"}},{"ruleId":"D1","level":"warning","message":{"text":"Hls._loadData (cyclomatic 19): Hls._loadData 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":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"10bddf51bd3bbce52f5f53b760c940320f35a69201a917098ff89b05569adc3e"}},{"ruleId":"D1","level":"warning","message":{"text":"Flv._onProgress (cyclomatic 19): Flv._onProgress has cyclomatic 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/index.js"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a3e6e6449dedc39c7c612c8b92eff9c3fbae74d325eb94de1ffbc2531713d28"}},{"ruleId":"D1","level":"warning","message":{"text":"SubTitleParser.parseVTT (cyclomatic 19): SubTitleParser.parseVTT 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":"packages/xgplayer-subtitles/src/parser.js"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"65863ccf3b697f0b3248afcd8d26e5cd31d9457393ee089b515bcd2ada854e4a"}},{"ruleId":"D1","level":"warning","message":{"text":"XhrLoader._onLoad (cyclomatic 19): XhrLoader._onLoad 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":"packages/xgplayer-streaming-shared/src/net/xhr.js"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff31fc43fa737830cefc1b57b4f3d7c985bedd853f223cef4d68f24607e8b64b"}},{"ruleId":"D1","level":"warning","message":{"text":"MP4Parser.moovToSamples (cyclomatic 19): MP4Parser.moovToSamples 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":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":1213}}}],"partialFingerprints":{"codehealthFindingId/v1":"44c6ef01240478c98097046df904497745d78b4dab595ace90766757311976e6"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaProxy.constructor (cyclomatic 18): MediaProxy.constructor 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":"packages/xgplayer/src/mediaProxy.js"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"623904a8129bce54f0f60f2af6fa2e02ae66beea1709f664be4c8b658365f183"}},{"ruleId":"D1","level":"warning","message":{"text":"Player.constructor (cyclomatic 18): Player.constructor has cyclomatic complexity 18 (threshold 15). Of this number, 17 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":"packages/xgplayer/src/player.js"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"220b365baedfc5ae742018b4070981550fbffdc7a7c5a0035929938ca7af00d3"}},{"ruleId":"D1","level":"warning","message":{"text":"MobilePlugin.onTouchMove (cyclomatic 18): MobilePlugin.onTouchMove 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":"packages/xgplayer/src/plugins/mobile/index.js"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b0b69c7c4f8259fbf342ad4606aa7f88a759e0afd0898b718072a695e1dc11d"}},{"ruleId":"D1","level":"warning","message":{"text":"Stream.update (cyclomatic 18): Stream.update 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":"packages/xgplayer-hls/src/hls/playlist/stream.js"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fa92011390cab520efd166d6b1a954be3a9d5352b9a090f5f512a23d8869aca"}},{"ruleId":"D1","level":"warning","message":{"text":"Hls._loadSegment (cyclomatic 18): Hls._loadSegment 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":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"44951967c51fde592308b6c8e1e94027d2dd5825a0bcabed42dcc33654fdf0d5"}},{"ruleId":"D1","level":"warning","message":{"text":"Hls._onSeeking (cyclomatic 18): Hls._onSeeking 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":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":800}}}],"partialFingerprints":{"codehealthFindingId/v1":"32f5d81db806c1b8214ffb409ed53fd84cc53392f4132d143daf07e78e05261b"}},{"ruleId":"D1","level":"warning","message":{"text":"HlsJsPlugin._statistics (cyclomatic 18): HlsJsPlugin._statistics has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 160, 154). 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":"packages/xgplayer-hls.js/src/index.js"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"567c7f421bdd541f47672454b0ad1458f5c687e266c18d8a75e17e56a383bf7e"}},{"ruleId":"D1","level":"warning","message":{"text":"MPEG.parseHeader (cyclomatic 18): MPEG.parseHeader 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":"packages/xgplayer-transmuxer/src/codec/mpeg.ts"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f3a678e3e837148acd1de1a6ffacb68069ea5af7e031f0cd6b4ae9dcd23ba94"}},{"ruleId":"D1","level":"warning","message":{"text":"TsFixer.fix (cyclomatic 18): TsFixer.fix 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":"packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"04d170d8873387be6ad52c1590a6214ba77fe12a59611bcb629d300e6d65d650"}},{"ruleId":"D1","level":"warning","message":{"text":"_tick (cyclomatic 18): _tick 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":"packages/xgplayer-flv/src/flv/index.js"},"region":{"startLine":457}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f8bddcb4f03aa48d4e73234d7ac6f321c895a1642580de977c0e4fa43763279"}},{"ruleId":"D1","level":"warning","message":{"text":"Errors.constructor (cyclomatic 17): Errors.constructor 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":"packages/xgplayer/src/error.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2775f3e5f5522eb8e018088a1d448da2ddc6abd093ef57faf538ba004228282"}},{"ruleId":"D1","level":"warning","message":{"text":"Hls._loadSegmentDirect (cyclomatic 17): Hls._loadSegmentDirect 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":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"f749e650e6d6cd5354ccd54a3317bfd1f6d1906012d97ca6ab814beb1cdfba83"}},{"ruleId":"D1","level":"warning","message":{"text":"DASH.init (cyclomatic 17): DASH.init has cyclomatic 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 4 function literals inside it that branch (lines 69, 37, 51, \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":"packages/xgplayer-dash/src/dash.js"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"27b9ad45b0beaf0784ff0786fc6cad5b9e897dabcc3eaba65d10b31cfa008f68"}},{"ruleId":"D1","level":"warning","message":{"text":"MP4._loadSegment (cyclomatic 17): MP4._loadSegment 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":"packages/xgplayer-mp4/src/mp4/index.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"12b9c5d81c324324018a792dc73f049f565ea2cb089b013c4ed550874dab2329"}},{"ruleId":"D1","level":"warning","message":{"text":"MP4Loader.loadMeta (cyclomatic 17): MP4Loader.loadMeta has cyclomatic complexity 17 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 3 belong to one function item 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":"packages/xgplayer-mp4-loader/src/loader.js"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbd16b46e64bcf7c7274f908bcf8b611389610b010dc3884d479b1ee7edb6358"}},{"ruleId":"D1","level":"warning","message":{"text":"MSE.unbindMedia (cyclomatic 17): MSE.unbindMedia has cyclomatic complexity 17 (threshold 15). Of this number, 14 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":"packages/xgplayer-streaming-shared/src/mse.ts"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c733807ffb93ea73624c97a5cfae9e3b21398c0f5de7fd441a66a281d9997b7"}},{"ruleId":"D1","level":"warning","message":{"text":"TsFixer._doFixAudioInternal (cyclomatic 17): TsFixer._doFixAudioInternal 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":"packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"941b277f919a4dda14c92423fbdfcb72e32ed34346d71c64db59f4d4b42d11f9"}},{"ruleId":"D1","level":"warning","message":{"text":"exitFullscreen (cyclomatic 17): exitFullscreen has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/player.js"},"region":{"startLine":1526}}}],"partialFingerprints":{"codehealthFindingId/v1":"b772e5840acb58a9c5b7ca865a1b97ee1c70418ce81ab2c25f9cd0218e2c342c"}},{"ruleId":"D1","level":"warning","message":{"text":"attachPlayer (cyclomatic 17): attachPlayer has cyclomatic complexity 17 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 1 belongs 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":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"d411006396fd3b12bff9319eb20af2330eaf2eb1a2ef39f6b356bde9e4d6e0b3"}},{"ruleId":"D1","level":"warning","message":{"text":"Player._initDOM (cyclomatic 16): Player._initDOM has cyclomatic complexity 16 (threshold 15). Of this number, 14 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":"packages/xgplayer/src/player.js"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"230945289a4465446b78a44c3adb75694e57d422b08fd86e7fd688feee36c3b6"}},{"ruleId":"D1","level":"warning","message":{"text":"Start.toggleTo (cyclomatic 16): Start.toggleTo 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":"packages/xgplayer/src/plugins/start/index.js"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cb375579d195f0e8bee4a364c74e2486a83078914718cfb1cab8ae5ef6eeeb7"}},{"ruleId":"D1","level":"warning","message":{"text":"Keyboard.onKeydown (cyclomatic 16): Keyboard.onKeydown 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":"packages/xgplayer/src/plugins/keyboard/index.js"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7f48e66eed8b8a665072f4d76767e230dd9bb15d64336b11eaf3bf61d505d76"}},{"ruleId":"D1","level":"warning","message":{"text":"FlvFixer.fix (cyclomatic 16): FlvFixer.fix 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":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ddba8033076e5edcbb876be6d5df18e9208472203f6034f9e68def0b327f5a6"}},{"ruleId":"D1","level":"warning","message":{"text":"FMP4Demuxer.demux (cyclomatic 16): FMP4Demuxer.demux has cyclomatic complexity 16 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 5 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":"packages/xgplayer-transmuxer/src/mp4/fmp4-demuxer.js"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"058e0cf42f5cd47045ebd46539a250c815281471638a4ae8c188073fddc0a6da"}},{"ruleId":"D1","level":"warning","message":{"text":"seek (cyclomatic 16): seek has cyclomatic complexity 16 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 4 belong to one function item 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":"packages/xgplayer/src/player.js"},"region":{"startLine":1139}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1b77162b42f6be5145dd7b5055d8b54004f3d00badd87eadd416dcd50103483"}},{"ruleId":"D1","level":"warning","message":{"text":"_tick (cyclomatic 16): _tick 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":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":966}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3a23d742912411ac202ea70c72382c2433876af303caa83fede80473ba42c4a"}},{"ruleId":"D2","level":"warning","message":{"text":"getSegments (cognitive 184): getSegments has cognitive complexity 184 (threshold 15). Drivers by points: if/else 57 (125 pts), ternaries 9 (25 pts), boolean chains 22, loops 5 (12 pts) (nesting depth added 91). Of this number, 97 points are the body\u0027s own statements and 87 belong to 4 function items inside it that branch. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"f92e5e8b1e3163fa3feef6ac547af8ad6fa09da58ea242ce148eff7672deba1d"}},{"ruleId":"D2","level":"warning","message":{"text":"MPD.fetch (cognitive 109): MPD.fetch has cognitive complexity 109 (threshold 15). Drivers by points: if/else 40 (90 pts), boolean chains 13, loops 1 (3 pts), ternaries 1 (3 pts) (nesting depth added 54). None of this is in the body itself: all 109 points belong to 4 function literals inside it that branch (lines 137, 82, 108, \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":"packages/xgplayer-dash/src/m4s/mpd.js"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"664dfb09e91584b371f6a2abcab84b7e45d1f2ec9963e29c5fc4aa9581d3fa6e"}},{"ruleId":"D2","level":"warning","message":{"text":"demuxPart (cognitive 92): demuxPart has cognitive complexity 92 (threshold 15). Drivers by points: if/else 28 (62 pts), boolean chains 14, loops 5 (9 pts), ternaries 1 (4 pts), error handling 1 (3 pts) (nesting depth added 43). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"92a9db07002e43419b862ce1c7dc4db797cd5a66c6888917746955181e050a35"}},{"ruleId":"D2","level":"warning","message":{"text":"parseMediaPlaylist (cognitive 85): parseMediaPlaylist has cognitive complexity 85 (threshold 15). Drivers by points: if/else 23 (62 pts), ternaries 3 (10 pts), boolean chains 6, loops 2 (5 pts), match/switch 1 (2 pts) (nesting depth added 50). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/manifest-loader/parser/media.js"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"d40f46507ac645eff1ac5de8be4da42abce9c11bd2aaf26affd208087a5d841b"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.moovToTrack (cognitive 73): MP4Parser.moovToTrack has cognitive complexity 73 (threshold 15). Drivers by points: if/else 23 (41 pts), boolean chains 25, ternaries 2 (5 pts), match/switch 1 (2 pts) (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":980}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5af25b4052d2ceeac8a240d41f398bf9725a321173b5a71da5ae2802f5ccbfb"}},{"ruleId":"D2","level":"warning","message":{"text":"loadMetaProcess::OnProgressHandle (cognitive 73): loadMetaProcess::OnProgressHandle has cognitive complexity 73 (threshold 15). Drivers by points: if/else 24 (58 pts), boolean chains 12, error handling 1 (2 pts), ternaries 1 (nesting depth added 35). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/loader.js"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"c08d09cd048746d1c2d0883502498b4b7ad62fba16874377c562d414b60a405d"}},{"ruleId":"D2","level":"warning","message":{"text":"_parseVideo (cognitive 70): _parseVideo has cognitive complexity 70 (threshold 15). Drivers by points: if/else 21 (47 pts), boolean chains 11, ternaries 4 (9 pts), match/switch 1 (3 pts) (nesting depth added 33). Of this number, 50 points are the body\u0027s own statements and 20 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":"packages/xgplayer-transmuxer/src/flv/index.js"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee3f38edc9cef0faa292bee55fa8a6108caab9d958ad0581cc11cbfcc82441f6"}},{"ruleId":"D2","level":"warning","message":{"text":"parseDOMChildren (cognitive 65): parseDOMChildren has cognitive complexity 65 (threshold 15). Drivers by points: if/else 17 (47 pts), boolean chains 12, loops 3 (6 pts) (nesting depth added 33). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/m4s/xml2json.js"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d9356373063e8bc9d0855e19323e4db39a8d6c81b0f4667639e003fe4a85aaa"}},{"ruleId":"D2","level":"warning","message":{"text":"demuxPart (cognitive 63): demuxPart has cognitive complexity 63 (threshold 15). Drivers by points: if/else 22 (48 pts), boolean chains 8, loops 2 (7 pts) (nesting depth added 31). Of this number, 28 points are the body\u0027s own statements and 35 belong to 10 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":"packages/xgplayer-transmuxer/src/mp4/fmp4-demuxer.js"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"96319e3346c76f7417656746b82f51023a1e374c809fd71d745a5db98770fef3"}},{"ruleId":"D2","level":"warning","message":{"text":"BufferService.createSource (cognitive 59): BufferService.createSource has cognitive complexity 59 (threshold 15). Drivers by points: if/else 21 (50 pts), boolean chains 9 (nesting depth added 29). Of this number, 34 points are the body\u0027s own statements and 25 belong to 2 function literals inside it that branch. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/buffer-service/index.js"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"8410d2e50374d3feea7e7c91a691d509d74e4607a6d585a6e8dc3a01e4a54be0"}},{"ruleId":"D2","level":"warning","message":{"text":"TsDemuxer.demux (cognitive 55): TsDemuxer.demux has cognitive complexity 55 (threshold 15). Drivers by points: if/else 16 (41 pts), match/switch 2 (6 pts), boolean chains 4, loops 2 (4 pts) (nesting depth added 31). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mpeg-ts/index.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"744467037187340c9038fb309d9fb739444dc6a4327b6cd8666938bcd66a4c23"}},{"ruleId":"D2","level":"warning","message":{"text":"BufferService.appendBuffer (cognitive 54): BufferService.appendBuffer has cognitive complexity 54 (threshold 15). Drivers by points: if/else 24 (38 pts), boolean chains 8, ternaries 2 (5 pts), error handling 2 (3 pts) (nesting depth added 18). Of this number, 53 points are the body\u0027s own statements and 1 belongs to one function item 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":"packages/xgplayer-flv/src/flv/services/buffer-service.js"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"55a5f41c8e584730263a12766f60674cb2c05d3c9c971cc5e5a2e24aa0f64f15"}},{"ruleId":"D2","level":"warning","message":{"text":"load (cognitive 50): load has cognitive complexity 50 (threshold 15). Drivers by points: if/else 20 (26 pts), boolean chains 14, ternaries 5 (9 pts), error handling 1 (nesting depth added 10). Of this number, 21 points are the body\u0027s own statements and 29 belong to 5 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":"packages/xgplayer-streaming-shared/src/net/fetch.js"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"d502bc95c0e08acae7d43dc3cc465de903f10e4bfef7c65535a24939fd81cfc0"}},{"ruleId":"D2","level":"warning","message":{"text":"demux (cognitive 50): demux has cognitive complexity 50 (threshold 15). Drivers by points: if/else 25 (42 pts), boolean chains 6, loops 1, ternaries 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/index.js"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"19b4bf3f4f309fce17fc54a0b2d8b34d07be865fcaec315a0feff1838019f60e"}},{"ruleId":"D2","level":"warning","message":{"text":"TsDemuxer._createVideoSample (cognitive 48): TsDemuxer._createVideoSample has cognitive complexity 48 (threshold 15). Drivers by points: if/else 12 (26 pts), boolean chains 14, ternaries 2 (4 pts), loops 1 (3 pts), match/switch 1 (nesting depth added 18). Most of this is not in the body itself: 1 of the 48 points is its own statement and the rest belongs to one function literal inside it that branches (line 244). 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":"packages/xgplayer-transmuxer/src/mpeg-ts/index.ts"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"21b76adfe5049ed1ed692823880a009c0182cc828164eab0b7662dd0412d05ab"}},{"ruleId":"D2","level":"warning","message":{"text":"AVC.parseSPS (cognitive 47): AVC.parseSPS has cognitive complexity 47 (threshold 15). Drivers by points: if/else 18 (35 pts), loops 2 (5 pts), match/switch 1 (3 pts), ternaries 1 (3 pts), boolean chains 1 (nesting depth added 24). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/avc.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"d267cd624cad7e0e6d87646e67b29a5c826ab5ad749ea6f1eb771907ab7c04d0"}},{"ruleId":"D2","level":"warning","message":{"text":"demux (cognitive 43): demux has cognitive complexity 43 (threshold 15). Drivers by points: if/else 13 (29 pts), loops 3 (7 pts), boolean chains 4, ternaries 1 (3 pts) (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bc2fd081b3832fb8b803d5d12762e19e9711c24c0c314ef90d44f345f36c232"}},{"ruleId":"D2","level":"warning","message":{"text":"FlvFixer._doFixAudioInternal (cognitive 42): FlvFixer._doFixAudioInternal has cognitive complexity 42 (threshold 15). Drivers by points: if/else 13 (29 pts), boolean chains 4, loops 2 (4 pts), ternaries 2 (3 pts), match/switch 1 (2 pts) (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb2779c66dabe68eebe847565fa633c98cb39d4df8c630bc5994cbbbe131317d"}},{"ruleId":"D2","level":"warning","message":{"text":"appendBuffer (cognitive 41): appendBuffer has cognitive complexity 41 (threshold 15). Drivers by points: if/else 18 (29 pts), boolean chains 10, other 2 (nesting depth added 11). Of this number, 40 points are the body\u0027s own statements and 1 belongs to 2 function items 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":"packages/xgplayer-hls/src/hls/buffer-service/index.js"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"deb07c64daee39b34ac4319fee29a1dad2862294dd4db8bc37b4fb353b1de95c"}},{"ruleId":"D2","level":"warning","message":{"text":"TsFixer._fixVideo (cognitive 40): TsFixer._fixVideo has cognitive complexity 40 (threshold 15). Drivers by points: if/else 17 (27 pts), boolean chains 9, loops 2 (4 pts) (nesting depth added 12). Of this number, 37 points are the body\u0027s own statements and 3 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":"packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4beee2dbda74bbc682ad0dc950dc94f7014e60e42d85903370b13e0ac472696"}},{"ruleId":"D2","level":"warning","message":{"text":"master.parseMasterPlaylist (cognitive 39): master.parseMasterPlaylist has cognitive complexity 39 (threshold 15). Drivers by points: if/else 14 (31 pts), boolean chains 4, match/switch 1 (3 pts), loops 1 (nesting depth added 19). Of this number, 35 points are the body\u0027s own statements and 4 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":"packages/xgplayer-hls/src/hls/manifest-loader/parser/master.js"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae4a42fe53746e8653377913d1d2502468fb6655c3992a54f38b80ed73359b00"}},{"ruleId":"D2","level":"warning","message":{"text":"SubTitleParser.parseVTT (cognitive 39): SubTitleParser.parseVTT has cognitive complexity 39 (threshold 15). Drivers by points: if/else 14 (31 pts), boolean chains 7, loops 1 (nesting depth added 17). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/parser.js"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"311113936841153f55220de609676a5c34944b2beb79536cd98a56b27ac996c3"}},{"ruleId":"D2","level":"warning","message":{"text":"ManifestLoader.load (cognitive 38): ManifestLoader.load has cognitive complexity 38 (threshold 15). Drivers by points: if/else 17 (25 pts), boolean chains 11, error handling 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/manifest-loader/index.js"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd888126cd5ac28ddcc0026198b63653f301675ce96b6ea40c69dd8eda44c512"}},{"ruleId":"D2","level":"warning","message":{"text":"saveAs.saveAs (cognitive 36): saveAs.saveAs has cognitive complexity 36 (threshold 15). Drivers by points: if/else 15 (17 pts), boolean chains 14, ternaries 1 (3 pts), error handling 1 (2 pts) (nesting depth added 5). This file\u0027s own header attributes it to another copyright holder, so it is code this repository carries rather than code it wrote: restructuring the body in place forks it from upstream and turns every future re-sync into a manual merge. The performable moves are to leave the body as close to its upstream form as possible and keep it behind a narrow interface of your own, and to re-sync it when upstream changes \u2014 or, if it has already diverged far enough that you maintain it here, adopt it deliberately and then split the body into named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/download/saveAs.js"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"1be0c6e3ae40f5e58d186ac94934ec9e07905c5baf10c0474143249bbf75de2d"}},{"ruleId":"D2","level":"warning","message":{"text":"Task.exec::request (cognitive 36): Task.exec::request has cognitive complexity 36 (threshold 15). Drivers by points: if/else 15 (31 pts), boolean chains 4, error handling 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/net/task.js"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"14c761ddf55a3b43331b64a6e3b211a101c3c709bae5dd1f76eef1b7d2deb766"}},{"ruleId":"D2","level":"warning","message":{"text":"config.getBuildConfig (cognitive 36): config.getBuildConfig has cognitive complexity 36 (threshold 15). Drivers by points: if/else 12 (20 pts), ternaries 11 (12 pts), boolean chains 4 (nesting depth added 9). Of this number, 32 points are the body\u0027s own statements and 4 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":"scripts/utils/config.js"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ca0082e15c60217805d9fe2e6be23a1f39c7c41115f2401096753a3993b9792"}},{"ruleId":"D2","level":"warning","message":{"text":"_loadChunk::pump (cognitive 36): _loadChunk::pump has cognitive complexity 36 (threshold 15). Drivers by points: if/else 17 (25 pts), boolean chains 6, ternaries 3 (4 pts), error handling 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/net/fetch.js"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"58e67c7ec2435dc1c2581de303742d4ed54679358fb076b285978b09275ead86"}},{"ruleId":"D2","level":"warning","message":{"text":"demux (cognitive 36): demux has cognitive complexity 36 (threshold 15). Drivers by points: if/else 12 (27 pts), loops 1 (4 pts), ternaries 1 (4 pts), boolean chains 1 (nesting depth added 21). Of this number, 20 points are the body\u0027s own statements and 16 belong to 4 function literals inside it that branch. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/fmp4-demuxer.js"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"a10503037789f9e3b60cb0c42e235b73c9f40e9e5d11ef617c11f35fa05cfc0f"}},{"ruleId":"D2","level":"warning","message":{"text":"trafToSegments (cognitive 34): trafToSegments has cognitive complexity 34 (threshold 15). Drivers by points: ternaries 9 (13 pts), if/else 8 (12 pts), boolean chains 7, loops 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa9bdf83add86424121dc2a1953821a666e7a14bdcd63b482c7feee6246b124c"}},{"ruleId":"D2","level":"warning","message":{"text":"_tick (cognitive 33): _tick has cognitive complexity 33 (threshold 15). Drivers by points: if/else 11 (18 pts), loops 2 (8 pts), ternaries 1 (5 pts), boolean chains 2 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":966}}}],"partialFingerprints":{"codehealthFindingId/v1":"21fa18958567ad20c6c553e5f366643b314492dcb9e30f1b5cbfcca477e28eb1"}},{"ruleId":"D2","level":"warning","message":{"text":"requestPIP (cognitive 33): requestPIP has cognitive complexity 33 (threshold 15). Drivers by points: if/else 17 (26 pts), boolean chains 4, ternaries 1 (2 pts), error handling 1 (nesting depth added 10). Most of this is not in the body itself: 14 of the 33 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 193, 230). 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":"packages/xgplayer/src/plugins/pip/index.js"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d7e6472929b1b5aee1516c486eb71b044434f6d66db0c6ee5ed19aa25e28bc0"}},{"ruleId":"D2","level":"warning","message":{"text":"Hls._loadData (cognitive 32): Hls._loadData has cognitive complexity 32 (threshold 15). Drivers by points: if/else 15 (26 pts), ternaries 1 (3 pts), boolean chains 2, error handling 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7ce2b8ffae981ffa7d6f835bdc3c95800356ed989c00b95054567c2447104a0"}},{"ruleId":"D2","level":"warning","message":{"text":"NALu.parseAnnexB (cognitive 32): NALu.parseAnnexB has cognitive complexity 32 (threshold 15). Drivers by points: if/else 11 (20 pts), loops 4 (6 pts), boolean chains 4, match/switch 1 (2 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/nalu.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"346d533292efb2758c33a278d235c4642a74e187ed3d612963bdde8205409b30"}},{"ruleId":"D2","level":"warning","message":{"text":"index.main (cognitive 31): index.main has cognitive complexity 31 (threshold 15). Drivers by points: if/else 18 (20 pts), boolean chains 8, ternaries 2 (3 pts) (nesting depth added 3). Of this number, 29 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, 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":"scripts/commands/release/index.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"31efc3bfad916d37ca27b322d4c46b38ddd20dc3e279874814ee572a7eba749e"}},{"ruleId":"D2","level":"warning","message":{"text":"UTF8.decode (cognitive 30): UTF8.decode has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (27 pts), boolean chains 2, loops 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/utils/utf8.js"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"e69110bb1d5036c3b770de53e8dbead440af457369216f4a7b2ee8f00313411e"}},{"ruleId":"D2","level":"warning","message":{"text":"FlvFixer._fixVideo (cognitive 30): FlvFixer._fixVideo has cognitive complexity 30 (threshold 15). Drivers by points: if/else 18 (26 pts), boolean chains 3, loops 1 (nesting depth added 8). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaa93978817280ce75d2ea6f1bf7a70986101b1756b0a374e4c4c04c9f2771eb"}},{"ruleId":"D2","level":"warning","message":{"text":"moofToSamples (cognitive 30): moofToSamples has cognitive complexity 30 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 13, loops 1 (2 pts) (nesting depth added 6). Most of this is not in the body itself: 5 of the 30 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 1165, 1189). 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":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":1157}}}],"partialFingerprints":{"codehealthFindingId/v1":"61ae64c2a11cda067cd70801d21395a29ddbfecd8cb5ac8c872fc9f90584df86"}},{"ruleId":"D2","level":"warning","message":{"text":"(anonymous) (cognitive 30): (anonymous) has cognitive complexity 30 (threshold 15). Drivers by points: if/else 12 (21 pts), error handling 1 (4 pts), boolean chains 3, loops 1 (2 pts) (nesting depth added 13). Of this number, 24 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":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"6baee4cd76689e3d437bea27e447f894643c965dbd3ecd4a59477a21d2d9c680"}},{"ruleId":"D2","level":"warning","message":{"text":"beforePlayerInit (cognitive 30): beforePlayerInit has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 10, error handling 2 (5 pts) (nesting depth added 7). Of this number, 19 points are the body\u0027s own statements and 11 belong to 7 function items 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":"packages/xgplayer-hls/src/plugin.js"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9017966a2309be044cf754d6f01583ed3f46ee639a6ee2a5dd2e1a29cb5db4c"}},{"ruleId":"D2","level":"warning","message":{"text":"AMF._parseValue (cognitive 29): AMF._parseValue has cognitive complexity 29 (threshold 15). Drivers by points: if/else 9 (22 pts), loops 3 (6 pts), match/switch 1 (nesting depth added 16). 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":"packages/xgplayer-transmuxer/src/flv/amf.js"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbf9bcb72600f384dfe8e5bd68b02f4668a0d605becd4e2e910e5eefc1eeba94"}},{"ruleId":"D2","level":"warning","message":{"text":"ImaAdManager.onAdEvent (cognitive 28): ImaAdManager.onAdEvent has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (22 pts), boolean chains 4, match/switch 1, ternaries 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-ads/src/imaAdManager.js"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"54bd574c0e02f01498b335cc22dc2b9f9e73f71374f3c8018df3dc72678d8fef"}},{"ruleId":"D2","level":"warning","message":{"text":"TsFixer._fixHevcBoundary (cognitive 28): TsFixer._fixHevcBoundary has cognitive complexity 28 (threshold 15). Drivers by points: if/else 12 (17 pts), boolean chains 9, loops 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c846ceec1e090ee8476cc4d4302f62930955a946e1501a709441fbed9e940bb"}},{"ruleId":"D2","level":"warning","message":{"text":"_startInit (cognitive 28): _startInit has cognitive complexity 28 (threshold 15). Drivers by points: if/else 14 (16 pts), boolean chains 10, ternaries 2 (nesting depth added 2). 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":"packages/xgplayer/src/player.js"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d0735da28ca5e45fe2bc2cc8dfbff93df7c67ed287ad51ff6b73324b734ff68"}},{"ruleId":"D2","level":"warning","message":{"text":"exitFullscreen (cognitive 28): exitFullscreen has cognitive complexity 28 (threshold 15). Drivers by points: if/else 8 (12 pts), error handling 4 (11 pts), boolean chains 4, loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/player.js"},"region":{"startLine":1526}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5521833cfcb3d1db948509a8ade71494451c8811927e955004133b2664cf2af"}},{"ruleId":"D2","level":"warning","message":{"text":"register (cognitive 28): register has cognitive complexity 28 (threshold 15). Drivers by points: if/else 15 (19 pts), boolean chains 7, error handling 1, loops 1 (nesting depth added 4). 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":"packages/xgplayer/src/plugin/pluginsManager.js"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"522f20e8a60c62f418b7d070953511d60235af1217ba443b1e201e069939232a"}},{"ruleId":"D2","level":"warning","message":{"text":"toggleFullScreen (cognitive 28): toggleFullScreen has cognitive complexity 28 (threshold 15). Drivers by points: if/else 13 (21 pts), boolean chains 4, error handling 1 (3 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/fullscreen/index.js"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"7faa0f453dbd2882be5ccf439f17b2b95fafd559d47c92e6cd8e253d2784e504"}},{"ruleId":"D2","level":"warning","message":{"text":"_loadSegment (cognitive 28): _loadSegment has cognitive complexity 28 (threshold 15). Drivers by points: if/else 11 (26 pts), boolean chains 2 (nesting depth added 15). Of this number, 14 points are the body\u0027s own statements and 14 belong to 3 function literals inside it that branch. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/segment-loader/index.js"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"69d075f025126f1b697739c0f4ad6afcaa0e0b3074676afd5f2a6259b6b88406"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Loader.loadMeta (cognitive 27): MP4Loader.loadMeta has cognitive complexity 27 (threshold 15). Drivers by points: if/else 15 (26 pts), boolean chains 1 (nesting depth added 11). Of this number, 20 points are the body\u0027s own statements and 7 belong to one function item 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":"packages/xgplayer-mp4-loader/src/loader.js"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ad7185814220a6acca7f639f680b0c00179e2027d28e1e57396f80c1cc3a6c6"}},{"ruleId":"D2","level":"warning","message":{"text":"TsFixer._doFixAudioInternal (cognitive 27): TsFixer._doFixAudioInternal has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (19 pts), boolean chains 4, loops 2 (4 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3bf8364277db5680a46a83fcff430859c1b2045fe5f8b6b6ab9184310fa7efa"}},{"ruleId":"D2","level":"warning","message":{"text":"_tick (cognitive 27): _tick has cognitive complexity 27 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 7, loops 2 (7 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/index.js"},"region":{"startLine":457}}}],"partialFingerprints":{"codehealthFindingId/v1":"c37e28120167ec585f6b2547341229189785adc56a3a8b5c521ac71ff0642420"}},{"ruleId":"D2","level":"warning","message":{"text":"Subtitle.switch (cognitive 26): Subtitle.switch has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (21 pts), boolean chains 3, loops 1 (2 pts) (nesting depth added 10). None of this is in the body itself: all 26 points belong to 2 function literals inside it that branch (lines 319, 363). 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":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"79ac9ee980d2e8d5ad7a3e25067b115e2041ff27192561eb130eaabfd743eb28"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.esds (cognitive 26): MP4Parser.esds has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (21 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 13). None of this is in the body itself: all 26 points belong to one function literal inside it that branches (line 700). 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":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":699}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eb4c73e4e3b9bc839ac18bd35777f1de5661ea37a3a92c3aea0f895fc5b2e7e"}},{"ruleId":"D2","level":"warning","message":{"text":"resizePosition (cognitive 26): resizePosition has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 10 (18 pts), if/else 5, boolean chains 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/player.js"},"region":{"startLine":2105}}}],"partialFingerprints":{"codehealthFindingId/v1":"3adccbc95a58d148d4606c6c634034507954f5d8045b9c5dfc63dbcfc7a9e5a3"}},{"ruleId":"D2","level":"warning","message":{"text":"debounce (cognitive 26): debounce has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (13 pts), ternaries 5 (7 pts), boolean chains 6 (nesting depth added 4). Most of this is not in the body itself: 9 of the 26 points are its own statements and the rest belongs to 12 function items inside it that branch (debounced, shouldInvoke, trailingEdge, \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/utils/util.js"},"region":{"startLine":977}}}],"partialFingerprints":{"codehealthFindingId/v1":"118a80437068f6622680dd13286cf3c16da67a6f4fc333f1def36bb60365d8d8"}},{"ruleId":"D2","level":"warning","message":{"text":"MSE.unbindMedia (cognitive 25): MSE.unbindMedia has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (15 pts), error handling 2 (6 pts), boolean chains 4 (nesting depth added 10). Of this number, 18 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":"packages/xgplayer-streaming-shared/src/mse.ts"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"1408c1fdfd51522eb67c5d2e3e9101ba5f79cea5f7ee56fd90d26a59ab2be7c9"}},{"ruleId":"D2","level":"warning","message":{"text":"getSamples (cognitive 25): getSamples has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (15 pts), ternaries 2 (5 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 11). Most of this is not in the body itself: 3 of the 25 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 1289, 1273, 1268). 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":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":1258}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7e069fb4251852c3055caa55cb2692563bd64deb4d1eaa36b5252b7482f4a4c"}},{"ruleId":"D2","level":"warning","message":{"text":"_onLoad (cognitive 25): _onLoad has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 7, ternaries 3 (5 pts) (nesting depth added 4). 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":"packages/xgplayer-streaming-shared/src/net/xhr.js"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"95c4ada2cf6e3816c071b57ed766d7b170449daf1501c29ec5c44595584e64cd"}},{"ruleId":"D2","level":"warning","message":{"text":"constructor (cognitive 25): constructor has cognitive complexity 25 (threshold 15). Drivers by points: boolean chains 8, ternaries 4 (8 pts), if/else 4 (6 pts), loops 1 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/error.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a5e034ade625015fdfa34828cf27b3fc419d37bb16217d8327c692e693b7719"}},{"ruleId":"D2","level":"warning","message":{"text":"MP3Loader.loadSegment (cognitive 24): MP3Loader.loadSegment has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 6, loops 2, ternaries 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/loader.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffcd148d500793350322cc7f8fe8dd5f4e11603761a10c7a80e8d8d9a906d5d6"}},{"ruleId":"D2","level":"warning","message":{"text":"MP3.loadSegment (cognitive 24): MP3.loadSegment has cognitive complexity 24 (threshold 15). Drivers by points: if/else 14 (19 pts), ternaries 2 (3 pts), boolean chains 1, error handling 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/mp3.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"67135820da639733d5896a8e3c6f8b202fd004dd86b404b0f942a2be1b7b3fcd"}},{"ruleId":"D2","level":"warning","message":{"text":"utils.moovToMeta (cognitive 24): utils.moovToMeta has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (20 pts), boolean chains 2, ternaries 1 (2 pts) (nesting depth added 13). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"a403d7ea0cec2b73275e7f7759fb53f1a3532a7d69990a4916bf01e02aea83f0"}},{"ruleId":"D2","level":"warning","message":{"text":"HEVC.parseSliceHeader (cognitive 24): HEVC.parseSliceHeader has cognitive complexity 24 (threshold 15). Drivers by points: if/else 13, boolean chains 8, ternaries 2, error handling 1. 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":"packages/xgplayer-transmuxer/src/codec/hevc.ts"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"354f1f398dae5a72f517da010290ab59c0ae2552f99326e304b10b0b1a452548"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.trun (cognitive 24): MP4Parser.trun has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (20 pts), boolean chains 2, loops 1 (2 pts) (nesting depth added 12). None of this is in the body itself: all 24 points belong to one function literal inside it that branches (line 910). 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":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":909}}}],"partialFingerprints":{"codehealthFindingId/v1":"28701ee2dc8612365e3c1c678c8aaac446b3bd4bb5cfcbbc76d3028549b47445"}},{"ruleId":"D2","level":"warning","message":{"text":"_initDOM (cognitive 24): _initDOM has cognitive complexity 24 (threshold 15). Drivers by points: if/else 13 (18 pts), boolean chains 3, ternaries 3 (nesting depth added 5). Of this number, 18 points are the body\u0027s own statements and 6 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":"packages/xgplayer/src/player.js"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5eb4a06ce0d48e22e923ea5bb8a65676537c84907cd5e6f402c6b139fcecd99"}},{"ruleId":"D2","level":"warning","message":{"text":"attachPlayer (cognitive 24): attachPlayer has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 7, error handling 1 (3 pts), match/switch 1 (2 pts) (nesting depth added 6). Of this number, 23 points are the body\u0027s own statements and 1 belongs 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":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"8038d0b35d3064397c071bd20b3ecbedf0032f642e749a75d0a7dca82f3ff41a"}},{"ruleId":"D2","level":"warning","message":{"text":"onTouchMove (cognitive 24): onTouchMove has cognitive complexity 24 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 8, ternaries 3 (6 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/mobile/index.js"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"194f51b5d9addf9e8797725b6ce569f8d560a8c6df8f36371993ce6eb3162c7d"}},{"ruleId":"D2","level":"warning","message":{"text":"util.util.getBuffered2 (cognitive 23): util.util.getBuffered2 has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (18 pts), loops 2 (3 pts), ternaries 1 (2 pts) (nesting depth added 11). 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 into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/utils/util.js"},"region":{"startLine":692}}}],"partialFingerprints":{"codehealthFindingId/v1":"75eb4e475a2164026f1849126d882a485434679a95d97e45167a41e8be6e5934"}},{"ruleId":"D2","level":"warning","message":{"text":"Player.resize (cognitive 23): Player.resize has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 12, if/else 9 (10 pts), ternaries 1 (nesting depth added 1). 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":"packages/xgplayer/src/player.js"},"region":{"startLine":2217}}}],"partialFingerprints":{"codehealthFindingId/v1":"7af363e66d3b65ff09694c2f7c33e20256ba369bee89380d686febe8c9b67253"}},{"ruleId":"D2","level":"warning","message":{"text":"Keyboard.handleKeyCode (cognitive 23): Keyboard.handleKeyCode has cognitive complexity 23 (threshold 15). Drivers by points: if/else 5 (15 pts), ternaries 1 (4 pts), boolean chains 3, loops 1 (nesting depth added 13). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/keyboard/index.js"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc076f9eccb5ad9c5187a5f4586fa05aea634d37ff65c1861405e720b893c22a"}},{"ruleId":"D2","level":"warning","message":{"text":"index.updateVersions (cognitive 23): index.updateVersions has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (20 pts), boolean chains 3 (nesting depth added 12). None of this is in the body itself: all 23 points belong to 4 function literals inside it that branch (lines 182, 191, 202, \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":"scripts/commands/release/index.js"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cc0a6dbf3155a7db9a30f4ad7821376c1a5a9c7d4ab591e98b754a73059895c"}},{"ruleId":"D2","level":"warning","message":{"text":"_onProgress (cognitive 23): _onProgress has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 5, ternaries 1 (2 pts), error handling 1 (nesting depth added 5). 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 into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/index.js"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"a45ce6cb1dd694d6bb50a35d092b330c50030bfe25c863d75cda2924b2f8d62f"}},{"ruleId":"D2","level":"warning","message":{"text":"update (cognitive 23): update has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 10 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/playlist/stream.js"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"770ebde93a31ec5193f2e8cbdbaeae96601ee3e6160d9d67af3d2db08f7f16bc"}},{"ruleId":"D2","level":"warning","message":{"text":"_updateSegments (cognitive 23): _updateSegments has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (13 pts), boolean chains 6, ternaries 1 (3 pts), other 1 (nesting depth added 9). Of this number, 22 points are the body\u0027s own statements and 1 belongs to 3 function literals inside it that branch. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/playlist/stream.js"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfe0052e709c283e6f2113dc6a1bbcc280eee547d2692009b3a6d6f3ff6f2149"}},{"ruleId":"D2","level":"warning","message":{"text":"onGapJump (cognitive 23): onGapJump has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 6, ternaries 1 (3 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/gapJump/index.js"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"e398247a6af4af023f82c52b95474ccfd5c5dd5892393e0659c161e8b229e78c"}},{"ruleId":"D2","level":"warning","message":{"text":"isValidDaterange (cognitive 23): isValidDaterange has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 13, if/else 5 (8 pts), loops 1 (2 pts) (nesting depth added 4). 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":"packages/xgplayer-hls/src/hls/manifest-loader/parser/utils.js"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"e41f072f39a91cd55838b661ce003f3a68de78a17c4f6bc7a320d1c70e5b42a5"}},{"ruleId":"D2","level":"warning","message":{"text":"Player.onFullscreenChange (cognitive 22): Player.onFullscreenChange has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 7 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/player.js"},"region":{"startLine":1784}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebcf4f12b04b4c7d00022bde69454184bb36825ed8cc944a8c20b16da5bc018c"}},{"ruleId":"D2","level":"warning","message":{"text":"CastPlugin._resumeMSEPlugin (cognitive 21): CastPlugin._resumeMSEPlugin has cognitive complexity 21 (threshold 15). Drivers by points: if/else 12 (14 pts), boolean chains 6, error handling 1 (nesting depth added 2). 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":"packages/xgplayer-cast/src/plugin.ts"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eb842ed30cd4f8f146b3fea0d14478003f3a9de13d27eeaebee08c86fbe4ffd"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4._loadSegment (cognitive 21): MP4._loadSegment has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (15 pts), error handling 3 (4 pts), boolean chains 1, ternaries 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4/src/mp4/index.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f98ffb541e4b66d4d6465416e56667404c88caa6bc5fe88982ba8b3869dd504"}},{"ruleId":"D2","level":"warning","message":{"text":"MPEG.parseHeader (cognitive 21): MPEG.parseHeader has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 5 (12 pts), if/else 3 (5 pts), boolean chains 4 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/mpeg.ts"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"c026899c40d7a47b4393500e4021f39897a1022b7b9576af4026aaeb327762c3"}},{"ruleId":"D2","level":"warning","message":{"text":"FMP4Remuxer.remux (cognitive 21): FMP4Remuxer.remux has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (18 pts), boolean chains 3 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/fmp4-remuxer.js"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"842b6a4750a7c5d9a0bfebe50232fa436c1c58e9614e8034542a59ca23ce41b4"}},{"ruleId":"D2","level":"warning","message":{"text":"release-metadata.validateReleaseVersion (cognitive 21): release-metadata.validateReleaseVersion has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (12 pts), ternaries 2 (4 pts), boolean chains 3, loops 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/workflow/release-metadata.js"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"f67074cbb79ce515dce57be989d156f951a1127adbbf545d90f6c7dccef7c314"}},{"ruleId":"D2","level":"warning","message":{"text":"Player.constructor (cognitive 20): Player.constructor has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 6 (nesting depth added 4). 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 into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/player.js"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb74e32acd6bf6004498bc8f0ede0630e4e8ef4693d37ce7e917d90329140520"}},{"ruleId":"D2","level":"warning","message":{"text":"SubTitleParser.parseASS (cognitive 20): SubTitleParser.parseASS has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (13 pts), error handling 1 (4 pts), boolean chains 2, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/parser.js"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c1e082322a1c86a512b5f1fcc5b33ccd5b8b48c1192c6f9aac49d5315418cc4"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4.traf (cognitive 20): MP4.traf has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11 (16 pts), boolean chains 4 (nesting depth added 5). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":946}}}],"partialFingerprints":{"codehealthFindingId/v1":"17a8f30684c149a2e937ffa164c16d4adbb5f5b14dc305a535b015cd01ab1a6e"}},{"ruleId":"D2","level":"warning","message":{"text":"mediaPlay (cognitive 20): mediaPlay has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 4, error handling 1 (2 pts) (nesting depth added 7). Of this number, 11 points are the body\u0027s own statements and 9 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":"packages/xgplayer/src/player.js"},"region":{"startLine":1039}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc907a43aee9b01ec1f6ad67b0077e5ebc7cb35daaead57602b97715bcb50256"}},{"ruleId":"D2","level":"warning","message":{"text":"_loadSegment (cognitive 20): _loadSegment has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 9 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"00474883012f62860cb2bc6f47780c3f9fcd89c90a53722640ac84e90eae4d71"}},{"ruleId":"D2","level":"warning","message":{"text":"_loadSegmentDirect (cognitive 20): _loadSegmentDirect has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 5, error handling 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"11d9927fcdae5d576c42635718f66941897e4a07fcdf9fe824cf1283bb19ff95"}},{"ruleId":"D2","level":"warning","message":{"text":"Plugin.insert (cognitive 19): Plugin.insert has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (13 pts), ternaries 2 (4 pts), loops 1 (2 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugin/plugin.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"acb0eafa753d30531d364a4b3b32b7a4e8d50cd105d120ef28f6c577d08a69ba"}},{"ruleId":"D2","level":"warning","message":{"text":"Hls._onSeeking (cognitive 19): Hls._onSeeking has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 6, ternaries 1 (2 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":800}}}],"partialFingerprints":{"codehealthFindingId/v1":"67a2a8e66c39c951b72296c4cb58a5de5e16a6d9830addb533c2a91bb9e91252"}},{"ruleId":"D2","level":"warning","message":{"text":"DASH.init (cognitive 19): DASH.init has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (8 pts), boolean chains 7, ternaries 2 (4 pts) (nesting depth added 4). None of this is in the body itself: all 19 points belong to 4 function literals inside it that branch (lines 69, 37, 51, \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":"packages/xgplayer-dash/src/dash.js"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"8512e19b8e6ca91336a36313c5c9fc22fc2648fda3a4ea4947537e9a681ef656"}},{"ruleId":"D2","level":"warning","message":{"text":"index.util.getBrowserVersion (cognitive 19): index.util.getBrowserVersion has cognitive complexity 19 (threshold 15). Drivers by points: if/else 13 (17 pts), boolean chains 2 (nesting depth added 4). 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":"packages/xgplayer-hls.js/src/utils/index.js"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1af5902d939119740b2786741b214b4f96c1d5f88c5ae341702a48b0cdd6880"}},{"ruleId":"D2","level":"warning","message":{"text":"parser.parseXingHeader (cognitive 19): parser.parseXingHeader has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (12 pts), ternaries 4 (6 pts), boolean chains 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/parser.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a947cd89ada58cebd5e9751ded1f15b28365e30f2d30240254507d511474ed5"}},{"ruleId":"D2","level":"warning","message":{"text":"AAC.getSilentFrame (cognitive 19): AAC.getSilentFrame has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (18 pts), match/switch 1 (nesting depth added 9). 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":"packages/xgplayer-transmuxer/src/codec/aac.ts"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"8333142b8141b4c74dd286d728b5f29857965d7c4e7d4b038ff1f2706c7c3ad7"}},{"ruleId":"D2","level":"warning","message":{"text":"HEVC.parseHEVCDecoderConfigurationRecord (cognitive 19): HEVC.parseHEVCDecoderConfigurationRecord has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (12 pts), loops 2 (3 pts), match/switch 1 (3 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/hevc.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"1902739b3e3a3990c8577299536f274f55d88b4860e708a216bd17f05ba7a1cb"}},{"ruleId":"D2","level":"warning","message":{"text":"TsFixer.fix (cognitive 19): TsFixer.fix has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (12 pts), ternaries 2 (4 pts), boolean chains 3 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"050fe5989867b62d8c4256bfdfeb8158ac129815c38fa5252ccc2dbec215b2f1"}},{"ruleId":"D2","level":"warning","message":{"text":"_statistics (cognitive 19): _statistics has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 5 (8 pts), boolean chains 7, if/else 4 (nesting depth added 3). None of this is in the body itself: all 19 points belong to 4 function literals inside it that branch (lines 160, 154, 151, \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":"packages/xgplayer-hls.js/src/index.js"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc7f6a1d00dfeccd464352a7775fb060bc4659266fb5831f643980317efcfd6c"}},{"ruleId":"D2","level":"warning","message":{"text":"mediaProxy.getVideoEventHandler (cognitive 18): mediaProxy.getVideoEventHandler has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (9 pts), boolean chains 5, error handling 1 (2 pts), ternaries 1 (2 pts) (nesting depth added 3). None of this is in the body itself: all 18 points belong to one function literal inside it that branches (line 46). 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":"packages/xgplayer/src/mediaProxy.js"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"d51238eb74f3138a101785c7897aa26a2df2b12b59b5560e700dfebe8d5f118b"}},{"ruleId":"D2","level":"warning","message":{"text":"Player.getFullscreen (cognitive 18): Player.getFullscreen has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 3, ternaries 1 (3 pts), error handling 1, loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/player.js"},"region":{"startLine":1474}}}],"partialFingerprints":{"codehealthFindingId/v1":"14c98c5166d365d74ff4b6180e6c852c761233f7f014092a3d3f73a0ec76f0df"}},{"ruleId":"D2","level":"warning","message":{"text":"VVC._parseVVCNalArrays (cognitive 18): VVC._parseVVCNalArrays has cognitive complexity 18 (threshold 15). Drivers by points: if/else 2 (6 pts), error handling 1 (5 pts), loops 2 (3 pts), match/switch 1 (3 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/vvc.js"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"e901f65812a9b95b5300b963836b2565460f79d825544dd3f2428befca041e8e"}},{"ruleId":"D2","level":"warning","message":{"text":"VVC.parseVVCPTLRecord (cognitive 18): VVC.parseVVCPTLRecord has cognitive complexity 18 (threshold 15). Drivers by points: loops 5 (10 pts), if/else 5 (7 pts), boolean chains 1 (nesting depth added 7). 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":"packages/xgplayer-transmuxer/src/codec/vvc.js"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b71c14c99a2737a438c6b7d6806ca0846a79eb2e26a0123b48d25a9aad11a14"}},{"ruleId":"D2","level":"warning","message":{"text":"__registerChildren (cognitive 18): __registerChildren has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (8 pts), boolean chains 6, ternaries 1 (4 pts) (nesting depth added 6). Most of this is not in the body itself: 5 of the 18 points are its own statements and the rest belongs to one function literal inside it that branches (line 355). 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":"packages/xgplayer/src/plugin/plugin.js"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb0ab327459485f5ffea5c482a7ba11f3939d8face36a6a2d06b2785825cc1bc"}},{"ruleId":"D2","level":"warning","message":{"text":"findIndexByTime (cognitive 18): findIndexByTime has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (8 pts), boolean chains 4, ternaries 3 (4 pts), loops 1 (2 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"92c2ef45c6474e1f849bc659695020d1e9aa441af2fb0ade0477da3f7989118e"}},{"ruleId":"D2","level":"warning","message":{"text":"HeatMap.formatData (cognitive 17): HeatMap.formatData has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 3, ternaries 1 (3 pts) (nesting depth added 6). Of this number, 13 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":"packages/xgplayer/src/plugins/heatmap/index.js"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd58acea417adf52a3176cca129c90e2ebfcbd37e511e4e8d67af719c9276dd1"}},{"ruleId":"D2","level":"warning","message":{"text":"parser.findFirstFrameOffset (cognitive 17): parser.findFirstFrameOffset has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 2, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/parser.ts"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"a03676553c202e4ba529eabbcb102bd325d6cf42602e9fd09bf545e2a4176f30"}},{"ruleId":"D2","level":"warning","message":{"text":"BufferService.appendBuffer (cognitive 17): BufferService.appendBuffer has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 2, error handling 1 (2 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4/src/mp4/buffer-service.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f3eadaecdd379fa0864dfe5f2a33d150835defdf8a30dbcd155efdc86e943ea"}},{"ruleId":"D2","level":"warning","message":{"text":"_registerPlugins (cognitive 17): _registerPlugins has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 7, if/else 4 (5 pts), error handling 2 (4 pts), ternaries 1 (nesting depth added 3). Most of this is not in the body itself: 4 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 690, 708, 714). 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":"packages/xgplayer/src/player.js"},"region":{"startLine":679}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bfbb199f48b44fa06341f7bdc43e2a8cd883692cbc47ce02578742a4f34bdd4"}},{"ruleId":"D2","level":"warning","message":{"text":"switchURL (cognitive 17): switchURL has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (9 pts), error handling 1 (2 pts), loops 1 (2 pts), ternaries 1 (2 pts), boolean chains 1, match/switch 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"300418236433f211f6133fa3c90edc8713ff427413e6ab03bf3b83dab0b7da53"}},{"ruleId":"D2","level":"warning","message":{"text":"deepCopy (cognitive 17): deepCopy has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 3, ternaries 1 (3 pts) (nesting depth added 6). 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 276). 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":"packages/xgplayer/src/utils/util.js"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"b715211e43a1fa9e4437f474b48ad9e21f395cbc0062ab3bed3d7d4e8b964b87"}},{"ruleId":"D2","level":"warning","message":{"text":"afterCreate (cognitive 17): afterCreate has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 4, error handling 1 (2 pts) (nesting depth added 4). Of this number, 12 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":"packages/xgplayer-music/src/music.js"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dfbfa640f6bd64da7cbd35659e1ff290e6f04d0c4d77d7b63ea8d18adc61e45"}},{"ruleId":"D2","level":"warning","message":{"text":"transmux (cognitive 17): transmux has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 2 (4 pts), boolean chains 3, error handling 2 (3 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/buffer-service/transmuxer/index.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"25fc0a315e8a131006feadf125c86be0e0d65292f8b03db110a9d94f18ac2db9"}},{"ruleId":"D2","level":"warning","message":{"text":"Start.toggleTo (cognitive 16): Start.toggleTo has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (9 pts), boolean chains 5, ternaries 1 (2 pts) (nesting depth added 2). 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":"packages/xgplayer/src/plugins/start/index.js"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b906191ccde78967b656aa94f7b16ef90bd422fe8696586374e9e98147cbe31"}},{"ruleId":"D2","level":"warning","message":{"text":"Playlist.upsertPlaylist (cognitive 16): Playlist.upsertPlaylist has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 1 (nesting depth added 5). 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":"packages/xgplayer-hls/src/hls/playlist/index.js"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"506309a69a000cc4df93f5051b610ae7f041d65dc11352d7d6b20e46d6e94908"}},{"ruleId":"D2","level":"warning","message":{"text":"DASH.seek (cognitive 16): DASH.seek has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 1 (nesting depth added 7). None of this is in the body itself: all 16 points belong to 4 function literals inside it that branch (lines 114, 105, 132, \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":"packages/xgplayer-dash/src/dash.js"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ce64163d4f18203820d5de9d9b56f4df16c3757c854258f7e675bc940636342"}},{"ruleId":"D2","level":"warning","message":{"text":"AdUIManager.hideAdUI (cognitive 16): AdUIManager.hideAdUI has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 3 (nesting depth added 3). Most of this is not in the body itself: 5 of the 16 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 199, 214, 231). 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":"packages/xgplayer-ads/src/ui/adUIManager.js"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bf510ccfbdbbe7d018c0e27b1deda34295194ad8368df0a4b7c115863c07c4d"}},{"ruleId":"D2","level":"warning","message":{"text":"Stream.readByte (cognitive 16): Stream.readByte has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (15 pts), match/switch 1 (nesting depth added 5). 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":"packages/xgplayer-dash/src/parse/stream.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"74636fea5031fe57b80061347e8c7e432a4a657cdd9eb2a51b917be82d7b9505"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Parser.moovToSamples (cognitive 16): MP4Parser.moovToSamples has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 4 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":1213}}}],"partialFingerprints":{"codehealthFindingId/v1":"2826f25c85e4d2f0c9376237a00618b5ffd85a17361fdaf93736485748c9cd8e"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4.sidx (cognitive 16): MP4.sidx has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 3 (nesting depth added 6). 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":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":1377}}}],"partialFingerprints":{"codehealthFindingId/v1":"923c4de653f9b332abd6a31247cb89feea5777c12457e483e8faf5f6b2691ee6"}},{"ruleId":"D2","level":"warning","message":{"text":"index.main (cognitive 16): index.main has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (8 pts), boolean chains 6, loops 1 (2 pts) (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/commands/changelog/index.js"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb73cf609b4b742ad0404a4981b13baf1bd621e0e44c3084f16006d54b10b99f"}},{"ruleId":"D2","level":"warning","message":{"text":"setSubTitles (cognitive 16): setSubTitles has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 5, if/else 4 (5 pts), error handling 2 (4 pts), match/switch 1 (2 pts) (nesting depth added 4). Of this number, 15 points are the body\u0027s own statements and 1 belongs to 5 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":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9de94bbb1fcfd6430dcaa1271ca4e6da7a78c9de9b39f7c3c02b1b7e7af194f"}},{"ruleId":"D2","level":"warning","message":{"text":"constructor (cognitive 16): constructor has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8, boolean chains 6, ternaries 2. 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":"packages/xgplayer/src/mediaProxy.js"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c5ebde91be497ef099325fbca95f3053c8ff909aa4138008deab80b6255230c"}},{"ruleId":"D2","level":"warning","message":{"text":"afterCreate (cognitive 16): afterCreate has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 7, if/else 7, ternaries 1 (2 pts) (nesting depth added 1). Of this number, 12 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. 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":"packages/xgplayer/src/plugins/common/optionsIcon.js"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"80987f2162398fd58374e89e4670acfb9810f19c1289e2384c2faa02c110521e"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Player: ClassTooLong \u2014 1412 significant lines (blank, comment-only and punctuation-only lines excluded), 94 methods. The bar is 400 significant lines; this is 1012 over it, 3.53\u00D7 the bar. 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":"packages/xgplayer/src/player.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"6613060cdd3c89682e3de7697525794141dec1f3b7a88feaf12c14ce5642c15a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Player: TooManyMethods \u2014 94 methods. The bar is 30 methods; this is 64 over it, 3.13\u00D7 the bar. 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":"packages/xgplayer/src/player.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4f8311b836005aba3c3f8c95601dbdfb220e8fd3c784d2772eb6967151ffb7a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/player.js: FileTooLong \u2014 1448 significant lines (blank, comment-only and punctuation-only lines excluded), about 98% of them inside a single declaration: Player (47-2763). The bar is 500 significant lines; this is 948 over it, 2.90\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/player.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd4d2bb6474fcf69e6f127f3ce418f8fd2e6ed9e5ba391c8bda3413a9805f74d"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: MP4: ClassTooLong \u2014 995 significant lines (blank, comment-only and punctuation-only lines excluded), 64 methods. The bar is 400 significant lines; this is 595 over it, 2.49\u00D7 the bar. 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":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9e3b8fd7b124fed101a866d598d444ca62eeb7a89c0d009c25f37e12860d012"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: utils.getSegments: FunctionTooLong \u2014 getSegments runs 236 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 136 over it, 2.36\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"47b345a0844126b332cff7a79865a5582e5aa5521c9a358a682114b408e06f5d"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: MP4Parser: ClassTooLong \u2014 911 significant lines (blank, comment-only and punctuation-only lines excluded), 56 methods. The bar is 400 significant lines; this is 511 over it, 2.28\u00D7 the bar. 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":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5b304ce82db976326dd6f91545cd3fcfe96cabd7b127b891540e23018807c3b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MP4: TooManyMethods \u2014 64 methods. The bar is 30 methods; this is 34 over it, 2.13\u00D7 the bar. 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":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9d674ad00387d6379de7a45aebe804c46cdda6462b73cd553439212d1734077"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: mp4/mp4-parser.js: FileTooLong \u2014 1027 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units), about 89% of them inside a single declaration: MP4Parser (17-1242). The bar is 500 significant lines; this is 527 over it, 2.05\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddb914ef1c853b0127ab55eb9ba7cc02a0faa1e457bf9bd6d3d6343dfafedcb8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: mp4/mp4.js: FileTooLong \u2014 1000 significant lines (blank, comment-only and punctuation-only lines excluded), about 100% of them inside a single declaration: MP4 (13-1449). The bar is 500 significant lines; this is 500 over it, 2.00\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0af93a79ed477ed7f8bad60c8a6b6452470d19fbdce53eb6ab6bb8981027b4ce"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MPD.fetch: MethodTooLong \u2014 fetch runs 195 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 95 over it, 1.95\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/m4s/mpd.js"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"efcb4b41a12e58b82b1ba0bd400a4b7c6f61f0e814e5b669d2d02d54ab5ca327"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Subtitle: ClassTooLong \u2014 758 significant lines (blank, comment-only and punctuation-only lines excluded), 49 methods. The bar is 400 significant lines; this is 358 over it, 1.90\u00D7 the bar. 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":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"e08cd22641572c10700bfdc4caab6801c61ff3286f0392d39d147e25e0872ff0"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MP4Parser: TooManyMethods \u2014 56 methods. The bar is 30 methods; this is 26 over it, 1.87\u00D7 the bar. 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":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"918aeacc4c5e7d0588a52c60bfea9cea2531ad13f66640ce85db39d3fe7a76c9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: media.parseMediaPlaylist: FunctionTooLong \u2014 parseMediaPlaylist runs 168 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 68 over it, 1.68\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/manifest-loader/parser/media.js"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bf67ec19e48b99be1fd2217e64f1fec26649888e8c98c7dc2e6653863d6f49b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Hls: ClassTooLong \u2014 657 significant lines (blank, comment-only and punctuation-only lines excluded), 42 methods. The bar is 400 significant lines; this is 257 over it, 1.64\u00D7 the bar. 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":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fcbd8646f2a9c908510902c0e663d509bcc0ec4d7e15af48828602087106a29"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Subtitle: TooManyMethods \u2014 49 methods. The bar is 30 methods; this is 19 over it, 1.63\u00D7 the bar. 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":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f617854c9d20cc8f8dde0ac1300c1990f1ccd323b29a9fa4272a6c60f783737"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/index.js: FileTooLong \u2014 797 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: Subtitle (69-1223). The bar is 500 significant lines; this is 297 over it, 1.59\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e7c5b3840035d97dc2321fcd7a826d14a73ba07516c545ad350758d75b65775"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: FetchLoader.load: MethodTooLong \u2014 load runs 154 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 54 over it, 1.54\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/net/fetch.js"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c4b861ca52f45cc8efffd78dd6986513736331f15f49f2144c320d47983feb1"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Progress: TooManyMethods \u2014 45 methods. The bar is 30 methods; this is 15 over it, 1.50\u00D7 the bar. 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":"packages/xgplayer/src/plugins/progress/index.js"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6d2ef1a18b8dce2ddecff31e5f45b4e61d0d8c9c57bf35418398467b4d93585"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Hls: TooManyMethods \u2014 42 methods. The bar is 30 methods; this is 12 over it, 1.40\u00D7 the bar. 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":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"e97a4decd81540150ad5ae9238f3e2c08449f1833d85c72c3846456684cfb548"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MP4Parser.moovToTrack: MethodTooLong \u2014 moovToTrack runs 140 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 40 over it, 1.40\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":980}}}],"partialFingerprints":{"codehealthFindingId/v1":"4974d2105a4805511de4436cf51a39a7bc3e2b7481d27b80be473b7c07bc251e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: hls/index.js: FileTooLong \u2014 686 significant lines (blank, comment-only and punctuation-only lines excluded), about 96% of them inside a single declaration: Hls (46-1099). The bar is 500 significant lines; this is 186 over it, 1.37\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6927e79cffb8be872a77c0e9d2c8bee5c872c6ccf271a2bff9a4a70ee66216da"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MP4Demuxer.demuxPart: MethodTooLong \u2014 demuxPart runs 136 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 36 over it, 1.36\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a6f5fc16ff55364d31848d284d2f8a968748feb41f14ed0869495b84bcd438e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: context.createContext: FunctionTooLong \u2014 createContext runs 134 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 34 over it, 1.34\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/context.js"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0eee19186af3b2dfd6bf2fe8cae3d44bdf46502a57f728cd11abc9e4334fb73"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AVC.parseSPS: MethodTooLong \u2014 parseSPS runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/avc.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"53884ebd4df2699f5604f50fcf3d30f96654e5e76fc9b384090b296b97644b21"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: utils/util.js: FileTooLong \u2014 619 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 119 over it, 1.24\u00D7 the bar. 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":"packages/xgplayer/src/utils/util.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7920ef707ccf6906ee85f2fcbbc78267fb6d53f76f7d9a50fe448c744c3d51b0"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Progress: ClassTooLong \u2014 486 significant lines (blank, comment-only and punctuation-only lines excluded), 45 methods. The bar is 400 significant lines; this is 86 over it, 1.22\u00D7 the bar. 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":"packages/xgplayer/src/plugins/progress/index.js"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc6f199537f80e1bbf2e3b5b81602746d1f251a0b866c9bb6f66435fc24d4240"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MSE: TooManyMethods \u2014 36 methods. The bar is 30 methods; this is 6 over it, 1.20\u00D7 the bar. 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":"packages/xgplayer-streaming-shared/src/mse.ts"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"52adef385b85fc7ca47a260920aec41cf0104e42b91eb0096283510445c1d5ba"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: MSE: ClassTooLong \u2014 477 significant lines (blank, comment-only and punctuation-only lines excluded), 36 methods. The bar is 400 significant lines; this is 77 over it, 1.19\u00D7 the bar. 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":"packages/xgplayer-streaming-shared/src/mse.ts"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"54fce437d0b1b853ce01f51b499d68af8e9efdae1b8678e9bbaf45155e2ba3b6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/mse.ts: FileTooLong \u2014 596 significant lines (blank, comment-only and punctuation-only lines excluded), about 80% of them inside a single declaration: MSE (192-901). The bar is 500 significant lines; this is 96 over it, 1.19\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/mse.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9154c7ec6e1723b9164e011cc9830eada0998c9add0ca38233f2fed1a1ece8a8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: FetchLoader._loadChunk: MethodTooLong \u2014 _loadChunk runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/net/fetch.js"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"905f24404b8262017f2b11000837c86799d80242ceb8f15b750f2cbf42b8a5a0"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: MobilePlugin: ClassTooLong \u2014 468 significant lines (blank, comment-only and punctuation-only lines excluded), 34 methods. The bar is 400 significant lines; this is 68 over it, 1.17\u00D7 the bar. 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":"packages/xgplayer/src/plugins/mobile/index.js"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"e31bdbaefeedc097f03d2efa91060a8e3e160d7f825fea196d7eff0567fb3acd"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MobilePlugin: TooManyMethods \u2014 34 methods. The bar is 30 methods; this is 4 over it, 1.13\u00D7 the bar. 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":"packages/xgplayer/src/plugins/mobile/index.js"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dbed1096cd808f39a6c6bece2f0beffb2937d6eb6d78d0f1397edf88b25ebba"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ProgressPreview: TooManyMethods \u2014 34 methods. The bar is 30 methods; this is 4 over it, 1.13\u00D7 the bar. 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":"packages/xgplayer/src/plugins/progressPreview/index.js"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"452bc668212467504e43ae9b4bdbb37268d4db85f4cd518ac12091896d6a7b61"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Player.constructor: MethodTooLong \u2014 constructor runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/player.js"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"49274d0a9d100fd37852de3c4f1c07072559357d85e6b05b3363cce2fbc6584a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ImaAdManager.onAdEvent: MethodTooLong \u2014 onAdEvent runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 5 over it, 1.05\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-ads/src/imaAdManager.js"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"39a7d4a912005517f08439cbed585e5959220773d10f84e300c4b6c97ae710de"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ImaAdManager: TooManyMethods \u2014 31 methods. The bar is 30 methods; this is 1 over it, 1.03\u00D7 the bar. 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":"packages/xgplayer-ads/src/imaAdManager.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"10d955af8e97b1e2bbd2916e7d12578a024d16b66b51b109420d46d37a5f9861"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Airplay: TooManyMethods \u2014 31 methods. The bar is 30 methods; this is 1 over it, 1.03\u00D7 the bar. 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":"packages/xgplayer-cast/src/platform/airplay.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"db5fb56dc1fc293890d5069f7a36a78a018468df0fb7cbce17a11da0a3193cc9"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Draggabilly: TooManyMethods \u2014 31 methods. The bar is 30 methods; this is 1 over it, 1.03\u00D7 the bar. 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":"packages/xgplayer/src/utils/draggabilly.js"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"39c7648dc75c15a064f91612d01f54e0ced6a3de0d176fd22af9be21ee365c5d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TsDemuxer.demux: MethodTooLong \u2014 demux runs 103 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 3 over it, 1.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mpeg-ts/index.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"e054e500eeb105071b0c8ea688b19bd666271c0ebfe96652f401d2584dec4300"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MP4Loader.loadMetaProcess: MethodTooLong \u2014 loadMetaProcess runs 102 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 2 over it, 1.02\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/loader.js"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf0651a919035a16e4e0f28dd1cd2ef7392fc220745d50f4ff29f2d005320dd5"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BufferService.appendBuffer: MethodTooLong \u2014 appendBuffer runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/services/buffer-service.js"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e15c6280329f71e3e0632a6acd187d8e2269431be746454f41ae62830570da0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: index.main: FunctionTooLong \u2014 main runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/commands/release/index.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f7066a9672f877b0cade824f6764ccb51edec0061cadf76f34799c63f8f8e32"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: xgplayer-transmuxer: xgplayer-transmuxer: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 5 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"11ae07239ac9d1f4506f70ffd365fe0a9e3417f3da519b654bc15b2327c17f15"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ScreenShot (LCOM4 5): ScreenShot\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/screenShot/index.js"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"462074ee1af2c07ca0cbd5ae93d7f6d35ca401836aa7791c4aa0ba7a86ddc78c"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: ignores range-shaped objects that are not TimeRanges: This test sets up 4 test doubles (for example \u0060jest.fn\u0060) against 2 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/__tests__/mse.spec.js"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ce74a35b6fe51bb23dca1f9e76126d24be0f52c79baab5aeaec269af5218f7d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not subscribe to bufferedchange for a regular MediaSource: This test sets up 3 test doubles (for example \u0060jest.fn\u0060) against 2 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/__tests__/mse.spec.js"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"88ad12b54120ee4bc7321450130832a36a6b2d1893b6a4a45becfa92d59f9a10"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: uses the custom media buffer API in soft-decode mode: This test sets up 5 test doubles (for example \u0060jest.fn\u0060) against 2 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4/__tests__/buffer-service.spec.ts"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"159c8699c8eecc00059e7845b8fb6e765779b5ae2dff2e8edcdf712de1dce3af"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: demuxes fragmented MP4 segments without sample index ranges: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 1 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4/__tests__/buffer-service.spec.ts"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"b70bd63383bafc145b99bd3f0dc3070cbaea28e64013dbb24a06ffaf8e62f53f"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not append stale worker data on reset cancellation: This test sets up 4 test doubles (for example \u0060vi.mock/jest.mock of an imported module\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4/__tests__/buffer-service.spec.ts"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"2445f2f01b5a1b05a19dccca32afbba91dd6f569bfd52aca0dc2e6c677ae5a19"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: falls back to the main thread after a real worker failure: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 2 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4/__tests__/buffer-service.spec.ts"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c70b48662caa910ad5a9861a668028aa3ef0904a7f953e629bfa5fe143573f"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps stall monitoring active after the last segment is downloaded: This test sets up 3 test doubles (for example \u0060jest.fn\u0060) against 2 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4/__tests__/core.spec.ts"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f62cf9a3e85dceb0b62838c3dddb6c35bdc3d4c6a2de49877c8c48cab647a0d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: uses FMP4Demuxer for fragmented MP4 tasks without sample ranges: This test sets up 3 test doubles (for example \u0060jest\n      .spyOn\u0060) against 2 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4/__tests__/transmuxerworker.spec.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d15a8a80dd7d67e443c9b00bb418a2186986c9b160c8429e49810a32e6c91b1"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: uses the exact MPEG Audio MIME without a codecs parameter: This test sets up 3 test doubles (for example \u0060vi.mock/jest.mock of an imported module\u0060) against 1 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/__tests__/buffer-service.spec.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"b73243d8169ed452625ca4c63f83277f58c9bf10bae64e6ca8281ad6bec4f7a5"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: consumes a trailing ID3 tag and ends at the measured audio duration: This test sets up 4 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 2 real object(s) of its own, and its only verification is 8 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/__tests__/core-loader.spec.ts"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc22b9eeb2b7bf0d04d55bcde3f7dbafdc6ce165dafc8b5642ddec487637202a"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: load: This test sets up 5 test doubles (for example \u0060jest.spyOn\u0060) against 1 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/__tests__/hls.spec.js"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"098461114c418136896b98a2de40c2135ef51f78cf03cdcfde36cb2122f2c649"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: vod stops preloading when discontinuous buffered islands exceed preloadTime: This test sets up 3 test doubles (for example \u0060jest.spyOn\u0060) against 1 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/__tests__/hls.spec.js"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"460a6ca9337d273f9e42e306bd2f50a59af61ddabdabfc7e42148edb51bfec73"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: vod keeps loading when next segment starts at the next buffered island: This test sets up 3 test doubles (for example \u0060jest.spyOn\u0060) against 1 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/__tests__/hls.spec.js"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4108d730f0523d266f00a130410c40c1fddd57667d063aba152d52f72167f71"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: appendBuffer directAppend should align timeline by timestampOffset: This test sets up 8 test doubles (for example \u0060jest.fn\u0060) against 3 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/__tests__/services/buffer.spec.js"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"eda65015958e1f3e180f6e70d4a6dea5fcbc2c4b27eec6bfa6890835cf375e33"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reset: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 1 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/__tests__/services/buffer.spec.js"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdc7beda7a4e47fef10ec5fcf4819305e3db32af08a52ffa3dea44d72693f318"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: load: This test sets up 6 test doubles (for example \u0060jest.spyOn\u0060) against 1 real object(s) of its own, and its only verification is 6 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/__tests__/flv.spec.js"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b155ccbe934a88fc590892612df28e6e1337984d35b6e1b0a6cb5578a1345f0"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: replay: This test sets up 4 test doubles (for example \u0060jest.spyOn\u0060) against 1 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/__tests__/flv.spec.js"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8d6bce07e8a4f873ee6519195533153c4c7fd1f0c4036d5df2532b1de278fa0"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: switchURL: This test sets up 4 test doubles (for example \u0060jest.spyOn\u0060) against 1 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/__tests__/flv.spec.js"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"596170063f770d2202236b728bd9776654a7818c657740b816359fd6b711fc4c"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: appendBuffer: This test sets up 6 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 1 real object(s) of its own, and its only verification is 31 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/__tests__/services/buffer.spec.js"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"5efe249b2298730da72a9a579d3381884f857dcaa7131858d6a28f310fe86d03"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: seamlessSwitch: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 1 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/__tests__/services/buffer.spec.js"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"b18ec937d5bcc10646e7230583629a1b7ac6ec8dac4827b3db3eced95e662cb5"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: unContiguous: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 1 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/__tests__/services/buffer.spec.js"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae8d1c751efee41cd8a0c203ef3d66928900d870dcfbb419af93dadd11881de5"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reset: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 1 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/__tests__/services/buffer.spec.js"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa4492e09a132187f13ba904204b534264ba2d14da57c1bb2141a2ff7ed9b71b"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not reapply native source while currentSrc still reports the detached blob: This test sets up 4 test doubles (for example \u0060jest.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/__tests__/airplay.spec.js"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"40fbaae6583a3cb37df20dbc6e15eb1be2573d499b92ef55045c960ec144eacc"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not open picker when blob source cannot be resolved to a network URL: This test sets up 3 test doubles (for example \u0060jest.spyOn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/__tests__/airplay.spec.js"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0a916ee1bbb12e0d6a8e1779af454af31607ebfd6e466f5593a077ecc8f4a47"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not suspend MSE plugin when picker is opened without selecting a route: This test sets up 3 test doubles (for example \u0060jest.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/__tests__/airplay.spec.js"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d799d4515e81647d17ad5ca2179812793a55abbbd4e7a8cbf563d2f5e48a12a"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: restores streaming plugin after native AirPlay handoff disconnects: This test sets up 3 test doubles (for example \u0060jest.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/__tests__/airplay.spec.js"},"region":{"startLine":428}}}],"partialFingerprints":{"codehealthFindingId/v1":"166ece54b5abd669a3164b723c17782713aff60930f2e30437ecea003effd1c8"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: emits cast_target_change isCasting:true on SESSION_STARTED: This test sets up 4 test doubles (for example \u0060jest.fn\u0060) against 1 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/__tests__/chromecast.spec.js"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"885e079a1d7b6a02341958a0d7d8382546e6e5b7c7c9ab799cbff464dc78690f"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: _onRequestCast requests session and loads media: This test sets up 7 test doubles (for example \u0060jest.fn\u0060) against 1 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/__tests__/chromecast.spec.js"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"747f43a326e115b27f54b0638b91023011b774cc40b0c337d35bfba75485752e"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: _onRequestCast uses request autoplay and pauses local media before load: This test sets up 5 test doubles (for example \u0060jest.fn\u0060) against 2 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/__tests__/chromecast.spec.js"},"region":{"startLine":561}}}],"partialFingerprints":{"codehealthFindingId/v1":"d482706ec6c8ac96d819dd06d06ca801b8774088c2229084470e15fb98732b39"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: _onRequestCast refreshes currentTime after Chromecast session is selected: This test sets up 5 test doubles (for example \u0060jest.fn\u0060) against 1 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/__tests__/chromecast.spec.js"},"region":{"startLine":615}}}],"partialFingerprints":{"codehealthFindingId/v1":"13a3102cbb8a0707e5608fa7c7692b15020e1a7ab8f6dc41121c012fcb2cdd4a"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: _onRequestCast uses false request autoplay without forcing local pause: This test sets up 5 test doubles (for example \u0060jest.fn\u0060) against 1 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/__tests__/chromecast.spec.js"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"492668cbbe8b46ad6ea80f32cdbd3e1571409e7957f333b52d4e0cf78b60755d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: _onRequestCast emits cast_error when requestSession rejects: This test sets up 7 test doubles (for example \u0060jest.fn\u0060) against 2 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/__tests__/chromecast.spec.js"},"region":{"startLine":737}}}],"partialFingerprints":{"codehealthFindingId/v1":"67c15b523070794b48011a9ea26b54f0bf4c9da6538d3274099b6bcb19fbb458"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: _onRequestCast handles blob URL with warning and no crash: This test sets up 7 test doubles (for example \u0060jest.fn\u0060) against 1 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/__tests__/chromecast.spec.js"},"region":{"startLine":1197}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b9f3efdd90b7f2eb8d36fceba2c9aa51d12af85687f0fd47fb3af8b00651f30"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps the plugin argument out of the wrapped handler: This test sets up 3 test doubles (for example \u0060jest.fn\u0060) against 0 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/__tests__/hooksDescriptor.spec.js"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"defca29faebc8a51ecb685a26da7f295179480eb12e5e108808ab682a4ddaaab"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: core-js: core-js 3.12.1, declared in package.json, is marked deprecated by its publisher: \u0022core-js@\u003C3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.\u0022. Replace it with the package or version that message names, or record why this one must stay."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"package.json"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"459709f0f3ece7a089fc10bb6362472405ad01dd3d16026be8f01381bea984f5"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: glob: glob 7.2.3, declared in packages/xgplayer-flv.js/package.json, is marked deprecated by its publisher: \u0022Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting [e-mail redacted]\u0022. Replace it with the package or version that message names, or record why this one must stay."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv.js/package.json"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"a793cbf1c3fbaf246021775d7c5c307f52d225b34bf04083914a790a8626cf6c"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: shaka-player: shaka-player 2.5.23, declared in packages/xgplayer-shaka/package.json, is marked deprecated by its publisher: \u0022Shaka Player \u003C v4.2 is no longer supported.\u0022. Replace it with the package or version that message names, or record why this one must stay."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-shaka/package.json"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bf8641e330112a6b44d8f4029fa8ddc8d123073a1215953e9b4b16559c7d6f4"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: concat-typed-array: concat-typed-array 1.0.2, declared in packages/xgplayer-transmuxer/package.json, is marked deprecated by its publisher: \u0022WARNING: This package has been renamed to typed-array-concat.\u0022. Replace it with the package or version that message names, or record why this one must stay."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/package.json"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b16823c7bc01baad3a57b92396715b02aa807ece6ff01612bd300afd393a78c"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-async-generator-functions: @babel/plugin-proposal-async-generator-functions 7.20.7 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"65d49b05809c34fbe764fba48e45c1739b8d587169e70abc2d1b8896dc2ddaf5"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-class-properties: @babel/plugin-proposal-class-properties 7.18.6 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"98ef9367f9a6d32eff045a01ff84c33c9673bec4579e63fd4d00102f62498780"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-class-static-block: @babel/plugin-proposal-class-static-block 7.21.0 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-static-block instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aaf7f836671f263bec54a90acfeeb77842c3419b2cdc39911017c6a3f2433c1"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-dynamic-import: @babel/plugin-proposal-dynamic-import 7.18.6 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f9739b712033ff16bbe7e770dbcedcb4192f7c271f4d406981b06879bfc5112"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-export-namespace-from: @babel/plugin-proposal-export-namespace-from 7.18.9 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":442}}}],"partialFingerprints":{"codehealthFindingId/v1":"c30c900d482ab8b19d2002fc454a740a0f2f78f7ce13dc1306f2124b63dbad7a"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-json-strings: @babel/plugin-proposal-json-strings 7.18.6 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-json-strings instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":450}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcdfe81cc524e5510a6d8642623aadba78ebda2fe30b5b014b16f47b8a03aad7"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-logical-assignment-operators: @babel/plugin-proposal-logical-assignment-operators 7.20.7 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0905f04c9759ec78303cbd1ee49174e7284bf8577a1997731d4d014cc0ab41e"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-nullish-coalescing-operator: @babel/plugin-proposal-nullish-coalescing-operator 7.18.6 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ac43ec836e3c17743763b5e7e621039bd82771ead6baf3470b3d2a739d4883c"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-numeric-separator: @babel/plugin-proposal-numeric-separator 7.18.6 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"21831f408730d7263d670f61c1fe6e9f99b2ae1f8d3e58fe4f7cc8c9a960261f"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-object-rest-spread: @babel/plugin-proposal-object-rest-spread 7.20.7 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"d10cf27456842a59f6a7785fe964ed85787c39a1ee26a9e904384c6cdced60d8"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-optional-catch-binding: @babel/plugin-proposal-optional-catch-binding 7.18.6 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":493}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbff452dd66ff69852054bac8b11042843b37b497f8014337f109ce1cc93abf8"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-optional-chaining: @babel/plugin-proposal-optional-chaining 7.21.0 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fd2a43ce1f48c573e748667a92469dd659f563d6d307f4577644a80adfd576b"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-private-methods: @babel/plugin-proposal-private-methods 7.18.6 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":510}}}],"partialFingerprints":{"codehealthFindingId/v1":"5313654796f251b96572a6629aa787dc643d32d5eaf7042d0928130a4c411f1f"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-private-property-in-object: @babel/plugin-proposal-private-property-in-object 7.21.0 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"da0c750f364a0b7c6b4dfc2c8a98447ad25bdd555ce6330a84a665fb2b5892a2"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: @babel/plugin-proposal-unicode-property-regex: @babel/plugin-proposal-unicode-property-regex 7.18.6 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"e20ff343a884a49019c73d897ceb3e5b0b0a10c5a769dacd89e61f9517450956"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: abab: abab 2.0.6 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022Use your platform\u0027s native atob() and btoa() methods instead\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":1926}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8dd0bf0d0cd13d756b090f499871d270eaf3254404514096be24c0fe4cd0b98"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: domexception: domexception 4.0.0 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022Use your platform\u0027s native DOMException instead\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":2677}}}],"partialFingerprints":{"codehealthFindingId/v1":"a70487e136352d3106124e624305291d240e0fb8ab553a27047a54656955b695"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: eme-encryption-scheme-polyfill: eme-encryption-scheme-polyfill 2.1.1 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022Deprecated as a package and folded into Shaka Player directly\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":2702}}}],"partialFingerprints":{"codehealthFindingId/v1":"03a4fdbeb749feb8a7ba864cb78640106537dd5a8edc3fc81233861db8b55dc2"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: inflight: inflight 1.0.6 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":3333}}}],"partialFingerprints":{"codehealthFindingId/v1":"55be9905a34a12b9511076231a068531da3ac6b41453399bbd9f2029c07dc756"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: rimraf: rimraf 3.0.2 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022Rimraf versions prior to v4 are no longer supported\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":4619}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7eee92188ebd48360d1f320b3f5bc255da846526549cda5081de851ea4cbe73"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: sourcemap-codec: sourcemap-codec 1.4.8 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022Please use @jridgewell/sourcemap-codec instead\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":4778}}}],"partialFingerprints":{"codehealthFindingId/v1":"385503975d481de15a077dd4a742958d7328a9340c98126609784cb1f4cd14d3"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: tar: tar 6.1.15 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting [e-mail redacted]\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":4902}}}],"partialFingerprints":{"codehealthFindingId/v1":"3934b3cbb175beb36c77fcc0ba1d88c2cfd2af525922978dd5aec16c2a211eea"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: w3c-hr-time: w3c-hr-time 1.0.2 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022Use your platform\u0027s native performance.now() and performance.timeOrigin.\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":5154}}}],"partialFingerprints":{"codehealthFindingId/v1":"07142f918085b86fb396ec35d61ea1519e487b91fd3806131f9cd1bac35b14cd"}},{"ruleId":"D12","level":"note","message":{"text":"Deprecated: whatwg-encoding: whatwg-encoding 2.0.0 is resolved in yarn.lock and is marked deprecated by its publisher: \u0022Use @exodus/bytes instead for a more spec-conformant and faster implementation\u0022. This repository does not declare it \u2014 a direct dependency pulls it in, so the move is to upgrade or replace that dependency."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"yarn.lock"},"region":{"startLine":5195}}}],"partialFingerprints":{"codehealthFindingId/v1":"af53de653a0bb0be8ffdc0a977fb9371aa6cc6deacd91c571f062076c05fb927"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated (npm): glob: glob is pinned at 7.2.3; registry.npmjs.org publishes 14.0.3 as the latest release. Upgrading is a judgement call \u2014 read that package\u0027s changelog for what changed between the two \u2014 but a direct production dependency several releases behind is where security and compatibility debt accumulates silently."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv.js/package.json"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"df9aefa4b7d91027fef6e47766bb8af49d358e9321b7b5563bf65ada8ac5b9f8"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated (npm): shaka-player: shaka-player is pinned at 2.5.23; registry.npmjs.org publishes 5.3.3 as the latest release. Upgrading is a judgement call \u2014 read that package\u0027s changelog for what changed between the two \u2014 but a direct production dependency several releases behind is where security and compatibility debt accumulates silently."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-shaka/package.json"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"c479d127d31a847d9248be78297ee3cf9d0a3f42571639c3b31e6734344fe67c"}},{"ruleId":"D12","level":"warning","message":{"text":"Floating npm dependency: danmu.js: \u0060danmu.js\u0060 is declared as \u0060\u003E=1.2.1\u0060 in packages/xgplayer/package.json, which names no releasable version: \u0060\u003E=1.2.1\u0060 is an open range with no upper bound on the major. A production dependency that cannot be resolved to one immutable release makes the build non-reproducible \u2014 two installs a day apart can ship different code \u2014 and leaves nothing for a vulnerability scanner to match against."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"92831804c8b0460841e421afe3bcfb69f0fad67ed82716109db26e96872b86ee"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: fixtures/hls/index.js: fixtures/hls/index.js changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 53 in index.onload at line 43. 2 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, make sure the area it touches is under test, 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. Counted over 2026-07-31..2026-10-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-31 17:30:32 \u002B08:00\u0027 --until=\u00272026-10-29 17:30:32 \u002B08:00\u0027 --full-history --no-merges -- fixtures/hls/index.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"fixtures/hls/index.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1c9386978278eebfc667c2c0eb52607709d2ac9fd624bb66aeff3471f3d2c81"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/xgplayer-mp3/src/loader.ts: packages/xgplayer-mp3/src/loader.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in MP3Loader.loadSegment at line 240. 3 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, make sure the area it touches is under test, 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. Counted over 2026-07-31..2026-10-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-31 17:30:32 \u002B08:00\u0027 --until=\u00272026-10-29 17:30:32 \u002B08:00\u0027 --full-history --no-merges -- packages/xgplayer-mp3/src/loader.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/loader.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dc7d24c55485b845fa03b0749e57d3ec63adf0a9cc763da1ef0cf368628ee06"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/xgplayer-mp3/src/mp3.ts: packages/xgplayer-mp3/src/mp3.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in MP3.loadSegment at line 161. 3 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, make sure the area it touches is under test, 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. Counted over 2026-07-31..2026-10-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-31 17:30:32 \u002B08:00\u0027 --until=\u00272026-10-29 17:30:32 \u002B08:00\u0027 --full-history --no-merges -- packages/xgplayer-mp3/src/mp3.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/mp3.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb1ea1201a938a18cdaea9ea2ea1467aa5863fc0984bf96bdbfc3c3c5562a8a1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/xgplayer-transmuxer/src/codec/mpeg.ts: packages/xgplayer-transmuxer/src/codec/mpeg.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in MPEG.parseHeader at line 126. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-31..2026-10-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-31 17:30:32 \u002B08:00\u0027 --until=\u00272026-10-29 17:30:32 \u002B08:00\u0027 --full-history --no-merges -- packages/xgplayer-transmuxer/src/codec/mpeg.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/mpeg.ts"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"a71beb7cc05abb53a8ff437da34634edb651ba4bc2c072fc60a6455bcc6f3265"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts: packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in TsFixer._doFixAudioInternal at line 477. 2 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, make sure the area it touches is under test, 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. Counted over 2026-07-31..2026-10-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-31 17:30:32 \u002B08:00\u0027 --until=\u00272026-10-29 17:30:32 \u002B08:00\u0027 --full-history --no-merges -- packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0f396f1dc52e9e45943beb8d50019ea6a3a4099226bbb60f370368da116e014"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: packages/xgplayer-mp3/src/plugin.ts: packages/xgplayer-mp3/src/plugin.ts changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 12 (its worst body is MP3Plugin.handleFatalError at line 297), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(xgplayer-mp3): correct EOF handling and source switching\u201D; \u201Cfix(xgplayer-mp3): address mp3 loader review issues\u201D; \u201Cfix(xgplayer-mp3): improve loader logging and fixture UX\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-31..2026-10-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-31 17:30:32 \u002B08:00\u0027 --until=\u00272026-10-29 17:30:32 \u002B08:00\u0027 --full-history --no-merges -- packages/xgplayer-mp3/src/plugin.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/plugin.ts"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ca7031f876bfa543dcc43f86a1d855cf02b75eda6b5cdf2687e2f22128ac0b9"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 9 significant file(s) lose their only recent owner: packages/xgplayer/src/plugins/progressPreview/index.js, packages/xgplayer-transmuxer/src/mp4/fmp4-demuxer.js, packages/xgplayer-transmuxer/src/codec/avc.ts, packages/xgplayer-cast/src/platform/chromecast-remote-controller.ts, packages/xgplayer-flv.js/src/plugin.js, packages/xgplayer-transmuxer/src/utils/exp-golomb.ts, packages/xgplayer-transmuxer/src/codec/nalu.ts, packages/xgplayer-cast/src/platform/cast-handoff-state.ts (\u002B1 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1bd01e5e0c2e485a2126cc63db4ad247718313f373a7dc1e5b7b6bfab808f3d9"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 3 significant file(s) lose their only recent owner: packages/xgplayer-transmuxer/src/flv/fixer.js, packages/xgplayer-dash/src/m4s/mpd.js, packages/xgplayer/src/plugin/pluginsManager.js. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1b8c08fbf5b59e27bb91104ebd8b4fefaee27dc392d224a7eabd16e32ce2dafd"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 5 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 (18 single-owned of 162 analysed files in total, counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated, example/demo and scaffolding-template trees and test files identified by path convention, largest first; 162 of the 308 production source files in this repository met that bar). They are anonymized user #3 (2 file(s)), anonymized user #4 (1 file(s)), anonymized user #5 (1 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. The files folded here: packages/xgplayer/src/lang/i18n.js, packages/xgplayer-streaming-shared/src/net/helper.js, packages/xgplayer-dash/src/util/index.js, packages/xgplayer-streaming-shared/src/net/task.js, packages/xgplayer/src/plugins/rotate/index.js, packages/xgplayer-hls/src/hls/manifest-loader/parser/utils.js."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac528f2429e724e1a97ed868f79eefbcf1888dab4af9a9e673429369bb5b2f"}},{"ruleId":"D26","level":"note","message":{"text":"Projects may be oversized for their cohesion: 1 of 17 project(s) overshoot their size bounds, lowering Project Cohesion to 8.8/10. The most over is \u0060packages/xgplayer\u0060 (19545 LoC, 89 module-visible types across 43 directories). Review these for cohesion \u2014 draw the boundary inside the module first (group each responsibility into its own package or directory and keep the cross-boundary members non-public), since splitting a published package moves types between packages and breaks consumers."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d5a94650dc74886a0f1f08eb9fb6775f1fc395279ef7e901c970c9d26f767a72"}},{"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":"ccfd774add492472595a9eb75fed5e46e2424f110ca7c7440e7fbea3836549c2"},"properties":{"commitSha":"08f55c2170be8f093b846f80272cc212768e65ce"}},{"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":"89308a9e6367619ee9d131962c9f7000729ee4ec035d6f5c63ed7fc2b27352a0"},"properties":{"commitSha":"08f55c2170be8f093b846f80272cc212768e65ce"}},{"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":"c51a2dab3a7060c05c5b88adf3c8bdad0f3ddcfefe660033d88cbfbd1cfff13f"},"properties":{"commitSha":"08f55c2170be8f093b846f80272cc212768e65ce"}},{"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":"a4b73fd754786243681ba4b91e78f1bc0e7c55a2baf795f75905187fb984edb2"},"properties":{"commitSha":"08f55c2170be8f093b846f80272cc212768e65ce"}},{"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":"7588173ad9593dc9765acf179f70126c082aa6418382ab252793d741b234d405"},"properties":{"commitSha":"c47b7d492a4991f73232a666f28a46ad19af08e6"}},{"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":"23e7545ddf9c59aa3034b0383f4c0e46d8a51bdf0b46b87233599d38e9ff433c"},"properties":{"commitSha":"c47b7d492a4991f73232a666f28a46ad19af08e6"}},{"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":"dd2654f0100c9e8723120cd78e6cd54ae202c754cd17c7aa95a5571050dec73f"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"c6f460ce8067d56b84aee71c9d815d4e5f81b21b8afa12ba1cf721c068e16882"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"feaceaf23f9b1ab3c7918307ae021348ce340996fa946f78f5b597797f632b52"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"77847d4d9e715398297c158f302f573115261fa4ec2a7243fa64534887cf387b"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"4f54ebe8227db81079b909f45c06e84d0d9f717137f4498b6eed157c1927b13c"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"801e60aed41b1830aa35670f62ac1a60a301a9b98f6d9a13478d3be3430260a0"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"21292659969e62ffb8d004c5461a090ca9c36735adf7942a44c09a324b41241d"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"ad55762915a00c022bdfbb7d4950713e12d7b3aa2fe4fab64d39f9cc75d81953"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"b1824bae7c6a2afbf91bb7091a2af59cde14e51340d122cd7c8645c0619f02ad"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"d1c8099c7ef2013a8812c98ac636dd763212ae1bc0df3979fbca3aa1fa922dcd"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"55aba414e4213b549500b21e788ad39b6a74a263279538c7821228a26d4996d6"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"c401d2c9c1dfb390b775ad31257d82eb5e26d73bc29c01161ad948422286c386"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"102d1680f0ae32022b2e3694ddb884c7bcf7a2595a52c8e5061f733bf898c848"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"abd8659d560770ef61d289df9ac8fc6ba7238b15d4175c5c2d4e1abdc40a0a72"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"6d5ef0e5918798ffa6a9dab98c02c5563eeade2a5d2c899bf954f4ce054f0710"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"d37fca025e7eff89683db18bc391e3ad90f7a7bfe7ce1ae79a611148eb60afff"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"e7e3eb9f92818e5763de98108d01e2d7a78e4bcb49c0cf0a4f75fa86c92aa1ae"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"ab8d83539c5ebe567cb6deae98d392d6617f9ea4001a34a9a21fb3f393c0be8f"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"8af93b54d7b6d09176d9c9016e65470b9e3497c2e30cd6af0b8b0a89230292a4"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"f15ca41ea89408ce83d3c8c669b8d7a164f4cedaed3ebc0cd9064cf1b92a3054"},"taxa":[{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"ee296beeef27e9cc75b8ec1724aa20e1afb5ea7bcab3b3e940fd8082b0b95e43"},"taxa":[{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","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":"564f69ebf05c8197c1086db31b23d0c977ffb831f4e5c123b61e6be03459aed9"},"taxa":[{"id":"CWE-319","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A04:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","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":"429e3863aeabc49a01badea953a22ed3b3f9acfdda4eae9f8d0863bb85722dce"},"taxa":[{"id":"CWE-319","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A04:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","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":"0ad320320718898dc00516c5b885a5d4973659eb9a76fa8f6eb4cd2251a9757f"},"taxa":[{"id":"CWE-1333","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A02:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","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":"081eadc4a91c2e104d784c2921d6c50e83494b56ad435b303b7b9d6a309152c0"},"taxa":[{"id":"CWE-1333","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A02:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","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":"e56648bf7877686de156e661f746e9c28c3b98f6fc4e80322fe718d31d0b562a"},"taxa":[{"id":"CWE-457","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","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":"48834dca93136c5756b91d39899d942a56cd33d8548f66fa18486cbe57c234c0"},"taxa":[{"id":"CWE-1333","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A02:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","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":"2ef7f3c90ba97b419761bd47cb76000709adb6819402f3cd85122618f5df71c9"},"taxa":[{"id":"CWE-1333","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A02:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D30","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":"e3654f6833a3764f09bdb6f35e9d51fa351c7f34f76f265e09210bb732f389d6"},"properties":{"dependency":{"package":"@babel/traverse","version":"7.21.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"1832fff5de810fcf303cffa4dab7cc73a432059253ebc9ab01c924b6720d58f1"},"properties":{"dependency":{"package":"form-data","version":"4.0.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"1c9a61626e0d439eacda938bf7340276efbf3bfe3de024eb2bd43a16ebca4a59"},"properties":{"dependency":{"package":"tar","version":"6.1.15","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"0adad6028366f237751d80b18e7a29b814192942ada5d705e20a875c5e43e82e"},"properties":{"dependency":{"package":"@babel/plugin-transform-modules-systemjs","version":"7.20.11","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"1688745f7c2687a3a878cb3413906341cb84269a6cfa0c48072768c2326e0deb"},"properties":{"dependency":{"package":"brace-expansion","version":"1.1.11","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"286cb5bcc48a159a80a428015b637ae7796cb3b413253bf9468956c15f5314ce"},"properties":{"dependency":{"package":"brace-expansion","version":"5.0.6","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"141c9073bf454ba0393bd30e60638105a902f15a49d5e28ba0a8a1b52f7a5947"},"properties":{"dependency":{"package":"braces","version":"3.0.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"516168152bb5dba93c5dbb03351418a2c72ea2c9ecf10f18a6ade72fa55dd0a9"},"properties":{"dependency":{"package":"browserslist","version":"4.21.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"fac6db659a9da8df25d40a5be2c1ba9f774002b846b0232b88b1fa9a8477cb91"},"properties":{"dependency":{"package":"cross-spawn","version":"7.0.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"bfab80b37c3d52f33d8e9e40231a22ffb3b2ef638e1167ae49ef2bd0f7f9740d"},"properties":{"dependency":{"package":"immutable","version":"4.3.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"8551343a455849fc5616830b4bf1c4631f2d9b63f581741ea2452b582f417c70"},"properties":{"dependency":{"package":"js-yaml","version":"3.14.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"8ef33557430c0008e8fa29fa05b9f724a788f90c2ea64127655150f7863ba7f9"},"properties":{"dependency":{"package":"lodash","version":"4.17.21","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"340e8b8f0fee29d6d6cb45ccd0437e64701d655771d019c853915389e8336f74"},"properties":{"dependency":{"package":"minimatch","version":"3.1.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"20e05f808fdaa55e8331bf6a3bd129087179d9080258232e44cb58ba85f77abc"},"properties":{"dependency":{"package":"nanoid","version":"3.3.6","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"bcaa3aeb9aede7e9fa8341c54213e62f0656db09f0aaeaa66bc813801f5ed1a7"},"properties":{"dependency":{"package":"picomatch","version":"2.3.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"98c10bd5bcca3bca929fd3cd90a5ccf9aa482f7ff68301e9c94c00acd2ed6d27"},"properties":{"dependency":{"package":"postcss","version":"8.4.23","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","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":"1343e4c9677a76c6dd8e6701088a5d5f24eb1b4e5dbac6f71b86b2eff0168c72"},"properties":{"dependency":{"package":"rollup","version":"2.77.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"7c7776161ef34abb7a2e96705cb0d297999e2bca1ba37951b4eeb8f70bdd28d0"},"properties":{"dependency":{"package":"semver","version":"7.5.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"production","file":"scripts/commands/changelog/index.js","line":4}}}},{"ruleId":"D30","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":"97a440266b822f695a8a2ba0d7a4ef0a70fb12e05caf7ff61e22369f6c92c523"},"properties":{"dependency":{"package":"semver","version":"6.3.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"production","file":"scripts/commands/changelog/index.js","line":4}}}},{"ruleId":"D30","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":"292aff019dd5f3776df4eb4601bbfa1fc4f398a7e6300ee9441be232f8c34274"},"properties":{"dependency":{"package":"source-map-js","version":"1.0.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"cdccc4eaa721ab8f7a83edffe113398dac37af235e7ec8b5c2db184739121de8"},"properties":{"dependency":{"package":"vite","version":"2.9.15","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"production","file":"scripts/commands/build-demo/index.js","line":4}}}},{"ruleId":"D30","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":"05241e847eef03d8b1b078939b5ff2b04c76f3e626994e7ef74e5736f62d9e49"},"properties":{"dependency":{"package":"ws","version":"8.13.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"4d5592c3b7d318ffb594d5bf5f1a80f59bff85b7142c4622718918381b67a9a0"},"properties":{"dependency":{"package":"@babel/helpers","version":"7.21.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"c79be231dc54822eb2d135a8f9d06b84b4512244540a99bbc87ee518b4987d57"},"properties":{"dependency":{"package":"@babel/runtime","version":"7.21.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","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":"3a068d736950df7f81a0f0e1eb25e85ca2ac29524243beb737c8e5693eb6d3c7"},"properties":{"dependency":{"package":"esbuild","version":"0.14.54","advisory":"[GHSA redacted]","reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"e2349dff77f96e0bc39f97a9ccb5f23acdc83b46b3a4c595422c0f9b1efec07e"},"properties":{"dependency":{"package":"micromatch","version":"4.0.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"d371195e094fa3d74adc8d830819d107ba23f17d57137e2ee57b7f087a6aa230"},"properties":{"dependency":{"package":"tough-cookie","version":"4.1.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"447161147569a55970db86114a5c006ff1a19d231e5a93ad1e3d19ce7165e170"},"properties":{"dependency":{"package":"word-wrap","version":"1.2.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"696950c1aa4ac8042480bf39cdfbb11060aa9dd830b45962f66317e71dac10ad"},"properties":{"dependency":{"package":"@babel/core","version":"7.21.8","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"production","file":"scripts/index.d.ts","line":4}}}},{"ruleId":"D30","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":"f8a3ea6bd5bc95f6c80a6d6760a1a911dee29ed0294dbde28364c6443346d7d2"},"properties":{"dependency":{"package":"@tootallnate/once","version":"2.0.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"9b055c65404bc0c8fcb9780a1ee5fced26a176eadf2c50d33140be0f4ffe07ee"},"properties":{"dependency":{"package":"deepmerge","version":"4.3.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","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":"3335d307a116927fc3ff5e5909e8d2dc362bea0948ed03704d61c9e9a6b879da"},"properties":{"dependency":{"package":"diff","version":"5.1.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"bf7089680723cc061c6419f11d02591d42996c661f85e30b9f2bf8a55298269a"},"properties":{"dependency":{"package":"es5-ext","version":"0.10.62","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned files with no living knowledge: 78 of 162 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 2,400 bytes or more, excluding vendored, generated, example/demo and scaffolding-template trees and test files identified by path convention, largest first; 162 of the 308 production source files in this repository met that bar). 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 most significant first: packages/xgplayer-flv/src/flv/index.js, packages/xgplayer/src/plugins/track/index.js, packages/xgplayer-subtitles/src/utils.js, packages/xgplayer-music/src/music.js, packages/xgplayer/src/utils/draggabilly.js, packages/xgplayer/src/plugins/dynamicBg/index.js, packages/xgplayer/src/plugins/keyboard/index.js, packages/xgplayer/src/plugins/volume/index.js (and 70 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":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d849ecf0279447220d77f3c286ac28516e83871e7bf957965775a8a546a103b3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/track/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfaf9427be6927c9b49829953361fa368ff73fdef85efa7021ec29619cb5bee9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d5a924a2228f2c43ce8c6eaf193c1ab19638bbe9c2eee32d1e4af3fd59ae8a9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/music.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6f208ab9ff54a75b775990396adf898ca259b4509515556267ac9aba66a7eac"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/utils/draggabilly.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c99f47f8ad358aedab353a0c8e9823783bc151cd904f7c4e093809953b757ed6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/dynamicBg/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"95ba178bbd7dd7bce3240ff95efc6799c2d5fa3c2136c2d3cacae4dc34151e22"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/keyboard/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"99d8c4489b8ef91b0262efaf944fecb5ec98466d1d4ae2433fcf1f5c087bf77e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/volume/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ded461bd27f9c9109f81b11cef6e4d816bfaadf7c9182555458bcbde3dda0d56"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/heatmap/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab56f326fa72a26c759b3aa9e10b0e725b0c34a188a5152633e41831257ebce3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/logger/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa86ec01303adb1f334cc5085e108265d1a3348c752bd0b86d02dd649d65fe81"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/danmu/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"100376ccb512bbe5c6d37f329de9a1bb377eb50cd26e8ba47831235693e5a1c3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/defaultConfig.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f3fbf6e53f349a7025609adef0b0de79ebc87d24f6890f348025bb50c5ac5ad"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugin/basePlugin.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a839d57f33de118d43f87dfb38266ff89ccfbe099fb4629facd0f24133b54a7"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/common/optionsIcon.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cd9565aedc5340544df8d97475b179cd97fe6fedfae9ddd1a28c2f7dc7f6993"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/playlist/stream.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f60a0ba13ec699e5bc01203fc0ef6cbc054ee66bf460268e869528e33e79f151"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/media/eme.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb9153c5ccd409150c97689c54f1809b194d4408a965c015b97cb075807d4be0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-shaka/src/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"495b866b06f987b31254c48b24bd4a0ac7a5ed423b2c0cc0677918e71135c22d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/progressPreview/dotsApi.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6913ead979af012facd73ed6863ac052a09cb5e81982a79f2dc2476b9a46328"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/progress/innerList.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"98d121be49b2643ca7a95360e4d4ea5c0261452882c9c5181d3a4a53eab102f6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/start/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"85737264123bf944b6d729b4ef20c6efb73610662932d3d099b183ee686bce88"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/manifest-loader/parser/media.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf67cceb7388914d32bc361bfe577313d5c8b0736bda20f217d96a46c392770f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/miniScreen/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0053538c197507d1633f2a3e26af1bc8ca463a35a0d71c3acdf9f9f0bed2d256"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/danmu/danmuPanel.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"28da669374beac548d0368eb40d5a923513dc13a16fb8236a92c5b46216751bf"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/fullscreen/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"19ab71fdf0fe2652b9308de6ddcfceb967a8a6a2a3f65ed4ed97e1311e3343e5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/lyric.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e1389cdc8ef019cd54535b43c6ae774f53ac92dcfa573b67d89f6a97b6aa1ad"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/manifest-loader/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ac9a4f0179a9a622995c2639241a54a3afa458590f328d3d2abf5826dc44cbd"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/time/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8527f1a9c89f97c073b2038da14088d85a42522772ab23584bb818431bd5d183"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/common/thumbnail.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"58108cd9f37c5d15ca90970fe028249df24e937b52a62f7760ee80146d5e0bc0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/time/timesegments.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc55bae346427ca5157ac5786407fb8d98c18b82edc07abc689a36523ec916eb"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd03453679090f2996a16fd9fdfce73b59136e734d5c6d8ed7051f77dd097f35"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/testspeed/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddda25837182612b11b297709593ec8294b3ea97992fd3d14a04ca433c2192bd"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/pc/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1853fe1d657ea2bfee3a51d88a0216d381ad4fe7762378bc92c3cddb6e29b7db"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/playlist/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e54a5918cb41b75c1b4c55ec3bfd4133c9fc9b069d4cd71cf5abb2d779eb40b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/controls/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7676ffd3bc66c662782750ab18316b23e27717608ac05e0fbb32bec4421b1cc7"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/screenShot/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b8a351eb28d646ac85dfc0991dc3a7cd06fe64c59a65644e310d3db75115191"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-remuxer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9187f6d85af828c631a820ceef384b77188c0912a230444427399a936cc69d0a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/segment-loader/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"60c20ff16041a34703d7c2ae38096f32a102b3e2e0811b283ca46b9ed164628b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/mobile/touch.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ed1ac608d5e34014648d37700ad66b7286aed87fcd2a3a295cada417fc0afb1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/m4s/xml2json.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4125d737e16013adb66f100af26bb08c20d53c3e991182619cbaeb1620b9a0c1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/amf.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a84659189e2ffce0cb70941e9d114b839cdfcb16064c3fb9902738a284047242"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/services/stats.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a79a89ba61f4e3f8460a2f4f224f3f2a3e24404f18bf4015ecc675637cdc56de"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e7c7965dc979050982de53d5596f38b28336fa90a84027ac172c0da4dfb9a3b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/definition/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"50805257fb29ce44c571532240b16a7fba712e1d49681c50c6a13b57138150b5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/fmp4-remuxer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fc47c57f0b00055f100142f94fba0d77f1e9a76004ac0633accde94b5de4cc9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/stats/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"70fa6f9d44a6e36afdb69926c16879e2c6e0b6007cf3352c39488eda17b4fbc3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/th.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"99ab285f16b93676fc72b502b9aa6bdfa758b4064310e74c82e89eaac3c6875d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/instManager.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d0acbef376dc94ce66f9a7f3db646c1e91953bc1af211abafdd1d7c1280c5e1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/utils/database.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e9261dab878a2c77f8d2b6ababe7b1dc0d04b5633d6b6f83f7279e341218693"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/buffer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af685ebe3bd11d679d46cfdeb20ed2c55cc5cce9e61d0032fb5c0223c8dac09e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/crypto/crypto.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"51a7c3db815c8f582b2d74d8085afef308ce861ebba850ee713d676159de08fd"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/gapJump/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"909b44de105a0a0de1bbe97d7346410a19c8ae29008fd140be6dff58a588014b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/ru.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"493721e37762c3ffb308c5246864f9d8e583cb110bf09d3bfc5c7672bb44eb41"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/logger.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"412ca94799ee19889df339aec50903136e43ea8dbfef2a34abee1b43e91bd2cd"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/error.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"551968f83201db61a02b60b8d98bb371f1641dade45cc3ce40cd43a585c86044"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/playbackRate/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"93dc15216e1d4831c1016f8bf966a46205e947b8d9de2638ce95f2d74fb82646"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a0ed99d7be6fce88ae5fa2cfdee3ef68d0e86f4bbfccbef0448e700c29defd0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/error.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29a56529853a90777f57d1caac02b5c805e44d79aef30f636150491736bcba03"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/manifest-loader/parser/master.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0b70afe076d4f66ee718d22c3929608876c4f7c37bb1ea173eed93ba3550d07"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/cssFullScreen/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"edbe49aaad23798078a9ac84c30c75c12791637c6757e3393c03212156ad1df0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/jp.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6985821af01d709266cc094a6bf32346c4523dea400fc5e1244e1b808b7d509b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/presets/default.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ff13ec25270d808962b5a179f0e2980671c1fa8a5952e7574b7f6b1702b4545"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/events.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dae2db6945fdb316ad08e6a344ea165f88208acf11ea5b10f48429e7656d3195"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/helper.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4155e466699ae6219167807e85ae7a27bfee219bf9e71a4455cc38d4d797f49b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/common/optionList.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"efaaff6bf123d3c9c8f4aaf0580ced074dc0671f645786e113eeb3a25138ab7e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/kr.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9defea98be534143c7c6b5ced77201e7b7aee60f36716de162ba9bd7abfe996b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/presets/default-en.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c32e8400888b9385d0fb8cf991ae3cbb30c34bfb5ee7dc20eee86f746a525047"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/es.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ff44596368c69bd075f139e5811d461b275be7f66eeff053c25a3a6a5218de7"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/parse/stream.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10b12178200d537e55b65a05a113cebeadc92c112d35d1e6d1b9293e07e7fce1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/fr.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aacd47f67dca54f71c26f2cde84f2c25e49a4264e69c71bb0dc2cc3b03736521"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/de.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f41d7da3282402fa268580a1a6e049e419753bb39fb39823601f88d1c33e8202"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/vn.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"18c6d5e26ea46ac18092fc88384d5c24c15a1fc48e3e24a5e97d1123d3502738"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/it.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7185f0b9bace1b50c9cbf78cc33a1f9e2a6f672388ca347f1116b03bfc1b1b0b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/services/bandwidth.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2486fa12e9f4371ca1b26434b823eee01299b46bb810e14836cf373e4050982"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/br.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"295f04dcf49d0237c6ecf2e68b6f3ea6951327f2af7640ce4e3f2bdfc2e1c0f5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/media/mse.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c6318201024944c90679642d0421a84d40828cfa5b0dc50cf7634f4b5d91ca3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugin/resizeObserver.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b66c43f4e7625051877f7bc42580b0be8f4893184d97e4210d71ecbe111b31e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/util.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"94e1022b7f6442c74c69e0b328783c89917e32a7d78e8dd92f8a706093dbe195"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/id.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"37c47c9db83ede7c003c3768006f42a3df5adca2934bd90fe5a831fc4a0db522"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: index.js \u2194 airplay.ts: \u0060fixtures/cast/index.js\u0060 and \u0060packages/xgplayer-cast/src/platform/airplay.ts\u0060 change together 50% of the time (6 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u006071c81901\u0060 fix(cast): restore local state after cast ends (at that commit the file was still \u0060packages/xgplayer-cast/src/platform/airplay.js\u0060); \u0060dda44933\u0060 feat(cast): preserve playback handoff state (at that commit the file was still \u0060packages/xgplayer-cast/src/platform/airplay.js\u0060); \u00603cda0098\u0060 fix(cast): harden cast media handoff (at that commit the file was still \u0060packages/xgplayer-cast/src/platform/airplay.js\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"fixtures/cast/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"84e151c58b725cf808e0f97f2e6eb3ebc279a2913359e76359c7310d88c0a1db"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: airplay.ts \u2194 chromecast.ts: \u0060packages/xgplayer-cast/src/platform/airplay.ts\u0060 and \u0060packages/xgplayer-cast/src/platform/chromecast.ts\u0060 change together 67% of the time (10 of the 15 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 10 shared commits counted here, the most recent 3 are \u00602f135fc4\u0060 refactor(monorepo): enforce strict TypeScript checks; \u0060d6286241\u0060 fix(cast): unify receiver media resolution; \u0060927b5ecd\u0060 fix(cast): harden AirPlay and Chromecast handoff \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/src/platform/airplay.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0455353c0b4ae1eb70bdec2ddb4bb0310bd7b4b8c61ce161e295fb8e37a2645a"}},{"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"},"taxa":[{"id":"CICD-SEC-9","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"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"},"taxa":[{"id":"CICD-SEC-8","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"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":"ace515990e7ee0f17b5c17e44dd168a5bdecf90804a3a3dd845cf05540978013"},"taxa":[{"id":"CICD-SEC-3","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"IC1","level":"warning","message":{"text":"Fake-async \u2014 async method never awaits: \u0060setLiveSeekableRange\u0060 is declared \u0060async\u0060 but never awaits anything, so it runs synchronously while pretending to be asynchronous. Drop \u0060async\u0060 or do the real async work."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/buffer-service/index.js"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9d3e0501fceb45e2f8aa826f0e76b56d67dc908a706d0a46fb1b43cf5bd282b"}},{"ruleId":"IC1","level":"warning","message":{"text":"Both branches are identical \u2014 the condition decides nothing: Both arms of this conditional expression are the same, so no input can make the condition matter. Implement the distinction that was intended, or drop the condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/mobile/index.js"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"b993dc0902cb0984a7dae662354d19ced28c8ffbc353c720b8dad4d2aa6814ff"}},{"ruleId":"IC1","level":"note","message":{"text":"Empty method body: \u0060parseVps\u0060 has an empty body \u2014 confirm it\u0027s an intentional no-op and not an unfinished method."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/vvc.js"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ee51dddbf31e907239347441384d32922a36a3a40b04749edb14f3a3d2bf685"}},{"ruleId":"M2","level":"note","message":{"text":"No ADRs: No Architecture Decision Records found \u2014 no conventional ADR directory, no numbered \u0060NNNN-title\u0060 documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"670b3d6e36a756d63097d0dfbf90afd5fc761308800b9354894a07c3f4e4aa14"}},{"ruleId":"P3","level":"note","message":{"text":"No SAST: No static application security testing detected. For this repository\u0027s stack, add CodeQL\u0027s javascript-typescript pack, \u0060semgrep --config=p/typescript\u0060, or eslint-plugin-security as a CI step. What was searched, so you can tell an absence from a miss: the 9998 CI workflow file(s) in this repository, and the scanner and linter configuration checked in beside them. A scan that runs outside CI, one configured in your forge\u0027s web UI rather than in a committed file, or a tool whose name is none of those this check carries, is not seen \u2014 if that is your case the row is wrong, and saying so is more useful than adding a second scanner."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6e54424179c892f03ef2fd003130ac4bd43f39bbf3b1ca0a0143e25acb80ec87"}},{"ruleId":"P3","level":"note","message":{"text":"No dependency-update automation: \u0060package.json\u0060 declares packages, and nothing in the repository keeps them current: no Dependabot or Renovate configuration that schedules updates, and no dependency-review gate on pull requests. A pinned dependency stays at the version it was added at until someone notices \u2014 including after an advisory is published against it. Add a \u0060.github/dependabot.yml\u0060 with one \u0060package-ecosystem\u0060 entry per ecosystem the tree uses (or an enabled \u0060renovate.json\u0060), and gate pull requests with \u0060actions/dependency-review-action\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"package.json"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b237f7efe841e3a95b381b232502a3a473094adeb069a11eaca8ca533fb1c34"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060fs.readFileSync\u0060 in \u0060transform\u0060 blocks the event loop until it finishes \u2014 a blocking call inside async code stalls the event loop \u2014 every other request waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/utils/config.js"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5c60b7421b7c32fb9b10530aed437708b12fca382ef232ff6642a4977cef70e"}},{"ruleId":"R1","level":"warning","message":{"text":"Type Safety: 68 typed \u00B7 334 plain JS \u2014 the untyped files are __mocks__/fileMock.js, __mocks__/styleMock.js, jest.setup.js, packages/xgplayer-ads/src/baseAdManager.js, packages/xgplayer-ads/src/events.js, packages/xgplayer-ads/src/imaAdManager.js (\u002B328 more)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d00ee7953f55325a823d27e5db9657c80ca9b9861c0c0abf8fe487cd3fa586d3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 13 sibling directories (28 clone groups): 28 duplicated blocks under packages/ have copies in at least two of the sibling directories xgplayer, xgplayer-ads, xgplayer-dash, xgplayer-flv, xgplayer-flv.js, xgplayer-hls (\u002B7 more sibling(s) not listed) \u2014 22 of them are reported below, and 6 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 28 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 28 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 28 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/plugin.ts"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"04a340a37f51da775f2ad56d2225b6e9a3df2f3f28df4ff3c0b20052b1fdeb93"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 2 sibling directories (9 clone groups): 9 duplicated blocks under packages/xgplayer-transmuxer/src/ have copies in at least two of the sibling directories flv, mpeg-ts \u2014 6 of them are reported below, and 3 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 9 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 9 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 9 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/index.js"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"3287bb0aa45e607e518ec87ffc5ac416a47464709ca005bbea9ffcaf3a5bb6b9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 10 sibling directories (6 clone groups): 6 duplicated blocks under packages/xgplayer/src/plugins/ have copies in at least two of the sibling directories common, controls, cssFullScreen, danmu, download, pc (\u002B4 more sibling(s) not listed) \u2014 4 of them are reported below, and 2 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 6 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 6 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 6 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/cssFullScreen/index.js"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"015947d8ffa91d9f9c323abe37c5f46518e55a3a0e416961217efb1423cd67f7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (138 matched lines \u00D7 2 locations): packages/xgplayer-mp3/src/plugin.ts:163 \u00B7 packages/xgplayer-mp4/src/plugin.ts:134 \u2014 the two spans are one implementation copied and then locally edited \u2014 882 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/plugin.ts"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"92c7c8d29af39a98d4068b30dca9574561a42bab619176a2c7dee4aab8ec4864"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (68 matched lines \u00D7 2 locations): packages/xgplayer-flv/src/plugin.js:86 \u00B7 packages/xgplayer-hls/src/plugin.js:153 \u2014 the two spans are one implementation copied and then locally edited \u2014 428 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/plugin.js"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"918012865eea7a5096986a95be1defa8483a227b13ba3785a8abf427ce877fb2"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (54 identical lines \u00D7 2 files): packages/xgplayer/src/presets/default-en.js:1 \u00B7 packages/xgplayer/src/presets/default.js:1 \u2014 these 2 files are line-for-line copies of one another \u2014 54 lines are identical, in the same order, in every one of them \u2014 so this is one fact about the file set, not a block to extract. An edit made to one file and not the others changes behaviour silently, which is the failure a wholesale copy guarantees. Pick one file as the single source and derive the others from it (re-export it, spread it into the local overrides each variant genuinely needs, or generate the copies at build time) \u2014 the few lines that differ between the files are exactly the part each variant should still own. Check first whether the copies are deliberately standalone deliverables (a translation file seeded from its sibling and waiting to be translated); where they are, the duplication is the design, and the honest move is to mark the seeded file as untranslated rather than to let it pass as done."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/presets/default-en.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b355eca40b8a1dc584b27552267c96d2a8b514c23162f6abedb48893ee70756"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (52 matched lines \u00D7 2 locations): packages/xgplayer-flv/src/plugin-extension.js:11 \u00B7 packages/xgplayer-hls/src/plugin-extension.js:14 \u2014 the two spans are one implementation copied and then locally edited \u2014 301 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/plugin-extension.js"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"a61e2b971ddb11e7d212fcd33dad954966eab67ae75d3b7298c73c0fbb7987c0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (39 matched lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js:208 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js:258 \u2014 the two spans are one implementation copied and then locally edited \u2014 328 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f1eb21a26e8957f759761cb319f0de6ae8f315a8cb3bfc0f097b2ef721b1452"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 4 locations): packages/xgplayer-music/src/plugins/musicBackward.js:3 \u00B7 packages/xgplayer-music/src/plugins/musicForward.js:3 \u00B7 packages/xgplayer-music/src/plugins/musicNext.js:3 \u00B7 packages/xgplayer-music/src/plugins/musicPrev.js:3 \u2014 the 4 copies are spread across 4 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/plugins/musicBackward.js"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"34903be7b97485b5bb93fadb0fbc464f92ffc36286fa50c1ab5d184276968d3a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/codec/nalu.ts:138 \u00B7 packages/xgplayer-transmuxer/src/codec/vvc.js:358 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/nalu.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"e49fef6478568f30fe0d9aaae970abb6d69760ceef4997b75c0ef514c732132f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (24 matched lines \u00D7 2 locations): packages/xgplayer-subtitles/src/utils.js:27 \u00B7 packages/xgplayer/src/utils/util.js:94 \u2014 the two spans are one implementation copied and then locally edited \u2014 172 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"53bc92905e0e3f2b2c14cac71fe5e1986c45c3048139ae5c85cc7564a51f511a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (22 matched lines \u00D7 2 locations): packages/xgplayer/src/player.js:1497 \u00B7 packages/xgplayer/src/player.js:1538 \u2014 the two spans are one implementation copied and then locally edited \u2014 106 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/player.js"},"region":{"startLine":1497}}}],"partialFingerprints":{"codehealthFindingId/v1":"87f12d0339ae3305f6f24b5bc8c16c19c187e81b201797561f0254abd4177f2c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js:83 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js:124 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5289590f4f98b3b89e9660f52ad5b33af6334957090c2b72a060d2b0b62818f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (20 matched lines \u00D7 2 locations): packages/xgplayer-mp4-loader/src/loader.js:151 \u00B7 packages/xgplayer-mp4-loader/src/loader.js:253 \u2014 the two spans are one implementation copied and then locally edited \u2014 184 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/loader.js"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbbfbaaefe1071f70f47687eb0950ef3d8aac395a5a0ee41028d2f30c8bda7de"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): packages/xgplayer-subtitles/src/index.js:47 \u00B7 packages/xgplayer-subtitles/src/utils.js:369 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e1819cc1bfa83d1f8fb4e593a786f28037a6306d82a80ef7ba0238f95a8c1a2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): packages/xgplayer-flv/src/flv/services/buffer-service.js:350 \u00B7 packages/xgplayer-hls/src/hls/buffer-service/transmuxer/index.js:133 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/services/buffer-service.js"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"b61985fe1252e246044942acb7a6c882fa832b7001c8f6c44c7bd3a5d744b7f5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 4 locations): packages/xgplayer-music/src/plugins/musicBackward.js:36 \u00B7 packages/xgplayer-music/src/plugins/musicForward.js:36 \u00B7 packages/xgplayer-music/src/plugins/musicNext.js:36 \u00B7 packages/xgplayer-music/src/plugins/musicPrev.js:36 \u2014 the 4 copies are spread across 4 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/plugins/musicBackward.js"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"70d6d262faf1e4f3b7f1a597463009b38c244a5e5958c3b6bfb40dc59402ab90"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): packages/xgplayer-subtitles/src/utils.js:158 \u00B7 packages/xgplayer/src/utils/util.js:13 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"21fca8856ecb04810900b4b8985efe43b346133f13c4e5f47614613ba4c17bd6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/mp4/mp4.js:1256 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4.js:1274 \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":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":1256}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9a2e1d5e0a9a9e832e653c30fc06a7c2d754a18e5bce0e91cbf8fc080f05064"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (17 matched lines \u00D7 2 locations): packages/xgplayer/src/plugins/keyboard/index.js:157 \u00B7 packages/xgplayer/src/plugins/keyboard/index.js:177 \u2014 the two spans are one implementation copied and then locally edited \u2014 83 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/keyboard/index.js"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c344431089255add29654f6281f39abc9d0a15c11cb3491cdfc41afa3fb3abd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): packages/xgplayer-flv.js/src/plugin.js:48 \u00B7 packages/xgplayer-hls.js/src/index.js:55 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv.js/src/plugin.js"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1e2c843b581d582f235c3c00a729fec662a8576c35ccce94bd29f5dcfd855b2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): packages/xgplayer-flv/src/flv/index.js:253 \u00B7 packages/xgplayer-hls/src/hls/index.js:451 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/index.js"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"5824c26acdad3e2a64d920d90a20fb128fb0e45f79183b1b353470400fed1b16"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): packages/xgplayer-subtitles/src/index.js:1169 \u00B7 packages/xgplayer/src/mediaProxy.js:844 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":1169}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c164327f1c5cc775e7337f075f9bb9f9ce427f567b184088b6ea97cdf5917d5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): packages/xgplayer-subtitles/src/parser.js:195 \u00B7 packages/xgplayer-subtitles/src/parser.js:295 \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":"packages/xgplayer-subtitles/src/parser.js"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b598be9604109a074f7dab455cedd6c398d1d23774e18c19a24ccc65f1012ad"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/mp4/mp4.js:894 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4.js:911 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":894}}}],"partialFingerprints":{"codehealthFindingId/v1":"df534732a03175a03a8eb164a9d11edb29941ed2e38187b486c8e69665d779f5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (15 matched lines \u00D7 2 locations): packages/xgplayer-cast/src/platform/airplay.ts:60 \u00B7 packages/xgplayer-cast/src/platform/airplay.ts:494 \u2014 the two spans are one implementation copied and then locally edited \u2014 51 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/src/platform/airplay.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a8c341881adf088a7f51a2683a7f53dda9f1e2551827df98e8ffc74eb604c60"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): packages/xgplayer-mp4-loader/src/utils.js:392 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:1315 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"06777a9978538d94f55a60b7ab19892d468a1ff2100ce6cab539f00a541cd6f9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (15 matched lines \u00D7 2 locations): packages/xgplayer-subtitles/src/index.js:328 \u00B7 packages/xgplayer-subtitles/src/index.js:382 \u2014 the two spans are one implementation copied and then locally edited \u2014 89 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"c09fb604ada17c5008d6162c2ccad2aa09b17796f2f21a337e8812b57cb85ac8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/model/audio-track.ts:94 \u00B7 packages/xgplayer-transmuxer/src/model/video-track.ts:96 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/model/audio-track.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"866b0512a1f509d33757e3d48f86c1d37e66298593ae2582a62281ff4470eb75"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3 locations): packages/xgplayer-transmuxer/src/mp4/mp4.js:1288 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4.js:1306 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4.js:1325 \u2014 all 3 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":1288}}}],"partialFingerprints":{"codehealthFindingId/v1":"58d5902ca92d3ab9e69f11cc14249bce6bd4fd9a022915c6b62609135966e3fe"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): packages/xgplayer-streaming-shared/src/logger.js:72 \u00B7 packages/xgplayer-transmuxer/src/mp4/logger.js:27 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/logger.js"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"a170c270f844a55ce8896b92ed5fcf8cfb2bccbb79c4cf9a6066644f649cbb88"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (14 matched lines \u00D7 2 locations): packages/xgplayer-streaming-shared/src/net/fetch.js:183 \u00B7 packages/xgplayer-streaming-shared/src/net/fetch.js:362 \u2014 the two spans are one implementation copied and then locally edited \u2014 94 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/net/fetch.js"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"d311f30dadc4d71e6435acf4b41525debf616ad7f9782b2d4339b1b7b64be031"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/flv/index.js:410 \u00B7 packages/xgplayer-transmuxer/src/mpeg-ts/index.ts:244 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/index.js"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a791f90dde4337a24486f6f44753f9007298ea2eda22fdc1d6c29e6dc43b9c4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:135 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:237 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf34327a999e0e950d83efe297a1b64ca58ddc277a407c288611371616ef3dab"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): packages/xgplayer/src/plugin/basePlugin.js:202 \u00B7 packages/xgplayer/src/plugin/basePlugin.js:224 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugin/basePlugin.js"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"25095e5a8de6cc6e640dea853f025154ec9ad03ab14d1aabd505dac5a055522a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): packages/xgplayer/src/plugins/cssFullScreen/index.js:102 \u00B7 packages/xgplayer/src/plugins/play/index.js:81 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/cssFullScreen/index.js"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"eafa0ee32884bbe5630a452b8f214713db6c083c64c7c8700f710b459be186a8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): packages/xgplayer/src/utils/database.js:49 \u00B7 packages/xgplayer/src/utils/database.js:64 \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":"packages/xgplayer/src/utils/database.js"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2f4474952425431aaf202c85b7c6ee0ee1e36072fd70aff2504f5f5b388b0ab"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (13 matched lines \u00D7 2 locations): packages/xgplayer-ads/src/baseAdManager.js:151 \u00B7 packages/xgplayer/src/player.js:1051 \u2014 the two spans are one implementation copied and then locally edited \u2014 69 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-ads/src/baseAdManager.js"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"0de7523dad205fcde165c149d1a4b3937ec8c16a7485b7623e1b56c5a4d9888b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (13 matched lines \u00D7 2 locations): packages/xgplayer-music/src/music.js:185 \u00B7 packages/xgplayer-music/src/music.js:205 \u2014 the two spans are one implementation copied and then locally edited \u2014 57 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/music.js"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"cff0ae0ff5d3b26898285831dce9581695890f6f2f2e6eada6a9c1bcdbbed3aa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/flv/amf.js:40 \u00B7 packages/xgplayer-transmuxer/src/flv/amf.js:59 \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":"packages/xgplayer-transmuxer/src/flv/amf.js"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"23fc3bd3be89736138a8de90fe9f509f57936695382ac0840adf557ce0a4ad65"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/flv/fixer.js:367 \u00B7 packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts:531 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"f04f0ce473a92a6ee7f8c69ef24ad33e6f4e36b495cc1c2aed3034bc720b02e2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:860 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:875 \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":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":860}}}],"partialFingerprints":{"codehealthFindingId/v1":"af348b58fb5df5684edeae3995ab151a226250fa64adbaf3aec127c9637b329c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): packages/xgplayer/src/plugins/common/thumbnail.js:58 \u00B7 packages/xgplayer/src/plugins/time/timesegments.js:34 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/common/thumbnail.js"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf77ca540705397ea0219092656751917325293076ca97f459ae2d35d16f661b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): scripts/rollup.base.js:90 \u00B7 scripts/utils/index.js:23 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/rollup.base.js"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"3676d6a9a964b7c3f0d29c2985b9c4f81a268e2f46f5fcae2f091552e97437eb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (12 matched lines \u00D7 2 locations): packages/xgplayer-dash/src/util/xhr.js:1 \u00B7 packages/xgplayer-subtitles/src/xhr.js:1 \u2014 the two spans are one implementation copied and then locally edited \u2014 83 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/util/xhr.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f86eb7eb4ca6e80e66020739596ab2e1fb593c0c56c610aef67b5a59266304b2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): packages/xgplayer-hls/src/hls/segment-loader/index.js:112 \u00B7 packages/xgplayer-hls/src/hls/segment-loader/index.js:128 \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":"packages/xgplayer-hls/src/hls/segment-loader/index.js"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9267c1eb7d8ef2c61f95785a9a6a4ebda5651134d83b69dfb4e503f6ccb5cac"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (12 matched lines \u00D7 2 locations): packages/xgplayer-mp3/src/buffer-service.ts:63 \u00B7 packages/xgplayer-mp4/src/mp4/buffer-service.ts:291 \u2014 the two spans are one implementation copied and then locally edited \u2014 60 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/buffer-service.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"1466b8169774469e752cead5527d836293c47b08679d0f2d23c913b49d62859c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/mp4/mp4.js:988 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4.js:1005 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":988}}}],"partialFingerprints":{"codehealthFindingId/v1":"f71556a9b027752a521b5ce6a199da29e71adf61793ab32fd5b2990c231c7b58"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (12 matched lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/utils/byte-reader.ts:47 \u00B7 packages/xgplayer-transmuxer/src/utils/byte-reader.ts:69 \u2014 the two spans are one implementation copied and then locally edited \u2014 53 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/utils/byte-reader.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4cbead0fd717cd55c2889bf5b336961190891dab31a80d152866ac867d85437"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): packages/xgplayer/src/plugins/download/saveAs.js:157 \u00B7 packages/xgplayer/src/plugins/download/saveAs.js:188 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/download/saveAs.js"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"95ffbd55e34a8c21fcd615d6a54ffc234fa8a71e6219835b061a267a1cd0aded"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): packages/xgplayer/src/plugins/keyboard/index.js:207 \u00B7 packages/xgplayer/src/plugins/keyboard/index.js:226 \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":"packages/xgplayer/src/plugins/keyboard/index.js"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"5136659f1500e171b3ce5a1b7e019c20543ebaa443c4f40f5be0f99a7cb93141"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): packages/xgplayer/src/plugins/progress/innerList.js:104 \u00B7 packages/xgplayer/src/plugins/progress/innerList.js:117 \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":"packages/xgplayer/src/plugins/progress/innerList.js"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"55f56619f8a393a95fd2a14063f68ab4661614ee25604dae84f6805ae535c292"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): packages/xgplayer/src/utils/util.js:76 \u00B7 packages/xgplayer/src/utils/util.js:101 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/utils/util.js"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"568cc0d5a675cc0537506f991e5702ba1b0a8ff4783492c82240d9edb0f09077"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): packages/xgplayer-cast/src/platform/chromecast.ts:364 \u00B7 packages/xgplayer-cast/src/platform/chromecast.ts:390 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/src/platform/chromecast.ts"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"91dc47d6f065a35faaa3fb4692d548ed0f6fce924ef4344d6bced600c33ae7c9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (11 matched lines \u00D7 2 locations): packages/xgplayer-dash/src/parse/box/sidx.js:20 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:109 \u2014 the two spans are one implementation copied and then locally edited \u2014 64 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/parse/box/sidx.js"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"b79cb3ab6bae6a1be2eb56fc9bc117f2406117050344f586bc232403f2530fa0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): packages/xgplayer-dash/src/util/index.js:62 \u00B7 packages/xgplayer/src/utils/util.js:210 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/util/index.js"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"2978fbc14446ffac29663f6c68f742683ec7b1fe89303866b3b8e02e1058ded1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): packages/xgplayer-hls/src/hls/manifest-loader/index.js:196 \u00B7 packages/xgplayer-hls/src/hls/segment-loader/index.js:174 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/manifest-loader/index.js"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"59c03222bf05af59a4dd008450eb6a067b21c871a7f7cc6efb23f9badb067cae"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): packages/xgplayer-mp4-loader/src/utils.js:486 \u00B7 packages/xgplayer-mp4-loader/src/utils.js:514 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":486}}}],"partialFingerprints":{"codehealthFindingId/v1":"16fad530ea4428e58b51e8989a6ddeab093156c601145c34dd65cc7003f84335"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4 locations): packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:804 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:840 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:854 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:869 \u2014 all 4 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d664056489f17d3b2d55196d623d7966f48cd226bc8ccb7fa9148c4454d26e9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): packages/xgplayer/src/plugin/plugin.js:475 \u00B7 packages/xgplayer/src/plugin/plugin.js:495 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugin/plugin.js"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c3d7ac18a14e3a0e329fe349bb3487d84d591f912aa7d1a3003a8db122cbddd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): scripts/commands/release/index.js:190 \u00B7 scripts/commands/release/index.js:201 \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":"scripts/commands/release/index.js"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe9f57d796c55e2bda4f92ea4c7bc4d1a57b09c1fa186659f663e656908bd36d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): packages/xgplayer-mp3/src/parser.ts:113 \u00B7 packages/xgplayer-mp3/src/parser.ts:141 \u2014 the two spans are one implementation copied and then locally edited \u2014 71 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/parser.ts"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2965dd811b858299441ac98c48529f378eff6fb339111a4057a6ada2c868388"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): packages/xgplayer-music/src/analyze/drawBars.js:5 \u00B7 packages/xgplayer-music/src/analyze/drawDoubleBars.js:5 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/drawBars.js"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"721729da69bd952640b5449bdf0a229a1fe55029719333183b34050b745d0aeb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): packages/xgplayer-subtitles/src/observer.js:17 \u00B7 packages/xgplayer/src/plugin/resizeObserver.js:27 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/observer.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"237988e64e060d2113c0233a30419cfb292bff7d08b56742896d5e4ee3f036b6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/codec/hevc.ts:90 \u00B7 packages/xgplayer-transmuxer/src/codec/hevc.ts:108 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/hevc.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"6abf4d4e50321eebc54b8e0f244e52f91ed13154003a6eb0f4d3fc911edf4ece"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/flv/fixer.js:97 \u00B7 packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts:148 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"87eac7b27a2b979052828760fde1449077c0b40d9ce808389d84a0b44c758085"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/flv/fixer.js:230 \u00B7 packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts:396 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6eda7d94f195f3cc4256f4a69ff4ec7a4e66a73acc133066858cfb5f0730d94"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:201 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:490 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed08ea40848fdd64ea185745057be78dd789a92065d8b1bfc5b9fb8791d93c6a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:277 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:892 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3032ef1a0cf0f464994983553f5df9846e7cdd23df761c93e3b21f731866f7c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): packages/xgplayer-transmuxer/src/mp4/mp4.js:1318 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4.js:1337 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4.js:1357 \u2014 all 3 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":1318}}}],"partialFingerprints":{"codehealthFindingId/v1":"222fc30a758bfee0472a6ff419e956f4f77b2d142be204077fbac5ef35fc9d70"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): packages/xgplayer/src/plugins/common/optionsIcon.js:238 \u00B7 packages/xgplayer/src/plugins/playbackRate/index.js:115 \u2014 the two spans are one implementation copied and then locally edited \u2014 55 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/common/optionsIcon.js"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3da5a1fc9e6449241858c33fe6806edf33b0b62300757571c14ef77e3c8ff90"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): packages/xgplayer/src/plugins/cssFullScreen/index.js:55 \u00B7 packages/xgplayer/src/plugins/download/index.js:46 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/cssFullScreen/index.js"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1674ba0a4ba7d9050a435c248e9b74b64b9e6531594c3f6a2aaccb42a20f398"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): packages/xgplayer-hls/src/hls/index.js:361 \u00B7 packages/xgplayer-hls/src/hls/index.js:394 \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":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"621340ff98b6f19fe2bb16fbf10c10f0bed6ad4c8836c716345e32f1c7b3c505"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): packages/xgplayer-hls/src/hls/manifest-loader/index.js:103 \u00B7 packages/xgplayer-hls/src/hls/manifest-loader/index.js:137 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/manifest-loader/index.js"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae638fdc2ce7d830621aa12ff2125a58ce3ae4d85d0940ff999a1ab6d4a4218e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): packages/xgplayer-mp4-loader/src/utils.js:506 \u00B7 packages/xgplayer-mp4-loader/src/utils.js:535 \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":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"f90b1e6a7e7354c4b45940b9e2048accaa34fab9afa3c4f44bfe4ac8ad6defbb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): packages/xgplayer-subtitles/src/index.js:645 \u00B7 packages/xgplayer-subtitles/src/index.js:655 \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":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":645}}}],"partialFingerprints":{"codehealthFindingId/v1":"efb14780e6348f3104776d768c304084413268e3851cc928bb1961fc44636bca"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:534 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:589 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:631 \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":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cd3159f6f466102cff0a0ff1b3ee84e53638a0c2c7528c78b2066dbc162501f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): packages/xgplayer-transmuxer/src/mp4/mp4.js:1305 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4.js:1324 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4.js:1343 \u2014 all 3 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":1305}}}],"partialFingerprints":{"codehealthFindingId/v1":"34722fb45a7ca9580530789c6aae844dfaaf95de348294420c83a9584e5e3552"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): packages/xgplayer/src/plugins/mobile/index.js:158 \u00B7 packages/xgplayer/src/plugins/mobile/index.js:723 \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":"packages/xgplayer/src/plugins/mobile/index.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec02fa23dd6d1561776e161f7eacaa2800cc9a9c9b45d4c0c8203ad062fbb3b8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 5 locations): packages/xgplayer-flv/src/plugin.js:98 \u00B7 packages/xgplayer-flv/src/plugin.js:106 \u00B7 packages/xgplayer-hls/src/plugin.js:170 \u00B7 packages/xgplayer-hls/src/plugin.js:178 \u00B7 \u002B1 more site(s) not listed \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/plugin.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9f206d04f2a94d3ed4b0874c122125367492d68e518c811ce03a52d777f1d00"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): packages/xgplayer-hls/src/hls/index.js:344 \u00B7 packages/xgplayer-hls/src/hls/index.js:384 \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":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e9a7bb270d66b34731f2539c5fd6dd2b183b8ce96048a8d5b00044dcb56dd95"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): packages/xgplayer-hls/src/hls/index.js:435 \u00B7 packages/xgplayer-hls/src/hls/index.js:444 \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":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"2251d201e48a34bfaa4eca18b2e1f6449d4124f5c079a0044a949e26538b3967"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): packages/xgplayer-mp3/src/mp3.ts:66 \u00B7 packages/xgplayer-mp4/src/mp4/index.ts:65 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/mp3.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"64cee07e2c68898ec2e8525b423fa62e4cfdb7b451194bfef385776a86b7c24b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): packages/xgplayer-subtitles/src/index.js:506 \u00B7 packages/xgplayer-subtitles/src/index.js:548 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"5330dd1d2ed80eb21da3f0110002059dcf3d8108e2e46f14aa5043ca53b3f341"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/flv/index.js:276 \u00B7 packages/xgplayer-transmuxer/src/flv/index.js:324 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/index.js"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"44fb695bc67500aed818dc5af3f4afb255e1a792d04263fbe7748133f6e10296"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js:122 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js:256 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"a155b4ca3dd6783834fc1d1de27ceb89ab0e8b29817acf05c0663e772a31ef96"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/mp4/mp4.js:875 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4.js:929 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":875}}}],"partialFingerprints":{"codehealthFindingId/v1":"987ed83471b7456bfd563c77d30d4be0c548be9f81907d8c1bf670d8c6fb7b33"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/utils/byte-reader.ts:18 \u00B7 packages/xgplayer-transmuxer/src/utils/index.ts:15 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/utils/byte-reader.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dcb1bef53bf196cedea468d787121d37be71e56364e9fd48d271eae6ce16690"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): packages/xgplayer/src/lang/i18n.js:26 \u00B7 packages/xgplayer/src/utils/util.js:303 \u2014 the two spans are one implementation copied and then locally edited \u2014 52 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/i18n.js"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f3d9011e89753e3fd363a3972f1e500806bbd4c3fcbca25dbfdb2e9dfe148e0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): packages/xgplayer/src/mediaProxy.js:804 \u00B7 packages/xgplayer/src/player.js:629 \u2014 the two spans are one implementation copied and then locally edited \u2014 56 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/mediaProxy.js"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdc13454918431aae883a8d6e91d6c22749074fe0d3bb4c4b2762f54df1bd9ec"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): packages/xgplayer/src/plugin/pluginsManager.js:329 \u00B7 packages/xgplayer/src/plugin/pluginsManager.js:342 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugin/pluginsManager.js"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"496cd98ce2cd9291bbfb4278fa03dcfcc7de4250061e544e1a2eec122ae19b5a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): packages/xgplayer/src/plugins/track/index.js:179 \u00B7 packages/xgplayer/src/plugins/track/index.js:221 \u2014 the two spans are one implementation copied and then locally edited \u2014 64 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/track/index.js"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"b473d0dabb72e1e3dcfae85c979cb61b6355743d88249d39b227788cff05b801"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): packages/xgplayer-flv/src/flv/services/buffer-service.js:285 \u00B7 packages/xgplayer-hls/src/hls/buffer-service/index.js:338 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/services/buffer-service.js"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"04d5184aa9a347ea369c18335a2114049bfc946092d66abdd6277fa569a3b6ae"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): packages/xgplayer-hls.js/src/utils/index.js:8 \u00B7 packages/xgplayer-hls.js/src/utils/index.js:25 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls.js/src/utils/index.js"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f9aa53b7e1458d5ee08f240fc4799bb3d3562cfd97c02d9cf12479186e79ff3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): packages/xgplayer-hls.js/src/utils/index.js:16 \u00B7 packages/xgplayer-hls.js/src/utils/index.js:31 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls.js/src/utils/index.js"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4cdc64738f8a96e39c72e475ac297a930dfe0ce61afcdeeee1c76a60e40b374"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (7 matched lines \u00D7 2 locations): packages/xgplayer-streaming-shared/src/mse.ts:322 \u00B7 packages/xgplayer-streaming-shared/src/mse.ts:356 \u2014 the two spans are one implementation copied and then locally edited \u2014 54 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/mse.ts"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"91ba37adeee4241af4751d99d0c3af8d6905adcd3003ad322dcfd4b5d0fe270f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (7 matched lines \u00D7 2 locations): packages/xgplayer-subtitles/src/utils.js:181 \u00B7 packages/xgplayer/src/utils/sniffer.js:75 \u2014 the two spans are one implementation copied and then locally edited \u2014 85 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"afb71165d0f5ec29b2c96501a4ef194e54dba0384629362bd5b4ac1e6ae008bc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/flv/index.js:424 \u00B7 packages/xgplayer-transmuxer/src/mpeg-ts/index.ts:259 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/index.js"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd40fb4daf41627b320cbb57fe71d2adaa70ca0344b7f9a467a4c7d2adbc0301"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/mp4/fmp4-demuxer.js:183 \u00B7 packages/xgplayer-transmuxer/src/mp4/fmp4-demuxer.js:228 \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":"packages/xgplayer-transmuxer/src/mp4/fmp4-demuxer.js"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b3205247e932b324eb1810974b986a21d477505517ba5bc1ecd191acd1d05e2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:157 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:904 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"951a77fab27bf95f567622f3065f956bea8f5473858ecbb30dc9063ac269809d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4 locations): packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:501 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:539 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:594 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:636 \u2014 all 4 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"b46d9329a7eaaf663479590d6c7a4310d8079ecc1f13d615c07c55b4e8292d82"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): packages/xgplayer/src/plugins/common/optionsIcon.js:109 \u00B7 packages/xgplayer/src/plugins/common/optionsIcon.js:300 \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":"packages/xgplayer/src/plugins/common/optionsIcon.js"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"dced2e5077c45a2b9e8bb2e34f07d67e8fc667d5816942d44f686881051b6238"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): packages/xgplayer/src/plugins/time/index.js:153 \u00B7 packages/xgplayer/src/plugins/time/index.js:169 \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":"packages/xgplayer/src/plugins/time/index.js"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"59de6e05961ed7abb5a53144dae43b0595e09cdc31e5cc8d67150dade5ce0292"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): packages/xgplayer-transmuxer/src/flv/fixer.js:181 \u00B7 packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts:325 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"01e967a806a6e2188c94e863f6aa41524bad3f62cdc9be689e50d9f86e5c499f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 6 locations): packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:150 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:193 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:201 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:282 \u00B7 \u002B2 more site(s) not listed \u2014 all 6 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"181941cbea01307bea9cc1e0f945ed45e810bce773658868f2448437b6895b83"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (6 matched lines \u00D7 2 locations): scripts/workflow/release-metadata.js:9 \u00B7 scripts/workflow/release-metadata.js:28 \u2014 the two spans are one implementation copied and then locally edited \u2014 63 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/workflow/release-metadata.js"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5645da5d312cf313ae8176f29f8b1b61d32073d101fda42062058b354141746"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3 locations): packages/xgplayer-mp4-loader/src/utils.js:111 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:980 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4-parser.js:1213 \u2014 the 3 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"3878c9c65d445a20813f010b13f2bbe7e05731ffe45b0951cd36168a21eba18c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3 locations): packages/xgplayer-transmuxer/src/mp4/mp4.js:975 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4.js:992 \u00B7 packages/xgplayer-transmuxer/src/mp4/mp4.js:1008 \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":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":975}}}],"partialFingerprints":{"codehealthFindingId/v1":"46d39be76697dfa0758e537cca983f8b4d75e3f637e89f36568cfcb05c422bfa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): packages/xgplayer/src/plugins/volume/index.js:75 \u00B7 packages/xgplayer/src/plugins/volume/index.js:305 \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":"packages/xgplayer/src/plugins/volume/index.js"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4835d779785d2484d713e91531696f3a7787a6c3eb34b6830f650307323c48c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: packages/xgplayer-hls.js/src/index.js:1 imports hls.js/dist/hls.light.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls.js/src/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a6c83af5095dde9ab54094a3839940ccdca8e3e3174fc54b2c535dfeeaf4b51"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-cross-package-internals]: packages/xgplayer-hls/__tests__/mse-airplay.spec.js:1 reaches past another workspace package\u0027s public entry into its internals with a relative path (../../xgplayer-streaming-shared/src/mse) \u2014 the test is coupled to a file layout that package makes no promise about, so a refactor behind its entry point breaks the suite. Import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/__tests__/mse-airplay.spec.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7107e012197e71948e5916ac8cc8bb8f2594a1661487fdb6f4108f7fde70cbc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: packages/xgplayer-transmuxer/src/mp4/crypto/crypto.js:1 imports crypto-es/lib/core, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/crypto/crypto.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cce924046eaf127076c90b0fcb072e0d5a8fe795644610141b3b3c41c3296b7d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: packages/xgplayer-transmuxer/src/mp4/crypto/crypto.js:2 imports crypto-es/lib/cipher-core, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/crypto/crypto.js"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"277df128350c033cbc4c16797e0ea3e56b36e659b1b095a620e9b09dfaec7440"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: packages/xgplayer-transmuxer/src/mp4/crypto/crypto.js:3 imports crypto-es/lib/aes, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/crypto/crypto.js"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"e14e2a053cc370fa468438daeb19cc3f33f0f6caaa53c9c277b5d53765624a94"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: packages/xgplayer-transmuxer/src/mp4/crypto/crypto.js:4 imports crypto-es/lib/mode-ctr, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/crypto/crypto.js"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4e4a0bbb875ff81c6db6dbf908791c99723cc41c2e18393456f9cfbf0d04ea5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: packages/xgplayer-transmuxer/src/mp4/crypto/crypto.js:5 imports crypto-es/lib/pad-nopadding, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/crypto/crypto.js"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cc9379739f55d0c8d4145a8b16f9b1b02aa1a22b996134a310eaa2b1db2e9eb"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function parseMediaPlaylist (cyclomatic 54, cognitive 85): parseMediaPlaylist has cyclomatic complexity 54 and cognitive complexity 85; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/manifest-loader/parser/media.js"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c77b77b9bfb8f5d2ee2cd383161adecb6e5dc58cdd19ed0a1ac35b9d59f0ea9"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function getSegments (cyclomatic 53, cognitive 97): getSegments has cyclomatic complexity 53 and cognitive complexity 97; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"9087d08bf05507f820e4c3ae31c46162996c7358107a02cfa5df6a6b9bde0bc2"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function moovToTrack (cyclomatic 53, cognitive 73): moovToTrack has cyclomatic complexity 53 and cognitive complexity 73; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":980}}}],"partialFingerprints":{"codehealthFindingId/v1":"0945410931fd202922e4a47b25390cf140043bc22dbe0a4df5bbe925e6b68235"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function parseSPS (cyclomatic 49, cognitive 48): parseSPS has cyclomatic complexity 49 and cognitive complexity 48; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/avc.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"34ae68020bb2ec2d7f9d79705493f56cc4f540d711cf0fbd1dbed060d26e4392"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 49, cognitive 47): (anonymous) has cyclomatic complexity 49 and cognitive complexity 47; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mpeg-ts/index.ts"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d009fe4e2d7485474197b8ac8ea873222ddfea681b6712cabf39b76960f5f2d"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function demuxPart (cyclomatic 46, cognitive 92): demuxPart has cyclomatic complexity 46 and cognitive complexity 92; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"23402524e306b57eb065b0ca3f9a8955c5164cb6b7feb2669ad531c328e4593e"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function parseSliceHeader (cyclomatic 46, cognitive 30): parseSliceHeader has cyclomatic complexity 46 and cognitive complexity 30; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/hevc.ts"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"810baa3b3d55a05f4252f19eda6c72d4a37e0f197860a9efa26e2be1099fd5be"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function OnProgressHandle (cyclomatic 44, cognitive 73): OnProgressHandle has cyclomatic complexity 44 and cognitive complexity 73; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/loader.js"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a3298f0040e41394d6a3ae03f728089319c57faae08b6492d19de3d37ec2aa"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 42, cognitive 55): (anonymous) has cyclomatic complexity 42 and cognitive complexity 55; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/m4s/mpd.js"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b125b8e6ff48a0c58c7bb0f18f2be333618a128a81e8545a4a5772a068f2ee3"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function appendBuffer (cyclomatic 37, cognitive 52): appendBuffer has cyclomatic complexity 37 and cognitive complexity 52; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/services/buffer-service.js"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"88ab5a02c5fddb36768e350618f19ffe11b3171478a6dbb769fe1b3a055c1514"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function saveAs (cyclomatic 36, cognitive 34): saveAs has cyclomatic complexity 36 and cognitive complexity 34; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/download/saveAs.js"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"431ca3aed453e97ec584dc9250235000fa9d23f10f772353cbe6348528272afb"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function parseDOMChildren (cyclomatic 33, cognitive 65): parseDOMChildren has cyclomatic complexity 33 and cognitive complexity 65; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/m4s/xml2json.js"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3b88d760c3067050022ee1f9dbcb2063dfb46e5f3479f37006910d53d3b2479"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function demux (cyclomatic 32, cognitive 55): demux has cyclomatic complexity 32 and cognitive complexity 55; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mpeg-ts/index.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fbd5b9211a417d4659331582709406425e314e15c69d45e341cc38b387243e7"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function demux (cyclomatic 32, cognitive 50): demux has cyclomatic complexity 32 and cognitive complexity 50; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/index.js"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"233cc06941f923498f48126bdd6bf8dee7df20c5165888a246307e5939661482"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function appendBuffer (cyclomatic 30, cognitive 40): appendBuffer has cyclomatic complexity 30 and cognitive complexity 40; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/buffer-service/index.js"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aa3ab6453ad17386b764ccbae53b7ed5f8f9f814bc6d29d3f78cac64e838960"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 29, cognitive 76): (anonymous) has cyclomatic complexity 29 and cognitive complexity 76; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f696a6f446ad6b2af051e62636d17e507849025dc3cedb9ef02cde14d25fbbe"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function load (cyclomatic 29, cognitive 37): load has cyclomatic complexity 29 and cognitive complexity 37; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/manifest-loader/index.js"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"6853c47130f3cec48b5c629da5349c4fc32400ec110e4daaab40cc94bb8a1292"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function _fixVideo (cyclomatic 28, cognitive 42): _fixVideo has cyclomatic complexity 28 and cognitive complexity 42; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"21725402817b1c7a77cf01e480bbefabf86a88798ee5f9cffe142b461782f4d8"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function _fixHevcBoundary (cyclomatic 28, cognitive 27): _fixHevcBoundary has cyclomatic complexity 28 and cognitive complexity 27; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf0a8c6a588c4e69e88ec030f1466eb8973a956274ecc0bbaf50711171261d84"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function _doFixAudioInternal (cyclomatic 27, cognitive 42): _doFixAudioInternal has cyclomatic complexity 27 and cognitive complexity 42; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6570fe3596abe877d9f1ac64405a0277c1edf814d7b7e013297fa44d042b8ff"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer/src/player.js: 2548 lines of code: packages/xgplayer/src/player.js has 2548 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/player.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b96cbbc281fe46620664b37e3642c21bca79fb5638ba4a578a654c35a33c1d8"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-transmuxer/src/mp4/mp4.js: 1345 lines of code: packages/xgplayer-transmuxer/src/mp4/mp4.js has 1345 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f21ea0a298f5a667f365618f6c8c804df5b4b1525d08fcd6980edb590cd7ca0"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js: 1296 lines of code: packages/xgplayer-transmuxer/src/mp4/mp4-parser.js has 1296 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mp4/mp4-parser.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b67d0f9bd389c2e47512e9c9955a0a399d4bff48a818c2f269d35018cce410df"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-subtitles/src/index.js: 1156 lines of code: packages/xgplayer-subtitles/src/index.js has 1156 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2985546f7444bbe3961405b28fe062c70595edb53477d98b1fd399b78b20f2f"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer/src/utils/util.js: 1083 lines of code: packages/xgplayer/src/utils/util.js has 1083 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/utils/util.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5cf1db9cab5bb77fad7fac1fa24e76852568c814aaba582e128aa379712b74d"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-hls/src/hls/index.js: 986 lines of code: packages/xgplayer-hls/src/hls/index.js has 986 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"da5d7142bea466351b2983de6153e29375a3f369a8dabc5191995ddcb8aeea77"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer/src/mediaProxy.js: 796 lines of code: packages/xgplayer/src/mediaProxy.js has 796 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/mediaProxy.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"30fd87cafc48f85ba94b63df94bb8edb6c32854f6410b0076381c40566de307a"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-streaming-shared/src/mse.ts: 785 lines of code: packages/xgplayer-streaming-shared/src/mse.ts has 785 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/mse.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a199efe3026d4a8c8ff618efc1420b1e9bba252988ff13f00cf20ec0527fbcd"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer/src/plugins/progress/index.js: 737 lines of code: packages/xgplayer/src/plugins/progress/index.js has 737 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/progress/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"35ca19ec5cd0f776d243c531dec3cd1588b3353b7736fc8a2e0bf5418ec23bcf"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer/src/plugins/mobile/index.js: 693 lines of code: packages/xgplayer/src/plugins/mobile/index.js has 693 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/mobile/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"62a550d09674ec883b2b1d42ade5a06cb2e04fe0057765c83f3b37d08a9c24ec"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer/src/plugin/plugin.js: 643 lines of code: packages/xgplayer/src/plugin/plugin.js has 643 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugin/plugin.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb684b9a054d158378a42667c896d39c8a218159b04cc6b5a296a6610c83afa7"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-ads/src/imaAdManager.js: 629 lines of code: packages/xgplayer-ads/src/imaAdManager.js has 629 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-ads/src/imaAdManager.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"860ea3e44d58bd2c664559929bb02031b270823f1e79eb60057ae2691bcc79a2"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-mp4-loader/src/utils.js: 629 lines of code: packages/xgplayer-mp4-loader/src/utils.js has 629 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e7754465ba1bd785076c046cf0d3c75b67adc0b5f321496e6f882e936c8de50"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-flv/src/flv/index.js: 521 lines of code: packages/xgplayer-flv/src/flv/index.js has 521 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e50dd945aa799b2fae4b81a914496e6ba25c82cbc3347c81e587d574eff8365"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts: 520 lines of code: packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts has 520 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a28f0879f19f90a6ea1e2a60df201d805fa0238f3fbe00d16f4fd6619d9ca606"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-cast/src/platform/chromecast.ts: 487 lines of code: packages/xgplayer-cast/src/platform/chromecast.ts has 487 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/src/platform/chromecast.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"abc4cb258105cf90805e385d839c96e58c475dae42affb656faf3ab2a5525c97"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer/src/plugins/track/index.js: 478 lines of code: packages/xgplayer/src/plugins/track/index.js has 478 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/track/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25bd9065d6933f1de61dd9dcc7245211465db2b2725c98aae74538e853ebdca3"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer/src/plugins/progressPreview/index.js: 471 lines of code: packages/xgplayer/src/plugins/progressPreview/index.js has 471 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/progressPreview/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a9cde8ec2d80bc9a89d8cee956ee95941eb14a5a38e5652c378fb4f8ed2c15d"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-music/src/music.js: 470 lines of code: packages/xgplayer-music/src/music.js has 470 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/music.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a9d5131f59f1eb2ba1b975725ca40ad682b5b12a0b048b85a10df23bd995dff"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-subtitles/src/utils.js: 455 lines of code: packages/xgplayer-subtitles/src/utils.js has 455 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"45033f3d6972502d0220520c314989a7002933920ebb480eb3b7c9b54268589e"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-cast/src/platform/airplay.ts: 453 lines of code: packages/xgplayer-cast/src/platform/airplay.ts has 453 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/src/platform/airplay.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe08d453fe93968ada34ba93cb7f06caab56706609cd73d1a25097394a16f676"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-mp3/src/loader.ts: 442 lines of code: packages/xgplayer-mp3/src/loader.ts has 442 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/loader.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e184af017c51b49d74389990d861f6794dadcd3d98fad5bfd3e5c60cf323b22"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-mp4-loader/src/loader.js: 437 lines of code: packages/xgplayer-mp4-loader/src/loader.js has 437 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/loader.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"57d704a583046d99a33262a0638fad933ce7a2b2718846c84ac572d4ab7c83ef"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-transmuxer/src/codec/vvc.js: 435 lines of code: packages/xgplayer-transmuxer/src/codec/vvc.js has 435 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/vvc.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f3bf2b7a126aa164d75fc04f72f02cbc7b4fcd276b20ffa5a139bf9dd685bbf"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-transmuxer/src/mpeg-ts/index.ts: 435 lines of code: packages/xgplayer-transmuxer/src/mpeg-ts/index.ts has 435 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/mpeg-ts/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"856c68ad415dc22690e62fe2a8bc40502ab227888507483efd2ace72f55da45d"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-subtitles/src/parser.js: 419 lines of code: packages/xgplayer-subtitles/src/parser.js has 419 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/parser.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"92f20dac38c9f2fc1108e9a25c8e8527c9dcd64cc6ca05cd8281d9b9b5494baa"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-transmuxer/src/flv/index.js: 415 lines of code: packages/xgplayer-transmuxer/src/flv/index.js has 415 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"02db5835ef0536a87745d1ed4596d4c5fb5500588c19f3e852a19f8471a96950"}},{"ruleId":"R3","level":"warning","message":{"text":"packages/xgplayer-hls/src/hls/buffer-service/index.js: 408 lines of code: packages/xgplayer-hls/src/hls/buffer-service/index.js has 408 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/buffer-service/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e619e5278d3b477d7bc5998e40e739a87d4c2a0d19cb4ce05fc93bf9787c917a"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/music.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9b70d788978f663020b55f9fb9beb6fb5fbc02dc41d34488d017e7cd6fa6571"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/utils/config.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4642896068a254150f13b33ce97f425111e1778ce806266010d9eddc1049d5b1"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/commands/changelog/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47859e0cbce2b1d4d505febb16ed6ac03bf413352de516ddbd11b1b825b0dfbf"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/commands/release/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7179006b80a94eb1319ab1fea7e721ce22507d8b3325c0a121d0923d918636d3"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-shaka/src/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"08d9c94f3f65090c828105face2797c6a5229fb35fcdd4c039020f8b9a10b9b8"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/workflow/release-metadata.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cd0dc5c28d805ea50ac78d98d9f52e8325eb6fb76ec6b12d24edac63c1bc3cb"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/lyric.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b9d99db2243e48eaf4ac4224f4a2a8c2c115a20cf3f395e9d9fc64a3222e2b5"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/context.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7765234d87a38153fe954c3ef900eec14c955c4715fae0137d4297c8c1706b4d"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5269a6276e1af328fd7028cadce12928b2db01c03364bbc0c31d07b2242f0dbd"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/parse/stream.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fe2314776d1b78b6bb705cfafa3a9da671344d2bcbd4db26faab025a7f653d3"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/helper.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"61172d4970de6358297d9c3197224233d15c4f6a8d8d6b4a931dad2a68221aea"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/workflow/release-archives.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd80feccada579136346b9151455ccf396e8df6e9ea383949a4958371ef0754b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/rollup.base.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"862eb48d845b965a81922548cf01c4aebd82de1017dfdcd62e1d5b77736c755b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/utils/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"50ee6753b7a1c909cbd0d47ebdb9a4efd05001c55f38049837ab7dd748098374"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/util.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"224512ab294b4387adbe6e2c603d2accfde8784f87c2abc0e657607cb081daf9"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/rollup.prod.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fb833c1d5283ebfb1f4b5e7c713c46268bcf8556863c4f7f729e4934432ca5b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/parse/box.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"918ae5da3e3c47452d469bebf67f92f073656d9147f23c9fb2de12b45a648da1"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/render.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"788bb16e3ccfa5bdd4e519667b61d7ca23cd3916cbfcf0fe52a23516d05b2811"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/preset.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"61ccb5bdb444a7917808109d4940a46b558196b9510c95f5c020f688d72decaf"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/cli.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f1bb92daabafd77c601c95ca868cddf1ed3de58420c59b3b9114907a4933fe7"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/utils/legacy/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd6fd1ff39360f93ecdf7bee1e2c9982dd084e40b43b464d52c6feb89d11239f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/commands/build-demo/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdb1eeb44a2bae08a90b6a4e5ecf59000597c90c5cbe9370bd640d92067be6c2"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/utils/logger.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f86640f0a97aa0a3127094235695dc1243138563ab0eb28f7aaa9f924f273130"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/plugins/musicBackward.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1668231dccfe6f9cd5bb45570bc7fa871b314bd7e5b31de9080ed0ed95a9360"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/plugins/musicForward.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e46b034f0d0671cea13bdf411f6b2b45c9f145009ecbeb8398d7e6b6f0e7328"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/plugins/musicNext.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d34f9a931860fb96f533e301f5dc1280393458e00aeca0fe55cd406331670051"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/plugins/musicPrev.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed792c35662bc603e930b228025720c0796f785bdbd4a3a595e731a082723e47"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/commands/dev/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fab7bce94b109fc4684a5d3c70049d8ebede07090f379cd59ffa61a812b2d47"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/commands/link/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"260eef5e5d92e62ee50ac7e88f17c0f45b8df11d894e0e1582adaf8d58e002ea"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/drawWaves.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1185637db0735909c82f6280a70f95b7465a33ad8ba19b5a30f77c4a67735234"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/workflow/create-github-release.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb4bf504ac5c4fcf60f7b137d98cfe50aa55f822a9c0485b1103b7d2d4586b3e"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/parse/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"07dd9118b1a3aec59da7dfaa46edb48d473f91474c2f2bd34bb0aff13db98152"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/plugins/musicCover.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"88c4afb6d0af6c165fbb54aff3dda01860fd1c75a7e82d308aa4290004bf858b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/parse/box/sidx.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a270a2427a80b351c34aa79bcb71790cc33cb1a8f6f975db92a6ea3e64eb627b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/plugins/musicMeta.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bca0d5cea2fba0d63b4e0ab519cdb18c5a991c184783f2976be2099e41e4f2b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/drawDoubleline.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"63e26a8cce61b2dc8afdd10ef375ac0175bd0c1f163b15781d2ea25aa557c2fc"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/netAdaption/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"35c7429f613599f710eccc7f0f54fe5a00d4d5f2a4ec99a914e797e9fec09934"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/xhr.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3f7179c0e3dc23b1939f457833fee47b55e839230c68e9f3a1da676807fe48b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/drawVertlines.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bea7dceef3388e2f0ac214e12b4be7dfbd03135bfff6f69796fa65a873d3d75e"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ee767a845fad8edac1a916996fa734500393767958ad8655a65de143736ddb7"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/drawLightning.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5e03c1110363c147ea65b24ba03ea82193f4e6bdfd92de272bed5a790ac05bd"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/parse/date.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc37fe92d0ead649e9ce5579c6c0cf24e6f35d5695cd8288fdf7e879bccdf0af"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/drawBars.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"620f4d862a064f58b85f3e1284dd73dc0f310515c596fe256d55eccb12d25fc8"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/drawDoubleBars.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"82feab0ec94430b89258e9de822f703b5720b4f7cfb13d94491bb2619c73c3a7"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/workflow/release-packages.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6ae2aa7d8a6a5c5a747ac864281938029f8591465fe4280453c5bbcec5433bb"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/workflow/create-release-pr.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bb78a1d68b332cb9c87f4a6a0c4b0355d5f3a20e19fede23178144827162184"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/index.umd.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cae89157175a41d81102511b76c0694fd8c8985fff7b7f9cb24f7b1dff2ef761"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/utils/url.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7573097993a78d4762ed93d418e739ab5d956246de13a171fa6867ad77e6a08"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-ads/src/index.umd.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9a05e23910281b183db316f221bdfad34644d13e18950d6aa183691100b016a"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/workflow/npm-publish.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d27423b2ebd464e826d2b29ad95aadc0d508df2d440168a58e42ea90f1620024"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/src/index.umd.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"997ea93810e4cb37cd0326ae720d349b9cee728cad02c318a7b6fa14769a69fe"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv.js/src/index.umd.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"02bc4fe644b62778a6e0dbffcd3cf33e15c928feb66bdc83f1b35f0464279935"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"097293b00920c80cf9bb5e9e0da7a79695cc86f4bd8472a2d01140d234b169ec"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/theme-default.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"07f4db1fc0ff4cb2f2127d03f7f4abff97fcc30510e004f000b30ea2f9c84593"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~115 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), but 3 in-repo import(s) from 3 other file(s) do name it (packages/xgplayer-dash/src/parse/box.js, packages/xgplayer-dash/src/parse/box/sidx.js, packages/xgplayer-dash/src/parse/index.js) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/parse/stream.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20c6c8fc2caa851f0f29313c10937072cfab2a0cc2a575cd20277a9cf4a8ab58"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~104 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (scripts/rollup.prod.js) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/rollup.base.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b05713041e88dfb57f811a84398866a16048f46420c149cb766ac00a19c37365"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~90 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/util.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"09cd272e5811d6fa590a327bf449083b2f5ee8e8dd21ef08fa7fcd86875f9863"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~87 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/rollup.prod.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"935e397d1e3eef7427fcea97b18957a13cd1260eab1a015f9facd5d8d857e2d8"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~69 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), but 2 in-repo import(s) from 2 other file(s) do name it (packages/xgplayer-dash/src/parse/box/sidx.js, packages/xgplayer-dash/src/parse/index.js) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/parse/box.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c46f93037e4015853c51a40c7729c2118e516fa03f8b2e10829a035bab1f2af"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~45 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/workflow/create-github-release.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"479952567dbe1774b51677505d8e17f090ce3542fc414cc90a51c4c8879044ea"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~43 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/parse/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b13a611543a64a38c2de32ac372a4f8139b33088ff112717c73e8a336b856d7"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~39 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/parse/box/sidx.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c06d749085d3e170c6950d4dacd849015115a2777c5db70c42f00e94caa6a245"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~35 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/netAdaption/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e940d3ea6b5b72e4be182d7fc8d8b95477e0dc0eaee3af2890f7c7cff2eec235"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~19 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/parse/date.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0233fcb0c44ad8c3c7deb7eb1feebd37ec86d77f83d81dc9ba4997c8a01f5974"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~17 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/workflow/create-release-pr.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b5ea6dd20f1b1bcb5d95d9a04ac479bcf8edb8cd85f0459e9ed22e3f053da8a"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~10 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/utils/url.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7479799f1dc7e147a504dff4ef65fb509edd8806c0b0759f1ec4aee27da94cc9"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~3 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/icons.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"71cdba9a10474381ab6f42981cf0180a29197232abf4f4bba1aba515b69e2f26"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~2 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d4e9d6fecd95f63494718d2808f2a84dece85efeb500ed49f0e9aeb7bfaa674"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~0 LoC): no import path from any entry point (45 application, 10 tooling, 96 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/theme-default.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc9f28053509901fce14035094b289de8a07dcf8804d7c1e1c738ab0ff2d0e47"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027trafToSegments\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp4-loader/src/utils.js"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"47233c680c92d1077aec47aef66b1ea31753f4d33e67d86f536ec54af5f604e6"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027genLinear\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/helper.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd921bae45c8d57a825c15db76fc11150ca534ab206876504560369faba76406"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027getPoints\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/analyze/helper.js"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"12552df44effbd6c45143cc5bfddb994326a4d0853fc0fb75672939e26820783"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027isNumber\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/is.js"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f3274736f423e2af60d5d5a613c02310600ec73c1e4d23121ae2315975f710a"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027removeItemByIndex\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1d4e042887de0aa7b7d626e0903317d6f95e35ce67358ed9783368c05c146be"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027__loadText\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"a488fa629862446cc3a4348c748ec1c15ee81b26231de637633e2bdcd7964d0d"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027formatUrl\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"556ff0fe54afb4288fbb958790fbd647c9d8e35e4f385c0be0b6f264a5204704"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/br.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"189b66a8c121f871c11f9acdd6871fc0ee4a98db4ff88f2a76874331d1c9b71c"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/de.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"26fc903443328afdd079978affb2ddb46ef98069861bd280052bbc3cbbeedd6b"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/es.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c268ce51243186db048fdcdff82a3c243753de618b0797d71b0138af5d430dc"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/fr.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68d985c1a32cfb77630692801075cc1bbb1cdf538f8ce27aadf7158266a4141a"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/id.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5d4174c9dcf37eeb2dafb6e5c1da7e64ec9ef4a920796c76f5c24c50c164828"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/it.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb060cf38ecddbf26d1a4297b527412f0810a6be735e966c0c25eb9bd07b65e6"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/jp.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3217508950a3d35eff0ce7d5689bc0f97051ba883b4ba911fdbbaec2c3359ebf"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/kr.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"34f57594366cc5517ec5bcba192e16158c5b759c1ed3d43e5951e987cc7cc910"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/ms-my.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"34ed37f42721ef312aab1d66c97abdcf01413ee6a54de7daede0357820b68538"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/ru.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af6c16c4e32570022a56253d7989ad73dc80985f45576eb81ad10835eccaafec"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/th.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9dcf2fe648850c81661437ca644dc4030277627f103ea347ec7d8cc2501ba9c"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/vn.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c66152a91fa28de0271d7fe8ca0b35238faef399a7a41300a10d6e890e57537c"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/lang/zh-hk.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a203664c9e08702d878c39f109e43be95f90a4897a3602cbdc9833451b47ea28"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/heatmap/index.js"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ac458eec979b5a6435748ded1b12e15e1ba3f15f76f1d7193f603d3ed736b0e"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/track/index.js"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"23c1691317fe9f725bb197b929a5c711d103d46c9b7c2214840bf2877e59b438"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/presets/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/presets/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/presets/default-en.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6f03d2cc7432ec8ec9a3e843f3f1dab2ad6c9b879825e896a06ccf516d79b1b"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/presets/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/presets/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/presets/live.js"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce30567c553feb10294d1b866007bc4cc83a3b313ef7967d8b1864249693fa81"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in packages/xgplayer/src/presets/index.js, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in packages/xgplayer/src/presets/index.js in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/presets/mobile.js"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3a66e6e7d333fae6123a263f76f016d438e62e59b359f751605a60dd7e04d2c"}},{"ruleId":"R7","level":"note","message":{"text":"Unused module-local declaration \u0027generateAdsResponse\u0027: This top-level declaration is not exported and its name occurs nowhere else in its module \u2014 not called, read, typed against, re-exported or named by a string. Nothing outside the module can reach a non-exported binding, so this is the whole search: remove it, or use it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"fixtures/ads/index.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d62a1c9353a5837fe14e51ae9bbadacc4d7f3c18c33a6896e5f561466ce7677"}},{"ruleId":"R7","level":"note","message":{"text":"Unused module-local declaration \u0027SubtitleItem\u0027: This top-level declaration is not exported and its name occurs nowhere else in its module \u2014 not called, read, typed against, re-exported or named by a string. Nothing outside the module can reach a non-exported binding, so this is the whole search: remove it, or use it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2e8ef21967a158c4900e5b8d66f48cb75d58c4b6b1ebcee691c06e008bb5416"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027react\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/utils/config.js"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"e597ddb662cbe3e6d78140e3eb9c10c7686cbf958325062e5e509196966287cc"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027brotli-size\u0027: Declared in the root package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c838433b6be55bf0196117f5551a02bb4973b87ccac12b1f10fbc1107d5f7a2d"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027cliui\u0027: Declared in the root package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"47753259d296ff187d0d7f30511c6f2af9836ca9a9474316f46df4da91c019b4"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027dts-bundle-generator\u0027: Declared in the root package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5ae8e17741b483cd2137ae94912c68e3233919cae898541958682b5493837834"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (3 files): packages/xgplayer-streaming-shared/src/index.js \u2192 packages/xgplayer-streaming-shared/src/services/index.js \u2192 packages/xgplayer-streaming-shared/src/services/stats.js \u2192 packages/xgplayer-streaming-shared/src/index.js"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/index.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"88cc026d55259e04c1f6b991215a2bf42a1a474082feebc52f7d8e9b488289e6"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!!mediaType \u0026\u0026 mediaType !== \u0027video\u0027 \u0026\u0026 mediaType !== \u0027audio\u0027 \u0026\u0026 mediaType !== \u0027offscreen-video\u0027\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-flv/src/plugin.js, packages/xgplayer-hls/src/plugin.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/plugin.js"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"29fc65720b5a6d1e6814f8194b541a0473614c994c14d766d6e927cca772c34c"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!Array.isArray(this._range) || this._range.length \u003C 2\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-streaming-shared/src/net/fetch.js, packages/xgplayer-streaming-shared/src/net/xhr.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/net/fetch.js"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"d38d297b39400fe91b82c90c82c24853f7f6667cda547e4134bf97dd59b694be"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!audioSamps.length \u0026\u0026 !videoSamps.length\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-transmuxer/src/flv/fixer.js, packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fc67979fb9745ca59e31b88671f0a9a58409ff27d6d5ec467a22b3c2259792d"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!mediaType || mediaType === \u0027video\u0027 || mediaType === \u0027audio\u0027\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-flv/src/flv/index.js, packages/xgplayer-hls/src/hls/index.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/index.js"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"695cc29a8b382e50e9ed46280bca312f6faf81545996faad237e458bbf0f9743"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!player.ended \u0026\u0026 Number.isFinite(player.currentTime)\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-mp3/src/plugin.ts, packages/xgplayer-mp4/src/plugin.ts. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-mp3/src/plugin.ts"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"69c6222a1cecaf466f52fab67a07f9e968d7533de9338fe4f2aff2eb7d4447c9"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!this._audioTimestampBreak \u0026\u0026 delta \u003E= AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration \u0026\u0026 delta \u003C= MAX_SILENT_FRAME_DURATION \u0026\u0026 !isSaf\u2026\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-transmuxer/src/flv/fixer.js, packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"01c6d206e80c0fac672b8d7e91873d743ec032aaef55ab3c262587aa7eefcdc3"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!this.config.list || this.config.list.length \u003C 2\u0060 appears character-identically in 2 files \u2014 packages/xgplayer/src/plugins/common/optionsIcon.js, packages/xgplayer/src/plugins/definition/index.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/common/optionsIcon.js"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"177663a7809610034d60633ff20f104454b713bbd852c504372413055d6c6c6a"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!window.cast?.framework || !window.chrome?.cast\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-cast/src/platform/chromecast-sdk.ts, packages/xgplayer-cast/src/platform/chromecast.ts. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/src/platform/chromecast-sdk.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a973a0a56024144844e1b5c57c5567b9aa0ea894152007a49182aaeeaed2e52"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060/(?:SymbianOS)/.test(ua) || isWindowsPhone\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-subtitles/src/utils.js, packages/xgplayer/src/utils/sniffer.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"86a13b0faad0ff82c4ed330b1abc3b78c372bced1974a7536e109ec7ba1c45b7"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060Number.isFinite(delta) \u0026\u0026 Math.abs(delta) \u003E LARGE_AV_FIRST_FRAME_GAP\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-transmuxer/src/flv/fixer.js, packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ed0957cd6e3ebb379f3e8d58842b06030dad1d3d0ab69d4eae76237dab5236a"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060Sniffer.os.isTizen || Sniffer.os.isWebOS\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-ads/src/baseAdManager.js, packages/xgplayer-ads/src/imaAdManager.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-ads/src/baseAdManager.js"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"24d5ccd00e838b23d8f76f405a34762473ab6b5295fd52ce9ba3d46204c213f4"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060Util.checkIsFunction(playerConfig.disableSwipeHandler) \u0026\u0026 playerConfig.disableSwipeHandler()\u0060 appears character-identically in 2 files \u2014 packages/xgplayer/src/plugins/mobile/index.js, packages/xgplayer/src/plugins/progress/index.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/mobile/index.js"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fc85efa7ad47254f65db95ccadf00619803f8c85d7a901794a0d6730221b32f"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060Util.checkIsFunction(playerConfig.enableSwipeHandler) \u0026\u0026 playerConfig.enableSwipeHandler()\u0060 appears character-identically in 2 files \u2014 packages/xgplayer/src/plugins/mobile/index.js, packages/xgplayer/src/plugins/progress/index.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/mobile/index.js"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8501da2fc363e9618b33c16673b6088d4cc227f1164011e4c20b9ca02c065d1"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060Util.typeOf(url) === \u0027Array\u0027 \u0026\u0026 url.length \u003E 0\u0060 appears character-identically in 2 files \u2014 packages/xgplayer/src/player.js, packages/xgplayer/src/plugins/download/index.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/player.js"},"region":{"startLine":630}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4ad9f4b917a860680fc544612618b6ba8013b0c16dd4fae5951178355cad04c"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060__handlers[i] \u0026\u0026 target === __handlers[i].target\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-subtitles/src/observer.js, packages/xgplayer/src/plugin/resizeObserver.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/observer.js"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"28c70e13289e4663e535c354d8752812fc280e4ff0175ac8954567e379a03ed5"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060currentTime \u003E= start \u0026\u0026 currentTime \u003C= end\u0060 appears character-identically in 2 files \u2014 packages/xgplayer/src/plugins/time/timesegments.js, packages/xgplayer/src/utils/util.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/time/timesegments.js"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"49481bae71c268db47764fc666275f736f9d6ef031a0bcceeca16e55fe2c796c"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060delta \u003C= -AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration \u0026\u0026 delta \u003E= -1 * MAX_SILENT_FRAME_DURATION\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-transmuxer/src/flv/fixer.js, packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"5047a175e457358fb5e4ac4a382275e738b09f426a42d4713783b9e0991c9c06"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060el === \u0027video\u0027 || el === \u0027audio\u0027 || el === \u0027live-video\u0027\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-subtitles/src/utils.js, packages/xgplayer/src/utils/util.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1cc06e3a828719468029bd3a8dac19e82b4f8b3109d5070cacf2345daa4fbeb"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060el.className \u0026\u0026 typeof el.className === \u0027object\u0027\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-subtitles/src/utils.js, packages/xgplayer/src/utils/util.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"7617903cba4a08c7ead7dccf86da682d4e2515412722ec2bd8654d03b064f3e8"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060orgClassName \u0026\u0026 !!orgClassName.match(new RegExp(\u0027(\\\\s|^)\u0027 \u002B className \u002B \u0027(\\\\s|$)\u0027))\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-subtitles/src/utils.js, packages/xgplayer/src/utils/util.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffeff6d868fef39d221a5790ece5f9f16ac7d2b9f887e4f8bb8725e4c6ca5f4e"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060playPromise !== undefined \u0026\u0026 playPromise \u0026\u0026 playPromise.then\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-ads/src/baseAdManager.js, packages/xgplayer/src/player.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-ads/src/baseAdManager.js"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"edd2b315d89857686f5d289efb7b8cb0a501f3a47dc14ee78aa8555feca896cc"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060player.media.paused \u0026\u0026 player.media.currentTime !== 0 \u0026\u0026 this.hasPlayed\u0060 appears character-identically in 2 files \u2014 packages/xgplayer/src/plugins/gapJump/index.js, packages/xgplayer/src/plugins/waitingTimeoutJump/index.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/gapJump/index.js"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"e07817e29543e877424cd4c9d387f18ba4185c632fc11fa4e698a03883317848"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060playerConfig \u0026\u0026 playerConfig.isMobileSimulateMode === \u0027mobile\u0027\u0060 appears character-identically in 2 files \u2014 packages/xgplayer/src/presets/default-en.js, packages/xgplayer/src/presets/default.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/presets/default-en.js"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a49d6834276d73a8d20ff22817c9a4d49d82af2b521d3b3d28005f8d3242a16"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060sampleDuration \u003E MAX_VIDEO_FRAME_DURATION || sampleDuration \u003C 0\u0060 appears character-identically in 2 files \u2014 packages/xgplayer-transmuxer/src/flv/fixer.js, packages/xgplayer-transmuxer/src/mpeg-ts/fixer.ts. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/flv/fixer.js"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec0700d202b0973b24a1ede612f8d173d16700027bf8877b7873ecfe68cdb5cc"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060this.playerConfig.customDuration || this.player.duration\u0060 appears character-identically in 2 files \u2014 packages/xgplayer/src/plugins/mobile/index.js, packages/xgplayer/src/plugins/progress/index.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/mobile/index.js"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"77644671b96e2ffac7fde16b71b61313ab8d0be9b83ec0522d13bdfaa6c70be9"}},{"ruleId":"X23","level":"note","message":{"text":"Diagnostic log message is built whether or not it is wanted: \u0060debug\u0060 at line 343 is called with an argument built by \u0060JSON.stringify(this._range)\u0060 (line 343), whose cost grows with the collection it walks. JavaScript evaluates a call\u0027s arguments BEFORE entering the method, so that join/projection runs in full every time this line is reached \u2014 and then the level check inside the logger discards the string it produced, because debug is a level a shipped configuration normally leaves off. Nothing here decides beforehand whether the message is wanted: no \u0060isLevelEnabled\u0060/\u0060isDebugEnabled\u0060 test, no debug flag, no \u0060NODE_ENV\u0060 build switch."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/net/fetch.js"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8e4ac3d6de16086361f18ba36f77d38737c7abc1ec601e39006afb604cb2391"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060lyrbicTxts.join(\u0027\u0027)\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/lyric.js"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"95f27406dbc7b04be72bf8bab1033b3655a4134511007f1d5e7381f643a78752"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060\u0060${item.title}\u0060\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/plugins/musicMeta.js"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"7757850b41d7fb2fb2ab02f1194266123134ebc7e8db6b97083430ed742c4af3"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060tpl\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"02a537e477b11c2c057a8b933b96d050724f53505fefe461374f5a833ebf0f68"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060html\u0060 is text this program did not author, and it is written into the text of an element through \u0060insertAdjacentHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugin/plugin.js"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"637a253f55b4a10efdbc19625f046c051903c9b0cd3bad630cc906559d496479"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060html\u0060 is text this program did not author, and it is written into the text of an element through \u0060insertAdjacentHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugin/plugin.js"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aefb0211b7f9ee405059b2fe55cd4873933814fe869389aac395bc96a1076a2"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060typeof langTextShow===\u0027function\u0027?langTextShow(lang):langTextShow\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugin/plugin.js"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d2de5cd8280886169a324b96edaa54bdef17d198818aaf367f9eab0b873250d"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060text\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugin/plugin.js"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"c394a680e38ad7cd1afec5e4e658e06e43b429454231ee07124399c2ef680f34"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060htmlStr\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugin/plugin.js"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"dda32db63d957f0655d87bf0fdebbb366f62a4d73d486689d8828500f2e39b4d"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060this.getTextByLang(curItem,\u0027iconText\u0027)\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/common/optionsIcon.js"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"c772f2e86dbe9b9c90b2c74b8ea6c2989d4072c695c92e66ea9d82bb06be15be"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060url\u0060 is text this program did not author, and it is written into the start of a URL attribute, where it chooses the scheme through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. HTML encoding does not help here \u2014 a \u0060javascript:\u0060 URL contains nothing it changes; allow only http(s) or a relative path."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/download/index.js"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"16f1a175d67c9af44359757590273a6b081a00475eb894f1138576010351a422"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060config.index\u0060 is text this program did not author, and it is written into a quoted attribute value through \u0060insertAdjacentHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/dynamicBg/index.js"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebf2d13f5cce8267710f359b3b08b49a708591de79068b92df3a3d2c525ba0e2"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060innerHtml\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/enter/index.js"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"aea88c2df13b8c4bad4376b3a0d332f4c73fbde43e1c62f9baa3611afdd384d4"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060errorNote\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/error/index.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e1373b34ea171baec579f1488415415dc3f25f7c4108aaa1c1e4eb0d7dc232e"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060this.i18n.REFRESH_TIPS\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/error/index.js"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"4355fb70215305df0153abe70ec7db2122f3b4f7a8ab07d49aa23cc8e97e2b55"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060Util.format(this.duration)\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/mobile/index.js"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"be4a0976b7191f9b7a60e6c563a5a07cf8d2afb142ac4b935555d75a8f3f1a4d"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060Util.format(this.duration)\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/mobile/index.js"},"region":{"startLine":670}}}],"partialFingerprints":{"codehealthFindingId/v1":"aec67ad2a3aad9372b85aaf35244cd1c2b33856c3901aed6dbd3d609d3ef4c05"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060Util.format(time)\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/mobile/index.js"},"region":{"startLine":671}}}],"partialFingerprints":{"codehealthFindingId/v1":"b80abe2e4bbc199af2ba58770d5c74bcb1db6c61589159bfd6b030e6ce78113e"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060timeStr\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/progressPreview/index.js"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"18560752b82e9ead7fa7c75cfa189350a2efbc969552c41763745e43b86d9a8a"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060timeStr\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/progressPreview/index.js"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"a016421140808e6773656aac744ec64d2068676945ea482d3118d62e29c52282"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060detail\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/prompt/index.js"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"87f41998e6318330ca7e268769b18f89ac3dc1d56d66fb8bafef633d6f27585e"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060detail.highlight\u0060 is text this program did not author, and it is written into the text of an element through markup built here with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/prompt/index.js"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c3108f4eb9336b3f9f1c26cd826d6ba61567f6f612f6176dfe733184216d547"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060Util.format(duration)\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/time/index.js"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"05387708cabf508572ec755023498383b2f639808e1e76011e982de3b6273eb6"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060Util.format(duration)\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/time/index.js"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"d94ce1f3c58f30a044caaccffc5b38834f69c0e6033501205c90bbc22eef591e"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060Util.format(0)\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/time/index.js"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c6efbb70ebfa16d58c08ec991cb128f24033b2d33777a34967eaf7956f84a94"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060Util.format(0)\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/time/index.js"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"564aaf7894ac9ef5c17b7150c734a2844a4c2099386cf53f965f03ebeed9c63f"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060this.getTextByLang(closeText,\u0027iconText\u0027)\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/track/index.js"},"region":{"startLine":440}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a6c967a4d0be2fdd98e13c205188340997169e563b999748d6f9560df38c987"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060this.getTextByLang(curItem,\u0027iconText\u0027)\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/track/index.js"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"d291c5a216c908c68b01910234221be9ddec8703249d5a82c4a0307d961f080b"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060url\u0060 is text this program did not author, and it is written into the start of a URL attribute, where it chooses the scheme through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. HTML encoding does not help here \u2014 a \u0060javascript:\u0060 URL contains nothing it changes; allow only http(s) or a relative path."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/utils/url.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"44c2b88bcd546dfc9054e2d5278aed26bfc51bc993b085629169924e858ce591"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060tpl\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/utils/util.js"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"d23e4e2ac0fcbd64bcad79beca9a43913a28031cc35c9e890e7253daf58511ec"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060html\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/utils/util.js"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"407209acea9c3bc3957fc4aca51306a017f2e32610e36c55986ee7314aef1cf7"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060dom.innerHTML\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/utils/util.js"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6f34e9bfb8a4e6369984d50e25e86873759b92c419695b01d6dedfe0befa774"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/context.js"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6b82d3f14ccdab3ab7332fc01a3f07a93071f806295fd7790d7643704f06062"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/context.js"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"7561985008225fe9e4e8a4900483cfe76023bbeece67cef4c84f81a5e0922306"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/rollup.base.js"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc6e7a9de12a3af83bd5b8fb7dcb8fae409301c0e5f0f8d2534d3a7e7a9be087"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/utils/config.js"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b4b5dc2f8fc1381598d122936390da1b589aead82e640fc0651ec3db74766be"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/utils/index.js"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5632065fa542d3565396ed25eb9853e6b2a684050c1e0d6f1699d12b9217b85"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/utils/legacy/index.js"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"db6c6f575a19a0907daf0563b38dbdec3608cce5fe6d8c5b125a8fda1aa3d811"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/hevc.ts"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d31357cb3b1fb9e4bfa6067248e7db30bc45eda64c576b41fc4339183f59f8d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/hevc.ts"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2de4e8411a1603f4780fb2f4d4e50bafef79637e4d5d209f871b26760ec15ae"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/hevc.ts"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"84f2367dcd30ae4799a768aa8825c542d24bb94ade749de14f1bb161b6e3b1ba"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-transmuxer/src/codec/vvc.js"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc558c6cec5c1a923527b6f02066880df31fe30c7c15246731c79eaffb47bf90"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/index.js"},"region":{"startLine":900}}}],"partialFingerprints":{"codehealthFindingId/v1":"335561015de9b59a9e95de3a584d44ed4402e43ecaf26283c80dadca2bd544f0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-subtitles/src/utils.js"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"67cfb9efa817c815c37ee035318b01eaa0c830ae66b526fcbf00721309af4035"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/mse.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"8de6ee92b3ee3c8270c9c5fe8e8311e83cbfaeca542841234da08161d362aa95"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/mse.ts"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"317e6e0c850cc9933bfb5f2688f3a2eaf91602ca5167e896c97c95e8d6f9e731"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/mse.ts"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c3de6cd8ade0b63737c008ac391e07544bdaac1a17b1938fc31f7c48127c3bb"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/mse.ts"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"6847c92b7701d698681056faa7c5caf05a0b89e2f01f23035f11eb94ac2ee48a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/buffer.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"76ef9b81ffe6d30bf482d1544eb6bb1f77e1a6ccf911304893dc3db62739ef07"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/logger.js"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"c22ee1361e110a72ee58b913d415013f2fdd9d386806584676934ae13e6562f5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/net/fetch.js"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fabae8829566539b50f6eb9e68537f624872c4310d4c9e108ea936023eb4c67"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/net/fetch.js"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"a822b0b4837ef29dc1544d17c25d7952938f15a53d43bdb95fa5ac106f6d3c24"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(e =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-streaming-shared/src/net/index.js"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"3415eddf111d7519738e42ca590b0a29a2088efca62ea6953ea9085a57804522"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(e =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-music/src/music.js"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"845f653523e4e84ddd2f9658deda09928e2d279e340e9734084f32860a7dc6dd"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls.js/src/index.js"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f9c5e8ac64fe29734a4727a271fdc63302a6aacc3d1d7d1ece1d9f265e2bda9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch((e) =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/plugin.js"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1d8a53967758bb793489e3701978dbd13ae1986215683d347da2a97c3916cf1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/plugin.js"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"2154031544080e25986933b0a1e9b7ee9a9337505894836dc31ce9e2d3412b87"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b3a72e39c3cf059248201279e7c8d38a348c496642abb46678be2d21db16bd3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch((_) =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":751}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3cae789e2b4ac78dc34dc06ed6a71827e30ad8039eaef70544d992514832089"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-hls/src/hls/index.js"},"region":{"startLine":1107}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc26067a13c280193d49b2e0ce5ec59bd9baaa67f99192df212e57f7e9618f34"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv.js/src/plugin.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"c624bea1fc7615f2ffee83da55a082abeb7146380851a6cf5ce0181efa86323c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv.js/src/plugin.js"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0a05271b7be75116977b183592218c380ecb8e2d3eea85eac70860fc8ff46d4"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/index.js"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"c05a9250abe5aafae07d7d9e85875ff71c0b3c1c04df9c30a427f581fe0a342b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/index.js"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"8580e205d64e50a41557adc807f5f08867430314393ddd9b821f6fb3cb5e4f1d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(e =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/index.js"},"region":{"startLine":508}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4a4eaa99eafa3b62304e45bd8f228eada249cc36f951854e2c9368487afc675"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-flv/src/flv/index.js"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"78e882d1fe20808c34174bfe060975094bc0344d754bc15d5131183c7791c73e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-dash/src/index.js"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd2c99a5c631ebae8b3ceaa5608fe191959f3d3c64182de9960bc55b29d67e3a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/src/platform/airplay.ts"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"84c2b340d4c55cceb0aa504ce343016ce300331cf8ba7f56311766b54a550847"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/src/platform/airplay.ts"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceb8fb5d8181978a532a1c0b0f659b4aafc28f0c441d8c13dca44164c3caba98"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/src/platform/airplay.ts"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec4a4b74c2d14d97f5621e1c25b3f4fa11f27b8f37b11b5e33d0c6117aba77ac"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer-cast/src/platform/airplay.ts"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"c293a3282059abdded55fa76d8e2c6d72cc624fcfa114022104c8169de32871b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/player.js"},"region":{"startLine":1544}}}],"partialFingerprints":{"codehealthFindingId/v1":"85cbdd17cfd58432257a45af0469115ccb55277b970ecbcd4ef2a9ca6e21b0bd"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/player.js"},"region":{"startLine":1554}}}],"partialFingerprints":{"codehealthFindingId/v1":"cae4e3e87522d2b0c2fae8841ac4bc9bf014d38a007de5526ec66813de8bc0e0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(e =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/track/index.js"},"region":{"startLine":369}}}],"partialFingerprints":{"codehealthFindingId/v1":"b76fd6603dcd7305b0a12dc468101423be793bcc3473c704609a6592f416a87d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(e =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/fullscreen/index.js"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"64b2e042d819e4602c95ce55ed5e29754334d4956ed71f141d345491ee119d4a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(e =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/fullscreen/index.js"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"8178c20cd5f03db24c4fbdd58a4eace5a7ec2794de24f32c38c18e642fd9d146"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(e =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/fullscreen/index.js"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d2cd710ace43cfe65ad6adc5b54f41e6a103f10c2d4d5ec897ade09a7fed2a5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/fullscreen/index.js"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecb7b68bc564dc11c4b4cbe026dc46eb25bce03388f7622ac7f14f08d76c45f5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(e =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/fullscreen/index.js"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"c67e96a7ca85eb93a0fd7f00bd76d86cdc865aade744f24cc8ac404f57d9b33e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/fullscreen/index.js"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1dc31beb5e0e852ce466b47098cb85ef40a90eb3c4c2a978d46038353288273"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugin/resizeObserver.js"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"f135d23b363dd4492e1c1a0cf88b5f8ced5009baec3973347b40447e4ca05809"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060xgIconTips\u0060 swallows every exception into \u0060return \u0027\u003Cdiv class=\u0022xg-tips hide\u0022\u003E\u003C/div\u003E\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/xgplayer/src/plugins/common/iconTools.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"d740b71586806339cf9119fa721fc555469b3ff91a0e9e1f42be0a1d84480a09"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060createContext.getAllPublicPkgs\u0060 swallows every exception into \u0060return false\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/context.js"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"238f5ea8f63836657cb9c865ff6d2b01fdca1e84ff7e7593befc4f032dba7b95"}}],"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-1333","guid":"11a336ce-63de-c45c-845e-29ca1e8df13d","name":"CWE-1333","shortDescription":{"text":"CWE-1333"},"helpUri":"https://cwe.mitre.org/data/definitions/1333.html"},{"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-319","guid":"7af97476-9f0d-4458-9163-3d2043918a1a","name":"Cleartext Transmission of Sensitive Information","shortDescription":{"text":"Cleartext Transmission of Sensitive Information"},"helpUri":"https://cwe.mitre.org/data/definitions/319.html"},{"id":"CWE-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"Missing Support for Integrity Check","shortDescription":{"text":"Missing Support for Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/353.html"},{"id":"CWE-457","guid":"b62874fe-6222-8b5b-8ade-9527ad1cbb4a","name":"CWE-457","shortDescription":{"text":"CWE-457"},"helpUri":"https://cwe.mitre.org/data/definitions/457.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-506","guid":"401d6455-56e3-0552-9a39-f77461673e3f","name":"Embedded Malicious Code","shortDescription":{"text":"Embedded Malicious Code"},"helpUri":"https://cwe.mitre.org/data/definitions/506.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Improper Neutralization of Special Elements used in a Command (\u0027Command Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in a Command (\u0027Command Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"Improper Neutralization of Special Elements used in an OS Command (\u0027OS Command Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in an OS Command (\u0027OS Command Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)","shortDescription":{"text":"Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)"},"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-829","guid":"13c33925-97fb-5a5e-b40c-56d328b8a4d7","name":"Inclusion of Functionality from Untrusted Control Sphere","shortDescription":{"text":"Inclusion of Functionality from Untrusted Control Sphere"},"helpUri":"https://cwe.mitre.org/data/definitions/829.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)"},"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":"Improper Control of Generation of Code (\u0027Code Injection\u0027)","shortDescription":{"text":"Improper Control of Generation of Code (\u0027Code Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"}]},{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61","version":"2025","organization":"OWASP Foundation","informationUri":"https://top10.owasp.org/2025/","isComprehensive":false,"shortDescription":{"text":"The OWASP Top 10:2025 web application security risks."},"taxa":[{"id":"A02:2025","guid":"668dee9e-41bc-6354-97d0-fdf8f40c50c1","name":"Security Misconfiguration","shortDescription":{"text":"Security Misconfiguration"},"helpUri":"https://top10.owasp.org/2025/A02_2025-Security_Misconfiguration/"},{"id":"A03:2025","guid":"168e227c-7735-2e57-bc6e-997affe644c5","name":"Software Supply Chain Failures","shortDescription":{"text":"Software Supply Chain Failures"},"helpUri":"https://top10.owasp.org/2025/A03_2025-Software_Supply_Chain_Failures/"},{"id":"A04:2025","guid":"6a9f5bfd-1a56-6453-beec-a7eff0ba3007","name":"Cryptographic Failures","shortDescription":{"text":"Cryptographic Failures"},"helpUri":"https://top10.owasp.org/2025/A04_2025-Cryptographic_Failures/"},{"id":"A05:2025","guid":"87e86033-3231-8458-8e4a-5cb82743553a","name":"Injection","shortDescription":{"text":"Injection"},"helpUri":"https://top10.owasp.org/2025/A05_2025-Injection/"},{"id":"A06:2025","guid":"491554d7-b8e4-9652-91a9-53700dc92ece","name":"Insecure Design","shortDescription":{"text":"Insecure Design"},"helpUri":"https://top10.owasp.org/2025/A06_2025-Insecure_Design/"},{"id":"A07:2025","guid":"334ddd78-539d-d35c-83dd-253647eb7eaf","name":"Authentication Failures","shortDescription":{"text":"Authentication Failures"},"helpUri":"https://top10.owasp.org/2025/A07_2025-Authentication_Failures/"},{"id":"A08:2025","guid":"84b0c297-710e-9a5f-9335-936ecb260c36","name":"Software or Data Integrity Failures","shortDescription":{"text":"Software or Data Integrity Failures"},"helpUri":"https://top10.owasp.org/2025/A08_2025-Software_or_Data_Integrity_Failures/"}]},{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35","organization":"OWASP Foundation","informationUri":"https://owasp.org/www-project-top-10-ci-cd-security-risks/","isComprehensive":false,"shortDescription":{"text":"The OWASP Top 10 CI/CD Security Risks."},"taxa":[{"id":"CICD-SEC-3","guid":"458c83a6-ebf7-cf55-8cc3-b4d949bbf271","name":"Dependency Chain Abuse","shortDescription":{"text":"Dependency Chain Abuse"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-03-Dependency-Chain-Abuse"},{"id":"CICD-SEC-8","guid":"b6b2dacf-a168-4957-876e-a8c73ee00eb0","name":"Ungoverned Usage of 3rd Party Services","shortDescription":{"text":"Ungoverned Usage of 3rd Party Services"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-08-Ungoverned-Usage-of-3rd-Party-Services"},{"id":"CICD-SEC-9","guid":"b3d36727-0395-5b51-94c4-5e173d62eab3","name":"Improper Artifact Integrity Validation","shortDescription":{"text":"Improper Artifact Integrity Validation"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-09-Improper-Artifact-Integrity-Validation"}]}],"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":71,"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."]}]}