TAP version 13
# Subtest: renderChannelVideosFromList decorates videos before storing
ok 1 - renderChannelVideosFromList decorates videos before storing
  ---
  duration_ms: 350.234012
  type: 'test'
  ...
# Subtest: renderChannelVideosFromList applies moderation blur without existing metadata
ok 2 - renderChannelVideosFromList applies moderation blur without existing metadata
  ---
  duration_ms: 66.626133
  type: 'test'
  ...
# Subtest: applyChannelVisualBlur blurs banner and avatar when viewer mutes author
ok 3 - applyChannelVisualBlur blurs banner and avatar when viewer mutes author
  ---
  duration_ms: 15.821532
  type: 'test'
  ...
# Subtest: moderation override clears channel blur via event wiring
ok 4 - moderation override clears channel blur via event wiring
  ---
  duration_ms: 42.715117
  type: 'test'
  ...
# Subtest: channel header moderation badge reflects blur state and override actions
ok 5 - channel header moderation badge reflects blur state and override actions
  ---
  duration_ms: 57.962342
  type: 'test'
  ...
# Subtest: channel video cards update moderation state in place when summary changes
ok 6 - channel video cards update moderation state in place when summary changes
  ---
  duration_ms: 42.929462
  type: 'test'
  ...
# Subtest: createFeedCoordinator - loadForYouVideos
    # Subtest: loadForYouVideos executes successfully
    ok 1 - loadForYouVideos executes successfully
      ---
      duration_ms: 6.198219
      type: 'test'
      ...
    1..1
ok 7 - createFeedCoordinator - loadForYouVideos
  ---
  duration_ms: 9.556235
  type: 'test'
  ...
# Subtest: handleHashChange defaults to for-you when logged in
ok 8 - handleHashChange defaults to for-you when logged in
  ---
  duration_ms: 174.48226
  type: 'test'
  ...
# Subtest: handleHashChange defaults to most-recent-videos when logged out
ok 9 - handleHashChange defaults to most-recent-videos when logged out
  ---
  duration_ms: 15.579232
  type: 'test'
  ...
# Subtest: handleHashChange respects explicit view regardless of login state
ok 10 - handleHashChange respects explicit view regardless of login state
  ---
  duration_ms: 14.143491
  type: 'test'
  ...
# Subtest: hydrateSidebarNavigation reveals chrome controls for authenticated viewers
ok 11 - hydrateSidebarNavigation reveals chrome controls for authenticated viewers
  ---
  duration_ms: 148.065341
  type: 'test'
  ...
# Subtest: hydrateSidebarNavigation hides chrome controls for logged-out viewers
ok 12 - hydrateSidebarNavigation hides chrome controls for logged-out viewers
  ---
  duration_ms: 20.369456
  type: 'test'
  ...
# Subtest: isUserLoggedIn returns false when no user pubkey is set
ok 13 - isUserLoggedIn returns false when no user pubkey is set
  ---
  duration_ms: 3.343329
  type: 'test'
  ...
# Subtest: isUserLoggedIn treats extension logins as authenticated
ok 14 - isUserLoggedIn treats extension logins as authenticated
  ---
  duration_ms: 0.664438
  type: 'test'
  ...
# Subtest: isUserLoggedIn guards against mismatched nostrClient state
ok 15 - isUserLoggedIn guards against mismatched nostrClient state
  ---
  duration_ms: 0.55453
  type: 'test'
  ...
# Subtest: isUserLoggedIn ignores anonymous session actor mismatches
ok 16 - isUserLoggedIn ignores anonymous session actor mismatches
  ---
  duration_ms: 0.524823
  type: 'test'
  ...
# Subtest: isUserLoggedIn rejects mismatched managed session actors
ok 17 - isUserLoggedIn rejects mismatched managed session actors
  ---
  duration_ms: 0.574503
  type: 'test'
  ...
# Subtest: handleModerationOverride decorates stored and current videos then refreshes UI
ok 18 - handleModerationOverride decorates stored and current videos then refreshes UI
  ---
  duration_ms: 8.622695
  type: 'test'
  ...
# Subtest: handleModerationOverride resumes deferred playback
ok 19 - handleModerationOverride resumes deferred playback
  ---
  duration_ms: 1.083871
  type: 'test'
  ...
# Subtest: handleModerationBlock requests a block, clears overrides, and refreshes hidden state
ok 20 - handleModerationBlock requests a block, clears overrides, and refreshes hidden state
  ---
  duration_ms: 3.864502
  type: 'test'
  ...
# Subtest: handleModerationBlock returns false when viewer is logged out
ok 21 - handleModerationBlock returns false when viewer is logged out
  ---
  duration_ms: 0.826885
  type: 'test'
  ...
# Subtest: handleModerationSettingsChange refreshes feeds with updated thresholds
ok 22 - handleModerationSettingsChange refreshes feeds with updated thresholds
  ---
  duration_ms: 5.867288
  type: 'test'
  ...
# Subtest: orders similar videos by shared tags then timestamp
ok 23 - orders similar videos by shared tags then timestamp
  ---
  duration_ms: 4.536119
  type: 'test'
  ...
# Subtest: returns no matches when the active video lacks tags
ok 24 - returns no matches when the active video lacks tags
  ---
  duration_ms: 0.522575
  type: 'test'
  ...
# Subtest: skips candidates without tag metadata
ok 25 - skips candidates without tag metadata
  ---
  duration_ms: 0.316687
  type: 'test'
  ...
# Subtest: filters NSFW and private videos when NSFW content is disabled
ok 26 - filters NSFW and private videos when NSFW content is disabled
  ---
  duration_ms: 0.349009
  type: 'test'
  ...
# Subtest: createNip07SigningAdapter
    # Subtest: uses explicit extension if provided
    ok 1 - uses explicit extension if provided
      ---
      duration_ms: 3.140542
      type: 'test'
      ...
    # Subtest: falls back to window.nostr if no extension provided
    ok 2 - falls back to window.nostr if no extension provided
      ---
      duration_ms: 0.564442
      type: 'test'
      ...
    # Subtest: throws error if no extension available
    ok 3 - throws error if no extension available
      ---
      duration_ms: 1.364875
      type: 'test'
      ...
    # Subtest: prioritizes explicit extension over window.nostr
    ok 4 - prioritizes explicit extension over window.nostr
      ---
      duration_ms: 0.723467
      type: 'test'
      ...
    1..4
ok 27 - createNip07SigningAdapter
  ---
  duration_ms: 7.616196
  type: 'suite'
  ...
# Subtest: NIP-04/44 Compliance: Encryption Preference
    # Subtest: createNip46Cipher prefers nip44.v2 when available
    ok 1 - createNip46Cipher prefers nip44.v2 when available
      ---
      duration_ms: 27.324436
      type: 'test'
      ...
    # Subtest: createNip46Cipher falls back to nip04 if nip44 is missing
    ok 2 - createNip46Cipher falls back to nip04 if nip44 is missing
      ---
      duration_ms: 11.491127
      type: 'test'
      ...
    1..2
ok 28 - NIP-04/44 Compliance: Encryption Preference
  ---
  duration_ms: 140.848015
  type: 'test'
  ...
# Subtest: NIP-04/44 Compliance: Decryption Fallback
    # Subtest: decryptNip46PayloadWithKeys handles nip44 (v2) payload
    ok 1 - decryptNip46PayloadWithKeys handles nip44 (v2) payload
      ---
      duration_ms: 37.149315
      type: 'test'
      ...
    # Subtest: decryptNip46PayloadWithKeys handles nip04 payload
    ok 2 - decryptNip46PayloadWithKeys handles nip04 payload
      ---
      duration_ms: 36.082477
      type: 'test'
      ...
    1..2
ok 29 - NIP-04/44 Compliance: Decryption Fallback
  ---
  duration_ms: 75.214397
  type: 'test'
  ...
# Subtest: NIP-07 Compliance: Retry Logic
    # Subtest: runNip07WithRetry succeeds on first try
    ok 1 - runNip07WithRetry succeeds on first try
      ---
      duration_ms: 2.676447
      type: 'test'
      ...
    # Subtest: runNip07WithRetry retries on timeout error
    ok 2 - runNip07WithRetry retries on timeout error
      ---
      duration_ms: 20.803478
      type: 'test'
      ...
    # Subtest: runNip07WithRetry fails after max retries or if error is not timeout
    ok 3 - runNip07WithRetry fails after max retries or if error is not timeout
      ---
      duration_ms: 1.449836
      type: 'test'
      ...
    1..3
ok 30 - NIP-07 Compliance: Retry Logic
  ---
  duration_ms: 26.703793
  type: 'test'
  ...
# Subtest: NIP-65 Compliance: Relay List Loading
    # Subtest: loadRelayList requests Kind 10002
    ok 1 - loadRelayList requests Kind 10002
      ---
      duration_ms: 8.321214
      type: 'test'
      ...
    # Subtest: loadRelayList parses r tags correctly
    ok 2 - loadRelayList parses r tags correctly
      ---
      duration_ms: 0.398801
      type: 'test'
      ...
    1..2
ok 31 - NIP-65 Compliance: Relay List Loading
  ---
  duration_ms: 190.253713
  type: 'test'
  ...
# Subtest: Video Note Compliance (Kind 30078 & NIP-71)
    # Subtest: prepareVideoPublishPayload creates Kind 30078 event
    ok 1 - prepareVideoPublishPayload creates Kind 30078 event
      ---
      duration_ms: 3.753698
      type: 'test'
      ...
    # Subtest: prepareVideoPublishPayload includes NIP-71 tags when provided
    ok 2 - prepareVideoPublishPayload includes NIP-71 tags when provided
      ---
      duration_ms: 1.391866
      type: 'test'
      ...
    1..2
ok 32 - Video Note Compliance (Kind 30078 & NIP-71)
  ---
  duration_ms: 61.242396
  type: 'test'
  ...
# Subtest: js/designSystem/dynamicStyles.js
    # Subtest: registerScope
        # Subtest: should register a scope and return a string ID
        ok 1 - should register a scope and return a string ID
          ---
          duration_ms: 131.748474
          type: 'test'
          ...
        # Subtest: should create a style element or use adoptedStyleSheets
        ok 2 - should create a style element or use adoptedStyleSheets
          ---
          duration_ms: 15.115636
          type: 'test'
          ...
        # Subtest: should insert rules with the correct selector
        ok 3 - should insert rules with the correct selector
          ---
          duration_ms: 10.235861
          type: 'test'
          ...
        # Subtest: should handle "&" in selectors
        ok 4 - should handle "&" in selectors
          ---
          duration_ms: 9.943656
          type: 'test'
          ...
        1..4
    ok 1 - registerScope
      ---
      duration_ms: 168.634587
      type: 'suite'
      ...
    # Subtest: setVariables
        # Subtest: should update CSS variables on the scope
        ok 1 - should update CSS variables on the scope
          ---
          duration_ms: 11.475109
          type: 'test'
          ...
        # Subtest: should handle removing variables
        ok 2 - should handle removing variables
          ---
          duration_ms: 11.315537
          type: 'test'
          ...
        1..2
    ok 2 - setVariables
      ---
      duration_ms: 23.07625
      type: 'suite'
      ...
    # Subtest: releaseScope
        # Subtest: should remove rules and clean up
        ok 1 - should remove rules and clean up
          ---
          duration_ms: 9.755405
          type: 'test'
          ...
        # Subtest: should return false for non-existent scope
        ok 2 - should return false for non-existent scope
          ---
          duration_ms: 17.440161
          type: 'test'
          ...
        1..2
    ok 3 - releaseScope
      ---
      duration_ms: 27.445186
      type: 'suite'
      ...
    # Subtest: Isolation
        # Subtest: should manage scopes independently for different documents
        ok 1 - should manage scopes independently for different documents
          ---
          duration_ms: 17.387793
          type: 'test'
          ...
        1..1
    ok 4 - Isolation
      ---
      duration_ms: 17.533373
      type: 'suite'
      ...
    # Subtest: Edge cases
        # Subtest: should handle invalid selectors gracefully
        ok 1 - should handle invalid selectors gracefully
          ---
          duration_ms: 9.190086
          type: 'test'
          ...
        # Subtest: should handle missing document gracefully
        ok 2 - should handle missing document gracefully
          ---
          duration_ms: 6.725556
          type: 'test'
          ...
        # Subtest: should fallback to <style> element if CSSStyleSheet is missing
        ok 3 - should fallback to <style> element if CSSStyleSheet is missing
          ---
          duration_ms: 15.921252
          type: 'test'
          ...
        1..3
    ok 5 - Edge cases
      ---
      duration_ms: 32.244697
      type: 'suite'
      ...
    1..5
ok 33 - js/designSystem/dynamicStyles.js
  ---
  duration_ms: 270.086546
  type: 'suite'
  ...
# Subtest: Documentation Accuracy Verification
    # Subtest: setup
    ok 1 - setup
      ---
      duration_ms: 12.772524
      type: 'test'
      ...
    # Subtest: should list accepted video file extensions in docs matching the HTML accept attribute
    ok 2 - should list accepted video file extensions in docs matching the HTML accept attribute
      ---
      duration_ms: 1.091974
      type: 'test'
      ...
    # Subtest: should state Title is required in docs and be required in HTML
    ok 3 - should state Title is required in docs and be required in HTML
      ---
      duration_ms: 0.773875
      type: 'test'
      ...
    # Subtest: should mention 2GB limit recommendation in docs and HTML
    ok 4 - should mention 2GB limit recommendation in docs and HTML
      ---
      duration_ms: 0.672497
      type: 'test'
      ...
    1..4
ok 34 - Documentation Accuracy Verification
  ---
  duration_ms: 17.839501
  type: 'suite'
  ...
# Subtest: explore diversity sorter increases tag diversity in the top results
ok 35 - explore diversity sorter increases tag diversity in the top results
  ---
  duration_ms: 3.362298
  type: 'test'
  ...
# Subtest: explore diversity sorter logs why when MMR re-orders similar candidates
ok 36 - explore diversity sorter logs why when MMR re-orders similar candidates
  ---
  duration_ms: 0.764452
  type: 'test'
  ...
# Subtest: explore disinterest filter drops videos with disinterested tags
ok 37 - explore disinterest filter drops videos with disinterested tags
  ---
  duration_ms: 2.597539
  type: 'test'
  ...
# Subtest: explore scorer penalizes disinterest overlap and logs why metadata
ok 38 - explore scorer penalizes disinterest overlap and logs why metadata
  ---
  duration_ms: 2.674225
  type: 'test'
  ...
# Subtest: explore scorer rewards novelty and new tag fraction
ok 39 - explore scorer rewards novelty and new tag fraction
  ---
  duration_ms: 2.991503
  type: 'test'
  ...
# Subtest: kids scorer correctly identifies dominant positive component
ok 40 - kids scorer correctly identifies dominant positive component
  ---
  duration_ms: 3.466556
  type: 'test'
  ...
# Subtest: kids scorer picks educational-boost when dominant
ok 41 - kids scorer picks educational-boost when dominant
  ---
  duration_ms: 0.472791
  type: 'test'
  ...
# Subtest: tag preference stage filters by interests and excludes disinterests
ok 42 - tag preference stage filters by interests and excludes disinterests
  ---
  duration_ms: 3.818065
  type: 'test'
  ...
# Subtest: tag preference stage accepts interests from nip71 hashtags
ok 43 - tag preference stage accepts interests from nip71 hashtags
  ---
  duration_ms: 0.452979
  type: 'test'
  ...
# Subtest: moderation stage hides videos muted by trusted when threshold met
ok 44 - moderation stage hides videos muted by trusted when threshold met
  ---
  duration_ms: 7.801329
  type: 'test'
  ...
# Subtest: moderation stage hides videos when trusted reports exceed threshold
ok 45 - moderation stage hides videos when trusted reports exceed threshold
  ---
  duration_ms: 1.480288
  type: 'test'
  ...
# Subtest: moderation stage respects runtime hide threshold changes
ok 46 - moderation stage respects runtime hide threshold changes
  ---
  duration_ms: 0.96984
  type: 'test'
  ...
# Subtest: moderation stage supports trusted mute hide resolver functions
ok 47 - moderation stage supports trusted mute hide resolver functions
  ---
  duration_ms: 1.067954
  type: 'test'
  ...
# Subtest: moderation stage bypasses hard hides on home feed
ok 48 - moderation stage bypasses hard hides on home feed
  ---
  duration_ms: 0.735331
  type: 'test'
  ...
# Subtest: moderation stage hides admin-whitelisted videos once thresholds fire
ok 49 - moderation stage hides admin-whitelisted videos once thresholds fire
  ---
  duration_ms: 0.940316
  type: 'test'
  ...
# Subtest: submitReport emits NIP-56 compliant report tags
ok 50 - submitReport emits NIP-56 compliant report tags
  ---
  duration_ms: 17.293353
  type: 'test'
  ...
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# Subtest: default trust seeds derive from config
ok 51 - default trust seeds derive from config
  ---
  duration_ms: 2.79005
  type: 'test'
  ...
# Subtest: trusted seeds contribute to trusted mute counts
ok 52 - trusted seeds contribute to trusted mute counts
  ---
  duration_ms: 5.113434
  type: 'test'
  ...
# Subtest: trusted seeds contribute to trusted report counts
ok 53 - trusted seeds contribute to trusted report counts
  ---
  duration_ms: 4.381148
  type: 'test'
  ...
# Subtest: trusted seed updates recompute guest report summaries
ok 54 - trusted seed updates recompute guest report summaries
  ---
  duration_ms: 0.933734
  type: 'test'
  ...
# Subtest: moderator seeds populate trusted contacts
ok 55 - moderator seeds populate trusted contacts
  ---
  duration_ms: 0.584752
  type: 'test'
  ...
# Subtest: bootstrap seeds track editor roster and ignore whitelist-only changes
ok 56 - bootstrap seeds track editor roster and ignore whitelist-only changes
  ---
  duration_ms: 96.57167
  type: 'test'
  ...
# Subtest: trusted mute lists from seeds hide authors for anonymous viewers
ok 57 - trusted mute lists from seeds hide authors for anonymous viewers
  ---
  duration_ms: 16.339884
  type: 'test'
  ...
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# [bitvid] [moderationService] moderation threshold crossed
# Subtest: trustedReportCount dedupes multiple reports from the same trusted reporter
ok 58 - trustedReportCount dedupes multiple reports from the same trusted reporter
  ---
  duration_ms: 7.764584
  type: 'test'
  ...
# Subtest: trustedReportCount ignores reports from muted or blocked reporters
ok 59 - trustedReportCount ignores reports from muted or blocked reporters
  ---
  duration_ms: 2.76825
  type: 'test'
  ...
# Subtest: blocking and unblocking reporters recomputes trusted summaries
ok 60 - blocking and unblocking reporters recomputes trusted summaries
  ---
  duration_ms: 2.346941
  type: 'test'
  ...
# Subtest: trustedReportCount only counts eligible F1 reporters and admin whitelist
ok 61 - trustedReportCount only counts eligible F1 reporters and admin whitelist
  ---
  duration_ms: 3.776732
  type: 'test'
  ...
# Subtest: VideoCard renders moderation badges and respects viewer override
ok 62 - VideoCard renders moderation badges and respects viewer override
  ---
  duration_ms: 192.749391
  type: 'test'
  ...
# Subtest: VideoCard hides content when hide metadata is present and override unmasks it
ok 63 - VideoCard hides content when hide metadata is present and override unmasks it
  ---
  duration_ms: 46.727997
  type: 'test'
  ...
# Subtest: VideoCard blurs viewer-muted creators
ok 64 - VideoCard blurs viewer-muted creators
  ---
  duration_ms: 24.478558
  type: 'test'
  ...
# Subtest: VideoCard blurs thumbnails when trusted mute triggers without reports
ok 65 - VideoCard blurs thumbnails when trusted mute triggers without reports
  ---
  duration_ms: 31.471526
  type: 'test'
  ...
# Subtest: VideoCard block action restores trusted mute hide state after override
ok 66 - VideoCard block action restores trusted mute hide state after override
  ---
  duration_ms: 58.587334
  type: 'test'
  ...
# Subtest: applyModerationContextDatasets clears blur when overrides are active
ok 67 - applyModerationContextDatasets clears blur when overrides are active
  ---
  duration_ms: 9.42498
  type: 'test'
  ...
# Subtest: buildModerationBadgeText returns trusted contact block copy when autoplay block and trusted mute combine
ok 68 - buildModerationBadgeText returns trusted contact block copy when autoplay block and trusted mute combine
  ---
  duration_ms: 0.280525
  type: 'test'
  ...
# Subtest: createNsecAdapter wires signing and cipher capabilities
ok 69 - createNsecAdapter wires signing and cipher capabilities
  ---
  duration_ms: 86.087128
  type: 'test'
  ...
# Subtest: createNip07Adapter maps extension methods and permissions
ok 70 - createNip07Adapter maps extension methods and permissions
  ---
  duration_ms: 4.209776
  type: 'test'
  ...
# Subtest: createNip46Adapter wraps the remote signer client
ok 71 - createNip46Adapter wraps the remote signer client
  ---
  duration_ms: 0.92875
  type: 'test'
  ...
# Subtest: CACHE_POLICIES structure
ok 72 - CACHE_POLICIES structure
  ---
  duration_ms: 1.484052
  type: 'test'
  ...
# Subtest: VIDEO_POST policy
ok 73 - VIDEO_POST policy
  ---
  duration_ms: 0.265666
  type: 'test'
  ...
# Subtest: WATCH_HISTORY policy
ok 74 - WATCH_HISTORY policy
  ---
  duration_ms: 0.192528
  type: 'test'
  ...
# Subtest: SUBSCRIPTION_LIST policy
ok 75 - SUBSCRIPTION_LIST policy
  ---
  duration_ms: 0.153447
  type: 'test'
  ...
# Subtest: VIDEO_COMMENT policy
ok 76 - VIDEO_COMMENT policy
  ---
  duration_ms: 0.190803
  type: 'test'
  ...
# Subtest: NostrClient
    # Subtest: Initialization
        # Subtest: should initialize with default state
        ok 1 - should initialize with default state
          ---
          duration_ms: 4.614041
          type: 'test'
          ...
        1..1
    ok 1 - Initialization
      ---
      duration_ms: 5.844868
      type: 'suite'
      ...
    # Subtest: fetchListIncrementally
        # Subtest: should fetch events and deduplicate results
        ok 1 - should fetch events and deduplicate results
          ---
          duration_ms: 3.512117
          type: 'test'
          ...
        # Subtest: should handle incremental updates using lastSeen
        ok 2 - should handle incremental updates using lastSeen
          ---
          duration_ms: 1.114028
          type: 'test'
          ...
        # Subtest: should override lastSeen with explicit since parameter
        ok 3 - should override lastSeen with explicit since parameter
          ---
          duration_ms: 0.907234
          type: 'test'
          ...
        # Subtest: should force full fetch if since is 0
        ok 4 - should force full fetch if since is 0
          ---
          duration_ms: 0.835186
          type: 'test'
          ...
        1..4
    ok 2 - fetchListIncrementally
      ---
      duration_ms: 6.744869
      type: 'suite'
      ...
    # Subtest: subscribeVideos
        # Subtest: should subscribe to video events and buffer them
        ok 1 - should subscribe to video events and buffer them
          ---
          duration_ms: 302.184095
          type: 'test'
          ...
        1..1
    ok 3 - subscribeVideos
      ---
      duration_ms: 302.524897
      type: 'suite'
      ...
    # Subtest: fetchVideos
        # Subtest: should delegate to subscribeVideos and return result on eose
        ok 1 - should delegate to subscribeVideos and return result on eose
          ---
          duration_ms: 3.101449
          type: 'test'
          ...
        # Subtest: should respect since parameter if provided
        ok 2 - should respect since parameter if provided
          ---
          duration_ms: 1.840883
          type: 'test'
          ...
        1..2
    ok 4 - fetchVideos
      ---
      duration_ms: 5.31861
      type: 'suite'
      ...
    # Subtest: publishVideo
        # Subtest: should throw if not logged in
        ok 1 - should throw if not logged in
          ---
          duration_ms: 2.248637
          type: 'test'
          ...
        # Subtest: should sign and publish a valid video
        ok 2 - should sign and publish a valid video
          ---
          duration_ms: 4.445981
          type: 'test'
          ...
        1..2
    ok 5 - publishVideo
      ---
      duration_ms: 6.910231
      type: 'suite'
      ...
    # Subtest: editVideo
        # Subtest: should throw if not owner
        ok 1 - should throw if not owner
          ---
          duration_ms: 0.967964
          type: 'test'
          ...
        1..1
    ok 6 - editVideo
      ---
      duration_ms: 1.126447
      type: 'suite'
      ...
    # Subtest: revertVideo
        # Subtest: should publish a deletion marker event
        ok 1 - should publish a deletion marker event
          ---
          duration_ms: 0.562943
          type: 'test'
          ...
        1..1
    ok 7 - revertVideo
      ---
      duration_ms: 0.700815
      type: 'suite'
      ...
    1..7
ok 77 - NostrClient
  ---
  duration_ms: 330.52548
  type: 'suite'
  ...
# Subtest: publishComment prefers active signer when available
ok 78 - publishComment prefers active signer when available
  ---
  duration_ms: 11.213503
  type: 'test'
  ...
# Subtest: publishComment rejects when active signer is unavailable
ok 79 - publishComment rejects when active signer is unavailable
  ---
  duration_ms: 0.451102
  type: 'test'
  ...
# Subtest: publishComment accepts legacy targets with only an event id
ok 80 - publishComment accepts legacy targets with only an event id
  ---
  duration_ms: 1.282159
  type: 'test'
  ...
# Subtest: publishComment derives root and parent metadata from parent comment tags
ok 81 - publishComment derives root and parent metadata from parent comment tags
  ---
  duration_ms: 1.55076
  type: 'test'
  ...
# Subtest: listVideoComments matches comments even when tag casing and whitespace differ
ok 82 - listVideoComments matches comments even when tag casing and whitespace differ
  ---
  duration_ms: 2.515411
  type: 'test'
  ...
# Subtest: listVideoComments matches uppercase definition addresses without lowering
ok 83 - listVideoComments matches uppercase definition addresses without lowering
  ---
  duration_ms: 0.958282
  type: 'test'
  ...
# Subtest: publishComment emits only uppercase video event pointer when address and parent are absent
ok 84 - publishComment emits only uppercase video event pointer when address and parent are absent
  ---
  duration_ms: 0.900529
  type: 'test'
  ...
# Subtest: listVideoComments builds filters with uppercase roots plus legacy fallbacks
ok 85 - listVideoComments builds filters with uppercase roots plus legacy fallbacks
  ---
  duration_ms: 1.254319
  type: 'test'
  ...
# Subtest: listVideoComments emits uppercase root filters when only the identifier is known
ok 86 - listVideoComments emits uppercase root filters when only the identifier is known
  ---
  duration_ms: 1.163976
  type: 'test'
  ...
# Subtest: listVideoComments supports legacy targets without a definition address
ok 87 - listVideoComments supports legacy targets without a definition address
  ---
  duration_ms: 0.875511
  type: 'test'
  ...
# Subtest: subscribeVideoComments forwards matching events and cleans up unsubscribe
ok 88 - subscribeVideoComments forwards matching events and cleans up unsubscribe
  ---
  duration_ms: 17.007274
  type: 'test'
  ...
# Subtest: subscribeVideoComments supports video targets without a definition address
ok 89 - subscribeVideoComments supports video targets without a definition address
  ---
  duration_ms: 1.176938
  type: 'test'
  ...
# Subtest: countDiagnostics
    # Subtest: isVerboseDiagnosticsEnabled
        # Subtest: should return true by default (due to override)
        ok 1 - should return true by default (due to override)
          ---
          duration_ms: 1.441141
          type: 'test'
          ...
        # Subtest: should return false if window.__BITVID_VERBOSE_DEV_MODE__ is false
        ok 2 - should return false if window.__BITVID_VERBOSE_DEV_MODE__ is false
          ---
          duration_ms: 0.430057
          type: 'test'
          ...
        # Subtest: should return true if window.__BITVID_VERBOSE_DEV_MODE__ is true
        ok 3 - should return true if window.__BITVID_VERBOSE_DEV_MODE__ is true
          ---
          duration_ms: 0.383313
          type: 'test'
          ...
        # Subtest: should fall back to isVerboseDevMode if window flag is not boolean
        ok 4 - should fall back to isVerboseDevMode if window flag is not boolean
          ---
          duration_ms: 0.391295
          type: 'test'
          ...
        1..4
    ok 1 - isVerboseDiagnosticsEnabled
      ---
      duration_ms: 3.635459
      type: 'suite'
      ...
    # Subtest: logRelayCountFailure
        # Subtest: should log warning for new relay URL
        ok 1 - should log warning for new relay URL
          ---
          duration_ms: 1.314325
          type: 'test'
          ...
        # Subtest: should suppress 'Failed to connect to relay' errors
        ok 2 - should suppress 'Failed to connect to relay' errors
          ---
          duration_ms: 0.417167
          type: 'test'
          ...
        # Subtest: should throttle duplicate warnings for the same relay
        ok 3 - should throttle duplicate warnings for the same relay
          ---
          duration_ms: 0.3739
          type: 'test'
          ...
        # Subtest: should handle empty or non-string relay URLs
        ok 4 - should handle empty or non-string relay URLs
          ---
          duration_ms: 0.413074
          type: 'test'
          ...
        1..4
    ok 2 - logRelayCountFailure
      ---
      duration_ms: 2.909318
      type: 'suite'
      ...
    # Subtest: Other Loggers
        # Subtest: should log timeout cleanup failure once
        ok 1 - should log timeout cleanup failure once
          ---
          duration_ms: 0.489504
          type: 'test'
          ...
        # Subtest: should log rebroadcast failure once
        ok 2 - should log rebroadcast failure once
          ---
          duration_ms: 0.365244
          type: 'test'
          ...
        # Subtest: should log view count failure once
        ok 3 - should log view count failure once
          ---
          duration_ms: 0.340934
          type: 'test'
          ...
        1..3
    ok 3 - Other Loggers
      ---
      duration_ms: 1.5313
      type: 'suite'
      ...
    # Subtest: Verbose Mode Disabled
        # Subtest: should not log even for new keys when disabled
        ok 1 - should not log even for new keys when disabled
          ---
          duration_ms: 0.522676
          type: 'test'
          ...
        # Subtest: should not consume throttle key when disabled
        ok 2 - should not consume throttle key when disabled
          ---
          duration_ms: 0.624818
          type: 'test'
          ...
        1..2
    ok 4 - Verbose Mode Disabled
      ---
      duration_ms: 1.377499
      type: 'suite'
      ...
    1..4
ok 90 - countDiagnostics
  ---
  duration_ms: 15.479821
  type: 'suite'
  ...
# Subtest: decryptionSchemeCache
    # Subtest: stores and retrieves a scheme
    ok 1 - stores and retrieves a scheme
      ---
      duration_ms: 1.876372
      type: 'test'
      ...
    # Subtest: returns null for unknown pubkey
    ok 2 - returns null for unknown pubkey
      ---
      duration_ms: 0.546173
      type: 'test'
      ...
    # Subtest: handles invalid inputs gracefully
    ok 3 - handles invalid inputs gracefully
      ---
      duration_ms: 0.337273
      type: 'test'
      ...
    # Subtest: expires entries after TTL (2 hours)
    ok 4 - expires entries after TTL (2 hours)
      ---
      duration_ms: 0.391443
      type: 'test'
      ...
    # Subtest: does not expire entries before TTL
    ok 5 - does not expire entries before TTL
      ---
      duration_ms: 0.427737
      type: 'test'
      ...
    # Subtest: clears cache
    ok 6 - clears cache
      ---
      duration_ms: 0.349006
      type: 'test'
      ...
    1..6
ok 91 - decryptionSchemeCache
  ---
  duration_ms: 5.836831
  type: 'suite'
  ...
# Subtest: Default NostrClient
    # Subtest: should be an instance of NostrClient
    ok 1 - should be an instance of NostrClient
      ---
      duration_ms: 1.413076
      type: 'test'
      ...
    # Subtest: should be configured with default relays
    ok 2 - should be configured with default relays
      ---
      duration_ms: 1.519522
      type: 'test'
      ...
    # Subtest: should be initialized with default read relays
    ok 3 - should be initialized with default read relays
      ---
      duration_ms: 0.235099
      type: 'test'
      ...
    # Subtest: should be initialized with default write relays
    ok 4 - should be initialized with default write relays
      ---
      duration_ms: 0.257783
      type: 'test'
      ...
    # Subtest: should be registered as the default client
    ok 5 - should be registered as the default client
      ---
      duration_ms: 0.230238
      type: 'test'
      ...
    1..5
ok 92 - Default NostrClient
  ---
  duration_ms: 5.809477
  type: 'suite'
  ...
# Subtest: DM relay duplication is deduped
ok 93 - DM relay duplication is deduped
  ---
  duration_ms: 199.637634
  type: 'test'
  ...
# Subtest: out-of-order DM delivery keeps newest messages first
ok 94 - out-of-order DM delivery keeps newest messages first
  ---
  duration_ms: 98.663738
  type: 'test'
  ...
# Subtest: DM reconnect replays do not duplicate messages or reset seen state
ok 95 - DM reconnect replays do not duplicate messages or reset seen state
  ---
  duration_ms: 178.695583
  type: 'test'
  ...
# Subtest: dmDecryptDiagnostics
    # Subtest: summarizeDmEventForLog
        # Subtest: should return a default object when event is null or undefined
        ok 1 - should return a default object when event is null or undefined
          ---
          duration_ms: 2.781965
          type: 'test'
          ...
        # Subtest: should return a default object when event is not an object
        ok 2 - should return a default object when event is not an object
          ---
          duration_ms: 0.32127
          type: 'test'
          ...
        # Subtest: should summarize a valid event correctly
        ok 3 - should summarize a valid event correctly
          ---
          duration_ms: 0.249759
          type: 'test'
          ...
        # Subtest: should handle non-finite created_at
        ok 4 - should handle non-finite created_at
          ---
          duration_ms: 0.396533
          type: 'test'
          ...
        # Subtest: should handle non-finite kind
        ok 5 - should handle non-finite kind
          ---
          duration_ms: 0.3024
          type: 'test'
          ...
        # Subtest: should handle missing or invalid content
        ok 6 - should handle missing or invalid content
          ---
          duration_ms: 0.219634
          type: 'test'
          ...
        # Subtest: should handle missing or invalid tags
        ok 7 - should handle missing or invalid tags
          ---
          duration_ms: 0.270644
          type: 'test'
          ...
        1..7
    ok 1 - summarizeDmEventForLog
      ---
      duration_ms: 6.367935
      type: 'suite'
      ...
    # Subtest: sanitizeDecryptError
        # Subtest: should return null when error is null or undefined
        ok 1 - should return null when error is null or undefined
          ---
          duration_ms: 0.352635
          type: 'test'
          ...
        # Subtest: should handle string errors
        ok 2 - should handle string errors
          ---
          duration_ms: 0.263077
          type: 'test'
          ...
        # Subtest: should handle Error objects with standard properties
        ok 3 - should handle Error objects with standard properties
          ---
          duration_ms: 0.210601
          type: 'test'
          ...
        # Subtest: should handle Error objects with missing properties
        ok 4 - should handle Error objects with missing properties
          ---
          duration_ms: 0.168198
          type: 'test'
          ...
        # Subtest: should handle Error objects with non-string properties
        ok 5 - should handle Error objects with non-string properties
          ---
          duration_ms: 0.182361
          type: 'test'
          ...
        1..5
    ok 2 - sanitizeDecryptError
      ---
      duration_ms: 1.514233
      type: 'suite'
      ...
    1..2
ok 96 - dmDecryptDiagnostics
  ---
  duration_ms: 8.860031
  type: 'suite'
  ...
# Subtest: dmDecryptWorkerClient
    # Subtest: should support worker environment
    ok 1 - should support worker environment
      ---
      duration_ms: 5.778351
      type: 'test'
      ...
    # Subtest: should reject if Worker is unavailable
    ok 2 - should reject if Worker is unavailable
      ---
      duration_ms: 3.003716
      type: 'test'
      ...
    # Subtest: should reject if inputs are invalid
    ok 3 - should reject if inputs are invalid
      ---
      duration_ms: 2.593276
      type: 'test'
      ...
    # Subtest: should successfully decrypt message
    ok 4 - should successfully decrypt message
      ---
      duration_ms: 10.402692
      type: 'test'
      ...
    # Subtest: should handle worker error response
    ok 5 - should handle worker error response
      ---
      duration_ms: 5.853558
      type: 'test'
      ...
    # Subtest: should handle worker error event
    ok 6 - should handle worker error event
      ---
      duration_ms: 3.053887
      type: 'test'
      ...
    # Subtest: should timeout if worker does not respond
    ok 7 - should timeout if worker does not respond
      ---
      duration_ms: 102.566885
      type: 'test'
      ...
    # Subtest: should initialize worker lazily and reuse instance
    ok 8 - should initialize worker lazily and reuse instance
      ---
      duration_ms: 3.956024
      type: 'test'
      ...
    # Subtest: should recreate worker if creation fails
    ok 9 - should recreate worker if creation fails
      ---
      duration_ms: 2.036635
      type: 'test'
      ...
    1..9
ok 97 - dmDecryptWorkerClient
  ---
  duration_ms: 142.459456
  type: 'suite'
  ...
# Subtest: decryptDM prefers nip44 decryptors when available
ok 98 - decryptDM prefers nip44 decryptors when available
  ---
  duration_ms: 3.657474
  type: 'test'
  ...
# Subtest: decryptDM falls back to nip04 when nip44 fails
ok 99 - decryptDM falls back to nip04 when nip44 fails
  ---
  duration_ms: 0.51062
  type: 'test'
  ...
# Subtest: dmSignalEvents
    # Subtest: publishDmReadReceipt should succeed
    ok 1 - publishDmReadReceipt should succeed
      ---
      duration_ms: 8.948256
      type: 'test'
      ...
    # Subtest: publishDmReadReceipt should fail if session actor
    ok 2 - publishDmReadReceipt should fail if session actor
      ---
      duration_ms: 0.839264
      type: 'test'
      ...
    # Subtest: publishDmTypingIndicator should succeed
    ok 3 - publishDmTypingIndicator should succeed
      ---
      duration_ms: 6.561344
      type: 'test'
      ...
    # Subtest: should fail if no signer
    ok 4 - should fail if no signer
      ---
      duration_ms: 0.736624
      type: 'test'
      ...
    1..4
ok 100 - dmSignalEvents
  ---
  duration_ms: 158.357819
  type: 'suite'
  ...
# Subtest: editVideo preserves existing d tag
ok 101 - editVideo preserves existing d tag
  ---
  duration_ms: 15.496943
  type: 'test'
  ...
# Subtest: editVideo falls back to base event id when d tag missing
ok 102 - editVideo falls back to base event id when d tag missing
  ---
  duration_ms: 2.518977
  type: 'test'
  ...
# Subtest: EventsCacheStore
    # Subtest: persistSnapshot should store events and tombstones
    ok 1 - persistSnapshot should store events and tombstones
      ---
      duration_ms: 19.874687
      type: 'test'
      ...
    # Subtest: persistSnapshot should only update changed items
    ok 2 - persistSnapshot should only update changed items
      ---
      duration_ms: 2.89139
      type: 'test'
      ...
    # Subtest: persistSnapshot should delete removed items
    ok 3 - persistSnapshot should delete removed items
      ---
      duration_ms: 3.127929
      type: 'test'
      ...
    # Subtest: persistSnapshot should respect dirty keys optimization
    ok 4 - persistSnapshot should respect dirty keys optimization
      ---
      duration_ms: 2.803893
      type: 'test'
      ...
    1..4
ok 103 - EventsCacheStore
  ---
  duration_ms: 30.80497
  type: 'suite'
  ...
# Subtest: EventsMap functionality
    # Subtest: indexes events by author on set
    ok 1 - indexes events by author on set
      ---
      duration_ms: 1.434111
      type: 'test'
      ...
    # Subtest: updates index on delete
    ok 2 - updates index on delete
      ---
      duration_ms: 0.373624
      type: 'test'
      ...
    # Subtest: updates index on overwrite with different object
    ok 3 - updates index on overwrite with different object
      ---
      duration_ms: 0.294959
      type: 'test'
      ...
    # Subtest: clears index on clear
    ok 4 - clears index on clear
      ---
      duration_ms: 0.205109
      type: 'test'
      ...
    # Subtest: normalizes pubkeys
    ok 5 - normalizes pubkeys
      ---
      duration_ms: 0.252324
      type: 'test'
      ...
    # Subtest: handles non-event objects gracefully
    ok 6 - handles non-event objects gracefully
      ---
      duration_ms: 0.192874
      type: 'test'
      ...
    1..6
ok 104 - EventsMap functionality
  ---
  duration_ms: 4.9626
  type: 'test'
  ...
# Subtest: nostr login + remote signing + publish + watch history integration
ok 105 - nostr login + remote signing + publish + watch history integration
  ---
  duration_ms: 185.509108
  type: 'test'
  ...
# Subtest: maxListenerDiagnostics
    # Subtest: collectCandidateStrings
        # Subtest: should return empty array for null/undefined/falsy
        ok 1 - should return empty array for null/undefined/falsy
          ---
          duration_ms: 2.696082
          type: 'test'
          ...
        # Subtest: should return array with string for string input
        ok 2 - should return array with string for string input
          ---
          duration_ms: 0.574345
          type: 'test'
          ...
        # Subtest: should extract relevant fields from object
        ok 3 - should extract relevant fields from object
          ---
          duration_ms: 0.577329
          type: 'test'
          ...
        # Subtest: should ignore non-string fields in object
        ok 4 - should ignore non-string fields in object
          ---
          duration_ms: 0.41315
          type: 'test'
          ...
        1..4
    ok 1 - collectCandidateStrings
      ---
      duration_ms: 5.416133
      type: 'suite'
      ...
    # Subtest: shouldSuppressWarning
        # Subtest: should NOT suppress anything if verbose mode is enabled
        ok 1 - should NOT suppress anything if verbose mode is enabled
          ---
          duration_ms: 0.736272
          type: 'test'
          ...
        # Subtest: should suppress warning by code string
        ok 2 - should suppress warning by code string
          ---
          duration_ms: 0.312962
          type: 'test'
          ...
        # Subtest: should suppress warning by object code property
        ok 3 - should suppress warning by object code property
          ---
          duration_ms: 0.52129
          type: 'test'
          ...
        # Subtest: should suppress warning by message snippet
        ok 4 - should suppress warning by message snippet
          ---
          duration_ms: 0.307734
          type: 'test'
          ...
        # Subtest: should suppress warning by object message property snippet
        ok 5 - should suppress warning by object message property snippet
          ---
          duration_ms: 0.354132
          type: 'test'
          ...
        # Subtest: should NOT suppress unrelated warnings
        ok 6 - should NOT suppress unrelated warnings
          ---
          duration_ms: 0.38258
          type: 'test'
          ...
        # Subtest: should handle multiple arguments
        ok 7 - should handle multiple arguments
          ---
          duration_ms: 0.339538
          type: 'test'
          ...
        1..7
    ok 2 - shouldSuppressWarning
      ---
      duration_ms: 3.551447
      type: 'suite'
      ...
    # Subtest: process.emitWarning patch
        # Subtest: should have patched process.emitWarning
        ok 1 - should have patched process.emitWarning
          ---
          duration_ms: 0.274781
          type: 'test'
          ...
        1..1
    ok 3 - process.emitWarning patch
      ---
      duration_ms: 0.43866
      type: 'suite'
      ...
    1..3
ok 106 - maxListenerDiagnostics
  ---
  duration_ms: 11.57512
  type: 'suite'
  ...
# Subtest: nip04WorkerClient
    # Subtest: should encrypt message successfully via worker
    ok 1 - should encrypt message successfully via worker
      ---
      duration_ms: 13.312936
      type: 'test'
      ...
    # Subtest: should reject when worker returns error
    ok 2 - should reject when worker returns error
      ---
      duration_ms: 4.813728
      type: 'test'
      ...
    # Subtest: should reject when worker emits error event
    ok 3 - should reject when worker emits error event
      ---
      duration_ms: 4.028139
      type: 'test'
      ...
    # Subtest: should timeout if worker does not respond
    ok 4 - should timeout if worker does not respond
      ---
      duration_ms: 102.952429
      type: 'test'
      ...
    # Subtest: should reject immediately if inputs are missing
    ok 5 - should reject immediately if inputs are missing
      ---
      duration_ms: 2.468304
      type: 'test'
      ...
    # Subtest: should reject if Worker API is unavailable
    ok 6 - should reject if Worker API is unavailable
      ---
      duration_ms: 2.013833
      type: 'test'
      ...
    # Subtest: should handle worker creation failure
    ok 7 - should handle worker creation failure
      ---
      duration_ms: 2.03196
      type: 'test'
      ...
    1..7
ok 107 - nip04WorkerClient
  ---
  duration_ms: 135.369964
  type: 'suite'
  ...
# Subtest: Nip07Adapter Race Condition
    # Subtest: should detect capabilities dynamically even if injected late
    ok 1 - should detect capabilities dynamically even if injected late
      ---
      duration_ms: 3.252734
      type: 'test'
      ...
    # Subtest: should call the injected method even if added late
    ok 2 - should call the injected method even if added late
      ---
      duration_ms: 2.529618
      type: 'test'
      ...
    1..2
ok 108 - Nip07Adapter Race Condition
  ---
  duration_ms: 7.461951
  type: 'suite'
  ...
# Subtest: Nip46Connector
    # Subtest: createKeyPair
        # Subtest: should generate a new key pair if none provided
        ok 1 - should generate a new key pair if none provided
          ---
          duration_ms: 3.568848
          type: 'test'
          ...
        # Subtest: should use existing keys if provided
        ok 2 - should use existing keys if provided
          ---
          duration_ms: 0.445359
          type: 'test'
          ...
        1..2
    ok 1 - createKeyPair
      ---
      duration_ms: 5.226086
      type: 'suite'
      ...
    # Subtest: prepareHandshake
        # Subtest: should parse connection string and return details
        ok 1 - should parse connection string and return details
          ---
          duration_ms: 1.354174
          type: 'test'
          ...
        1..1
    ok 2 - prepareHandshake
      ---
      duration_ms: 1.563193
      type: 'suite'
      ...
    # Subtest: connect
        # Subtest: should connect directly if remote pubkey is known
        ok 1 - should connect directly if remote pubkey is known
          ---
          duration_ms: 2.335878
          type: 'test'
          ...
        1..1
    ok 3 - connect
      ---
      duration_ms: 2.502431
      type: 'suite'
      ...
    # Subtest: reconnectStored
        # Subtest: should throw if no stored session
        ok 1 - should throw if no stored session
          ---
          duration_ms: 1.632952
          type: 'test'
          ...
        # Subtest: should reconnect using stored session
        ok 2 - should reconnect using stored session
          ---
          duration_ms: 0.695846
          type: 'test'
          ...
        1..2
    ok 4 - reconnectStored
      ---
      duration_ms: 2.55016
      type: 'suite'
      ...
    # Subtest: disconnect
        # Subtest: should clear stored session and emit change
        ok 1 - should clear stored session and emit change
          ---
          duration_ms: 0.550451
          type: 'test'
          ...
        1..1
    ok 5 - disconnect
      ---
      duration_ms: 0.747983
      type: 'suite'
      ...
    1..5
ok 109 - Nip46Connector
  ---
  duration_ms: 13.789567
  type: 'suite'
  ...
# Subtest: registerSigner stores and resolves signer entries
ok 110 - registerSigner stores and resolves signer entries
  ---
  duration_ms: 1.787255
  type: 'test'
  ...
# Subtest: setActiveSigner notifies listeners and resolves by pubkey
ok 111 - setActiveSigner notifies listeners and resolves by pubkey
  ---
  duration_ms: 0.546213
  type: 'test'
  ...
# Subtest: mirrorVideoEvent lowercases provided MIME types
ok 112 - mirrorVideoEvent lowercases provided MIME types
  ---
  duration_ms: 5.79339
  type: 'test'
  ...
# Subtest: mirrorVideoEvent lowercases inferred MIME types
ok 113 - mirrorVideoEvent lowercases inferred MIME types
  ---
  duration_ms: 0.707186
  type: 'test'
  ...
# Subtest: mirrorVideoEvent includes hash tags when provided
ok 114 - mirrorVideoEvent includes hash tags when provided
  ---
  duration_ms: 2.013222
  type: 'test'
  ...
# Subtest: publishVideoReaction includes both address and event tags when reacting to addressable content
ok 115 - publishVideoReaction includes both address and event tags when reacting to addressable content
  ---
  duration_ms: 8.077621
  type: 'test'
  ...
# Subtest: publishVideoReaction aborts when address pointer is missing a resolvable event id
ok 116 - publishVideoReaction aborts when address pointer is missing a resolvable event id
  ---
  duration_ms: 0.517679
  type: 'test'
  ...
# Subtest: revertVideo preserves existing d tag
ok 117 - revertVideo preserves existing d tag
  ---
  duration_ms: 9.625665
  type: 'test'
  ...
# Subtest: revertVideo falls back to original event id when d tag missing
ok 118 - revertVideo falls back to original event id when d tag missing
  ---
  duration_ms: 1.421904
  type: 'test'
  ...
# Subtest: SessionActor
    # Subtest: encrypts and decrypts private key
    ok 1 - encrypts and decrypts private key
      ---
      duration_ms: 328.458924
      type: 'test'
      ...
    # Subtest: fails to decrypt with wrong passphrase
    ok 2 - fails to decrypt with wrong passphrase
      ---
      duration_ms: 303.576605
      type: 'test'
      ...
    # Subtest: persists and reads session actor
    ok 3 - persists and reads session actor
      ---
      duration_ms: 1.676763
      type: 'test'
      ...
    # Subtest: clears stored session actor
    ok 4 - clears stored session actor
      ---
      duration_ms: 0.28433
      type: 'test'
      ...
    1..4
ok 119 - SessionActor
  ---
  duration_ms: 636.556755
  type: 'test'
  ...
# Subtest: js/nostr/sessionActor.js
    # Subtest: Encryption and Decryption Roundtrip
    ok 1 - Encryption and Decryption Roundtrip
      ---
      duration_ms: 305.727805
      type: 'test'
      ...
    # Subtest: Decryption fails with wrong passphrase
    ok 2 - Decryption fails with wrong passphrase
      ---
      duration_ms: 303.484999
      type: 'test'
      ...
    # Subtest: Persistence and Retrieval
    ok 3 - Persistence and Retrieval
      ---
      duration_ms: 300.756698
      type: 'test'
      ...
    # Subtest: Clear Stored Session Actor
    ok 4 - Clear Stored Session Actor
      ---
      duration_ms: 0.84364
      type: 'test'
      ...
    1..4
ok 120 - js/nostr/sessionActor.js
  ---
  duration_ms: 914.378687
  type: 'test'
  ...
# Subtest: queueSignEvent: processes requests sequentially
ok 121 - queueSignEvent: processes requests sequentially
  ---
  duration_ms: 106.305602
  type: 'test'
  ...
# Subtest: queueSignEvent: handles timeouts
ok 122 - queueSignEvent: handles timeouts
  ---
  duration_ms: 22.210308
  type: 'test'
  ...
# Subtest: queueSignEvent: handles permission denied errors
ok 123 - queueSignEvent: handles permission denied errors
  ---
  duration_ms: 0.92339
  type: 'test'
  ...
# Subtest: queueSignEvent: handles signer disconnected
ok 124 - queueSignEvent: handles signer disconnected
  ---
  duration_ms: 0.591956
  type: 'test'
  ...
# Subtest: queueSignEvent: fails if signer is missing or invalid
ok 125 - queueSignEvent: fails if signer is missing or invalid
  ---
  duration_ms: 0.625485
  type: 'test'
  ...
# Subtest: queueSignEvent: continues queue processing after failure
ok 126 - queueSignEvent: continues queue processing after failure
  ---
  duration_ms: 0.716257
  type: 'test'
  ...
# Subtest: setActiveSigner hydrates extension capabilities from window.nostr
ok 127 - setActiveSigner hydrates extension capabilities from window.nostr
  ---
  duration_ms: 2.531939
  type: 'test'
  ...
# Subtest: SyncMetadataStore
    # Subtest: should load from localStorage on initialization
    ok 1 - should load from localStorage on initialization
      ---
      duration_ms: 2.149517
      type: 'test'
      ...
    # Subtest: should update last seen and save to localStorage
    ok 2 - should update last seen and save to localStorage
      ---
      duration_ms: 0.67814
      type: 'test'
      ...
    # Subtest: should only update if timestamp is newer
    ok 3 - should only update if timestamp is newer
      ---
      duration_ms: 0.456079
      type: 'test'
      ...
    # Subtest: should get per-relay last seen
    ok 4 - should get per-relay last seen
      ---
      duration_ms: 1.751132
      type: 'test'
      ...
    # Subtest: should handle missing localStorage gracefully
    ok 5 - should handle missing localStorage gracefully
      ---
      duration_ms: 0.53041
      type: 'test'
      ...
    1..5
ok 128 - SyncMetadataStore
  ---
  duration_ms: 7.505245
  type: 'suite'
  ...
# Subtest: toolkit: DEFAULT_RELAY_URLS is frozen and contains valid URLs
ok 129 - toolkit: DEFAULT_RELAY_URLS is frozen and contains valid URLs
  ---
  duration_ms: 1.732682
  type: 'test'
  ...
# Subtest: toolkit: resolveSimplePoolConstructor finds SimplePool
ok 130 - toolkit: resolveSimplePoolConstructor finds SimplePool
  ---
  duration_ms: 0.673898
  type: 'test'
  ...
# Subtest: toolkit: shimLegacySimplePoolMethods adds sub/list/map if missing
ok 131 - toolkit: shimLegacySimplePoolMethods adds sub/list/map if missing
  ---
  duration_ms: 0.858863
  type: 'test'
  ...
# Subtest: toolkit: readToolkitFromScope finds NostrTools in global scope
ok 132 - toolkit: readToolkitFromScope finds NostrTools in global scope
  ---
  duration_ms: 0.440452
  type: 'test'
  ...
# Subtest: toolkit: normalizeToolkitCandidate validation
ok 133 - toolkit: normalizeToolkitCandidate validation
  ---
  duration_ms: 2.997371
  type: 'test'
  ...
# Subtest: toolkit: shimLegacySimplePoolMethods handles simple list operation
ok 134 - toolkit: shimLegacySimplePoolMethods handles simple list operation
  ---
  duration_ms: 11.434771
  type: 'test'
  ...
# Subtest: VideoEventBuffer
    # Subtest: Push and Flush
    ok 1 - Push and Flush
      ---
      duration_ms: 4.228774
      type: 'test'
      ...
    # Subtest: Latest Wins
    ok 2 - Latest Wins
      ---
      duration_ms: 0.521427
      type: 'test'
      ...
    # Subtest: Tombstone Handling
    ok 3 - Tombstone Handling
      ---
      duration_ms: 0.515109
      type: 'test'
      ...
    # Subtest: Cleanup
    ok 4 - Cleanup
      ---
      duration_ms: 0.452554
      type: 'test'
      ...
    1..4
ok 135 - VideoEventBuffer
  ---
  duration_ms: 7.653289
  type: 'test'
  ...
# Subtest: videoPayloadBuilder
    # Subtest: extractVideoPublishPayload
        # Subtest: extracts videoData and nip71Metadata
        ok 1 - extracts videoData and nip71Metadata
          ---
          duration_ms: 2.394599
          type: 'test'
          ...
        # Subtest: handles legacyFormData structure
        ok 2 - handles legacyFormData structure
          ---
          duration_ms: 0.212422
          type: 'test'
          ...
        # Subtest: normalizes boolean flags
        ok 3 - normalizes boolean flags
          ---
          duration_ms: 0.19611
          type: 'test'
          ...
        # Subtest: normalizes boolean flags (kids only)
        ok 4 - normalizes boolean flags (kids only)
          ---
          duration_ms: 0.235378
          type: 'test'
          ...
        1..4
    ok 1 - extractVideoPublishPayload
      ---
      duration_ms: 4.412064
      type: 'suite'
      ...
    # Subtest: prepareVideoPublishPayload
        # Subtest: throws if pubkey is missing
        ok 1 - throws if pubkey is missing
          ---
          duration_ms: 1.462473
          type: 'test'
          ...
        # Subtest: generates a valid event structure
        ok 2 - generates a valid event structure
          ---
          duration_ms: 3.247615
          type: 'test'
          ...
        # Subtest: generates unique d tag and videoRootId if not provided
        ok 3 - generates unique d tag and videoRootId if not provided
          ---
          duration_ms: 0.423282
          type: 'test'
          ...
        # Subtest: uses provided seriesIdentifier as d tag
        ok 4 - uses provided seriesIdentifier as d tag
          ---
          duration_ms: 0.378271
          type: 'test'
          ...
        # Subtest: resolves infoHash from magnet
        ok 5 - resolves infoHash from magnet
          ---
          duration_ms: 0.643193
          type: 'test'
          ...
        # Subtest: includes NIP-71 tags
        ok 6 - includes NIP-71 tags
          ---
          duration_ms: 0.805932
          type: 'test'
          ...
        1..6
    ok 2 - prepareVideoPublishPayload
      ---
      duration_ms: 7.395182
      type: 'suite'
      ...
    1..2
ok 136 - videoPayloadBuilder
  ---
  duration_ms: 12.572939
  type: 'suite'
  ...
# pool.list calls: 2
# pool.get calls: 0
# Subtest: hydrateVideoHistoryBatch optimizes network calls
ok 137 - hydrateVideoHistoryBatch optimizes network calls
  ---
  duration_ms: 6.431739
  type: 'test'
  ...
# Subtest: resolveVideoPostedAtBatch uses batch hydration
ok 138 - resolveVideoPostedAtBatch uses batch hydration
  ---
  duration_ms: 0.883102
  type: 'test'
  ...
# Subtest: attachmentService
    # Subtest: prepareAttachmentUpload
        # Subtest: should prepare upload without encryption
        ok 1 - should prepare upload without encryption
          ---
          duration_ms: 3.521002
          type: 'test'
          ...
        # Subtest: should prepare upload with encryption
        ok 2 - should prepare upload with encryption
          ---
          duration_ms: 11.170021
          type: 'test'
          ...
        1..2
    ok 1 - prepareAttachmentUpload
      ---
      duration_ms: 15.85716
      type: 'suite'
      ...
    # Subtest: downloadAttachment
        # Subtest: should download attachment
        ok 1 - should download attachment
          ---
          duration_ms: 1.50935
          type: 'test'
          ...
        # Subtest: should verify hash
        ok 2 - should verify hash
          ---
          duration_ms: 1.104446
          type: 'test'
          ...
        # Subtest: should throw on hash mismatch
        ok 3 - should throw on hash mismatch
          ---
          duration_ms: 1.59218
          type: 'test'
          ...
        1..3
    ok 2 - downloadAttachment
      ---
      duration_ms: 4.518884
      type: 'suite'
      ...
    # Subtest: caching
        # Subtest: should cache downloaded attachments
        ok 1 - should cache downloaded attachments
          ---
          duration_ms: 1.066022
          type: 'test'
          ...
        # Subtest: should clear cache
        ok 2 - should clear cache
          ---
          duration_ms: 1.290132
          type: 'test'
          ...
        1..2
    ok 3 - caching
      ---
      duration_ms: 2.590658
      type: 'suite'
      ...
    1..3
ok 139 - attachmentService
  ---
  duration_ms: 25.029905
  type: 'suite'
  ...
# Subtest: authUtils
    # Subtest: normalizeProviderId
        # Subtest: returns trimmed string if valid
        ok 1 - returns trimmed string if valid
          ---
          duration_ms: 1.117595
          type: 'test'
          ...
        # Subtest: returns 'nip07' fallback if empty
        ok 2 - returns 'nip07' fallback if empty
          ---
          duration_ms: 0.188997
          type: 'test'
          ...
        # Subtest: returns 'nip07' fallback if null
        ok 3 - returns 'nip07' fallback if null
          ---
          duration_ms: 0.160072
          type: 'test'
          ...
        # Subtest: returns 'nip07' fallback if undefined
        ok 4 - returns 'nip07' fallback if undefined
          ---
          duration_ms: 0.169187
          type: 'test'
          ...
        # Subtest: returns 'nip07' fallback if not a string
        ok 5 - returns 'nip07' fallback if not a string
          ---
          duration_ms: 0.147437
          type: 'test'
          ...
        1..5
    ok 1 - normalizeProviderId
      ---
      duration_ms: 3.159883
      type: 'test'
      ...
    # Subtest: normalizeAuthType
        # Subtest: prioritizes authTypeCandidate
        ok 1 - prioritizes authTypeCandidate
          ---
          duration_ms: 0.300871
          type: 'test'
          ...
        # Subtest: falls back to providerResult.authType
        ok 2 - falls back to providerResult.authType
          ---
          duration_ms: 0.161158
          type: 'test'
          ...
        # Subtest: falls back to providerResult.providerId
        ok 3 - falls back to providerResult.providerId
          ---
          duration_ms: 0.208985
          type: 'test'
          ...
        # Subtest: falls back to providerId
        ok 4 - falls back to providerId
          ---
          duration_ms: 0.184423
          type: 'test'
          ...
        # Subtest: returns 'nip07' if all else fails
        ok 5 - returns 'nip07' if all else fails
          ---
          duration_ms: 0.153421
          type: 'test'
          ...
        # Subtest: trims whitespace from results
        ok 6 - trims whitespace from results
          ---
          duration_ms: 0.139805
          type: 'test'
          ...
        # Subtest: ignores empty strings in candidates
        ok 7 - ignores empty strings in candidates
          ---
          duration_ms: 0.157317
          type: 'test'
          ...
        1..7
    ok 2 - normalizeAuthType
      ---
      duration_ms: 2.252365
      type: 'test'
      ...
    1..2
ok 140 - authUtils
  ---
  duration_ms: 6.513857
  type: 'test'
  ...
# Subtest: DiscussionCountService
    # Subtest: initialization sets defaults
    ok 1 - initialization sets defaults
      ---
      duration_ms: 1.510282
      type: 'test'
      ...
    # Subtest: refreshCounts returns early if videos array is empty or invalid
    ok 2 - refreshCounts returns early if videos array is empty or invalid
      ---
      duration_ms: 0.678504
      type: 'test'
      ...
    # Subtest: refreshCounts returns early if dependencies are missing
    ok 3 - refreshCounts returns early if dependencies are missing
      ---
      duration_ms: 1.212671
      type: 'test'
      ...
    # Subtest: refreshCounts handles happy path (fetches and updates DOM)
    ok 4 - refreshCounts handles happy path (fetches and updates DOM)
      ---
      duration_ms: 41.873284
      type: 'test'
      ...
    # Subtest: refreshCounts uses cached count if available
    ok 5 - refreshCounts uses cached count if available
      ---
      duration_ms: 1.391165
      type: 'test'
      ...
    # Subtest: refreshCounts handles API errors gracefully
    ok 6 - refreshCounts handles API errors gracefully
      ---
      duration_ms: 3.034169
      type: 'test'
      ...
    # Subtest: refreshCounts handles partial results
    ok 7 - refreshCounts handles partial results
      ---
      duration_ms: 2.872435
      type: 'test'
      ...
    # Subtest: refreshCounts handles unsupported relays (empty perRelay)
    ok 8 - refreshCounts handles unsupported relays (empty perRelay)
      ---
      duration_ms: 2.386777
      type: 'test'
      ...
    1..8
ok 141 - DiscussionCountService
  ---
  duration_ms: 168.455587
  type: 'suite'
  ...
# Subtest: exploreDataService optimization
    # Subtest: toLightweightVideo extracts necessary fields
    ok 1 - toLightweightVideo extracts necessary fields
      ---
      duration_ms: 2.690804
      type: 'test'
      ...
    # Subtest: collectVideoTags works with lightweight object
    ok 2 - collectVideoTags works with lightweight object
      ---
      duration_ms: 13.849965
      type: 'test'
      ...
    # Subtest: buildVideoAddressPointer works with lightweight object
    ok 3 - buildVideoAddressPointer works with lightweight object
      ---
      duration_ms: 0.510899
      type: 'test'
      ...
    # Subtest: toLightweightVideo handles invalid input
    ok 4 - toLightweightVideo handles invalid input
      ---
      duration_ms: 0.166339
      type: 'test'
      ...
    1..4
ok 142 - exploreDataService optimization
  ---
  duration_ms: 19.127898
  type: 'test'
  ...
# Subtest: exploreDataService - buildWatchHistoryTagCounts
    # Subtest: should return empty Map if watchHistoryService is missing
    ok 1 - should return empty Map if watchHistoryService is missing
      ---
      duration_ms: 1.598493
      type: 'test'
      ...
    # Subtest: should handle missing loadLatest method gracefully
    ok 2 - should handle missing loadLatest method gracefully
      ---
      duration_ms: 0.440259
      type: 'test'
      ...
    # Subtest: should handle loadLatest failure gracefully
    ok 3 - should handle loadLatest failure gracefully
      ---
      duration_ms: 9.788222
      type: 'test'
      ...
    # Subtest: should return counts from worker on success
    ok 4 - should return counts from worker on success
      ---
      duration_ms: 2.280319
      type: 'test'
      ...
    # Subtest: should handle worker error gracefully
    ok 5 - should handle worker error gracefully
      ---
      duration_ms: 1.53884
      type: 'test'
      ...
    1..5
ok 143 - exploreDataService - buildWatchHistoryTagCounts
  ---
  duration_ms: 24.120801
  type: 'suite'
  ...
# Subtest: LinkPreviewService
    # Subtest: initializes IndexedDB
    ok 1 - initializes IndexedDB
      ---
      duration_ms: 17.520315
      type: 'test'
      ...
    # Subtest: fetches and caches preview
    ok 2 - fetches and caches preview
      ---
      duration_ms: 27.518197
      type: 'test'
      ...
    # Subtest: returns null on fetch failure
    ok 3 - returns null on fetch failure
      ---
      duration_ms: 2.277903
      type: 'test'
      ...
    # Subtest: respects TTL
    ok 4 - respects TTL
      ---
      duration_ms: 13.525521
      type: 'test'
      ...
    # Subtest: deletePreview removes from cache
    ok 5 - deletePreview removes from cache
      ---
      duration_ms: 2.91061
      type: 'test'
      ...
    1..5
ok 144 - LinkPreviewService
  ---
  duration_ms: 66.875529
  type: 'test'
  ...
# Subtest: ModerationActionController: handles moderation override
ok 145 - ModerationActionController: handles moderation override
  ---
  duration_ms: 2.457346
  type: 'test'
  ...
# Subtest: ModerationActionController: blocks user and updates state
ok 146 - ModerationActionController: blocks user and updates state
  ---
  duration_ms: 1.290364
  type: 'test'
  ...
# Subtest: ModerationActionController: prevents blocking self
ok 147 - ModerationActionController: prevents blocking self
  ---
  duration_ms: 0.35758
  type: 'test'
  ...
# Subtest: ModerationActionController: requires login to block
ok 148 - ModerationActionController: requires login to block
  ---
  duration_ms: 0.357201
  type: 'test'
  ...
# Subtest: ModerationActionController: handles hide action
ok 149 - ModerationActionController: handles hide action
  ---
  duration_ms: 0.425757
  type: 'test'
  ...
# Subtest: NostrService
    # Subtest: loadVideos
        # Subtest: should load cached videos and start subscription
        ok 1 - should load cached videos and start subscription
          ---
          duration_ms: 4.909178
          type: 'test'
          ...
        1..1
    ok 1 - loadVideos
      ---
      duration_ms: 6.740849
      type: 'suite'
      ...
    # Subtest: fetchVideosByAuthors
        # Subtest: should fetch videos from relays for specific authors
        ok 1 - should fetch videos from relays for specific authors
          ---
          duration_ms: 4.191186
          type: 'test'
          ...
        1..1
    ok 2 - fetchVideosByAuthors
      ---
      duration_ms: 4.440625
      type: 'suite'
      ...
    1..2
ok 150 - NostrService
  ---
  duration_ms: 12.401411
  type: 'suite'
  ...
# (node:4523) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
# (Use `node --trace-warnings ...` to show where the warning was created)
# Subtest: PlaybackService
    # Subtest: Initialization sets defaults and dependencies
    ok 1 - Initialization sets defaults and dependencies
      ---
      duration_ms: 2.784286
      type: 'test'
      ...
    # Subtest: prepareVideoElement respects localStorage and binds listener
    ok 2 - prepareVideoElement respects localStorage and binds listener
      ---
      duration_ms: 7.077606
      type: 'test'
      ...
    # Subtest: registerUrlPlaybackWatchdogs triggers onFallback on error
    ok 3 - registerUrlPlaybackWatchdogs triggers onFallback on error
      ---
      duration_ms: 2.533751
      type: 'test'
      ...
    # Subtest: registerUrlPlaybackWatchdogs triggers onSuccess on playing
    ok 4 - registerUrlPlaybackWatchdogs triggers onSuccess on playing
      ---
      duration_ms: 1.281283
      type: 'test'
      ...
    # Subtest: createSession returns a PlaybackSession
    ok 5 - createSession returns a PlaybackSession
      ---
      duration_ms: 0.974636
      type: 'test'
      ...
    # Subtest: PlaybackSession Flow
        # Subtest: URL Probe Success starts playback
        ok 1 - URL Probe Success starts playback
          ---
          duration_ms: 14.447968
          type: 'test'
          ...
        # Subtest: URL Probe Failure triggers fallback
        ok 2 - URL Probe Failure triggers fallback
          ---
          duration_ms: 4.106503
          type: 'test'
          ...
        # Subtest: Watchdog Stall triggers fallback
        ok 3 - Watchdog Stall triggers fallback
          ---
          duration_ms: 5.66608
          type: 'test'
          ...
        1..3
    ok 6 - PlaybackSession Flow
      ---
      duration_ms: 24.949007
      type: 'suite'
      ...
    1..6
ok 151 - PlaybackService
  ---
  duration_ms: 207.379143
  type: 'suite'
  ...
# (node:4530) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
# (Use `node --trace-warnings ...` to show where the warning was created)
# Subtest: PlaybackService Forced Source Logic
    # Subtest: Normal flow: Timeout triggers fallback to Torrent if URL stalls
    ok 1 - Normal flow: Timeout triggers fallback to Torrent if URL stalls
      ---
      duration_ms: 17.371625
      type: 'test'
      ...
    # Subtest: Forced Source 'url': Ignores playbackStartTimeout and does NOT fallback to Torrent
    ok 2 - Forced Source 'url': Ignores playbackStartTimeout and does NOT fallback to Torrent
      ---
      duration_ms: 6.712185
      type: 'test'
      ...
    # Subtest: Forced Source 'url': Does NOT fallback to Torrent even if URL fails (probe bad)
    ok 3 - Forced Source 'url': Does NOT fallback to Torrent even if URL fails (probe bad)
      ---
      duration_ms: 1.608541
      type: 'test'
      ...
    # Subtest: Forced Source 'torrent': Ignores playbackStartTimeout and does NOT fallback to URL
    ok 4 - Forced Source 'torrent': Ignores playbackStartTimeout and does NOT fallback to URL
      ---
      duration_ms: 2.464967
      type: 'test'
      ...
    # Subtest: Forced Source 'torrent': Does NOT fallback to URL even if Torrent fails
    ok 5 - Forced Source 'torrent': Does NOT fallback to URL even if Torrent fails
      ---
      duration_ms: 1.896656
      type: 'test'
      ...
    1..5
ok 152 - PlaybackService Forced Source Logic
  ---
  duration_ms: 147.278322
  type: 'suite'
  ...
# (node:4537) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
# (Use `node --trace-warnings ...` to show where the warning was created)
# Subtest: PlaybackService Ordering
    # Subtest: Playback Execution Order
        # Subtest: urlFirstEnabled=true: Tries URL first, succeeds
        ok 1 - urlFirstEnabled=true: Tries URL first, succeeds
          ---
          duration_ms: 11.109014
          type: 'test'
          ...
        # Subtest: urlFirstEnabled=true: Tries URL first, fails, falls back to Torrent
        ok 2 - urlFirstEnabled=true: Tries URL first, fails, falls back to Torrent
          ---
          duration_ms: 1.628581
          type: 'test'
          ...
        # Subtest: urlFirstEnabled=false: Tries Torrent first, succeeds
        ok 3 - urlFirstEnabled=false: Tries Torrent first, succeeds
          ---
          duration_ms: 0.889081
          type: 'test'
          ...
        # Subtest: urlFirstEnabled=false: Tries Torrent first, fails (throws), falls back to URL
        ok 4 - urlFirstEnabled=false: Tries Torrent first, fails (throws), falls back to URL
          ---
          duration_ms: 2.288998
          type: 'test'
          ...
        # Subtest: forcedSource=torrent overrides urlFirstEnabled=true
        ok 5 - forcedSource=torrent overrides urlFirstEnabled=true
          ---
          duration_ms: 0.917058
          type: 'test'
          ...
        1..5
    ok 1 - Playback Execution Order
      ---
      duration_ms: 17.943095
      type: 'suite'
      ...
    1..1
ok 153 - PlaybackService Ordering
  ---
  duration_ms: 19.686733
  type: 'suite'
  ...
# Subtest: profileMetadataService
    # Subtest: fetchProfileMetadataBatch
        # Subtest: should return empty map if no pubkeys provided
        ok 1 - should return empty map if no pubkeys provided
          ---
          duration_ms: 2.134507
          type: 'test'
          ...
        # Subtest: should fetch profiles for provided pubkeys
        ok 2 - should fetch profiles for provided pubkeys
          ---
          duration_ms: 3.053662
          type: 'test'
          ...
        # Subtest: should handle relay failures gracefully
        ok 3 - should handle relay failures gracefully
          ---
          duration_ms: 0.749427
          type: 'test'
          ...
        # Subtest: should parse profile content correctly
        ok 4 - should parse profile content correctly
          ---
          duration_ms: 0.692563
          type: 'test'
          ...
        # Subtest: should deduplicate concurrent requests (inflight)
        ok 5 - should deduplicate concurrent requests (inflight)
          ---
          duration_ms: 9.089362
          type: 'test'
          ...
        1..5
    ok 1 - fetchProfileMetadataBatch
      ---
      duration_ms: 17.330134
      type: 'suite'
      ...
    # Subtest: fetchProfileMetadata
        # Subtest: should return null for invalid pubkey
        ok 1 - should return null for invalid pubkey
          ---
          duration_ms: 0.628131
          type: 'test'
          ...
        # Subtest: should return single profile result
        ok 2 - should return single profile result
          ---
          duration_ms: 0.669173
          type: 'test'
          ...
        1..2
    ok 2 - fetchProfileMetadata
      ---
      duration_ms: 1.50916
      type: 'suite'
      ...
    # Subtest: ensureProfileMetadataSubscription
        # Subtest: should return null if nostr pool is missing
        ok 1 - should return null if nostr pool is missing
          ---
          duration_ms: 0.691926
          type: 'test'
          ...
        # Subtest: should create a subscription via relaySubscriptionService
        ok 2 - should create a subscription via relaySubscriptionService
          ---
          duration_ms: 14.22565
          type: 'test'
          ...
        # Subtest: should handle onProfile callback
        ok 3 - should handle onProfile callback
          ---
          duration_ms: 1.035205
          type: 'test'
          ...
        1..3
    ok 3 - ensureProfileMetadataSubscription
      ---
      duration_ms: 16.286286
      type: 'suite'
      ...
    1..3
ok 154 - profileMetadataService
  ---
  duration_ms: 36.103524
  type: 'suite'
  ...
# Subtest: js/services/r2Service.js
    # Subtest: Default Settings
    ok 1 - Default Settings
      ---
      duration_ms: 3.283431
      type: 'test'
      ...
    # Subtest: handleCloudflareSettingsSubmit - Valid Input
    ok 2 - handleCloudflareSettingsSubmit - Valid Input
      ---
      duration_ms: 0.771703
      type: 'test'
      ...
    # Subtest: handleCloudflareSettingsSubmit - Invalid S3 URL
    ok 3 - handleCloudflareSettingsSubmit - Invalid S3 URL
      ---
      duration_ms: 0.944555
      type: 'test'
      ...
    # Subtest: handleCloudflareSettingsSubmit - Missing Fields
    ok 4 - handleCloudflareSettingsSubmit - Missing Fields
      ---
      duration_ms: 0.587143
      type: 'test'
      ...
    # Subtest: ensureBucketConfigForNpub - Uses Explicit Credentials
    ok 5 - ensureBucketConfigForNpub - Uses Explicit Credentials
      ---
      duration_ms: 1.001658
      type: 'test'
      ...
    # Subtest: ensureBucketConfigForNpub - Uses Meta Bucket when Missing
    ok 6 - ensureBucketConfigForNpub - Uses Meta Bucket when Missing
      ---
      duration_ms: 0.502705
      type: 'test'
      ...
    # Subtest: resolveConnection - Maps meta bucket into settings
    ok 7 - resolveConnection - Maps meta bucket into settings
      ---
      duration_ms: 1.112852
      type: 'test'
      ...
    # Subtest: resolveConnection - Returns null without StorageService entries
    ok 8 - resolveConnection - Returns null without StorageService entries
      ---
      duration_ms: 0.700273
      type: 'test'
      ...
    1..8
ok 155 - js/services/r2Service.js
  ---
  duration_ms: 12.208545
  type: 'test'
  ...
# Subtest: RelayHealthService: initializes with default values
ok 156 - RelayHealthService: initializes with default values
  ---
  duration_ms: 1.861039
  type: 'test'
  ...
# Subtest: RelayHealthService: manages telemetry opt-in
ok 157 - RelayHealthService: manages telemetry opt-in
  ---
  duration_ms: 0.322624
  type: 'test'
  ...
# Subtest: RelayHealthService: getRelayUrls fetches from relayManager
ok 158 - RelayHealthService: getRelayUrls fetches from relayManager
  ---
  duration_ms: 1.292306
  type: 'test'
  ...
# Subtest: RelayHealthService: ensureRelayState creates default state
ok 159 - RelayHealthService: ensureRelayState creates default state
  ---
  duration_ms: 0.283366
  type: 'test'
  ...
# Subtest: RelayHealthService: checkRelay success flow
ok 160 - RelayHealthService: checkRelay success flow
  ---
  duration_ms: 1.049736
  type: 'test'
  ...
# Subtest: RelayHealthService: checkRelay failure flow
ok 161 - RelayHealthService: checkRelay failure flow
  ---
  duration_ms: 0.623199
  type: 'test'
  ...
# Subtest: RelayHealthService: checkRelay handles missing nostrClient
ok 162 - RelayHealthService: checkRelay handles missing nostrClient
  ---
  duration_ms: 0.350049
  type: 'test'
  ...
# Subtest: RelayHealthService: refresh checks all relays
ok 163 - RelayHealthService: refresh checks all relays
  ---
  duration_ms: 0.791981
  type: 'test'
  ...
# Subtest: RelayHealthService: emits telemetry if opted in
ok 164 - RelayHealthService: emits telemetry if opted in
  ---
  duration_ms: 0.707264
  type: 'test'
  ...
# Subtest: RelayHealthService: checkRelay times out after DEFAULT_TIMEOUT_MS
ok 165 - RelayHealthService: checkRelay times out after DEFAULT_TIMEOUT_MS
  ---
  duration_ms: 12.207141
  type: 'test'
  ...
# Subtest: RelayHealthService: failure threshold triggers user warning
ok 166 - RelayHealthService: failure threshold triggers user warning
  ---
  duration_ms: 0.884388
  type: 'test'
  ...
# Subtest: RelayHealthService: user warning respects cooldown
ok 167 - RelayHealthService: user warning respects cooldown
  ---
  duration_ms: 0.400673
  type: 'test'
  ...
# Subtest: RelayHealthService: relay disconnect/error events trigger failure
ok 168 - RelayHealthService: relay disconnect/error events trigger failure
  ---
  duration_ms: 0.336749
  type: 'test'
  ...
# Subtest: RelayHealthService: integrates with nostrClient.markRelayUnreachable
ok 169 - RelayHealthService: integrates with nostrClient.markRelayUnreachable
  ---
  duration_ms: 0.281914
  type: 'test'
  ...
# Subtest: s3Service
    # Subtest: validateS3Connection
        # Subtest: should validate correct configuration
        ok 1 - should validate correct configuration
          ---
          duration_ms: 2.230938
          type: 'test'
          ...
        # Subtest: should throw on missing required fields
        ok 2 - should throw on missing required fields
          ---
          duration_ms: 0.844939
          type: 'test'
          ...
        1..2
    ok 1 - validateS3Connection
      ---
      duration_ms: 4.465871
      type: 'suite'
      ...
    # Subtest: getCorsOrigins
        # Subtest: should return current origin
        ok 1 - should return current origin
          ---
          duration_ms: 115.468338
          type: 'test'
          ...
        # Subtest: should handle localhost
        ok 2 - should handle localhost
          ---
          duration_ms: 11.419583
          type: 'test'
          ...
        1..2
    ok 2 - getCorsOrigins
      ---
      duration_ms: 127.24885
      type: 'suite'
      ...
    1..2
ok 170 - s3Service
  ---
  duration_ms: 132.664686
  type: 'suite'
  ...
# Subtest: S3UploadService
    # Subtest: constructor initializes listeners
    ok 1 - constructor initializes listeners
      ---
      duration_ms: 1.685906
      type: 'test'
      ...
    # Subtest: Event Emitter Logic
    ok 2 - Event Emitter Logic
      ---
      duration_ms: 1.874942
      type: 'test'
      ...
    # Subtest: emit handles listener errors safely
    ok 3 - emit handles listener errors safely
      ---
      duration_ms: 0.568865
      type: 'test'
      ...
    # Subtest: verifyConnection
    ok 4 - verifyConnection
      ---
      duration_ms: 0.759037
      type: 'test'
      ...
    # Subtest: prepareUpload
    ok 5 - prepareUpload
      ---
      duration_ms: 0.581691
      type: 'test'
      ...
    # Subtest: uploadFile
        # Subtest: validates parameters
        ok 1 - validates parameters
          ---
          duration_ms: 1.254526
          type: 'test'
          ...
        # Subtest: uploads successfully
        ok 2 - uploads successfully
          ---
          duration_ms: 0.78075
          type: 'test'
          ...
        1..2
    ok 6 - uploadFile
      ---
      duration_ms: 2.616555
      type: 'test'
      ...
    # Subtest: uploadVideo
        # Subtest: fails if npub missing
        ok 1 - fails if npub missing
          ---
          duration_ms: 0.965784
          type: 'test'
          ...
        # Subtest: fails if title missing
        ok 2 - fails if title missing
          ---
          duration_ms: 0.403417
          type: 'test'
          ...
        # Subtest: fails if file missing
        ok 3 - fails if file missing
          ---
          duration_ms: 0.280392
          type: 'test'
          ...
        # Subtest: successful upload flow
        ok 4 - successful upload flow
          ---
          duration_ms: 1.081052
          type: 'test'
          ...
        # Subtest: uploads thumbnail if provided
        ok 5 - uploads thumbnail if provided
          ---
          duration_ms: 0.837523
          type: 'test'
          ...
        # Subtest: handles validation errors from normalizeVideoNotePayload
        ok 6 - handles validation errors from normalizeVideoNotePayload
          ---
          duration_ms: 0.580003
          type: 'test'
          ...
        # Subtest: handles upload exception
        ok 7 - handles upload exception
          ---
          duration_ms: 0.687732
          type: 'test'
          ...
        1..7
    ok 7 - uploadVideo
      ---
      duration_ms: 6.175422
      type: 'test'
      ...
    1..7
ok 171 - S3UploadService
  ---
  duration_ms: 16.918594
  type: 'test'
  ...
# [bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl ready check timed out
#     at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:147:13)
#     at Object.apply (node:internal/test_runner/mock/mock:765:20)
#     at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
#     at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
#     at bootstrapTrustedSeeds (file:///app/js/services/trustBootstrap.js:151:31)
#     at TestContext.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:150:11)
#     at Test.runInAsyncScope (node:async_hooks:214:14)
#     at Test.run (node:internal/test_runner/test:1047:25)
#     at async Suite.processPendingSubtests (node:internal/test_runner/test:744:7)
# [bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl ready check timed out
#     at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:147:13)
#     at Object.apply (node:internal/test_runner/mock/mock:765:20)
#     at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
#     at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
#     at runAsyncRetry (file:///app/js/services/trustBootstrap.js:160:13)
# [bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl failed
#     at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:164:13)
#     at Object.apply (node:internal/test_runner/mock/mock:765:20)
#     at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
#     at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
#     at bootstrapTrustedSeeds (file:///app/js/services/trustBootstrap.js:151:31)
#     at TestContext.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:171:30)
#     at Test.runInAsyncScope (node:async_hooks:214:14)
#     at Test.run (node:internal/test_runner/test:1047:25)
#     at async Suite.processPendingSubtests (node:internal/test_runner/test:744:7)
# Subtest: trustBootstrap
    # Subtest: should return early if feature is disabled
    ok 1 - should return early if feature is disabled
      ---
      duration_ms: 2.910923
      type: 'test'
      ...
    # Subtest: should apply seeds when accessControl is ready
    ok 2 - should apply seeds when accessControl is ready
      ---
      duration_ms: 1.847228
      type: 'test'
      ...
    # Subtest: should subscribe to accessControl changes
    ok 3 - should subscribe to accessControl changes
      ---
      duration_ms: 0.781159
      type: 'test'
      ...
    # Subtest: should handle accessControl timeout and apply seeds anyway
    ok 4 - should handle accessControl timeout and apply seeds anyway
      ---
      duration_ms: 4.62087
      type: 'test'
      ...
    # Subtest: should recompute summaries after applying seeds
    ok 5 - should recompute summaries after applying seeds
      ---
      duration_ms: 0.68575
      type: 'test'
      ...
    # Subtest: should wait for relays if hydration fails initially
    ok 6 - should wait for relays if hydration fails initially
      ---
      duration_ms: 301.451232
      type: 'test'
      ...
    1..6
ok 172 - trustBootstrap
  ---
  duration_ms: 314.639599
  type: 'suite'
  ...
# Subtest: AppState
    # Subtest: getters and setters work for simple values
    ok 1 - getters and setters work for simple values
      ---
      duration_ms: 2.493872
      type: 'test'
      ...
    # Subtest: subscribeToAppStateKey fires on change
    ok 2 - subscribeToAppStateKey fires on change
      ---
      duration_ms: 0.623031
      type: 'test'
      ...
    # Subtest: subscribeToAppState fires on any change
    ok 3 - subscribeToAppState fires on any change
      ---
      duration_ms: 0.41206
      type: 'test'
      ...
    # Subtest: setModalState updates state and notifies
    ok 4 - setModalState updates state and notifies
      ---
      duration_ms: 0.707106
      type: 'test'
      ...
    # Subtest: resetAppState clears everything
    ok 5 - resetAppState clears everything
      ---
      duration_ms: 0.316355
      type: 'test'
      ...
    # Subtest: setVideosMap only accepts Maps or null
    ok 6 - setVideosMap only accepts Maps or null
      ---
      duration_ms: 0.390502
      type: 'test'
      ...
    1..6
ok 173 - AppState
  ---
  duration_ms: 7.460908
  type: 'suite'
  ...
# Subtest: persistSavedProfiles preserves custom authType strings
ok 174 - persistSavedProfiles preserves custom authType strings
  ---
  duration_ms: 3.137173
  type: 'test'
  ...
# Subtest: loadSavedProfilesFromStorage retains custom provider authType
ok 175 - loadSavedProfilesFromStorage retains custom provider authType
  ---
  duration_ms: 0.668611
  type: 'test'
  ...
# Subtest: loadSavedProfilesFromStorage migrates missing authType to nip07
ok 176 - loadSavedProfilesFromStorage migrates missing authType to nip07
  ---
  duration_ms: 0.448746
  type: 'test'
  ...
# Subtest: loadSavedProfilesFromStorage trims stored authType values
ok 177 - loadSavedProfilesFromStorage trims stored authType values
  ---
  duration_ms: 0.272977
  type: 'test'
  ...
# Subtest: loadSavedProfilesFromStorage ignores legacy userPubKey
ok 178 - loadSavedProfilesFromStorage ignores legacy userPubKey
  ---
  duration_ms: 0.284584
  type: 'test'
  ...
# Subtest: js/state/cache.js
    # Subtest: Saved Profiles Persistence
    ok 1 - Saved Profiles Persistence
      ---
      duration_ms: 3.202559
      type: 'test'
      ...
    # Subtest: Active Profile Pubkey
    ok 2 - Active Profile Pubkey
      ---
      duration_ms: 0.727082
      type: 'test'
      ...
    # Subtest: URL Health Caching
    ok 3 - URL Health Caching
      ---
      duration_ms: 0.786058
      type: 'test'
      ...
    # Subtest: URL Health Expiration
    ok 4 - URL Health Expiration
      ---
      duration_ms: 9.986242
      type: 'test'
      ...
    # Subtest: Moderation Settings
    ok 5 - Moderation Settings
      ---
      duration_ms: 1.50225
      type: 'test'
      ...
    # Subtest: Legacy Moderation Overrides Support
        # Subtest: ignores legacy v1 overrides
        ok 1 - ignores legacy v1 overrides
          ---
          duration_ms: 0.825025
          type: 'test'
          ...
        # Subtest: loads v2 overrides
        ok 2 - loads v2 overrides
          ---
          duration_ms: 0.97508
          type: 'test'
          ...
        1..2
    ok 6 - Legacy Moderation Overrides Support
      ---
      duration_ms: 2.7815
      type: 'test'
      ...
    1..6
ok 179 - js/state/cache.js
  ---
  duration_ms: 21.97444
  type: 'test'
  ...
# [bitvid] [ProfileCache] Expired watchHistory for 1111111111111111111111111111111111111111111111111111111111111111
# Subtest: ProfileCache: normalizeHexPubkey validates and cleans inputs
ok 180 - ProfileCache: normalizeHexPubkey validates and cleans inputs
  ---
  duration_ms: 2.270944
  type: 'test'
  ...
# Subtest: ProfileCache: resolves storage keys correctly
ok 181 - ProfileCache: resolves storage keys correctly
  ---
  duration_ms: 0.758135
  type: 'test'
  ...
# Subtest: ProfileCache: persists data to localStorage and memory
ok 182 - ProfileCache: persists data to localStorage and memory
  ---
  duration_ms: 2.175913
  type: 'test'
  ...
# Subtest: ProfileCache: loads from localStorage if memory miss
ok 183 - ProfileCache: loads from localStorage if memory miss
  ---
  duration_ms: 0.38504
  type: 'test'
  ...
# Subtest: ProfileCache: handles active profile switching
ok 184 - ProfileCache: handles active profile switching
  ---
  duration_ms: 0.529749
  type: 'test'
  ...
# Subtest: ProfileCache: setProfile normalizes and saves
ok 185 - ProfileCache: setProfile normalizes and saves
  ---
  duration_ms: 1.161226
  type: 'test'
  ...
# Subtest: ProfileCache: emits events on active profile change
ok 186 - ProfileCache: emits events on active profile change
  ---
  duration_ms: 0.511323
  type: 'test'
  ...
# Subtest: ProfileCache: respects TTL expiration
ok 187 - ProfileCache: respects TTL expiration
  ---
  duration_ms: 1.692892
  type: 'test'
  ...
# Subtest: ProfileCache: setProfile sanitizes XSS in media URLs
ok 188 - ProfileCache: setProfile sanitizes XSS in media URLs
  ---
  duration_ms: 1.280569
  type: 'test'
  ...
# Subtest: profile settings store clones values and tracks entries
ok 189 - profile settings store clones values and tracks entries
  ---
  duration_ms: 3.622042
  type: 'test'
  ...
# Subtest: profile settings store ignores falsy keys and survives clone failures
ok 190 - profile settings store ignores falsy keys and survives clone failures
  ---
  duration_ms: 0.43411
  type: 'test'
  ...
# Subtest: returns generic message when error missing
ok 191 - returns generic message when error missing
  ---
  duration_ms: 2.727248
  type: 'test'
  ...
# Subtest: identifies HTTPS requirement errors
ok 192 - identifies HTTPS requirement errors
  ---
  duration_ms: 0.39482
  type: 'test'
  ...
# Subtest: identifies disabled service worker errors
ok 193 - identifies disabled service worker errors
  ---
  duration_ms: 0.379115
  type: 'test'
  ...
# Subtest: identifies Brave specific guidance
ok 194 - identifies Brave specific guidance
  ---
  duration_ms: 0.321344
  type: 'test'
  ...
# Subtest: identifies blocked script errors
ok 195 - identifies blocked script errors
  ---
  duration_ms: 0.273982
  type: 'test'
  ...
# Subtest: identifies controller claim timeout
ok 196 - identifies controller claim timeout
  ---
  duration_ms: 0.273285
  type: 'test'
  ...
# Subtest: torrent/ui/styleHelpers
    # Subtest: returns null when no element is provided
    ok 1 - returns null when no element is provided
      ---
      duration_ms: 1.298128
      type: 'test'
      ...
    # Subtest: returns the original element without mutations
    ok 2 - returns the original element without mutations
      ---
      duration_ms: 105.010025
      type: 'test'
      ...
    # Subtest: provides an empty, frozen fallback map
    ok 3 - provides an empty, frozen fallback map
      ---
      duration_ms: 1.775226
      type: 'test'
      ...
    # Subtest: no-ops when removing styles
    ok 4 - no-ops when removing styles
      ---
      duration_ms: 10.135923
      type: 'test'
      ...
    1..4
ok 197 - torrent/ui/styleHelpers
  ---
  duration_ms: 120.065194
  type: 'suite'
  ...
# Subtest: torrent/ui/toastService
    # Subtest: renders a toast with Tailwind token classes and removes it on dismiss
    ok 1 - renders a toast with Tailwind token classes and removes it on dismiss
      ---
      duration_ms: 386.676968
      type: 'test'
      ...
    1..1
ok 198 - torrent/ui/toastService
  ---
  duration_ms: 388.569635
  type: 'suite'
  ...
# Subtest: AppChromeController binds upload button when elements hydrate later
ok 199 - AppChromeController binds upload button when elements hydrate later
  ---
  duration_ms: 120.094047
  type: 'test'
  ...
# Subtest: CreatorProfileController
    # Subtest: resolveCreatorProfileFromSources prioritizes cached profile
    ok 1 - resolveCreatorProfileFromSources prioritizes cached profile
      ---
      duration_ms: 1.721585
      type: 'test'
      ...
    # Subtest: resolveCreatorProfileFromSources falls back to fetched profile
    ok 2 - resolveCreatorProfileFromSources falls back to fetched profile
      ---
      duration_ms: 0.319186
      type: 'test'
      ...
    # Subtest: decorateVideoCreatorIdentity modifies video object
    ok 3 - decorateVideoCreatorIdentity modifies video object
      ---
      duration_ms: 0.679501
      type: 'test'
      ...
    # Subtest: fetchModalCreatorProfile fetches profile and updates modal
    ok 4 - fetchModalCreatorProfile fetches profile and updates modal
      ---
      duration_ms: 1.341938
      type: 'test'
      ...
    1..4
ok 200 - CreatorProfileController
  ---
  duration_ms: 5.988875
  type: 'test'
  ...
# Subtest: EngagementController
    # Subtest: handleRepostAction - should show error if no event ID is available
    ok 1 - handleRepostAction - should show error if no event ID is available
      ---
      duration_ms: 3.79583
      type: 'test'
      ...
    # Subtest: handleRepostAction - should call repostEvent with correct parameters
    ok 2 - handleRepostAction - should call repostEvent with correct parameters
      ---
      duration_ms: 0.976036
      type: 'test'
      ...
    # Subtest: handleRepostAction - should handle failure from repostEvent
    ok 3 - handleRepostAction - should handle failure from repostEvent
      ---
      duration_ms: 0.556188
      type: 'test'
      ...
    # Subtest: handleRepostAction - should use currentVideoPointer when in modal context
    ok 4 - handleRepostAction - should use currentVideoPointer when in modal context
      ---
      duration_ms: 0.462771
      type: 'test'
      ...
    # Subtest: handleMirrorAction - should show error if video has no URL
    ok 5 - handleMirrorAction - should show error if video has no URL
      ---
      duration_ms: 0.725236
      type: 'test'
      ...
    # Subtest: handleMirrorAction - should call mirrorVideoEvent when URL is provided
    ok 6 - handleMirrorAction - should call mirrorVideoEvent when URL is provided
      ---
      duration_ms: 0.71674
      type: 'test'
      ...
    # Subtest: handleMirrorAction - should prevent mirroring private videos
    ok 7 - handleMirrorAction - should prevent mirroring private videos
      ---
      duration_ms: 0.616561
      type: 'test'
      ...
    # Subtest: handleEnsurePresenceAction - should show error if no event ID
    ok 8 - handleEnsurePresenceAction - should show error if no event ID
      ---
      duration_ms: 0.656981
      type: 'test'
      ...
    # Subtest: handleEnsurePresenceAction - should handle throttled response
    ok 9 - handleEnsurePresenceAction - should handle throttled response
      ---
      duration_ms: 0.715144
      type: 'test'
      ...
    # Subtest: handleEnsurePresenceAction - should show success on successful rebroadcast
    ok 10 - handleEnsurePresenceAction - should show success on successful rebroadcast
      ---
      duration_ms: 0.470788
      type: 'test'
      ...
    1..10
ok 201 - EngagementController
  ---
  duration_ms: 13.000138
  type: 'test'
  ...
# Subtest: HashtagStripHelper triggers scroll hint when content overflows
ok 202 - HashtagStripHelper triggers scroll hint when content overflows
  ---
  duration_ms: 148.70503
  type: 'test'
  ...
# Subtest: HashtagStripHelper does not trigger scroll hint when no overflow
ok 203 - HashtagStripHelper does not trigger scroll hint when no overflow
  ---
  duration_ms: 16.096791
  type: 'test'
  ...
# Subtest: opens a popover in the overlay root and positions the panel
ok 204 - opens a popover in the overlay root and positions the panel
  ---
  duration_ms: 523.695901
  type: 'test'
  ...
# Subtest: positions bottom-end panels flush with the trigger's right edge
ok 205 - positions bottom-end panels flush with the trigger's right edge
  ---
  duration_ms: 85.714005
  type: 'test'
  ...
# Subtest: closes on outside pointer events and restores focus
ok 206 - closes on outside pointer events and restores focus
  ---
  duration_ms: 48.001733
  type: 'test'
  ...
# Subtest: supports roving focus, home/end navigation, and typeahead
ok 207 - supports roving focus, home/end navigation, and typeahead
  ---
  duration_ms: 80.447634
  type: 'test'
  ...
# Subtest: escape closes the popover and restores trigger focus
ok 208 - escape closes the popover and restores trigger focus
  ---
  duration_ms: 57.489712
  type: 'test'
  ...
# Subtest: close respects restoreFocus option for contextual menus
ok 209 - close respects restoreFocus option for contextual menus
  ---
  duration_ms: 58.813542
  type: 'test'
  ...
# Subtest: ensures only one popover is open at a time
ok 210 - ensures only one popover is open at a time
  ---
  duration_ms: 122.003728
  type: 'test'
  ...
# Subtest: applies token-based sizing and arrow positioning
ok 211 - applies token-based sizing and arrow positioning
  ---
  duration_ms: 73.364108
  type: 'test'
  ...
# Subtest: moderation settings save updates service and disables control
ok 212 - moderation settings save updates service and disables control
  ---
  duration_ms: 210.658952
  type: 'test'
  ...
# Subtest: moderation reset restores defaults and clearing inputs uses defaults
ok 213 - moderation reset restores defaults and clearing inputs uses defaults
  ---
  duration_ms: 37.011113
  type: 'test'
  ...
# Subtest: guest fallback uses config moderation defaults
ok 214 - guest fallback uses config moderation defaults
  ---
  duration_ms: 31.542208
  type: 'test'
  ...
# Success: Profile added. Select it when you're ready to switch.
# Success: That profile is already saved on this device.
# Subtest: handleAddProfile adds a new profile correctly
ok 215 - handleAddProfile adds a new profile correctly
  ---
  duration_ms: 186.017645
  type: 'test'
  ...
# Subtest: handleAddProfile prevents duplicates
ok 216 - handleAddProfile prevents duplicates
  ---
  duration_ms: 37.205337
  type: 'test'
  ...
# Subtest: handleAddProfile handles missing login result
ok 217 - handleAddProfile handles missing login result
  ---
  duration_ms: 18.491167
  type: 'test'
  ...
# Subtest: handleAddProfile handles errors gracefully
ok 218 - handleAddProfile handles errors gracefully
  ---
  duration_ms: 19.567177
  type: 'test'
  ...
# Subtest: ReactionController
    # Subtest: should subscribe to reactions
    ok 1 - should subscribe to reactions
      ---
      duration_ms: 3.7752
      type: 'test'
      ...
    # Subtest: should handle reaction update from subscription
    ok 2 - should handle reaction update from subscription
      ---
      duration_ms: 0.809198
      type: 'test'
      ...
    # Subtest: should apply optimistic update on handleReaction
    ok 3 - should apply optimistic update on handleReaction
      ---
      duration_ms: 1.242105
      type: 'test'
      ...
    # Subtest: should rollback optimistic update on publish failure
    ok 4 - should rollback optimistic update on publish failure
      ---
      duration_ms: 0.68989
      type: 'test'
      ...
    # Subtest: should not react if user not logged in
    ok 5 - should not react if user not logged in
      ---
      duration_ms: 0.464169
      type: 'test'
      ...
    1..5
ok 219 - ReactionController
  ---
  duration_ms: 8.831315
  type: 'suite'
  ...
# Subtest: cached thumbnails reuse existing src without lazy-loading
ok 220 - cached thumbnails reuse existing src without lazy-loading
  ---
  duration_ms: 388.524686
  type: 'test'
  ...
# Subtest: uncached thumbnails use fallback, cache on load, and retain blur state
ok 221 - uncached thumbnails use fallback, cache on load, and retain blur state
  ---
  duration_ms: 56.257043
  type: 'test'
  ...
# Subtest: primary clicks trigger onPlay while modifiers and right clicks do not
ok 222 - primary clicks trigger onPlay while modifiers and right clicks do not
  ---
  duration_ms: 22.196902
  type: 'test'
  ...
# Subtest: author identity fields render supplied values and datasets
ok 223 - author identity fields render supplied values and datasets
  ---
  duration_ms: 16.741072
  type: 'test'
  ...
# Subtest: view counter wiring exposes pointer datasets
ok 224 - view counter wiring exposes pointer datasets
  ---
  duration_ms: 25.486588
  type: 'test'
  ...
# Subtest: SimilarContentController
    # Subtest: extractDTagValue
        # Subtest: should return the 'd' tag value
        ok 1 - should return the 'd' tag value
          ---
          duration_ms: 3.540585
          type: 'test'
          ...
        # Subtest: should return empty string if no 'd' tag
        ok 2 - should return empty string if no 'd' tag
          ---
          duration_ms: 0.93229
          type: 'test'
          ...
        1..2
    ok 1 - extractDTagValue
      ---
      duration_ms: 7.326776
      type: 'suite'
      ...
    # Subtest: computeCandidates
        # Subtest: should return empty array if no active video
        ok 1 - should return empty array if no active video
          ---
          duration_ms: 3.055599
          type: 'test'
          ...
        # Subtest: should compute similar candidates based on tags
        ok 2 - should compute similar candidates based on tags
          ---
          duration_ms: 2.526895
          type: 'test'
          ...
        # Subtest: should exclude blocked authors
        ok 3 - should exclude blocked authors
          ---
          duration_ms: 0.708492
          type: 'test'
          ...
        # Subtest: should prioritize higher shared tag count
        ok 4 - should prioritize higher shared tag count
          ---
          duration_ms: 1.240232
          type: 'test'
          ...
        1..4
    ok 2 - computeCandidates
      ---
      duration_ms: 7.945133
      type: 'suite'
      ...
    # Subtest: updateModal
        # Subtest: should clear similar content if no active video
        ok 1 - should clear similar content if no active video
          ---
          duration_ms: 1.142633
          type: 'test'
          ...
        # Subtest: should set similar content if matches found
        ok 2 - should set similar content if matches found
          ---
          duration_ms: 0.996783
          type: 'test'
          ...
        # Subtest: should clear similar content if no matches found
        ok 3 - should clear similar content if no matches found
          ---
          duration_ms: 0.609552
          type: 'test'
          ...
        1..3
    ok 3 - updateModal
      ---
      duration_ms: 3.281583
      type: 'suite'
      ...
    1..3
ok 225 - SimilarContentController
  ---
  duration_ms: 20.60612
  type: 'suite'
  ...
# [bitvid] [StorageService] Unlocked storage for 00000000...
# Subtest: StorageService
    # Subtest: should unlock storage with a valid signer
    ok 1 - should unlock storage with a valid signer
      ---
      duration_ms: 35.603001
      type: 'test'
      ...
# [bitvid] [StorageService] Unlocked storage for 00000000...
# [bitvid] [StorageService] Saved connection r2-test-1
    # Subtest: should save and retrieve an R2 connection
    ok 2 - should save and retrieve an R2 connection
      ---
      duration_ms: 7.51317
      type: 'test'
      ...
# [bitvid] [StorageService] Unlocked storage for 00000000...
# [bitvid] [StorageService] Saved connection s3-generic-1
    # Subtest: should save and retrieve a Generic S3 connection with extra fields
    ok 3 - should save and retrieve a Generic S3 connection with extra fields
      ---
      duration_ms: 3.425111
      type: 'test'
      ...
    # Subtest: should fail to get connection if locked
    ok 4 - should fail to get connection if locked
      ---
      duration_ms: 1.195423
      type: 'test'
      ...
    1..4
ok 226 - StorageService
  ---
  duration_ms: 207.366706
  type: 'suite'
  ...
# Subtest: renderTagPillStrip builds buttons with labels and icons
ok 227 - renderTagPillStrip builds buttons with labels and icons
  ---
  duration_ms: 128.387432
  type: 'test'
  ...
# Subtest: renderTagPillStrip applies preference state styling
ok 228 - renderTagPillStrip applies preference state styling
  ---
  duration_ms: 12.758982
  type: 'test'
  ...
# Subtest: renderTagPillStrip wires the activation callback
ok 229 - renderTagPillStrip wires the activation callback
  ---
  duration_ms: 10.48436
  type: 'test'
  ...
# Subtest: createTagPreferenceMenu renders heading and actions
ok 230 - createTagPreferenceMenu renders heading and actions
  ---
  duration_ms: 137.173753
  type: 'test'
  ...
# Subtest: createTagPreferenceMenu disables actions based on membership and login
ok 231 - createTagPreferenceMenu disables actions based on membership and login
  ---
  duration_ms: 16.832837
  type: 'test'
  ...
# Subtest: createTagPreferenceMenu forwards actions to callback
ok 232 - createTagPreferenceMenu forwards actions to callback
  ---
  duration_ms: 14.478815
  type: 'test'
  ...
# Subtest: TagPreferenceMenuController
    # Subtest: ensurePopover
        # Subtest: should create a new popover entry if one does not exist
        ok 1 - should create a new popover entry if one does not exist
          ---
          duration_ms: 3.344054
          type: 'test'
          ...
        # Subtest: should return existing entry if one exists
        ok 2 - should return existing entry if one exists
          ---
          duration_ms: 0.635958
          type: 'test'
          ...
        # Subtest: should return null if trigger or tag is missing
        ok 3 - should return null if trigger or tag is missing
          ---
          duration_ms: 0.63729
          type: 'test'
          ...
        1..3
    ok 1 - ensurePopover
      ---
      duration_ms: 6.054862
      type: 'suite'
      ...
    # Subtest: requestMenu
        # Subtest: should ensure popover, close others, and open the requested one
        ok 1 - should ensure popover, close others, and open the requested one
          ---
          duration_ms: 1.687397
          type: 'test'
          ...
        # Subtest: should close the popover if it is already open
        ok 2 - should close the popover if it is already open
          ---
          duration_ms: 0.741946
          type: 'test'
          ...
        1..2
    ok 2 - requestMenu
      ---
      duration_ms: 2.730693
      type: 'suite'
      ...
    # Subtest: handleMenuAction
        # Subtest: should call service method and notify update
        ok 1 - should call service method and notify update
          ---
          duration_ms: 0.926755
          type: 'test'
          ...
        # Subtest: should handle error and call showError
        ok 2 - should handle error and call showError
          ---
          duration_ms: 1.054688
          type: 'test'
          ...
        1..2
    ok 3 - handleMenuAction
      ---
      duration_ms: 2.212723
      type: 'suite'
      ...
    # Subtest: persistPreferencesFromMenu
        # Subtest: should call service.publish
        ok 1 - should call service.publish
          ---
          duration_ms: 0.929231
          type: 'test'
          ...
        # Subtest: should reuse in-flight promise
        ok 2 - should reuse in-flight promise
          ---
          duration_ms: 0.816076
          type: 'test'
          ...
        1..2
    ok 4 - persistPreferencesFromMenu
      ---
      duration_ms: 1.968681
      type: 'suite'
      ...
    1..4
ok 233 - TagPreferenceMenuController
  ---
  duration_ms: 14.100494
  type: 'suite'
  ...
# Subtest: TorrentStatusController throws if accessor is missing
ok 234 - TorrentStatusController throws if accessor is missing
  ---
  duration_ms: 1.920427
  type: 'test'
  ...
# Subtest: TorrentStatusController updates video modal and calls onRemovePoster
ok 235 - TorrentStatusController updates video modal and calls onRemovePoster
  ---
  duration_ms: 0.913224
  type: 'test'
  ...
# Subtest: TorrentStatusController handles missing modal gracefully
ok 236 - TorrentStatusController handles missing modal gracefully
  ---
  duration_ms: 0.435359
  type: 'test'
  ...
# Subtest: UploadModal Integration
    # Subtest: should detect default R2 connection and show summary when loaded and unlocked
    ok 1 - should detect default R2 connection and show summary when loaded and unlocked
      ---
      duration_ms: 88.374799
      type: 'test'
      ...
    # Subtest: should handle locked state and unlock flow
    ok 2 - should handle locked state and unlock flow
      ---
      duration_ms: 71.035522
      type: 'test'
      ...
    1..2
ok 237 - UploadModal Integration
  ---
  duration_ms: 12461.931063
  type: 'suite'
  ...
# Subtest: UploadModal Reset Logic
    # Subtest: should reset upload state and inputs when resetUploads is called
    ok 1 - should reset upload state and inputs when resetUploads is called
      ---
      duration_ms: 84.937916
      type: 'test'
      ...
    # Subtest: should guard against zombie callbacks when upload is reset during process
    ok 2 - should guard against zombie callbacks when upload is reset during process
      ---
      duration_ms: 49.261559
      type: 'test'
      ...
    # Subtest: should call resetUploads when close is called
    ok 3 - should call resetUploads when close is called
      ---
      duration_ms: 29.758134
      type: 'test'
      ...
    1..3
ok 238 - UploadModal Reset Logic
  ---
  duration_ms: 12454.644426
  type: 'suite'
  ...
# Subtest: UrlHealthController
    # Subtest: probeUrl returns ok for valid URL
    ok 1 - probeUrl returns ok for valid URL
      ---
      duration_ms: 145.966788
      type: 'test'
      ...
    # Subtest: probeUrl returns error for 404
    ok 2 - probeUrl returns error for 404
      ---
      duration_ms: 20.968229
      type: 'test'
      ...
    # Subtest: handleUrlHealthBadge updates badge
    ok 3 - handleUrlHealthBadge updates badge
      ---
      duration_ms: 74.556101
      type: 'test'
      ...
    # Subtest: getUrlHealthPlaceholderMarkup returns string
    ok 4 - getUrlHealthPlaceholderMarkup returns string
      ---
      duration_ms: 12.433907
      type: 'test'
      ...
    1..4
ok 239 - UrlHealthController
  ---
  duration_ms: 256.475682
  type: 'suite'
  ...
# Subtest: VideoListView renders sorted popular tag pills
ok 240 - VideoListView renders sorted popular tag pills
  ---
  duration_ms: 212.956198
  type: 'test'
  ...
# Subtest: VideoListView applies tag preference variants to popular tags
ok 241 - VideoListView applies tag preference variants to popular tags
  ---
  duration_ms: 31.804097
  type: 'test'
  ...
# Subtest: VideoListView hides popular tags when no tags are available
ok 242 - VideoListView hides popular tags when no tags are available
  ---
  duration_ms: 16.99555
  type: 'test'
  ...
# Subtest: VideoListView setModerationBlockHandler stores callable
ok 243 - VideoListView setModerationBlockHandler stores callable
  ---
  duration_ms: 7.56809
  type: 'test'
  ...
# Subtest: VideoListView sorts cards by original posted timestamp
ok 244 - VideoListView sorts cards by original posted timestamp
  ---
  duration_ms: 191.237388
  type: 'test'
  ...
# Subtest: Application.resetTorrentStats logic
    # Subtest: does not throw when videoModal is null
    ok 1 - does not throw when videoModal is null
      ---
      duration_ms: 1.177807
      type: 'test'
      ...
    # Subtest: does not throw when videoModal is undefined
    ok 2 - does not throw when videoModal is undefined
      ---
      duration_ms: 0.220906
      type: 'test'
      ...
    # Subtest: does not throw when videoModal lacks resetStats
    ok 3 - does not throw when videoModal lacks resetStats
      ---
      duration_ms: 0.24469
      type: 'test'
      ...
    # Subtest: calls resetStats when available
    ok 4 - calls resetStats when available
      ---
      duration_ms: 0.285872
      type: 'test'
      ...
    1..4
ok 245 - Application.resetTorrentStats logic
  ---
  duration_ms: 3.751519
  type: 'test'
  ...
# Subtest: NostrClient resilience to COUNT timeouts
ok 246 - NostrClient resilience to COUNT timeouts
  ---
  duration_ms: 3410.213123
  type: 'test'
  ...
# Subtest: normalizeCommentAvatarKey handles inputs correctly
ok 247 - normalizeCommentAvatarKey handles inputs correctly
  ---
  duration_ms: 1.879695
  type: 'test'
  ...
# Subtest: resolveCommentAvatarAsset resolves avatars correctly
ok 248 - resolveCommentAvatarAsset resolves avatars correctly
  ---
  duration_ms: 2.549098
  type: 'test'
  ...
# Subtest: registerCommentAvatarFailure registers failures correctly
ok 249 - registerCommentAvatarFailure registers failures correctly
  ---
  duration_ms: 0.807453
  type: 'test'
  ...
# Subtest: EditModalController
    # Subtest: open()
        # Subtest: should resolve target and open modal if authorized
        ok 1 - should resolve target and open modal if authorized
          ---
          duration_ms: 2.860263
          type: 'test'
          ...
        # Subtest: should show error if not logged in
        ok 2 - should show error if not logged in
          ---
          duration_ms: 0.775133
          type: 'test'
          ...
        # Subtest: should show error if user does not own video
        ok 3 - should show error if user does not own video
          ---
          duration_ms: 0.611814
          type: 'test'
          ...
        # Subtest: should handle modal load errors
        ok 4 - should handle modal load errors
          ---
          duration_ms: 0.86793
          type: 'test'
          ...
        1..4
    ok 1 - open()
      ---
      duration_ms: 6.441332
      type: 'suite'
      ...
    # Subtest: handleSubmit()
        # Subtest: should handle successful submission
        ok 1 - should handle successful submission
          ---
          duration_ms: 1.077154
          type: 'test'
          ...
        # Subtest: should show error if not logged in
        ok 2 - should show error if not logged in
          ---
          duration_ms: 0.508282
          type: 'test'
          ...
        # Subtest: should handle submission errors
        ok 3 - should handle submission errors
          ---
          duration_ms: 1.760887
          type: 'test'
          ...
        1..3
    ok 2 - handleSubmit()
      ---
      duration_ms: 3.628034
      type: 'suite'
      ...
    1..2
ok 250 - EditModalController
  ---
  duration_ms: 11.017249
  type: 'suite'
  ...
# Subtest: embed accent color configuration
ok 251 - embed accent color configuration
  ---
  duration_ms: 1.592274
  type: 'test'
  ...
# Subtest: EmbedPlayerModal interface
    # Subtest: has expected methods
    ok 1 - has expected methods
      ---
      duration_ms: 1.114341
      type: 'test'
      ...
    # Subtest: resetStats is no-op and does not throw
    ok 2 - resetStats is no-op and does not throw
      ---
      duration_ms: 0.438636
      type: 'test'
      ...
    1..2
ok 252 - EmbedPlayerModal interface
  ---
  duration_ms: 3.24567
  type: 'test'
  ...
# Subtest: createHashChangeHandler
    # Subtest: loads default view if hash is empty
    ok 1 - loads default view if hash is empty
      ---
      duration_ms: 2.676675
      type: 'test'
      ...
    # Subtest: redirects legacy view
    ok 2 - redirects legacy view
      ---
      duration_ms: 0.426208
      type: 'test'
      ...
    # Subtest: skips redundant reload
    ok 3 - skips redundant reload
      ---
      duration_ms: 0.522536
      type: 'test'
      ...
    1..3
ok 253 - createHashChangeHandler
  ---
  duration_ms: 6.960365
  type: 'test'
  ...
# Subtest: NotificationController
    # Subtest: should instantiate correctly
    ok 1 - should instantiate correctly
      ---
      duration_ms: 2.941558
      type: 'test'
      ...
    # Subtest: showError should update text content and show container
    ok 2 - showError should update text content and show container
      ---
      duration_ms: 1.377037
      type: 'test'
      ...
    # Subtest: showError should hide container when msg is empty
    ok 3 - showError should hide container when msg is empty
      ---
      duration_ms: 0.830572
      type: 'test'
      ...
    # Subtest: updateNotificationPortalVisibility should toggle active class on portal
    ok 4 - updateNotificationPortalVisibility should toggle active class on portal
      ---
      duration_ms: 0.680462
      type: 'test'
      ...
    # Subtest: showSuccess should update text content and show container
    ok 5 - showSuccess should update text content and show container
      ---
      duration_ms: 0.792501
      type: 'test'
      ...
    # Subtest: showStatus should update text content and show container
    ok 6 - showStatus should update text content and show container
      ---
      duration_ms: 1.190476
      type: 'test'
      ...
    # Subtest: showStatus should handle spinner option
    ok 7 - showStatus should handle spinner option
      ---
      duration_ms: 0.862749
      type: 'test'
      ...
    1..7
ok 254 - NotificationController
  ---
  duration_ms: 10.742208
  type: 'suite'
  ...
# Subtest: parseFilterQuery collects filters and text tokens
ok 255 - parseFilterQuery collects filters and text tokens
  ---
  duration_ms: 4.366637
  type: 'test'
  ...
# Subtest: serializeFiltersToQuery emits filter tokens in order
ok 256 - serializeFiltersToQuery emits filter tokens in order
  ---
  duration_ms: 0.543835
  type: 'test'
  ...
# Subtest: video search filter matcher enforces tags, duration, and nsfw when allowed
ok 257 - video search filter matcher enforces tags, duration, and nsfw when allowed
  ---
  duration_ms: 0.839765
  type: 'test'
  ...
# Subtest: video search filter matcher blocks nsfw when disallowed and requires url
ok 258 - video search filter matcher blocks nsfw when disallowed and requires url
  ---
  duration_ms: 0.264927
  type: 'test'
  ...
# Subtest: Security configuration: Development mode should be disabled in production
ok 259 - Security configuration: Development mode should be disabled in production
  ---
  duration_ms: 1.682853
  type: 'test'
  ...
# Subtest: Security configuration: Verbose diagnostics should be disabled in production
ok 260 - Security configuration: Verbose diagnostics should be disabled in production
  ---
  duration_ms: 0.231596
  type: 'test'
  ...
# Subtest: cardSourceVisibility
    # Subtest: updateVideoCardSourceVisibility
        # Subtest: should handle null or undefined input gracefully
        ok 1 - should handle null or undefined input gracefully
          ---
          duration_ms: 6.517719
          type: 'test'
          ...
        # Subtest: should resolve card from object with .card property
        ok 2 - should resolve card from object with .card property
          ---
          duration_ms: 2.323187
          type: 'test'
          ...
        # Subtest: should always show card if owner is viewer
        ok 3 - should always show card if owner is viewer
          ---
          duration_ms: 1.061809
          type: 'test'
          ...
        # Subtest: should show card if at least one source is healthy
        ok 4 - should show card if at least one source is healthy
          ---
          duration_ms: 1.180285
          type: 'test'
          ...
        # Subtest: should show card if at least one source is checking/pending
        ok 5 - should show card if at least one source is checking/pending
          ---
          duration_ms: 1.402412
          type: 'test'
          ...
        # Subtest: should hide card ONLY if both sources are failed (not healthy and not pending)
        ok 6 - should hide card ONLY if both sources are failed (not healthy and not pending)
          ---
          duration_ms: 0.763206
          type: 'test'
          ...
        # Subtest: should recover from hidden state when source becomes healthy
        ok 7 - should recover from hidden state when source becomes healthy
          ---
          duration_ms: 0.829118
          type: 'test'
          ...
        # Subtest: should check closest .card if element is not .card itself
        ok 8 - should check closest .card if element is not .card itself
          ---
          duration_ms: 8.122142
          type: 'test'
          ...
        1..8
    ok 1 - updateVideoCardSourceVisibility
      ---
      duration_ms: 23.79188
      type: 'suite'
      ...
    1..1
ok 261 - cardSourceVisibility
  ---
  duration_ms: 24.546735
  type: 'suite'
  ...
# Subtest: domUtils
    # Subtest: escapeHTML
        # Subtest: should return empty string for null or undefined
        ok 1 - should return empty string for null or undefined
          ---
          duration_ms: 1.464714
          type: 'test'
          ...
        # Subtest: should return the string as is if no special characters are present
        ok 2 - should return the string as is if no special characters are present
          ---
          duration_ms: 0.303492
          type: 'test'
          ...
        # Subtest: should escape special characters
        ok 3 - should escape special characters
          ---
          duration_ms: 0.194952
          type: 'test'
          ...
        # Subtest: should escape multiple occurrences of special characters
        ok 4 - should escape multiple occurrences of special characters
          ---
          duration_ms: 0.183855
          type: 'test'
          ...
        # Subtest: should handle mixed content correctly
        ok 5 - should handle mixed content correctly
          ---
          duration_ms: 0.27726
          type: 'test'
          ...
        # Subtest: should convert non-string inputs to string and escape
        ok 6 - should convert non-string inputs to string and escape
          ---
          duration_ms: 0.185122
          type: 'test'
          ...
        1..6
    ok 1 - escapeHTML
      ---
      duration_ms: 3.911667
      type: 'suite'
      ...
    # Subtest: removeTrackingScripts
        # Subtest: should do nothing if root is null or undefined
        ok 1 - should do nothing if root is null or undefined
          ---
          duration_ms: 0.321208
          type: 'test'
          ...
        # Subtest: should do nothing if root has no querySelectorAll
        ok 2 - should do nothing if root has no querySelectorAll
          ---
          duration_ms: 0.152362
          type: 'test'
          ...
        # Subtest: should remove scripts matching the tracking pattern
        ok 3 - should remove scripts matching the tracking pattern
          ---
          duration_ms: 25.344111
          type: 'test'
          ...
        # Subtest: should not remove inline scripts (no src)
        ok 4 - should not remove inline scripts (no src)
          ---
          duration_ms: 2.023777
          type: 'test'
          ...
        # Subtest: should remove scripts where src ends with tracking.js
        ok 5 - should remove scripts where src ends with tracking.js
          ---
          duration_ms: 0.717756
          type: 'test'
          ...
        # Subtest: should remove scripts where src contains /tracking.js
        ok 6 - should remove scripts where src contains /tracking.js
          ---
          duration_ms: 0.671588
          type: 'test'
          ...
        1..6
    ok 2 - removeTrackingScripts
      ---
      duration_ms: 29.725299
      type: 'suite'
      ...
    1..2
ok 262 - domUtils
  ---
  duration_ms: 34.552937
  type: 'suite'
  ...
# Subtest: hex utils
    # Subtest: normalizeHexString
        # Subtest: should return empty string for non-string inputs
        ok 1 - should return empty string for non-string inputs
          ---
          duration_ms: 1.182484
          type: 'test'
          ...
        # Subtest: should return empty string for empty or whitespace-only strings
        ok 2 - should return empty string for empty or whitespace-only strings
          ---
          duration_ms: 0.322248
          type: 'test'
          ...
        # Subtest: should trim and lowercase valid hex strings
        ok 3 - should trim and lowercase valid hex strings
          ---
          duration_ms: 0.16455
          type: 'test'
          ...
        1..3
    ok 1 - normalizeHexString
      ---
      duration_ms: 3.004354
      type: 'suite'
      ...
    # Subtest: aliases
        # Subtest: should export normalizeHexId as an alias
        ok 1 - should export normalizeHexId as an alias
          ---
          duration_ms: 0.197083
          type: 'test'
          ...
        # Subtest: should export normalizeHexPubkey as an alias
        ok 2 - should export normalizeHexPubkey as an alias
          ---
          duration_ms: 0.138313
          type: 'test'
          ...
        1..2
    ok 2 - aliases
      ---
      duration_ms: 0.514431
      type: 'suite'
      ...
    # Subtest: HEX64_REGEX
        # Subtest: should match valid 64-character hex strings
        ok 1 - should match valid 64-character hex strings
          ---
          duration_ms: 0.528693
          type: 'test'
          ...
        # Subtest: should not match strings with incorrect length
        ok 2 - should not match strings with incorrect length
          ---
          duration_ms: 0.180494
          type: 'test'
          ...
        # Subtest: should not match strings with non-hex characters
        ok 3 - should not match strings with non-hex characters
          ---
          duration_ms: 0.157585
          type: 'test'
          ...
        # Subtest: should not match empty strings
        ok 4 - should not match empty strings
          ---
          duration_ms: 0.124059
          type: 'test'
          ...
        1..4
    ok 3 - HEX64_REGEX
      ---
      duration_ms: 1.231643
      type: 'suite'
      ...
    # Subtest: normalizeHexHash
        # Subtest: should return empty string for non-string inputs
        ok 1 - should return empty string for non-string inputs
          ---
          duration_ms: 0.340891
          type: 'test'
          ...
        # Subtest: should return empty string for invalid hex
        ok 2 - should return empty string for invalid hex
          ---
          duration_ms: 0.175839
          type: 'test'
          ...
        # Subtest: should return normalized hex for valid inputs
        ok 3 - should return normalized hex for valid inputs
          ---
          duration_ms: 0.250846
          type: 'test'
          ...
        1..3
    ok 4 - normalizeHexHash
      ---
      duration_ms: 0.989127
      type: 'suite'
      ...
    1..4
ok 263 - hex utils
  ---
  duration_ms: 6.688774
  type: 'suite'
  ...
# Subtest: linkPreviewSettings
    # Subtest: getLinkPreviewSettings
        # Subtest: returns defaults when storage is empty
        ok 1 - returns defaults when storage is empty
          ---
          duration_ms: 5.302509
          type: 'test'
          ...
        # Subtest: returns stored settings
        ok 2 - returns stored settings
          ---
          duration_ms: 2.804879
          type: 'test'
          ...
        # Subtest: returns defaults when storage is invalid
        ok 3 - returns defaults when storage is invalid
          ---
          duration_ms: 0.828749
          type: 'test'
          ...
        # Subtest: sanitizes settings from storage
        ok 4 - sanitizes settings from storage
          ---
          duration_ms: 0.557287
          type: 'test'
          ...
        1..4
    ok 1 - getLinkPreviewSettings
      ---
      duration_ms: 11.396375
      type: 'suite'
      ...
    # Subtest: setLinkPreviewAutoFetch
        # Subtest: updates settings and persists to storage
        ok 1 - updates settings and persists to storage
          ---
          duration_ms: 1.538157
          type: 'test'
          ...
        # Subtest: emits an event on change
        ok 2 - emits an event on change
          ---
          duration_ms: 1.185831
          type: 'test'
          ...
        1..2
    ok 2 - setLinkPreviewAutoFetch
      ---
      duration_ms: 2.979782
      type: 'suite'
      ...
    # Subtest: allowLinkPreviewDomain
        # Subtest: adds a domain and persists to storage
        ok 1 - adds a domain and persists to storage
          ---
          duration_ms: 0.756068
          type: 'test'
          ...
        # Subtest: handles duplicates
        ok 2 - handles duplicates
          ---
          duration_ms: 0.530555
          type: 'test'
          ...
        # Subtest: normalizes domains
        ok 3 - normalizes domains
          ---
          duration_ms: 0.567285
          type: 'test'
          ...
        # Subtest: emits an event on change
        ok 4 - emits an event on change
          ---
          duration_ms: 0.591984
          type: 'test'
          ...
        # Subtest: respects silent option
        ok 5 - respects silent option
          ---
          duration_ms: 0.428656
          type: 'test'
          ...
        1..5
    ok 3 - allowLinkPreviewDomain
      ---
      duration_ms: 3.329823
      type: 'suite'
      ...
    # Subtest: isLinkPreviewDomainAllowed
        # Subtest: returns true for allowed domains
        ok 1 - returns true for allowed domains
          ---
          duration_ms: 1.783386
          type: 'test'
          ...
        # Subtest: returns false for disallowed domains
        ok 2 - returns false for disallowed domains
          ---
          duration_ms: 0.484738
          type: 'test'
          ...
        # Subtest: handles normalization
        ok 3 - handles normalization
          ---
          duration_ms: 0.630805
          type: 'test'
          ...
        # Subtest: accepts settings object as second argument
        ok 4 - accepts settings object as second argument
          ---
          duration_ms: 0.615301
          type: 'test'
          ...
        1..4
    ok 4 - isLinkPreviewDomainAllowed
      ---
      duration_ms: 3.8393
      type: 'suite'
      ...
    # Subtest: subscribeToLinkPreviewSettings
        # Subtest: calls callback on event emission
        ok 1 - calls callback on event emission
          ---
          duration_ms: 2.669138
          type: 'test'
          ...
        # Subtest: unsubscribes correctly
        ok 2 - unsubscribes correctly
          ---
          duration_ms: 1.30425
          type: 'test'
          ...
        1..2
    ok 5 - subscribeToLinkPreviewSettings
      ---
      duration_ms: 4.438213
      type: 'suite'
      ...
    1..5
ok 264 - linkPreviewSettings
  ---
  duration_ms: 27.601216
  type: 'suite'
  ...
# Subtest: LRUCache
    # Subtest: should initialize with default options
    ok 1 - should initialize with default options
      ---
      duration_ms: 1.632087
      type: 'test'
      ...
    # Subtest: should store and retrieve values
    ok 2 - should store and retrieve values
      ---
      duration_ms: 0.393686
      type: 'test'
      ...
    # Subtest: should evict oldest item when limit is reached
    ok 3 - should evict oldest item when limit is reached
      ---
      duration_ms: 0.421783
      type: 'test'
      ...
    # Subtest: should refresh recency on access
    ok 4 - should refresh recency on access
      ---
      duration_ms: 0.260162
      type: 'test'
      ...
    # Subtest: should update value and refresh recency on set
    ok 5 - should update value and refresh recency on set
      ---
      duration_ms: 0.272177
      type: 'test'
      ...
    # Subtest: should track stats
    ok 6 - should track stats
      ---
      duration_ms: 0.325781
      type: 'test'
      ...
    # Subtest: should clear cache
    ok 7 - should clear cache
      ---
      duration_ms: 0.369736
      type: 'test'
      ...
    1..7
ok 265 - LRUCache
  ---
  duration_ms: 5.72808
  type: 'suite'
  ...
# Subtest: sanitizeProfileMediaUrl handles non-string inputs
ok 266 - sanitizeProfileMediaUrl handles non-string inputs
  ---
  duration_ms: 2.229473
  type: 'test'
  ...
# Subtest: sanitizeProfileMediaUrl handles empty or whitespace-only strings
ok 267 - sanitizeProfileMediaUrl handles empty or whitespace-only strings
  ---
  duration_ms: 0.349463
  type: 'test'
  ...
# Subtest: sanitizeProfileMediaUrl trims whitespace and removes quotes
ok 268 - sanitizeProfileMediaUrl trims whitespace and removes quotes
  ---
  duration_ms: 0.86152
  type: 'test'
  ...
# Subtest: sanitizeProfileMediaUrl allows data:image/ URLs
ok 269 - sanitizeProfileMediaUrl allows data:image/ URLs
  ---
  duration_ms: 0.175642
  type: 'test'
  ...
# Subtest: sanitizeProfileMediaUrl allows blob: URLs
ok 270 - sanitizeProfileMediaUrl allows blob: URLs
  ---
  duration_ms: 0.152169
  type: 'test'
  ...
# Subtest: sanitizeProfileMediaUrl rejects specific placeholder images
ok 271 - sanitizeProfileMediaUrl rejects specific placeholder images
  ---
  duration_ms: 0.135103
  type: 'test'
  ...
# Subtest: sanitizeProfileMediaUrl normalizes IPFS URLs
ok 272 - sanitizeProfileMediaUrl normalizes IPFS URLs
  ---
  duration_ms: 0.351838
  type: 'test'
  ...
# Subtest: sanitizeProfileMediaUrl handles protocol-relative URLs
ok 273 - sanitizeProfileMediaUrl handles protocol-relative URLs
  ---
  duration_ms: 0.153773
  type: 'test'
  ...
# Subtest: sanitizeProfileMediaUrl allows relative paths
ok 274 - sanitizeProfileMediaUrl allows relative paths
  ---
  duration_ms: 0.157099
  type: 'test'
  ...
# Subtest: sanitizeProfileMediaUrl adds protocol to domains and localhost
ok 275 - sanitizeProfileMediaUrl adds protocol to domains and localhost
  ---
  duration_ms: 0.670497
  type: 'test'
  ...
# Subtest: sanitizeProfileMediaUrl coerces http to https except for localhost
ok 276 - sanitizeProfileMediaUrl coerces http to https except for localhost
  ---
  duration_ms: 0.189886
  type: 'test'
  ...
# Subtest: sanitizeProfileMediaUrl rejects unsupported patterns
ok 277 - sanitizeProfileMediaUrl rejects unsupported patterns
  ---
  duration_ms: 0.219572
  type: 'test'
  ...
# Subtest: dedupeToNewestByRoot replaces entries with missing timestamps
ok 278 - dedupeToNewestByRoot replaces entries with missing timestamps
  ---
  duration_ms: 1.700973
  type: 'test'
  ...
# Subtest: dedupeToNewestByRoot replaces entries with non-numeric timestamps
ok 279 - dedupeToNewestByRoot replaces entries with non-numeric timestamps
  ---
  duration_ms: 0.262838
  type: 'test'
  ...
# Subtest: collectVideoTags dedupes across metadata sources and respects casing
ok 280 - collectVideoTags dedupes across metadata sources and respects casing
  ---
  duration_ms: 16.237847
  type: 'test'
  ...
# Subtest: collectVideoTags sorts case-insensitively and adds hashes when requested
ok 281 - collectVideoTags sorts case-insensitively and adds hashes when requested
  ---
  duration_ms: 0.388412
  type: 'test'
  ...
# Subtest: collectVideoTags handles malformed inputs safely
ok 282 - collectVideoTags handles malformed inputs safely
  ---
  duration_ms: 0.232333
  type: 'test'
  ...
# Subtest: resolveVideoPointer returns address pointer with dTag
ok 283 - resolveVideoPointer returns address pointer with dTag
  ---
  duration_ms: 2.990855
  type: 'test'
  ...
# Subtest: resolveVideoPointer returns address pointer with videoRootId
ok 284 - resolveVideoPointer returns address pointer with videoRootId
  ---
  duration_ms: 0.379857
  type: 'test'
  ...
# Subtest: resolveVideoPointer returns event pointer with fallbackEventId
ok 285 - resolveVideoPointer returns event pointer with fallbackEventId
  ---
  duration_ms: 0.280218
  type: 'test'
  ...
# Subtest: resolveVideoPointer prioritizes dTag over videoRootId
ok 286 - resolveVideoPointer prioritizes dTag over videoRootId
  ---
  duration_ms: 0.185781
  type: 'test'
  ...
# Subtest: resolveVideoPointer prioritizes videoRootId over fallbackEventId
ok 287 - resolveVideoPointer prioritizes videoRootId over fallbackEventId
  ---
  duration_ms: 0.189737
  type: 'test'
  ...
# Subtest: resolveVideoPointer prioritizes dTag over fallbackEventId
ok 288 - resolveVideoPointer prioritizes dTag over fallbackEventId
  ---
  duration_ms: 0.169395
  type: 'test'
  ...
# Subtest: resolveVideoPointer includes relay in pointer
ok 289 - resolveVideoPointer includes relay in pointer
  ---
  duration_ms: 0.236497
  type: 'test'
  ...
# Subtest: resolveVideoPointer normalizes inputs
ok 290 - resolveVideoPointer normalizes inputs
  ---
  duration_ms: 0.165222
  type: 'test'
  ...
# Subtest: resolveVideoPointer uses default kind when kind is missing or invalid
ok 291 - resolveVideoPointer uses default kind when kind is missing or invalid
  ---
  duration_ms: 0.218549
  type: 'test'
  ...
# Subtest: resolveVideoPointer returns null for invalid inputs
ok 292 - resolveVideoPointer returns null for invalid inputs
  ---
  duration_ms: 0.19427
  type: 'test'
  ...
# Subtest: getVideoRootIdentifier
    # Subtest: returns empty string for invalid inputs
    ok 1 - returns empty string for invalid inputs
      ---
      duration_ms: 1.174713
      type: 'test'
      ...
    # Subtest: returns videoRootId when present
    ok 2 - returns videoRootId when present
      ---
      duration_ms: 0.203587
      type: 'test'
      ...
    # Subtest: returns id when videoRootId is missing
    ok 3 - returns id when videoRootId is missing
      ---
      duration_ms: 0.162021
      type: 'test'
      ...
    # Subtest: returns id when videoRootId is not a string
    ok 4 - returns id when videoRootId is not a string
      ---
      duration_ms: 0.224889
      type: 'test'
      ...
    1..4
ok 293 - getVideoRootIdentifier
  ---
  duration_ms: 3.585578
  type: 'test'
  ...
# Subtest: applyRootTimestampToVideosMap
    # Subtest: returns early if videosMap is not a Map
    ok 1 - returns early if videosMap is not a Map
      ---
      duration_ms: 0.28578
      type: 'test'
      ...
    # Subtest: updates rootCreatedAt for matching video ID
    ok 2 - updates rootCreatedAt for matching video ID
      ---
      duration_ms: 0.237092
      type: 'test'
      ...
    # Subtest: updates rootCreatedAt for other videos with same rootId
    ok 3 - updates rootCreatedAt for other videos with same rootId
      ---
      duration_ms: 0.237867
      type: 'test'
      ...
    # Subtest: skips invalid stored objects in map
    ok 4 - skips invalid stored objects in map
      ---
      duration_ms: 0.179197
      type: 'test'
      ...
    1..4
ok 294 - applyRootTimestampToVideosMap
  ---
  duration_ms: 1.708246
  type: 'test'
  ...
# Subtest: syncActiveVideoRootTimestamp
    # Subtest: returns false for invalid timestamp
    ok 1 - returns false for invalid timestamp
      ---
      duration_ms: 0.326152
      type: 'test'
      ...
    # Subtest: returns false for invalid activeVideo
    ok 2 - returns false for invalid activeVideo
      ---
      duration_ms: 0.15995
      type: 'test'
      ...
    # Subtest: returns false if activeVideo has no root identifier
    ok 3 - returns false if activeVideo has no root identifier
      ---
      duration_ms: 0.185806
      type: 'test'
      ...
    # Subtest: returns false if rootId mismatch
    ok 4 - returns false if rootId mismatch
      ---
      duration_ms: 0.2424
      type: 'test'
      ...
    # Subtest: returns false if timestamp already matches
    ok 5 - returns false if timestamp already matches
      ---
      duration_ms: 0.168526
      type: 'test'
      ...
    # Subtest: updates activeVideo and displayTags
    ok 6 - updates activeVideo and displayTags
      ---
      duration_ms: 0.682823
      type: 'test'
      ...
    # Subtest: calls videoModal.updateMetadata if provided
    ok 7 - calls videoModal.updateMetadata if provided
      ---
      duration_ms: 0.326218
      type: 'test'
      ...
    1..7
ok 295 - syncActiveVideoRootTimestamp
  ---
  duration_ms: 3.629393
  type: 'test'
  ...
# watch-history-telemetry tests passed
# Subtest: tests/watchHistory/watch-history-telemetry.test.mjs
ok 124 - tests/watchHistory/watch-history-telemetry.test.mjs
  ---
  duration_ms: 333.568159
  type: 'test'
  ...
1..296
# tests 680
# suites 105
# pass 680
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 44304.038848
# start of coverage report
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# file                                            | line % | branch % | funcs % | uncovered lines
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# config                                          |        |          |         |
#  instance-config.js                             | 100.00 |   100.00 |  100.00 |
# js                                              |        |          |         |
#  accessControl.js                               |  17.60 |    55.56 |   10.26 | 21-23 25-32 34-53 55-65 67-86 88-103 130-131 145-146 155-159 161-163 167-243 246-333 336-351 354-369 372-387 390-417 420-433 436-450 453-457 460-461 464-466 469-477 480-481 484-485 488-489 492-493 496-505 508-517 520-529 532-553 556-573 576-601 604-623 626-660 663-682 685-691 694-705 708-793 796-797
#  adminListStore.js                              |   9.01 |    25.00 |    3.45 | 28-35 37-46 48-50 54-63 65-75 81 84-127 132-149 151-162 164-191 193-195 197-226 228-234 239-240 243-244 250-255 260-262 265-270 274-291 294-319 321-356 358-438 440-458 460-506 508-522 524-583 585-604 606-614 616-672 674-705 707-826 828-946 949-1016 1019-1026
#  app.js                                         |  22.64 |    96.77 |    2.93 | 212-213 216-217 220-221 224-225 228-229 232-233 236-237 240-241 244-245 248-249 252-255 258-545 702-703 706-709 712-715 718-725 728-729 732-733 736-737 740-741 744-746 749-764 767-775 778-779 782-808 811-815 818-821 824-830 833-851 854-973 976-1025 1028-1033 1036-1041 1044-1074 1077-1100 1103-1136 1139-1143 1146-1147 1150-1195 1198-1217 1220-1253 1256-1265 1268-1272 1275-1276 1279-1280 1283-1289 1292-1293 1296-1297 1300-1303 1306-1323 1326-1328 1331-1333 1336-1359 1362-1374 1377-1379 1382-1384 1387-1389 1392-1394 1397-1399 1402-1404 1410-1412 1415-1417 1420-1422 1425-1427 1430-1456 1459-1475 1478-1496 1499-1506 1509-1513 1516-1518 1521-1523 1526-1528 1531-1533 1537-1570 1573-1599 1602-1604 1607-1610 1613-1654 1657-1669 1672-1673 1676-1678 1681-1715 1718-1743 1746-1784 1787-1803 1806-1923 1926-1937 1940-1963 1966-1988 1991-2013 2016-2060 2063-2072 2075-2089 2092-2108 2111-2137 2140-2154 2157-2182 2185-2186 2189-2202 2205-2211 2214-2277 2280-2310 2313-2332 2335-2378 2381-2402 2405-2428 2431-2454 2457-2480 2483-2498 2501-2599 2602-2608 2614-2646 2649-2681 2684-2731 2737-2738 2741-2742 2745-2755 2758-2759 2762-2765 2768-2774 2777-2787 2790-2911 2914-2915 2918-2974 2977-3007 3010-3019 3022-3039 3042-3057 3060-3109 3112-3165 3171-3223 3226-3228 3231-3233 3236-3238 3241-3243 3246-3248 3251-3253 3256-3258 3261-3263 3266-3268 3271-3273 3276-3278 3281-3283 3286-3288 3291-3293 3296-3298 3301-3303 3306-3307 3310-3311 3314-3315 3318-3319 3357-3369 3372-3373 3376-3377 3380-3381 3424-3426 3429-3545 3548-3634 3637-3639 3642-3644 3647-3649 3652-3654 3657-3659 3662-3664 3667-3669 3672-3674 3684-3686 3689-3691 3694-3696 3699-3701 3704-3706 3709-3711 3714-3716 3719-3721 3724-3726 3729-3731 3734-3736 3739-3741 3744-3746 3749-3751 3754-3756 3759-3761 3764-3766 3769-3771 3774-3776 3779-3781 3784-3786 3790-3792 3795-3797 3800-3802 3805-3807 3810-3812 3815-3817 3820-3822 3825-3827 3830-3832 3835-3837 3840-3842 3848-3850 3856-3858 3864-3866 3872-3874 3880-3882 3885-3887 3890-3892 3895-3897 3900-3902 3905-3907 3910-3912 3915-3917 3920-3922 3925-3927 3930-3932 3935-3937 3940-3942 3945-3947 3953-3955 3958-3960 3963-3965 3968-3970 3973-3975 3982-3984 3992-3994 3997-3999 4002-4004 4007-4009 4012-4014 4017-4019 4022-4024 4027-4029 4032-4034 4037-4039 4042-4044 4047-4049 4052-4054 4057-4059 4062-4064 4067-4069 4072-4074 4077-4079 4082-4084 4087-4089 4092-4094 4097-4099 4102-4104 4107-4109 4112-4114 4117-4119 4122-4124 4127-4129 4132-4134 4137-4139 4142-4144 4147-4149 4152-4154 4157-4159 4162-4164 4167-4169 4172-4174 4177-4179 4182-4184 4187-4189 4192-4194 4197-4199 4202-4204 4207-4286 4289-4292 4295-4303 4306-4309 4312-4340 4343-4359 4362-4365 4368-4372 4375-4376 4379-4380 4383-4384 4387-4388 4391-4394 4397-4402 4405-4408 4411-4414 4417-4420 4428-4431 4434-4491 4494-4610 4616-4619 4622-4625 4628-4631 4634-4637 4640-4687 4693-4732 4738-4740 4743-4745 4748-4750 4753-4755 4758-4760 4767-4769 4773-4775 4778-4780 4783-4785 4788-4790 4793-4795 4798-4800 4803-4805 4808-4810 4816-4817 4820-4821 4824-4827 4830-4833 4836-4839 4842-4845 4848-4851 4854-4857 4860-4865 4868-4869 4876-4877 4883-4884 4887-4888 4891-4892 4895-4898 4901-4906 4909-4912 4915-4918 4921-4932 4935-5177 5180-5183 5186-5201 5204-5207 5213-5233
#  app                                            |        |          |         |
#   authSessionCoordinator.js                     |   9.18 |    66.67 |    2.86 | 57-74 78-127 132-749 753-775 779-783 787-799 803-823 827-838 842-854 858-1001 1005-1024 1035-1179 1183-1193 1197-1201 1205-1218 1222 1226-1229 1233-1260 1264-1271 1275-1343 1347-1417 1421-1488 1492-1586 1590 1594 1598-1650 1654-1714 1718 1722 1726-1728 1732-1735 1739
#   bindCoordinator.js                            | 100.00 |    75.00 |  100.00 |
#   feedCoordinator.js                            |  16.14 |    46.15 |    8.93 | 51-116 123-192 199-333 340-407 411-482 486-507 511-588 592-649 653-666 670-790 794-919 923-954 971-975 983-987 989-993 995-998 1015-1016 1039-1040 1053-1073 1081 1085 1089-1099 1107-1116 1125 1129-1145 1149 1153 1157 1161 1165 1169-1205 1209-1240 1244-1261 1265-1267 1271 1275-1338 1342 1346-1358 1362-1369 1373-1399 1403-1485 1489-1493 1497-1519 1523-1539 1543-1556 1560-1569 1573-1608 1612 1616-1646 1650 1654-1704 1708-1750 1754-1763
#   modalCoordinator.js                           |  19.32 |   100.00 |    3.33 | 36-54 58-59 63 67 74-76 80 84 88-90 94-96 100-102 106-108 112-123 127-192 196-275 279 283 287-321 325-344 348-364 368-374 378-381 385-401 405-418 422-444 448-466 470-591 595-605 609-611 615-644
#   moderationCoordinator.js                      |  22.53 |   100.00 |    6.25 | 29-91 95-162 166 170 174 178 182-185 189-201 205-241 245-259 263-283 287-292 296-301 305-310 314-321
#   playbackCoordinator.js                        |   9.70 |   100.00 |    4.17 | 46-81 85-105 109-157 161-168 172-182 186-189 193-209 213-263 267-275 279-284 288 292-308 312-330 334-443 451-539 543-858 862-891 895-925 929-965 969-1001 1005-1083 1087-1111 1115-1213
#   routerCoordinator.js                          |  28.41 |   100.00 |   25.00 | 18-45 49-66 70-86
#   uiCoordinator.js                              |  65.48 |    72.00 |   71.43 | 20-31 35-53 57-85 184-185 188-189 221-223 236-238 254-256 269-273 280-308
#  applicationContext.js                          |  66.67 |   100.00 |   50.00 | 15-20 23-24
#  attachments                                    |        |          |         |
#   attachmentUtils.js                            |  16.67 |   100.00 |    0.00 | 16-24 26-32 34-40 43-101 104-125 128-143 146-160
#  auth                                           |        |          |         |
#   signingAdapter.js                             | 100.00 |   100.00 |  100.00 |
#  channelProfile.js                              |  22.68 |    45.45 |   25.17 | 102-122 124-145 158-159 164-205 209-210 221-225 229-240 252-253 258-259 271-272 283 301-305 331-336 339-340 346-347 351-352 364-365 378-379 385-389 399-406 408-414 440-442 461-462 464-465 469-472 480-482 487-492 503-504 508-509 515-516 520-521 543-544 552-553 649-651 668-670 682-683 720-721 724-732 734-735 738-742 744-745 751-752 759-760 767-768 793-794 806-807 812-814 817-868 870-910 925-926 932-933 936-937 1004-1005 1054-1059 1066-1067 1080-1092 1099-1100 1108-1112 1121-1122 1126-1127 1132-1133 1137-1138 1142-1143 1161-1162 1167-1168 1172-1173 1178-1179 1223-1239 1242-1281 1318-1324 1326-1343 1364-1382 1384-1407 1409-1437 1439-1488 1490-1537 1539-1602 1604-1642 1644-1652 1654-1737 1739-1750 1752-1756 1758-1769 1771-1787 1789-1819 1821-1841 1843-1863 1865-1885 1887-1907 1909-1929 1931-1951 1953-1973 1975-1995 1997-2017 2019-2046 2048-2115 2117-2125 2127-2156 2158-2167 2169-2174 2176-2227 2229-2258 2260-2297 2299-2334 2336-2342 2344-2438 2440-2455 2457-2477 2479-2502 2504-2519 2521-2574 2576-2751 2753-2772 2774-2856 2858-2862 2864-2941 2943-2994 2996-3262 3264-3290 3292-3302 3304-3332 3334-3340 3342-3401 3403-3557 3559-3583 3585-3695 3702-3834 3841-3842 3846-3851 3858-4115 4121-4205 4207-4213 4215-4250 4252-4287 4289-4307 4309-4333 4335-4416 4418-4454 4456-4501 4511-4515 4518-4519 4524-4530 4536-4541 4544-4545 4552-4558 4583-4623 4632-4666 4673-4674 4688-4689 4692-4693 4700-4701 4719-4720 4722-4723 4780 4791-4793 4800-4803 4807-4811 4815-4819 4823-4827 4831-4835 4839-4843 4847-4851 4855-4861 4865-4868 4872-4878 4882-4885 4889-4891 4895-4898 4908-4914 4920-4921 4936-5091 5093-5131 5136-5247 5254-5284 5286-5429 5432-5514 5519-5529
#  config.js                                      |  88.82 |    62.50 |   66.67 | 58-65 135-139 143-148
#  constants.js                                   |  82.76 |    60.00 |   51.22 | 40-41 45-46 55-70 85-86 89-90 92-93 96-97 103-104 111-112 119-120 123-124 126-127 197-198 277 288 302 316 330 344 372 386 399 413 438-440 443-445 453-455 458-460 463-465 468-470 473-485 490-492 495-497 500-502
#  designSystem.js                                |  32.65 |    77.78 |   33.33 | 12-13 16-17 37-98
#  designSystem                                   |        |          |         |
#   dynamicStyles.js                              |  76.62 |    63.53 |   94.12 | 10-11 14-15 25-26 35 45-46 53-60 97-98 107-108 114-115 120-121 126-127 173-174 178 183-184 187-188 194-195 200-201 206-207 222-223 242-243 261-262 264-289
#   metrics.js                                    |  65.74 |    53.66 |   48.00 | 32-33 36-37 41-42 63-64 80-81 92-116 118-131 136-137 140-141 154-155 157-158 162-168 177-178 181-182 185-186 189-190 193-194 197-198 201-202 205-206 209-210 217-218 221-222
#  directMessagesStore.js                         |  47.77 |    35.71 |   70.00 | 16-17 23-25 41 48-49 53-54 59 61-74 80-81 93-94 102-103 107-108 111-112 119-120 126-127 146-147 155-156 159-169 183-235 242-244 267-276 278-284 288-336
#  dmDecryptor.js                                 |  50.38 |    38.04 |   76.00 | 14-15 27-34 36-62 66-67 71-72 84-85 88-89 96 105-106 110-125 133-134 137-141 153-154 158-159 164-171 187-188 193-194 198-199 218-219 224-226 236 241-242 244-245 247-248 254-255 262-271 278-279 291-293 346-370 372-468 478-489 499-500 507-508 545 569-578 583-594 598-609 615-626 629-648
#  dom                                            |        |          |         |
#   cardObserver.js                               |  44.02 |    46.67 |   45.45 | 4-11 17 37-38 54 65-87 90-149 153-154 160-161 163-164 174-175 182-183 189-197 200-202
#  embedDiagnostics.js                            |   3.95 |   100.00 |    0.00 | 6-167 170-177
#  feedEngine                                     |        |          |         |
#   engine.js                                     |  18.70 |   100.00 |    0.00 | 41-49 51-56 58-76 78-112 114-142 144-181 184-260
#   exploreScoring.js                             |  84.04 |    58.06 |  100.00 | 19-20 47-58 64-65 90-91 108-116 122-123 127-128 131-132 147-150 159-162 181-182 196-197 211-212 214-215 217-218 238-239 252-253 280-281 300-301 308-309 325-326 330-331 376-380 392-393
#   index.js                                      | 100.00 |   100.00 |  100.00 |
#   kidsAudienceFilterStage.js                    |  11.18 |   100.00 |    0.00 | 14-20 22-43 45-51 53-72 75-161
#   kidsScoring.js                                |  87.12 |    53.19 |  100.00 | 42-43 56-57 61-62 85 109-110 124-125 133-134 149-150 179-180 187-188 191-192 199-200 231 250-251 270-273 277-278 282-283 310-311 317-318 320-321 345-346 369-371 373-375 377-379
#   sorters.js                                    |  50.20 |    66.15 |   66.67 | 7-139 145-146 150-151 154-155 168-171 178-179 195-196 211-212 214-215 219-231 237-244 256-257 267-268 272-273 280-281 294-295 297-298 387-391 410-426 430-431 464-508
#   sources.js                                    |   5.88 |   100.00 |    0.00 | 7-12 14-20 22-32 35-63 66-169 172-238
#   stages.js                                     |  61.08 |    66.03 |   65.63 | 32-43 46-95 97-137 139-163 165-200 203-282 325-331 335-336 343-345 387-388 407-457 459-475 478-523 542 646-652 673-675 686-687 706-707 724-736 759-760 768-771 774-776 813-822 827-828 831-832 836-839 841-845 848-851 854-861 864-872 882-884 888-890 900-901 913-921 924-932 961-962 965-966 976-980 996-997 1022-1026 1109-1110 1156-1157 1161-1162 1258-1259 1264-1265 1270-1281 1306-1313
#   utils.js                                      |  69.79 |    73.68 |   71.43 | 26-27 35-42 46-47 50-51 57-58 84-96
#   watchHistoryFeed.js                           |   5.64 |   100.00 |    0.00 | 22-24 26-28 30-40 42-59 61-86 88-98 100-168 170-224 226-234 236-250 252-267 269-458 460-559 561-601 603-630 633-661 664-691
#  gridHealth.js                                  |  24.41 |    17.65 |   25.00 | 20-35 39-41 43-71 73-80 82-91 93-123 125-175 177-229 244-255 258-270 273-309 318-319 333 335-336 341-342 350-351 356-386 389-393 400-403 412-419 433-506 513-514 517-522 530-541 547-548 550-551
#  gridHealthLogic.js                             |   5.22 |   100.00 |    0.00 | 4-16 19-31 34-134
#  hashChangeHandler.js                           |  85.51 |    71.43 |   62.50 | 25-26 51 56-57 60-61 75-79 86-88 98-99 124 135-136
#  hashView.js                                    |  20.00 |   100.00 |    0.00 | 6-15 18-35
#  historyView.js                                 |  10.14 |    27.27 |    2.53 | 34-35 43-51 53-64 66-76 78-83 85-87 89-134 136-146 148-168 170-195 197-215 217-263 265-305 307-316 318-329 331-347 349-363 365-373 378-384 386-389 391-405 407-415 417-431 433-454 456-471 473-494 496-502 504-510 512-533 535-579 581-646 648-791 793-866 868-881 883-954 956-1027 1029-1103 1105-1120 1123-1391 1398-1445 1466-1471 1539-1555 1558-1572 1575-1614 1617-1631 1634-1645 1648-1671 1674-1734 1737-1753 1756-1763 1766-1771 1774-1779 1782-1795 1798-1820 1823-1846 1849-1860 1863-1868 1871-1887 1890-1910 1913-1955 1958-2046 2049-2122 2125-2136 2139-2190 2193-2297 2300-2315 2319-2343 2346-2364 2367-2386 2389-2396 2399 2402 2405-2436 2439-2510 2513 2516-2520 2530-2538
#  lists.js                                       | 100.00 |   100.00 |  100.00 |
#  magnets.js                                     |  13.54 |   100.00 |   25.00 | 3-20 31-50 52-96
#  magnetShared.js                                |  45.63 |    45.76 |   50.00 | 16-17 28-29 31-34 41-42 45-46 61-90 95-96 101-103 109-110 113-114 117-118 131-135 139-140 182-184 188-189 196-198 202-211 216-217 231-232 238-240 258-262 264-289 292-309 311-328 331-347 350-357 360-407 414 416-417 419-420
#  magnetUtils.js                                 |  16.28 |   100.00 |    0.00 | 22-129
#  nostr                                          |        |          |         |
#   adapters                                      |        |          |         |
#    nip07Adapter.js                              |  58.26 |    67.50 |   50.00 | 11-12 14-15 20-33 35 65-85 90-91 116-126 130-139 143-153 159-160 171-185 192-195 198-201 206-207
#    nip46Adapter.js                              |  75.00 |    45.45 |   22.22 | 16-36 47-48
#    nsecAdapter.js                               |  79.12 |    40.00 |   55.56 | 13-14 17-18 27-31 34-41 56-57
#   cachePolicies.js                              | 100.00 |   100.00 |  100.00 |
#   client.js                                     |  50.44 |    40.00 |   41.89 | 230-237 267-269 273-274 311-330 332-345 361-362 364-365 367-368 381-383 394-396 486-492 500-506 514-520 528-534 542-545 553-556 564-565 623-673 677-678 682-683 689-690 707-708 712-713 719-720 761-762 775-777 851-852 855-856 859-860 863-864 867-873 882-886 889-894 902-914 916-928 930-931 940-941 944-945 948-949 952-958 961-967 970-976 979-983 986-990 993-994 997-998 1020-1057 1069-1070 1073-1074 1077-1078 1081-1082 1085-1086 1089-1090 1093-1094 1097-1098 1101-1102 1120-1121 1124-1128 1131-1134 1138-1139 1145-1146 1151-1152 1162-1163 1167 1169-1170 1177-1178 1183-1184 1201-1202 1204-1205 1210 1212-1222 1228 1230-1243 1267 1269-1332 1353-1358 1388-1482 1486-1487 1503-1504 1515-1520 1523-1524 1532-1541 1552-1553 1555-1566 1571-1578 1611-1626 1629-1943 1962 1967-1976 1989-1990 1994-2014 2027-2028 2031-2032 2055-2056 2067-2090 2106-2107 2109-2110 2131-2141 2146-2147 2184-2186 2189-2190 2196-2201 2206-2207 2210-2211 2214-2215 2230-2231 2234-2249 2261-2262 2266-2267 2271 2282-2283 2292-2293 2297-2298 2304-2305 2308-2330 2334-2370 2465-2467 2513-2514 2524-2525 2529-2530 2559-2561 2565-2566 2569-2570 2582-2590 2599-2600 2603-2604 2607-2608 2611-2612 2615-2616 2626-2627 2630-2631 2638-2639 2642-2643 2661-2662 2664-2665 2669-2691 2709-2714 2717-2732 2747-2758 2765-2777 2787-2796 2799-2854 2857-2936 2939-3085 3116-3165 3188-3191 3193-3198 3206-3212 3273-3274 3277-3278 3297 3305-3315 3322-3326 3351-3352 3355-3356 3371-3376 3383-3385 3393-3394 3425-3427 3443-3534 3544-3591 3594-3603 3618-3619 3622-3623 3626-3627 3634-3655 3668-3693 3745-3746 3767-3768 3807-3923 3926-3929 3932-3941
#   commentEvents.js                              |  75.39 |    55.12 |   86.36 | 44 49-50 67-68 76-77 155-156 167-168 184-185 197-198 205-206 219-231 265-275 290-299 306-311 334-335 353-364 367-369 381-383 392-396 399 420-421 432-433 437-438 440-441 459-461 477-478 484-485 487-488 492 519-521 532-547 550-554 559-568 577-581 585-589 594-596 615-619 626-629
#   commentTargetNormalizer.js                    |  79.33 |    63.52 |  100.00 | 25-26 28-32 35-36 38-39 41-46 48-49 51-52 63-76 79-93 100 102-106 117-118 120 122-132 134-135 153-155 185-186 188-190 216-217 220-221 224-225 526-531 536-537 554-555 577-586 588-593 595-613 632-633 641-642 661-662 677-678 701-709 720-721 734-735 751-752 788-789 801-802 805-806 861-862 868-869 927-938 941-959 966-967 970-971 974-975 978-979
#   countDiagnostics.js                           | 100.00 |    95.24 |  100.00 |
#   decryptionSchemeCache.js                      | 100.00 |   100.00 |  100.00 |
#   defaultClient.js                              |  84.85 |   100.00 |    0.00 | 18 23-26
#   dmDecryptDiagnostics.js                       | 100.00 |   100.00 |  100.00 |
#   dmDecryptWorkerClient.js                      |  44.09 |    15.79 |   33.33 | 10-49 53-54 57-58 77-78 81-82 96-97 106-126
#   dmSignalEvents.js                             |  74.60 |    47.54 |  100.00 | 19-20 25 42-43 57-58 65-66 108-111 114-123 130-135 159-160 180-181 184-189 193-194 201-202 230-240 249-252 255-264 271-276 299-303
#   eventsMap.js                                  |  95.56 |    84.00 |  100.00 | 12-15
#   index.js                                      | 100.00 |   100.00 |  100.00 |
#   managers                                      |        |          |         |
#    ConnectionManager.js                         |  37.82 |    22.99 |   50.00 | 44-45 51-52 59-66 69-76 105-181 185-224 227-230 233-238 241-283 286-308 311-322 325-350 353-369 372-436 443-483 487-513 516-527 532-533 536-537 543-544 555-564 576-577 580-581 592-593 597-598 604-607 611-615 618-622 625-629 636-637 655-656 666-689 693-696 701-702 705-706 710-711 722-730 733-741 748 750-783 787-789 799-800 813-815 821-822 842-850 852-859 877 884-886 888-891 916 924-926 935-939 941 943-950
#    EventsCacheStore.js                          |  91.67 |    75.41 |   83.87 | 10-15 123-125 161-164 167-171 198-199 203-204 209-215 301-302 305-307
#    PersistenceManager.js                        |  48.87 |    50.00 |   60.00 | 16 43-55 58-68 71-104 107-187 190-207 234-239 242-243 286-287 301-302 304-308 316-317 331-332 351-352
#    SignerManager.js                             |  44.89 |    51.24 |   56.10 | 65-66 90-91 101-102 121-122 214-215 223-224 235-236 238-239 247-254 269-272 281-282 298-313 321-333 337-338 345-349 351-353 372-375 378-439 450-451 455-456 464-470 476-477 480-481 496-500 509-513 519-544 547-549 559-562 569-576 580-581 585-586 602-615 618-760 763-842 845-859 862-872 890-891 901 942-947 953-961 964-996 1013-1055 1058-1104
#   maxListenerDiagnostics.js                     |  88.42 |    86.36 |   80.00 | 70 74-75 80-81 84-89
#   nip04WorkerClient.js                          |  41.67 |    23.08 |   50.00 | 10-47 51-52 55-56 81-82 89-107
#   nip07Permissions.js                           |  74.72 |    50.77 |   79.41 | 62-65 116-117 135 137-140 146-147 153-154 159-163 165-167 175-177 183-184 196-198 205-206 210-220 246-250 318-319 322-323 351-355 365-372 374-376 398-432 434-441
#   nip46Client.js                                |  27.42 |    44.17 |   44.59 | 62-63 70-71 76-79 90 92-95 109-110 115-116 119-120 122-123 125-126 132-133 138-139 141-142 146-147 150-151 154-155 171-247 252-253 259-260 265-272 274-287 291-327 330-375 378-411 414-424 428-429 433-434 437-438 452-456 466-467 469 471-477 482-483 489-490 492-497 500-510 515-516 520-521 524-525 529-530 543-679 682-698 701-712 718-744 748-759 763-764 779-780 787-860 868-869 872-873 878-898 909 911-943 945-1007 1022-1023 1039-1045 1058-1059 1082-1083 1087-1088 1101-1102 1114-1119 1139-1140 1157-1158 1162-1163 1168 1182-1185 1190-1205 1208-1256 1280-1347 1350-1351 1354-1366 1369-1397 1400-1411 1414-1435 1438-1471 1474-1570 1573-1590 1606-1607 1614-1808 1821-1855 1858-1875 1878-1898 1909-1969 1972-1986 1989-2003 2007-2008 2016-2019 2023-2037 2041-2042 2076-2100
#   nip46Connector.js                             |  47.12 |    39.44 |   57.14 | 88-91 96-97 107-110 113-114 127-128 133-134 169-170 175-176 178-179 210-479 504-509 534-538 542-558 576-672 696-697 700-703 755-782 792-807 835-839 867-888 921-934 954-959 980-995 1032-1072 1077-1083
#   nip46LoggingUtils.js                          |  25.32 |    86.67 |   37.50 | 29-30 35-56 59-73 76-113 116-146 149-158
#   nip46Queue.js                                 |  26.14 |   100.00 |    0.00 | 13-17 20-37 40-68 75-87
#   nip71.js                                      |  42.55 |    39.89 |   53.33 | 24 29-51 53-69 76-94 97-119 121-152 162-163 179-244 247-259 263-264 270-271 276-299 331-332 336-337 341-342 345-351 355-356 377-383 386-392 397-415 417-505 507-528 530-564 566-580 582-588 592-593 610-611 618-619 635-636 641-646 648-653 655-660 662-668 670-675 677-682 684-689 691-696 705-710 712-717 719-731 733-738 740-745 754 759-776 778-779 781-782 788-789 791-792 812-813 817-819 824-825 841-842 847-875 893-955 960-961 965-966 971-972 976-977 1005-1006 1009-1010 1025-1068 1087-1114 1130-1131 1135-1136 1148-1149 1154-1155 1159-1160 1163-1171 1186 1198-1227 1237-1243 1254-1255 1265-1266 1277-1282 1285-1286 1291-1292 1336-1359 1376-1378 1386-1387 1395 1404-1405 1425-1428 1437-1442 1458-1464 1469-1473 1478-1479 1482-1487
#   publishHelpers.js                             |  32.18 |    28.42 |   40.00 | 43-44 46-47 76-78 84-86 94-95 110-136 140-141 153-154 163-164 169-177 180-185 188-200 202-271 274-280 283-307 310-330 375 377-380 387-391 393-397 401-444 461-462 474-482 489-501 512-997 1011-1012 1020-1021 1024-1025 1034-1035 1037-1038 1040-1041 1045-1046 1050-1051 1055-1056 1079-1080 1086-1087 1112-1113 1123-1133 1136-1137 1140-1148 1210-1218 1222-1352 1365-1370 1375-1376
#   reactionEvents.js                             |  48.33 |    46.81 |   90.00 | 18-19 24 33-34 37-48 58-59 64-68 71-75 78-82 89-90 93-104 112-113 117-121 124-128 131-135 141-275 289-290 294-295 299-300 327-332 344-349 351-352 380-381 398 402 404-409 411-412 442-445 452-457 459-463 467-480 500-501
#   relayBatchFetcher.js                          |  68.94 |    46.43 |   80.00 | 22-23 27-28 37-51 56-60 68-72 117-118 150-151 170-202 213-214 219-223
#   relayConstants.js                             | 100.00 |   100.00 |  100.00 |
#   sessionActor.js                               |  78.02 |    57.89 |   75.76 | 17-18 26-27 36-41 46-47 54-57 59-60 73-74 101 126-127 149-150 157-158 165-166 178-179 182-183 187-188 223-224 227-228 231-232 236-237 268-269 274-275 297-298 301-302 305-306 315-316 322-323 348-349 356-357 363-365 385-402 405-406 416-427 440-441 454-455 468-469 480-481 497-505
#   signerHelpers.js                              |  50.91 |    21.43 |   18.18 | 19-20 24-31 36-40 47-66 76-79 83-86 89-93 113-126 132-135 140-149 158-162
#   signRequestQueue.js                           |  93.08 |    88.37 |   92.31 | 25-27 63-65 77-78 102
#   syncMetadataStore.js                          |  94.00 |    68.00 |  100.00 | 44-45 57-58 70-71
#   toolkit.js                                    |  69.77 |    50.82 |   70.83 | 24 33-37 45-46 48-52 63-67 95-96 115-123 149-150 169-175 183-184 191-195 201-211 219-223 226-230 235 237-238 246-257 263-264 268-269 289-299 334-335 342-343 368 371 374 382 402-423 430-431 443-444 450-457 469 476 480-481 483-485 489-490 494-495 506-516 520-521 527-528 530-531 546-547 561-563 572-573 577 587-594
#   videoEventBuffer.js                           |  86.34 |    86.36 |   77.78 | 49-50 64-66 113-114 129-132 141-151
#   videoPayloadBuilder.js                        |  92.26 |    50.41 |  100.00 | 31-32 111-113 149-150 153-154 157-158 161-162 237-239 252-254 273-274 277-278 281-282 297-298 301-302 401-402 422-423 426-427 430-431 445
#   videoPublisher.js                             |  47.03 |    37.50 |   66.67 | 66-71 73-77 112-152 164-236
#   viewEventBindings.js                          |  28.57 |   100.00 |    0.00 | 5-14 17-18 21-26 29-34 37-42
#   viewEvents.js                                 |  37.40 |    22.08 |   69.57 | 28-47 50-84 109-110 129-130 132-139 157-158 176-182 185-186 193-195 200-204 206-228 233-234 245-247 251-252 260-261 267-268 271-319 323-341 346-347 352 356-447 450-515 518-663 669-670 678-680 695-696 700-701 708-709 719-727 741-742 749 753 755-761 772-773 777-779 803-827 832-833 835-836 840-842 865-866 884-885 896-897
#   watchHistory.js                               |  46.24 |    22.90 |   45.21 | 54-74 76-113 117-165 170-171 173-174 177-178 224-225 240-242 251-253 283-284 286-287 301-302 305-306 315-324 329-342 365-367 378-379 389-390 398-399 401-402 419 430-434 445-446 448 451-461 463-483 485-564 566-588 590-618 620-652 654-694 698-704 708-712 718-726 729-730 741-751 754-793 811-822 828-829 838 848-849 855-861 867-868 876-877 903-929 932-1017 1024 1028-1029 1033-1035 1053-1130 1156-1158 1179-1180 1197-1198 1226-1227 1244-1245 1248-1249 1265-1279 1292 1300-1304 1307-1308 1328 1339-1340 1346-1348 1350-1356 1369-1370 1378-1379 1389-1390 1418-1438 1441-1443 1460-1462 1474-1475 1483-1488 1495-1500 1519-1520 1534-1635 1638-1684 1703-1704 1707-1708 1716-1717 1727-1728 1744-1745 1747-1748 1771-1787 1792 1794-1804 1807-1815 1827-1831 1833-1834 1848-1851 1869-1903 1905-1948 1955-1983 1985 2003-2016 2032-2033 2036-2037 2047 2049-2050 2113-2128 2132-2133 2136-2137 2140-2141 2144-2145 2148-2154 2165-2166 2173-2174 2177-2178 2181-2182
#   watchHistoryBindings.js                       |  44.83 |   100.00 |    0.00 | 9-11 13-19 22-24 27-29
#  nostrClientFacade.js                           | 100.00 |   100.00 |  100.00 |
#  nostrClientRegistry.js                         |  63.10 |    66.67 |   63.16 | 14 25-36 39-47 71-72 84-87 89-94 102-104 107-117 122-123 137-138 155-161 164-165 172-174 199-200 212-235 249-250 256-261 270-271
#  nostrEventSchemas.js                           |  54.66 |    40.61 |   62.50 | 80-93 98-99 103-104 109-110 112-115 123-130 132-135 147-148 152-153 157-158 164 170-171 193-207 215-221 223 229-233 244-264 728-735 741-742 747-748 754-772 776-777 780-781 787-792 796-797 815-820 843-844 854-856 861-862 866-867 874-875 886-888 919-928 958-986 990 995-996 1008-1009 1015-1061 1119-1120 1131-1132 1138-1177 1180-1208 1211-1245 1273-1274 1280-1400 1403-1513 1516-1590 1593-1632 1635-1674 1699-1700 1705-1706 1717-1718 1724-1772 1793-1794 1805-1806 1812-1865 1896-1897 1908-1909 1947-1948 1959-1960 1993-1994 1998-1999 2032-2033 2039-2116 2147-2148 2151-2160 2167-2168 2173-2174 2182-2190 2197-2198 2209-2210 2221-2222 2224-2229 2234-2235 2250-2251 2300-2301 2303-2304 2306-2307 2334 2336-2337 2393-2394 2413-2417 2441-2442 2465-2470 2496-2501 2522-2523 2538-2539 2586-2587 2593-2636 2639-2672 2675-2702 2704-2716 2719-2768 2770-2778 2780-2791 2794-2887 2890-2896
#  nostrPublish.js                                |  56.75 |    44.44 |   63.16 | 6-21 25-60 73-74 80 92-97 106-111 133 135-145 147-153 161-162 193-195 198-208 223-224 235-237 247-248
#  nostrToolsBootstrap.js                         |  71.67 |    50.00 |   55.22 | 15-16 18-19 24-25 28-34 45-48 67-69 75-76 81-90 95-96 103-110 120-121 152-153 158 160-163 170-173 182-183 186-187 193-194 203-204 209-216 224-226 234-238 242-243 246-251 264-265 267-268 270-271 273-274 276-277 307-308 321-330 390-394 409-410 423-425 427-432 450-459 462-469 517-518 520-531 537-547 576 590-593 599-602 614-615 624-625 627-628 631 633-634 637 639-640 670-671 673-676 684-686
#  nostrViewEventsFacade.js                       | 100.00 |   100.00 |  100.00 |
#  nostrWatchHistoryFacade.js                     | 100.00 |   100.00 |  100.00 |
#  nwcSettings.js                                 |  12.16 |   100.00 |    0.00 | 19-21 23-29 31-55 57-86 88-98 100-102 104-120 122-131 133-138 140-163 165-168 170-191 193-197 199-203 205-226 228-245 247-267 269-280 282-302 304-315 318-319 322-334 337-354 357-370
#  payments                                       |        |          |         |
#   lnurl.js                                      |  11.00 |   100.00 |    5.56 | 17-22 24-36 38-40 42-83 85-113 115-123 125-135 138-143 145-154 156-170 172-178 181-221 223-229 232-294 297-319 321-330 333-401
#   nwcClient.js                                  |  11.33 |    27.27 |    3.13 | 35 54 57-95 101-105 110-119 126-130 132-137 139-147 149-163 165-173 175-191 193-224 226-253 255-363 365-373 375-387 389-417 419-436 461-495 497-551 553-575 577-583 585-595 597-605 607-628 630-647 649-685 687-719 721-738 740-751 753-778 780-825 827-838 840-849 851-918 920-957 959-978 980-988 990-996 998-1029 1031-1033 1035-1038 1040-1043 1045-1053 1055-1066 1068-1076 1078-1164 1166-1216 1218-1275 1278-1290 1292-1312 1314-1335 1337-1350 1352-1368 1370-1376 1378-1384 1407-1415 1417-1424 1426-1446 1448-1495 1497-1515 1517-1523 1525-1551 1553-1573 1576-1627 1630-1631
#   platformAddress.js                            |  21.04 |    27.27 |   13.33 | 20 39 42-80 86-90 95-104 112-116 118-123 125-133 135-152 154-162 164-180 182-209 211-213 215-218 220-228 230-295 298-324 327-328
#   platformFee.js                                |  14.86 |   100.00 |    0.00 | 6-50 53-58 61-66 69-74
#   zapMessages.js                                | 100.00 |   100.00 |  100.00 |
#   zapNotifications.js                           |   5.74 |   100.00 |    0.00 | 8-10 12-39 41-53 55-67 69-77 79-87 89-109 111-170 172-191 194-217 219-274 277-365
#   zapReceiptValidator.js                        |   9.66 |    33.33 |    0.00 | 16 28-33 35-49 51-55 57-75 77-86 88-97 99-105 107-113 115-171 173-199 201-213 216-440
#   zapRequests.js                                |  17.00 |   100.00 |    0.00 | 18-34 36-50 52-64 67-71 74-101 104-109 112-121 124-195
#   zapSharedState.js                             |  26.79 |   100.00 |    0.00 | 16-17 20-24 27-35 38-53 56-60 63-112 115-127 130-137 140-147 150-153 156-157 160-163 167-190 219-255 263-280
#   zapSplit.js                                   |  17.47 |    27.27 |   10.00 | 44 63 66-104 110-114 119-128 135-139 141-146 148-156 158-172 174-176 178-188 190-195 197-200 202-227 229-245 247-271 273-289 291-323 325-341 343-387 389-400 402-521 524-592
#  playbackUtils.js                               |  89.22 |    12.50 |  100.00 | 70-71 79-87
#  r2.js                                          |  39.59 |    55.00 |   55.56 | 12-19 22-36 42-48 65-66 72-74 90 112 117-126 128-131 140-167 170-184 186-212 215-231 234-243
#  reactionCounter.js                             |   6.15 |   100.00 |    0.00 | 13-28 30-41 43-67 69-99 101-107 109-122 124-187 189-217 219-239 241-326 328-350 352-364 366-382 384-387 389-406 408-447 449-480 482-500 502-541 543-567 569-583 585-667 671-784
#  relayManager.js                                |  49.94 |    51.28 |   68.18 | 25-26 29-30 32-33 39-40 48-49 52-53 59-60 63-64 67-72 75-76 82-83 126-130 134-135 142-143 145-146 149-150 178 184-185 187-188 192-197 216 222-229 236-237 246-247 273-280 291-292 295-296 304-312 320-324 335-357 360-385 388-404 407-425 428-432 435-439 468-471 474-477 483-490 497-504 515-518 525-535 542-543 550-557 561-569 599-608 612-613 618 626-635 643-646 650-764 767-768
#  search                                         |        |          |         |
#   searchFilterMatchers.js                       |  88.75 |    61.11 |   80.00 | 33-35 49-50 52-53 74-75
#   searchFilters.js                              |  73.41 |    48.28 |   86.67 | 54-56 77-91 97-98 102-103 115-116 129-135 142 156-158 168-170 176-178 188-190 195-202 204-206 208-215 217-224 228-230 235-237 246-249 257-258 262 303-304 307-308
#  services                                       |        |          |         |
#   attachmentService.js                          |  53.05 |    51.72 |   73.68 | 24-25 31-32 35-39 41-45 57-58 66-82 86-87 92-94 99-100 107-109 114-115 118-119 123-124 156-188 192-193 197-198 206-207 218-219 236-237 240-241 247-272 283-284 293-294 306-307 329-387
#   authProviders                                 |        |          |         |
#    generate.js                                  | 100.00 |   100.00 |    0.00 |
#    index.js                                     |  63.27 |    25.00 |   71.43 | 13-21 54-55 57-58 71-72 79-83 102-117 125-128 132-145
#    nip07.js                                     |  76.67 |    37.50 |   66.67 | 30-31 34-35 40-45 61-64 67-73
#    nip46.js                                     |  18.22 |   100.00 |    0.00 | 8-14 41-59 61-101 115-267
#    nsec.js                                      |  26.71 |   100.00 |    0.00 | 28-46 48-64 78-159
#   authService.js                                |  10.16 |   100.00 |    0.00 | 49-109 112-117 120-121 124-125 128-142 145-146 149-150 153-173 176-178 181-186 189-190 193-194 197-198 201-268 271-283 286-287 290-291 294-295 298-299 302-303 306-307 310-311 314-315 318-319 322-370 373-421 424-493 496-520 523-600 603-702 705-807 810-834 837-858 861-918 921-943 946-1015 1018-1069 1072-1238 1241-1280 1283-1284 1287-1298 1301-1302 1305-1308
#   authUtils.js                                  | 100.00 |   100.00 |  100.00 |
#   commentThreadService.js                       |   9.55 |   100.00 |    0.00 | 18-24 26-28 30-35 39-47 49-51 53-55 57-61 63-72 74-100 104-158 161-182 185-194 197-321 324-380 383-389 392-411 414-507 510-539 542-556 559-581 584-590 593-614 617-648 651-670 673-732 735-760 763-784 787-806 809-817 820-822 825-829 832-848 851-872 875-886 889-963 966-967 970-988 991-1009 1012-1016 1019-1034 1037-1038 1041-1046 1049-1050 1053-1069 1072-1075 1078-1083 1086-1087 1090-1120
#   discussionCountService.js                     |  84.52 |    70.83 |   88.89 | 13-14 30-32 36-37 69-70 80-82 85-87 131-132 148-149 151-152 163-168 187-188 194-195 199-200 212-213 217-218 234-235
#   dmNostrService.js                             |  11.40 |   100.00 |    0.00 | 22-34 36-41 43-54 56-63 65-86 89-162 164-170 172-178 180-189 193-217 220-249 252-254 257-261 264-280 283-310 313-332 335-349 352-358 361-370 373-400 403-428 431-439 442-446 449-462 465-479 482-529 532-600 603-608 611-620 623-632 635-681
#   dmNotificationManager.js                      |  68.60 |    53.85 |   68.75 | 19-25 47-48 56-59 66-69 72-89 93-94 110-114 119-120 127-128 134-135 152-153 173-174 181-182 196-197 213-230 234-235
#   exploreDataService.js                         |  38.77 |    96.77 |   31.58 | 101-115 119-146 149-153 156-167 170-178 181-211 214-221 224-231 234-265 268-296 299-300 303-304 307-324
#   hashtagPreferencesService.js                  |   9.62 |   100.00 |    6.67 | 55-72 75-90 97-112 114-122 124-160 162-209 211-244 269-279 284-285 288-309 312-316 319-348 351-359 362-374 377-416 419-420 423-424 427-447 450-463 466-486 489-502 505-518 521-541 544-578 581-954 957-969 972-1251 1254-1428
#   linkPreviewService.js                         |  79.92 |    55.38 |   87.50 | 10-11 17-18 21-22 29-30 37 42-43 48-49 64-65 69-71 88 111-112 125-127 133-134 138-139 145-146 157-158 164-165 168-169 180-181 192-193 198-199 204-206 212-213 218-220
#   moderationActionController.js                 |  68.67 |    62.68 |   92.00 | 88-89 93-94 97-98 124-125 128-129 133-137 146-148 152-154 164-170 183-192 235-236 239-240 250-252 262-263 273-278 289-294 300-301 313-314 327-328 333-334 346-347 352-356 368-379 387-389 393-403 408-409 414-418 423-424 429-433 438-439 443-444 465-466 470-471 479-483 488-489 493-494 499-503 508-509 514-519 524-525 531-536 541-542 547-552 557-558 563-567 572-573 578-582 586-599
#   moderationDecorator.js                        |  84.62 |    65.27 |   92.31 | 27-28 34-35 50 55-71 76-77 81-82 87-88 98-101 113-124 196-197 221-222 226-227 351-353 356-363 377-378 401-402 458-459 472-473 485-486 490-491 493 495-496 498-499
#   moderationService.js                          |  57.40 |    48.08 |   66.09 | 36 38-39 51-52 62-65 79-86 96-97 105 118-119 132-143 151-152 156-157 167-168 173-174 194-196 199-214 269-270 274-275 280-281 286-287 294-295 300-301 315-316 326-328 330-331 339-340 344-345 352-353 357-358 366-367 373-378 384-385 390-391 394-395 417-418 423-424 429-430 433-434 443-444 447-448 450-451 457 462-463 467-468 471-475 481-482 484-485 491-503 511-522 592-596 606-607 620-626 654-655 682-688 696 709-729 732-772 788-795 805-806 817-818 859-860 875 884-885 889-891 894-902 905-906 913-914 924-925 933-934 938-939 944-945 950-954 964-965 979-984 1003-1010 1014-1015 1019-1022 1052-1053 1060-1098 1101-1113 1118-1119 1121-1122 1132-1133 1137 1152-1153 1156-1158 1166-1199 1203-1217 1220-1222 1225-1227 1232-1233 1239-1240 1250-1271 1276-1302 1308-1311 1314 1330-1336 1348-1349 1352-1354 1361-1368 1374-1375 1377-1378 1392-1393 1397-1398 1404-1405 1410-1411 1416-1456 1459-1492 1495-1535 1538-1539 1542-1554 1557-1569 1587-1588 1593-1595 1612-1613 1620-1621 1626-1627 1630-1631 1641-1642 1645-1646 1700-1702 1704-1706 1710-1719 1737-1742 1745 1757-1817 1820-1867 1878-1880 1883-1884 1889-1890 1898-1911 1921-1952 1955-1991 1995-1996 2007-2020 2023-2073 2086-2087 2091-2092 2097-2098 2102-2103 2150-2151 2155-2175 2186-2187 2281-2282 2294-2295 2306-2307 2325-2326 2333-2342 2345-2346 2362-2363 2367-2368 2392-2395 2399-2402 2409-2412 2416-2419 2425-2428 2439-2443 2463-2467 2472-2475 2482-2486 2494-2495 2500-2501
#   nostrService.js                               |  45.33 |    33.90 |   59.00 | 41-42 49 52-54 63-64 67-68 75-76 87-88 98-101 115-122 132-133 139-140 142-143 156-163 168-169 173-174 190-191 207-208 212-213 216-217 224-225 232-233 242-248 253-254 260-261 265 270-273 276-282 284-294 302-304 315-316 323-324 339 341-351 353-356 361-364 369-371 373-376 384-385 392-393 404-405 419-422 430 436 443-445 470-471 475-476 501-502 506-507 518-551 553-607 615-619 644-645 649-651 657 661-667 674-675 679-683 702-719 735-736 749-750 763-764 767-783 790-825 833-834 837-841 864-866 870-871 891-892 896-897 901-902 906-907 910-912 953-956 966-1026 1029-1153 1156-1312 1315-1327 1337-1338 1348-1350 1357-1358 1372-1373 1382-1391 1395-1396 1399-1400 1408-1417 1421-1422 1436-1442 1452-1453 1458-1459 1462-1463 1474-1486 1498-1499 1504-1505 1508-1509 1512-1513 1518-1519 1521-1522 1526-1527 1532-1533 1535-1537 1560-1561 1566-1570 1574-1576 1579-1641 1657-1661 1664-1665 1674-1679 1696-1717 1719-1720 1734-1736 1747-1748 1758-1760 1764-1774 1779-1780 1814 1824 1832-1833 1894-1896 1918-1920 1924-1983 1986-2061 2064-2067 2070-2132 2135-2149 2152-2202 2208-2209 2211-2212 2218-2219
#   nwcSettingsService.js                         |  15.29 |   100.00 |    0.00 | 13-15 19-61 64-68 71-72 75-78 81-82 85-93 96-122 125-131 134-135 138-142 145-167 170-198 201-221 224-258 261-294 297-310 313-320 323-326
#   playbackService.js                            |  74.07 |    55.75 |   68.75 | 31-45 52-60 75-76 84-85 90-91 94-95 100-104 118-124 128-134 143-151 153-166 168 170-208 215-220 222-225 230 232 234 236 238 244-245 248-249 251-252 254-255 272 290-291 294-295 301-302 308-313 316-321 332-335 344 358-359 366-367 370-371 382-384 396-397 434-435 462-463 473-474 488-489 491-492 535-538 589-594 622-623 626-633 636-637 640-641 644-645 648-649 652-653 660 677-678 705-707 733-734 779-780 782-783 786-787 790-791 796-797 814-815 830-831 834-835 838-839 850-851 865-866 870-871 877-878 893-895 902-903 922-923 955-964 969-972 986-987 1031-1040 1043-1044 1054-1058 1066-1088 1092-1093 1193-1194 1213 1215-1225 1269-1277
#   playbackStrategyService.js                    |   6.67 |   100.00 |    0.00 | 11-16 19-27 37-343
#   profileMetadataService.js                     |  88.44 |    72.15 |   90.48 | 12-13 25-26 31 33-36 41-42 78-80 91-93 97-99 135-136 141-142 149-150 154-155 279-280 283-284 289-290
#   r2Service.js                                  |  32.27 |    44.78 |   50.00 | 56-58 60-62 64-82 84-101 115-116 119-120 122-123 136-137 160-161 184-185 202 213-217 220-221 224-225 228-309 324-332 345-346 367-371 373-374 412-433 437-438 461-468 487-488 493-494 496-497 506-507 509-510 519-569 605-711 714-716 725-775 796-1111 1114-1115 1118-1188
#   relayHealthService.js                         |  84.42 |    72.73 |  100.00 | 24-25 31-36 41-42 50-54 109-110 112-113 127-131 144-145 183-184 196-198 201-203 218-219 236-237 268-272
#   relaySubscriptionService.js                   |  62.80 |    62.50 |   76.00 | 5-6 35-36 39-40 47-48 64-65 108-109 112-117 123-129 132-141 147-154 160-162 165-171 180-181 185-192 194-201 224-243 246-247
#   s3Service.js                                  |  55.14 |    83.33 |   75.00 | 39-53 75-76 81-82 84-85 87-88 99-100 128-185
#   s3UploadService.js                            |  82.61 |    70.24 |   75.00 | 59-60 62-63 68-69 71-75 81-82 118 209-211 263-265 329-333 347 353-388 391-395 401-409 412-416 457-459
#   storageService.js                             |  68.96 |    56.47 |   55.10 | 42-44 46-48 50-52 80-87 89-98 100-111 113-123 127-131 134-137 140-143 156-163 191-193 211-212 291-297 303-308 324 330-331 335-336 349-397 459-460 470-471 496-498 519-520 528-529 592-600 606-612 618-630 642-655 665-671 678-680 687 691-701 726-736
#   trustBootstrap.js                             |  92.19 |    79.07 |   93.33 | 38-41 63 68-69 130-131 162-166 170
#   videoNotePayload.js                           |   7.79 |   100.00 |    0.00 | 24-25 27-35 37-46 48-54 56-62 64-86 88-95 97-105 107-149 151-192 194-213 215-234 236-323 326-475
#   watchHistoryTelemetry.js                      |  70.49 |    49.32 |   55.88 | 83-85 92-93 100-101 104-105 108-115 119-120 125-126 139-140 147-151 158-161 166-170 181-182 186-187 209-211 216-217 237-242 244-248 270-274 277-291 293-297 299-302 310-311 323 332-334 338-340 349-350 370-371 375-378 383-384 388-389 397-398 408-419 422-426
#  sidebarLoading.js                              |  12.12 |   100.00 |    0.00 | 3-14 17-33
#  state                                          |        |          |         |
#   appState.js                                   |  90.09 |    78.05 |   75.00 | 52-53 71-72 96-97 108-109 119-120 123-124 147-148 162-163 169-170 175-176 187-188
#   cache.js                                      |  50.71 |    56.85 |   66.15 | 70-75 85-90 138-139 143-144 148-149 161-162 166-180 185-192 204-205 207-208 214-229 234-254 263-264 269-277 282-283 287-288 319-320 342-343 355-356 370-371 384-385 399-400 406-408 410-419 424-425 430-447 452-453 522-524 530-531 535-537 593 595-596 601 603-604 615-617 629-630 642-647 667-672 679-681 695-734 737-824 827-874 880-889 892-894 896-928 962-1089 1093-1094 1108-1109 1116-1117 1126-1127 1130-1131 1147-1156 1170-1174 1177-1180 1182-1188 1190-1203 1206-1209 1212-1213 1216-1224 1227-1305 1307-1373 1389-1391 1407-1416 1421-1448 1451-1460 1463-1467 1479-1495 1531-1532 1544-1545 1553-1554 1556-1557 1563-1564 1567-1568 1580-1586 1589-1590 1595-1596 1601-1602 1605-1606 1642-1646 1659-1660 1664-1669 1704-1705 1723-1727 1731-1732 1740-1741 1748-1749 1767-1769 1774-1775 1792-1804 1807-1822
#   profileCache.js                               |  84.16 |    71.08 |   76.92 | 24-25 49-50 84-87 136-137 151-152 176-177 213-214 226-227 231-232 236-237 248-249 266-268 317-318 333 338-339 356-363 366-373 376-379 391-397 400-405 417-418
#   profileSettingsStore.js                       |  90.54 |    90.48 |   92.86 | 3-5 37-38 43-44
#  storage                                        |        |          |         |
#   dmDb.js                                       |  68.53 |    46.00 |   70.27 | 64-65 94-95 112-113 117-119 143-144 151-152 160-165 177-178 184-185 192 199-200 236-275 293-313 322-323 328-329 342-344 349-350 355-356 365-367 372-373 384-385 409-410 414-416 422-423 441-442 475-477 485-486 497-498 507-508 524-526 530-560 563-591
#   r2-mgmt.js                                    |   7.51 |   100.00 |    0.00 | 2-9 12-48 51-87 89-96 99-141 145-158 162-183 185-193 195-233 237-280 284-293
#   r2-s3.js                                      |  12.50 |   100.00 |    0.00 | 20-159 162-182
#   s3-client.js                                  |  45.61 |    57.14 |   30.00 | 13-32 36-37 41-43 47-48 65-74 77-78 81-82 85-86 89-107
#   s3-multipart.js                               |   6.25 |   100.00 |    0.00 | 8-17 19-29 31-50 53-92 95-132 135-156 159-272
#   s3-url.js                                     |  70.27 |    40.00 |   83.33 | 4-5 9 25 39-40 52-53 56-59 65-74
#  subscriptions.js                               |   9.14 |    66.67 |    6.00 | 58-64 66-74 76-123 125-158 160-180 182-234 236-286 301-318 321-336 376-387 395-438 441-447 450-451 454-474 477-800 803-824 827-831 834-858 861-873 876-938 941-953 956-961 964-980 983-984 987-1271 1274-1301 1304-1331 1339-1540 1547-1726 1730-1731 1736-1737 1742-1748 1751-1786 1789-1800 1803-1805 1808-1858 1865-1933 1936-1966 1969-2247 2250-2279 2282-2286 2289-2308 2311-2334 2337-2363 2366-2367
#  ui                                             |        |          |         |
#   ambientBackground.js                          |   3.43 |   100.00 |    0.00 | 7-11 13-35 37-65 67-98 101-321
#   appChromeController.js                        |  57.11 |    55.56 |   53.85 | 76-87 91-101 106-107 113-116 120-138 142-151 177-178 187-193 201-207 211-223 244-250 258-264 269-270 325-344 347-362 365-380 386-401 403-406
#   applicationBootstrap.js                       |   7.88 |   100.00 |    0.00 | 88-106 109-1153 1156-1167
#   components                                    |        |          |         |
#    DeleteModal.js                               |   8.83 |   100.00 |    0.00 | 3-16 20-74 77-78 81-82 85-90 93-127 130-147 150-160 163-181 184-196 199-213 216-258 261-336 339-360 363-374 377-389 392-426 429-450
#    EditModal.js                                 |   5.31 |   100.00 |    0.00 | 8-76 79-80 83-84 87-88 91-92 95-148 151-194 197-211 214-289 292-311 314-317 320-327 330-348 351-403 406-500 503-605 608-634 637-653 656-741 744-767 770-819 822-840 843-851 854-1095 1098-1107 1110-1121 1124-1128
#    EmbedPlayerModal.js                          |  35.05 |    75.00 |    7.69 | 24-35 38-39 42-43 46-50 57-75 78-79 82-83 86-88 93-97 100-101 109-110 113-114 117-118 123-126 129-130 133-148 151-154 157-175 178-207 210-213
#    EmbedVideoModal.js                           |  10.20 |   100.00 |    0.00 | 15-17 19-29 31-37 41-79 82-120 123-137 140-170 173-200 203-210 213-233 236-324 327-349 352-372 375-389 392-430 433-443 446-450
#    EventDetailsModal.js                         |   5.45 |   100.00 |    0.00 | 9-34 37-129 132-161 164-232 235-265 268-356 359-402 405-450 453-458
#    FeedInfoPopover.js                           |  27.27 |   100.00 |    0.00 | 13-44
#    hashtagStripHelper.js                        |  62.03 |    50.00 |   70.00 | 37-40 46-47 52-54 63-65 78-82 91-92 120-121 130-131 148-149 155-161 167-168 185-188 202 213-221 226-227 236-237 243-244 250-251 270-275 279-302 307-308 316 321-367 372-377 381-382 386-391
#    modalAccessibility.js                        |  29.05 |    33.33 |   13.33 | 22-29 31-50 55-63 69-79 83-123 127-139 143-172 179-180 182-185 187-195 199 207
#    nip71FormManager.js                          |  16.77 |    36.00 |   27.59 | 21-22 25-27 37-38 41-46 51-58 62-75 79-92 100-149 152-266 269-410 413-439 442-465 468-476 479-480 483-501 504-530 533-553 556-583 586-590 593-616 619-649 652-680 683-691 694-702 705-710 713-724 727-737 740-748 775-776 784-786 795-796
#    RevertModal.js                               |   4.51 |   100.00 |    0.00 | 8-65 68-69 72-73 76-81 84-121 124-145 148-169 172-225 228-242 245-259 262-278 281-374 377-504 507-537 540-930 933-1008 1011-1040 1043-1065 1068-1077 1080-1084 1087-1117 1120-1122 1125-1127 1130-1132 1135-1157 1160-1174 1177-1350 1353-1458 1461-1508 1511-1568 1571-1585 1588-1628 1631-1645 1648-1660
#    ShareNostrModal.js                           |  11.32 |   100.00 |    0.00 | 6-21 25-73 76-77 80-81 84-89 92-126 129-144 147-157 160-184 187-208 211-226 229-242 245-254 257-261 264-270 273-308 311-328 331-341 344-390 393-401 404-412 415-421 424-433 436-472 475-485
#    SimilarContentCard.js                        |  64.67 |    65.55 |   60.38 | 17-18 40-41 71-72 74-75 146-147 150-151 154-155 166-167 174-177 189-190 199 215-216 218-219 260-264 302-303 336-337 364-365 374-375 391-392 457-464 467-487 490-508 511-525 528-567 570-609 612-651 654-739 745-747 781-793 838-839 872-873 875-880 888-915 990-993 1038-1045 1084-1108 1157-1188 1220-1221 1243-1244 1251-1252 1256-1257 1263-1264 1268-1269 1272 1274-1277 1282-1287 1289-1291
#    staticModalAccessibility.js                  |  10.56 |   100.00 |    0.00 | 5-13 15-20 22-37 39-72 74-86 89-105 108-123 126-141
#    tagPillList.js                               |  59.83 |    76.92 |   57.14 | 15 21-22 42-43 58-59 101-102 119-129 131-143 145-150 152-174 177-210
#    tagPreferenceMenu.js                         |  88.31 |    72.09 |  100.00 | 19-21 31-32 75-76 81-83 104-111 121-122 163-164 218-219 228-230 235-236
#    UploadModal.js                               |  57.47 |    46.61 |   41.54 | 30-32 34-36 296-297 308-311 317-321 369-370 376-383 391-402 413-429 442-449 461-470 481-484 486-489 531-535 540-549 551-577 585-588 599-611 623-682 685-703 707-804 811-813 821-828 834-841 905-910 938-940 944-949 959-960 989-992 1006 1013-1096 1099-1126 1129-1139 1142-1160 1163-1183 1247-1256 1261-1278 1290-1291 1294-1295 1298-1299 1314-1318
#    video-modal                                  |        |          |         |
#     commentsController.js                       |   6.19 |   100.00 |    0.00 | 5-8 11-148 151-188 191-214 217-240 243-253 256-289
#     moderationController.js                     |  11.86 |   100.00 |    0.00 | 3-4 7-59 62-76 79-91 94-106 109-116
#     reactionsController.js                      |  13.16 |   100.00 |    0.00 | 3-8 11-39 42-59 62-74
#     similarContentController.js                 |  13.70 |   100.00 |    0.00 | 3-4 7-41 44-61 64-71
#     utils                                       |        |          |         |
#      commentAvatar.js                           |  97.53 |    90.91 |  100.00 | 72-73
#    VideoCard.js                                 |  63.15 |    47.43 |   73.68 | 45-46 48-49 279-280 283-284 287-288 291-292 295-334 337-376 384-385 418 447-448 463-464 498-499 502-510 561-562 565-566 649-651 662-663 673-674 680-681 689-690 700 704-706 711-717 719-722 750-755 764-765 781-795 800-801 807-808 824 832 834-842 846-870 925-928 1033-1056 1069-1088 1132-1143 1197-1212 1245-1250 1260-1266 1271-1276 1280-1284 1305-1310 1320-1326 1331-1336 1340-1344 1349-1406 1432-1433 1440-1441 1445-1446 1485-1518 1582-1583 1586-1587 1615-1618 1627-1643 1654-1659 1667-1668 1679-1696 1878-1883 1892-1896 1945-1946 1948-1949 1953-1967 1996-1997 1999-2003 2009-2010 2031-2032 2038-2039 2115-2116 2148-2149 2151-2152 2154-2159 2172-2173 2175-2179 2181-2185 2187-2188 2190-2191 2193-2194 2196-2198 2203-2216 2219-2253 2257-2258 2289-2290 2299-2400 2403-2430 2433-2457 2472-2548 2553-2554 2558-2559 2561-2562 2566-2575 2578-2580 2585-2586 2588-2604 2609-2610 2621-2622 2643-2660 2667-2668 2672 2678 2680-2681 2704 2706-2707 2709 2711-2712 2721-2723 2737-2743 2745-2746 2750-2767 2779-2803 2808-2850 2854-2907 2914-2923 2930-2931 2933-2935 2937-2938 2943-2944 2950-2951 2955-2991 3037-3039 3060-3066 3075-3077 3087-3105 3120-3121
#    videoMenuRenderers.js                        |   3.44 |   100.00 |    0.00 | 3-11 13-28 30-55 57-88 90-103 105-112 114-121 123-153 156-310 313-374 377-434 437-494
#    VideoModal.js                                |   7.08 |   100.00 |    0.00 | 57-339 342-354 357-358 361-362 365-372 375-376 379-380 383-476 479-547 550-816 819-843 846-870 873-899 902-904 907-916 919-929 932-934 937-943 946-956 959-967 970-981 984-1017 1020-1032 1035-1051 1054-1062 1065-1121 1124-1138 1141-1143 1146-1156 1159-1201 1204-1241 1244-1266 1269-1310 1313-1452 1455-1490 1493-1541 1544-1684 1687-1700 1703-1704 1707-1708 1711-1790 1793-1800 1803-1804 1807-1813 1816-1850 1853-1878 1881-1903 1906-1925 1928-1959 1962-1970 1973-1989 1992-1995 1998-2014 2017-2037 2040-2046 2049-2075 2078-2084 2087-2102 2105-2178 2181-2214 2217-2221 2224-2249 2252-2269 2272-2287 2290-2305 2308-2460 2463-2563 2566-2616 2619-2665 2668-2729 2732-2759 2762-2780 2783-2824 2827-2861 2864-2869 2872-2880 2883-2921 2924-2934 2937-2951 2954-2960 2963-2965 2968-2982 2985-3022 3025-3070 3073-3094 3097-3104 3107-3118 3121-3154 3157-3166 3169-3183 3186-3201 3204-3256 3259-3274 3277-3332 3335-3344 3347-3373 3376-3385 3388-3421 3424-3437 3440-3442 3445-3458 3461-3472 3475-3523 3526-3549 3552-3557 3560-3577 3580-3591 3594-3616 3619-3623 3626-3648 3651-3656 3659-3662 3665-3700 3703-3712 3715-3718 3721-3724 3727-3770 3773-3780 3783-3790 3793-3800 3803-3836 3839-3890 3893-3902 3905-3972 3975-4025 4028-4050 4053-4059 4062-4070 4073-4086 4089-4093 4096-4100 4103-4109 4112-4118 4121-4150 4153-4159 4162-4329 4332-4375 4378-4396 4399-4412 4415-4444 4447-4448 4451-4463 4466-4474 4477-4536 4539-4560 4563-4572 4575-4789 4792-4799 4802-4831 4834-4882 4885-4903 4906-4921 4924-4935 4938-4967 4970-4999 5002-5031 5034-5046 5049-5061 5064-5098 5101-5140 5143-5171 5174-5185 5188-5200 5203-5209 5212-5237 5240-5253 5256-5267 5270-5278 5281-5349 5352-5368 5371-5392 5395-5430 5433-5452 5455-5465 5468-5621 5624-5658 5661-5726 5729-5749 5752-5754 5757-5766 5769-5775 5778-5789 5792-5812 5815-5834 5837-5863 5866-5881 5884-5885 5888-5937 5940-5988 5991-6023 6026-6178 6181-6224 6227-6235 6238-6240 6243-6283
#   creatorProfileController.js                   |  82.00 |    34.41 |   78.95 | 47-50 53-56 59-62 75-76 78-79 82 88-89 150-151 153-154 157-158 160-161 171-172 200-201 207-208 237 244 255 272 289-290 299-300 309-310 313-317 324-326 336-344 347-348 358-359 362-363 385-386 390-391 405-411 461-462 465-466 469-470 478-482
#   dm                                            |        |          |         |
#    AppShell.js                                  |  36.49 |   100.00 |    0.00 | 9-18 116-291 294-295
#    Avatar.js                                    |   7.02 |   100.00 |    0.00 | 3-13 16-57
#    Composer.js                                  |   1.64 |   100.00 |    0.00 | 1-10 15-244
#    ContactRow.js                                |   5.26 |   100.00 |    0.00 | 4-13 16-95
#    ConversationList.js                          |   4.29 |   100.00 |    0.00 | 5-14 16-18 21-163
#    DayDivider.js                                |   8.33 |   100.00 |    0.00 | 1-10 13-24
#    DMPrivacySettings.js                         |   1.39 |   100.00 |    0.00 | 2-72
#    DMRelaySettings.js                           |   1.25 |   100.00 |    0.00 | 2-80
#    DMSettingsModalController.js                 |  17.24 |   100.00 |    8.33 | 16-41 44-82 94-112 115-129 132-145 148-181 184-186 189-212 215-220 223-245 248-260
#    index.js                                     | 100.00 |   100.00 |  100.00 |
#    MessageBubble.js                             |   2.60 |   100.00 |    0.00 | 1-10 13-77
#    MessageThread.js                             |   3.66 |   100.00 |    0.00 | 6-15 18-191
#    NotificationCenter.js                        |  10.05 |   100.00 |    0.00 | 1-10 29-31 34-97 100-219
#    zapHelpers.js                                |  10.34 |   100.00 |    0.00 | 1-7 10-17 20-52 55-58
#    ZapInterface.js                              |   5.04 |   100.00 |    0.00 | 5-14 17-119
#    ZapReceiptList.js                            |   5.00 |   100.00 |    0.00 | 3-12 14-29 32-100
#   editModalController.js                        |  90.76 |    70.83 |   75.00 | 45-47 60-62 64-66 73-74
#   engagementController.js                       |  74.18 |    49.03 |   50.00 | 32-33 48 50-51 78-79 87-88 90-91 117-118 120-123 125-128 130-131 136-139 156-158 164-165 169-171 187-189 264-297 311-313 319-320 324-326 384 391-413 416-418 422-424
#   initDeleteModal.js                            |   8.62 |   100.00 |    0.00 | 4-56
#   initEditModal.js                              |   7.35 |   100.00 |    0.00 | 4-66
#   initUploadModal.js                            |   6.58 |   100.00 |    0.00 | 4-74
#   loginModalController.js                       |   3.96 |   100.00 |    0.00 | 8-14 16-30 32-106 108-115 117-128 130-140 142-152 154-164 166-198 202-302 305-329 332-375 378-380 383-405 408-423 426-459 462-463 466-470 473-474 477-478 481-526 529-562 565-642 645-651 654-660 663-685 688-699 702-714 717-732 735-768 771-793 796-851 854-1115 1118-1595 1598-1851 1854-1867 1870-1887 1890-1918 1921-2032 2035-2062 2065-2079 2082-2083 2086-2116 2119-2152 2155-2184 2187-2214 2217-2227 2230-2442 2445-2459 2462-2487 2490-2550
#   ModalManager.js                               |   2.46 |   100.00 |    0.00 | 20-59 62-701 704-973
#   moderationCopy.js                             |  84.57 |    56.00 |  100.00 | 5-6 27-28 36-37 51-53 78-84 89-90 129-133 139-140
#   moderationUiHelpers.js                        |  93.43 |    84.55 |   94.44 | 33-39 46-51 185-186 188-189 213-214 298-299 301-302
#   moreMenuController.js                         |   5.00 |   100.00 |    0.00 | 26-104 107-108 111-169 172-204 207-225 228-229 232-275 278-351 354-427 430-438 441-459 462-479 482-483 486-576 579-615 618-622 625-635 638-692 695-721 724-783 786-852 855-896 899-944 947-958 961-989 992-1072 1075-1086 1089-1599
#   notificationController.js                     |  69.17 |    25.00 |   70.00 | 40-41 51-52 66-70 73-75 95-101 120-122 129-130 145 152-153 156-162 165 175 177-202 212-213 216-218 221-225 233-239 247-249
#   overlay                                       |        |          |         |
#    overlayRoot.js                               |  85.71 |    72.22 |  100.00 | 9-11 20-21 40-41 48-49
#    popoverEngine.js                             |  84.38 |    58.73 |   90.00 | 34-35 41-42 44-45 51-52 55-56 60 72-73 75-77 87-88 101-103 109-116 121-122 144-145 151-152 191-192 196 201-202 283-285 287-288 298-299 302-303 324-325 330-331 347-348 354-355 368-371 386-387 389-390 392-393 406-407 428-429 440-443 446-452 456-457 475-476 497-498 512 526-527 544-545 558 563-564 572-573 582-583 627-628 638-639 642-648 690-691 714-715 717-718 730-732 742-743 746-748 775-776 780-781 784-785 788-789 845-846 861-865 871-872 884-885 892-893 900-901 905-907 911-912 935-937 966-967 1013 1015-1016 1020-1025
#   profileIdentityController.js                  |   3.91 |   100.00 |    0.00 | 5-15 18-178
#   profileModal                                  |        |          |         |
#    ProfileDirectMessageActions.js               |   7.64 |    75.00 |    7.41 | 18-27 30-39 42-43 46-74 77-94 97-109 112-136 139-166 169-284 287-310 313-355 358-417 420-556 559-664 667-670 673-676 679-704 707-732 735-790 793-810 813-819 822-828 834-879 883-908 911-927
#    ProfileDirectMessageController.js            |  38.00 |    62.50 |   16.07 | 51-52 62-66 70 73 76 79 82 89-90 96-113 118-120 123-134 145-161 164-184 200-229 234-259 262-279 282-287 290-339 342-358 372-443 446-482 507-530 563-564 567-568 571-572 575-576 579-580 583-584 591-592 595-596 599-600 603-604 607-608 611-612 615-616 619-620 623-624 627-628 631-632 635-636 639-640 645-646 649-650 653-654 657-658 661-662 665-666 669-670 673-674 677-678
#    ProfileDirectMessageHelper.js                |  10.55 |    30.00 |    7.41 | 16-17 22-26 31 33-37 44-53 56-62 65-72 75-112 115-150 153-166 169-182 185-209 212-260 263-283 286-294 297-307 310-324 327-364 367-381 384-403 406-421 424-444 447-452 455-473 476-486 489-521 524-645 648-684 687-756
#    ProfileDirectMessageRenderer.js              |  18.63 |    26.67 |   36.84 | 45-72 78-81 110-111 117-123 132-139 142-148 155-160 163-172 178-181 189-192 197-204 221-227 238-246 252-279 282-429 432-525 528-626 629-766 769-779 782-791 794-803 806-825 828-859 862-905
#    ProfileRelayController.js                    |   9.01 |   100.00 |    7.69 | 21-30 33-136 139-145 148-200 203-215 218-263 266-352 355-395 398-431 434-446 449-464
#    ProfileStorageController.js                  |  14.81 |    40.00 |   13.64 | 67-70 73-76 79-82 85-88 91-94 97-100 104-192 195-245 248-251 254-299 302-316 319-333 336-337 340-351 354-492 495-601 604-679 682-695 698-701
#    ProfileWalletController.js                   |  18.07 |    29.41 |   28.13 | 35-46 49-52 55-58 61-64 67-70 85-92 105-111 115-136 139-187 193-195 197-199 203-204 210-211 224-226 228-231 235-257 260-289 292-312 315-337 340-363 366-387 390-492 495-603 606-677 686-690 696-720 723-740 743-757
#   profileModalContract.js                       |  67.25 |    84.71 |   46.28 | 30-31 60-62 64-78 80-94 106-113 122-125 155 164-165 235-236 328-329 333-339 343 347-362 366-369 373-394 398-410 420 432-496 525-534 588-591 612-618 634-640 658-659 692-698 707-713 722-732 741-747 756-766 775-779 788-803 841-844 847-850 855-858 864-870 892-895
#   profileModalController.js                     |  32.02 |    32.71 |   26.91 | 109 122-123 137-138 152-153 163-164 214 226 233 240 242-265 282-286 576 578-581 587-590 595-596 601-610 614-615 624-625 641 697-698 828-835 840 842-850 988-990 1044-1045 1049-1073 1076-1109 1126-1133 1156-1159 1166 1175-1178 1187 1194-1218 1224-1271 1278-1290 1296-1300 1305-1364 1369-1383 1391-1397 1400-1417 1421-1496 1499-1544 1549-1576 1581-1629 1634-1655 1665-1679 1715 1720-1728 1732 1738-1743 1749-1750 1756 1761-1768 1773 1779-1782 1785-1788 1791-1813 1816-1819 1822-1825 1828-1846 1849-1855 1858-1879 1882-1905 1908-1911 1914-1929 1933-1937 1940-1944 1947-1953 1956-1959 1962-1968 1971-1974 1977-1980 1983-1986 1989-1995 2000-2006 2013-2016 2019-2024 2027-2030 2033-2040 2043-2052 2055-2063 2066-2078 2106 2112 2118 2135-2138 2141-2153 2156-2162 2165-2168 2171-2183 2186-2192 2195-2198 2201-2213 2216-2222 2225-2228 2231-2234 2237-2240 2243-2246 2249-2252 2255-2258 2261-2264 2267-2270 2273-2277 2280-2284 2290-2311 2314-2346 2349-2426 2429-2443 2446-2539 2597 2602-2605 2652 2654-2656 2674-2675 2681 2683-2684 2691-2692 2701-2706 2723 2725-2726 2733-2734 2749-2752 2775-2776 2779-2784 2786-2787 2790-2798 2801-2817 2820-2826 2835-2837 2845-2850 2876-2877 2891-2892 2923-2924 2943-2944 2958-2959 2972-2973 2976-3004 3009-3012 3021-3022 3025-3026 3030-3138 3142-3169 3172-3216 3227 3229-3233 3247-3260 3267-3313 3316-3354 3366 3368-3397 3401-3412 3415-3424 3435-3465 3519-3520 3533-3535 3543-3545 3553-3554 3571-3572 3584-3589 3592-3593 3613-3614 3626 3628-3632 3634-3636 3638 3640 3642-3648 3650-3656 3658-3661 3663-3665 3683-3720 3723-3774 3777-3778 3781-3782 3786-3787 3793-3801 3814 3822-3826 3836 3841 3862-3872 3878-3886 3897-3913 3917-3980 3986-3996 4000-4011 4014-4015 4017-4018 4020-4021 4026-4066 4073-4078 4081-4085 4089-4106 4109-4115 4121-4126 4129-4137 4144-4147 4164-4182 4186-4222 4225-4299 4302-4405 4408-4466 4469-4491 4494-4512 4515-4692 4695-4938 4941-4953 4956-4981 4984-5256 5259-5271 5274-5282 5285-5379 5382-5499 5502-5567 5570-5572 5575-5596 5599-5628 5631-5680 5683-5729 5733-5782 5788-5789 5801-5802 5888-5889 5961-5962 5977-5980 5985-5986 5993-5996 6011-6012 6017-6018 6027-6028 6034-6048 6051-6087 6090-6110 6113-6133 6138 6142-6227 6229-6230 6236-6243 6250-6251 6300-6309 6311 6322-6329 6333-6334 6338-6347 6351-6378 6412-6413 6426-6427 6431-6438 6511-6520 6535-6536 6580-6589 6595-6604 6607-6627 6630-6658 6661-6696 6699-6848 6851-6919 6922-7000 7003-7018 7021-7035 7038-7129 7132-7211 7214-7391 7394-7423 7426-7455 7458-7514 7517-7531 7534-7618 7621-7686 7690-7758 7761-7765 7772 7776-7778 7784-7797 7806-7809 7813-7814 7817-7819 7823-7862 7868-7883 7890 7892-7893 7902-7909 7912-7916 7919-7963 7966-8014 8017-8043 8046-8076 8083 8092-8209 8212-8213 8216-8251 8254-8368 8371-8449 8452-8513 8516-8545 8548-8571 8574-8596 8599-8631 8643-8644 8648-8649 8656-8657 8663-8664 8672-8673 8681-8685 8687 8695-8696 8699-8700 8703-8704 8716-8717 8720-8721 8724-8725 8728-8729 8732-8733 8736-8737 8740-8741 8744-8745 8748-8749
#   reactionController.js                         |  75.47 |    27.69 |   47.37 | 37 59-67 76-78 83-84 96-97 99-100 106-110 120 143-153 156-161 166-167 184-185 191 193-194 199-200 210-211 231-234 246-247 258-259 261-262 268-272 300-301 309 313-314 321-328 330-331 345-346 364-369
#   revertModalController.js                      |   7.63 |   100.00 |    0.00 | 5-18 21-67 70-117
#   shareNostrController.js                       |   8.86 |   100.00 |    0.00 | 17-31 34-73 76-236
#   similarContentController.js                   |  81.68 |    71.76 |  100.00 | 30-31 41-42 59-60 69-73 84-88 105-106 129-139 142-143 155-159 166-167 169-170 174-175 177-178 201-202 210-211 235-236 242-245 252-253 255-256 263 310-311
#   subscriptionHistoryController.js              |  11.36 |   100.00 |    7.69 | 20-40 43-87 90-100 103-115 118-133 136-181 184-233 236-282 285-307 310-328 331-351
#   tagPreferenceMenuController.js                |  61.67 |    54.24 |   68.75 | 29-54 78-79 84-87 105-106 144-149 154-155 159 173-186 201-214 228-229 233-234 243-244 246-247 249-250 252-253 272-273 280-281 285-308 312-313 318-319 325-337 342-346
#   torrentStatusController.js                    |  78.74 |    68.97 |   90.00 | 25-29 32-41 110-111 117-126
#   urlHealthController.js                        |  69.06 |    28.17 |   66.67 | 44-45 52-53 56-64 84-86 93-94 108-109 134-135 140-141 148-150 163-176 186-200 216 219-227 246-249 260-261 264-267 287-288 293-294 299-300 316 330-331 336-340 347-348 356-357 361 375-380 389 391-397 419-426 436-447 454-459 463-464 467-472 479-483 493-499
#   videoListViewController.js                    |  11.61 |   100.00 |    0.00 | 5-12 15-18 21-49 52-104 107-111
#   videoModalCommentController.js                |   6.34 |   100.00 |    0.00 | 8-10 14-19 21-29 33-124 127-242 245-246 249-250 253-254 257-258 261-262 265-266 269-296 299-309 312-326 329-365 368-421 424-534 537-552 555-592 595-619 622-628 631-667 670-681 684-862 865-903 906-937 940-961
#   videoModalController.js                       |   9.90 |   100.00 |    0.00 | 5-20 23-24 27-28 34-84 87-91 94-98 101-201
#   videoSettingsMenuController.js                |  10.53 |   100.00 |    0.00 | 8-20 23-113 116-133 136-148 151-161 164-170
#   views                                         |        |          |         |
#    VideoListView.js                             |  48.81 |    27.74 |   36.04 | 209-210 214-216 219-221 224-228 232-233 236-237 252-253 256-264 267-277 280-281 284-285 288-289 292-293 296-297 300-301 309-311 314-315 337-338 355-356 367-378 413-414 423-424 434-435 443-445 453-454 458-459 480-481 485-486 563-565 569-579 583-593 597-607 611-618 622-633 637-648 652-666 670-673 677-685 689-692 696-698 702-705 710-711 714-715 730-755 759-784 791-795 801-803 817-840 843-883 897-899 905-907 913-930 934-935 943-944 947-948 953-954 960-961 970-972 974 979-980 986-993 995-996 1001-1002 1010-1011 1016-1023 1026-1037 1046 1048-1062 1066-1104 1107-1117 1120-1129 1132-1133 1136-1140 1143-1151 1154-1214 1217-1243 1247-1255 1259-1274 1277-1314 1317-1341 1344-1347 1350-1390
#   watchHistoryController.js                     |   7.82 |   100.00 |    0.00 | 11-17 19-31 35-54 57-91 94-112 115-132 135-150 153-221 224-348 351-370
#   zapController.js                              |   7.05 |   100.00 |    0.00 | 35-96 101-115 118-133 136-161 164-165 168-174 177-183 186-410 413-420 425-433 436-446 449-483 486-521 524-538 541-776 779-830 833-846 849-952 955-1054 1057-1083 1086-1088 1091-1192 1195-1198 1201-1204
#  urlHealthObserver.js                           |  38.24 |    75.00 |   50.00 | 12-17 21-54 60-61
#  userBlocks.js                                  |  18.92 |    33.78 |   26.47 | 43-44 54-57 64-65 71-75 97-103 105-113 115-163 165-198 200-230 241-243 247-259 266-282 286-288 290-303 306-308 311-313 327-357 359-418 420-442 444-457 468-483 485-500 502-514 516-518 520-557 559-587 589-601 603-614 616-632 634-667 676-677 682-688 710-717 722-738 741-748 751-772 775-786 793-794 797-798 801-802 805-831 836-837 845-851 855-884 887-1629 1632-1660 1663-1675 1680-1681 1684-1685 1698-1707 1710-1716 1719-1728 1737-1738 1742-1827 1830-1903 1906-1977 1980-1981 1984-1985 1992-1993 1998-1999 2003-2006 2009-2012 2023-2027 2029-2031 2034-2035 2039-2041 2044-2045 2055-2067 2079-2080 2083-2087 2092-2097 2106-2107 2110-2115 2118-2133 2136-2139 2143-2144 2156-2157 2177-2208 2247-2258 2261-2273 2286-2289 2293-2294
#  utils                                          |        |          |         |
#   asyncUtils.js                                 |  77.14 |    76.47 |   72.73 | 47-48 69-80 86-87 95-102
#   cardSourceVisibility.js                       |  88.89 |    73.53 |  100.00 | 23 25-29 36-37 39-40
#   cryptoUtils.js                                |  17.39 |    50.00 |    0.00 | 7-11 16-53 56-69
#   domUtils.js                                   | 100.00 |    91.67 |  100.00 |
#   formatters.js                                 |  31.75 |    40.00 |   20.00 | 8-21 30-31 35-36 39-40 50-70 76-92 99-126
#   hashtagNormalization.js                       |  84.00 |    42.86 |  100.00 | 21-22 26-27 31-32 46-47
#   hex.js                                        | 100.00 |   100.00 |  100.00 |
#   linkPreviewSettings.js                        |  84.00 |    66.67 |   87.50 | 15-17 33-34 43-47 62-63 72-73 91-92 96-97 116-117 133-134 142-143
#   logger.js                                     |  71.76 |    38.24 |   80.00 | 13-14 25-32 50-51 55-58 66 70 74 82 90-91 94-96 103-106 111-112 115-117 133 146-158
#   lruCache.js                                   |  98.17 |    93.33 |   87.50 | 107-108
#   magnetValidators.js                           |  27.12 |   100.00 |    0.00 | 15-57
#   mediaLoader.js                                |  23.17 |   100.00 |    0.00 | 13-59 62-75 78-79
#   mime.js                                       |  85.71 |    30.00 |  100.00 | 28-29 36-38 43-44
#   nostrHelpers.js                               |  37.25 |    62.50 |   33.33 | 10-37 46-72 82-83 87-88 95-99
#   pointer.js                                    |  77.78 |    64.29 |  100.00 | 5-6 10-11 16-17
#   pointerNormalization.js                       |  35.98 |    34.62 |   60.00 | 6-7 11-12 17-33 37-38 46-47 58-59 62-63 66-67 75-96 100-101 103-104 109-111 114-115 118-119 121-161
#   profileBatchFetcher.js                        |  13.75 |   100.00 |    0.00 | 12-80
#   profileMedia.js                               |  95.24 |    94.12 |  100.00 | 9-10 38-39
#   qrcode.js                                     |   4.72 |    20.00 |    0.00 | 12-771 775-776 779-780 788 792 796
#   safeDecode.js                                 |  37.50 |    33.33 |   50.00 | 2-15 19-20 24-25 30-31
#   serviceWorkerFallbackMessages.js              |  82.76 |    90.48 |  100.00 | 12-19 54-55
#   simpleEventEmitter.js                         |  17.50 |   100.00 |    0.00 | 3-5 8-22 25-39
#   storage.js                                    |  42.11 |    41.67 |   50.00 | 11-13 17-18 23-24 30-34 39-40 48-49 54-55 60-61 65-87 90-102 105-114
#   storagePointer.js                             |  64.33 |    68.42 |   83.33 | 16-23 25-28 51-52 60-61 70-80 84-85 90 95-104 111-122 134-135 155-156
#   torrentHash.js                                |  26.39 |   100.00 |    0.00 | 9-56 66-68 71-72
#   videoDeduper.js                               |  89.19 |    72.73 |  100.00 | 18-19 22-23
#   videoPointer.js                               |  84.92 |    80.65 |  100.00 | 76-77 95-96 100-101 107-111 114-121
#   videoTags.js                                  |  94.12 |    90.24 |  100.00 | 20-21 49-50 54-55 124-125
#   videoTimestamps.js                            |  98.11 |    95.92 |  100.00 | 45-46
#  videoEventUtils.js                             |  12.71 |   100.00 |    0.00 | 10-12 14-27 30-75 77-96 98-117
#  viewCounter.js                                 |  37.54 |    25.45 |   44.83 | 70-71 73-74 90-91 96-97 102-103 115-116 119-120 126-128 130-139 141-180 189-190 195-217 223-224 229-230 236 238-239 242-287 292-293 315-316 331-334 338-349 351-368 375-388 391-399 403-404 409-410 417-418 427-428 437-445 447-458 460-537 539-553 555-589 592-597 600-622 625-637 641-642 651-652 663-674
#  watchHistoryDebug.js                           |  23.32 |    50.00 |    0.00 | 12-14 40-61 63-76 78-87 89-95 97-119 121-152 155-166 169-193
#  watchHistoryService.js                         |  26.23 |    27.06 |   48.89 | 42-64 81-82 86-87 98-99 109-127 146-147 150-151 159-160 170-173 186-188 191-200 205-215 219-229 232-242 245-260 262-274 278-279 284-285 291-293 298-314 316-327 329-371 374-382 387-388 394-403 409-413 416-421 434-435 438-440 448-465 468-502 504-509 511-521 523-565 567-584 586-657 678-866 868-999 1003-1004 1007-1008 1016-1017 1026-1027 1049-1055 1057-1068 1070-1086 1088-1126 1128-1182 1189-1199 1205-1206 1221-1230 1250-1258 1261-1279 1289-1300 1308-1335 1340-1346 1354-1363 1365-1377
#  webtorrent.js                                  |  12.25 |    66.67 |    4.00 | 31-43 45-67 69-141 143-149 151-160 184-191 198-371 374-375 378-379 382-383 386-389 392-393 400-450 453-485 488-505 508-525 540-561 564-636 639-751 754-771 774-853 856-921 928-987 995-1032
#  webtorrent.min.js                              | 100.00 |    67.80 |   13.88 |
# scripts                                         |        |          |         |
#  agent                                          |        |          |         |
#   setup-test-env.js                             |  47.62 |    12.50 |    0.00 | 6-7 11-12 14-15 19-20 24-33 36-37 41-42
# tests                                           |        |          |         |
#  app                                            |        |          |         |
#   channel-profile-moderation.test.mjs           |  98.47 |    93.14 |   78.22 | 127-128 417-418 426-427 429-430
#   feedCoordinator.test.mjs                      | 100.00 |   100.00 |   80.00 |
#   hash-change-handler.test.mjs                  |  98.41 |    95.45 |   86.96 | 24-25
#   hydrate-sidebar-navigation.test.mjs           |  97.81 |    77.78 |   42.86 | 100-101 180-181
#   is-user-logged-in.test.mjs                    |  96.24 |    85.71 |   88.89 | 20-21 26-27 37
#   moderation-overrides.test.mjs                 |  96.59 |    94.74 |   70.83 | 32-36 131-134
#   moderation-settings-refresh.test.mjs          | 100.00 |   100.00 |  100.00 |
#   similar-content.test.mjs                      |  75.52 |    73.33 |   88.24 | 32-33 80-81 86-87 89-90 92-93 95-96 101-158
#  auth                                           |        |          |         |
#   signingAdapter.test.mjs                       |  97.80 |    93.33 |   86.67 | 20-21
#  compliance                                     |        |          |         |
#   nip04_44_compliance.test.mjs                  |  89.58 |    87.50 |   66.67 | 11-20
#   nip07_compliance.test.mjs                     |  97.22 |    84.62 |   69.23 | 8-9
#   nip65_compliance.test.mjs                     |  89.69 |    84.62 |   55.56 | 15-23 50
#   video_note_compliance.test.mjs                |  83.49 |    92.31 |   78.57 | 9-26
#  designSystem                                   |        |          |         |
#   dynamicStyles.test.mjs                        |  95.65 |    69.05 |  100.00 | 70-79 185-186
#  docs                                           |        |          |         |
#   verify-upload-claims.test.mjs                 | 100.00 |   100.00 |  100.00 |
#  feed-engine                                    |        |          |         |
#   explore-diversity.test.mjs                    | 100.00 |   100.00 |   87.50 |
#   explore-scorer.test.mjs                       | 100.00 |   100.00 |  100.00 |
#   kids-scorer.test.mjs                          | 100.00 |   100.00 |  100.00 |
#   tag-preference-filter.test.mjs                | 100.00 |   100.00 |  100.00 |
#  helpers                                        |        |          |         |
#   moderation-test-helpers.mjs                   |  81.99 |    64.63 |   65.63 | 20-21 29-30 35-36 50-51 62 85-102 132-133 186 189 205 208 211 214 217 220 246-247 251-252 257-273 277-278 281-282 286-292 331-332 335-337 340-342 345-347 360-362 415-416 421-422
#  moderation                                     |        |          |         |
#   hide-thresholds.test.mjs                      | 100.00 |    94.52 |   90.67 |
#   mocks                                         |        |          |         |
#    bootstrap-trust-seeds-loader.mjs             | 100.00 |    92.31 |  100.00 |
#   submit-report.test.mjs                        |  97.09 |    94.12 |   87.50 | 34 44-45
#   trust-seeds.test.mjs                          |  98.86 |    86.96 |   85.71 | 159 173 181
#   trusted-mute-lists.test.mjs                   |  97.80 |    86.96 |   75.00 | 90-91 94-95
#   trusted-report-count.test.mjs                 |  98.70 |    90.48 |   76.19 | 105-106 109
#   video-card.test.mjs                           |  95.77 |    89.58 |   66.67 | 44 46 66-68 71-73 76-83 345-348 411-414
#  nostr                                          |        |          |         |
#   adapters.test.mjs                             |  88.07 |    70.59 |   57.89 | 35-38 68-79 84-85 90-91 135
#   cachePolicies.test.mjs                        | 100.00 |   100.00 |  100.00 |
#   client.test.mjs                               |  97.99 |    96.08 |   88.68 | 7-8 23-24 27-28
#   comment-events.test.mjs                       |  99.75 |    90.57 |   89.80 | 38-39
#   countDiagnostics.test.mjs                     | 100.00 |   100.00 |  100.00 |
#   decryptionSchemeCache.test.mjs                | 100.00 |   100.00 |  100.00 |
#   defaultClient.test.mjs                        |  83.33 |    80.00 |   38.89 | 7-11 14-20
#   dm-direct-message-flow.test.mjs               |  97.39 |    86.00 |   92.50 | 36 62-63 128-129 134-135 140-141 400-401
#   dmDecryptDiagnostics.test.mjs                 | 100.00 |   100.00 |  100.00 |
#   dmDecryptorPreference.test.mjs                | 100.00 |   100.00 |  100.00 |
#   dmDecryptWorkerClient.test.mjs                |  98.43 |   100.00 |   93.94 | 23-26
#   dmSignalEvents.test.mjs                       |  91.16 |    88.46 |   94.74 | 8-16 28 30-35
#   edit-video-dtag.test.mjs                      |  99.40 |    80.00 |   90.00 | 25
#   eventsCacheStore.test.mjs                     |  96.88 |    80.00 |   77.78 | 7-8 26-27
#   eventsMap.test.mjs                            | 100.00 |   100.00 |  100.00 |
#   integration-remote-flow.test.mjs              |  90.03 |    46.15 |   57.69 | 7-10 16 21-26 75 86-87 139 151-153 193-194 218-220 231-232 235 241 249-250 255-256 259-260 283 286
#   maxListenerDiagnostics.test.mjs               |  98.25 |    95.45 |  100.00 | 8-9
#   nip04WorkerClient.test.mjs                    |  97.69 |    82.35 |   97.62 | 14-15 26-29
#   nip07Adapter-race-condition.test.mjs          | 100.00 |    90.91 |   56.25 |
#   nip46Connector.test.mjs                       |  97.56 |   100.00 |   75.00 | 39-40 61-62
#   nostrClientRegistry.test.mjs                  | 100.00 |   100.00 |  100.00 |
#   publishHelpers.test.mjs                       |  97.90 |   100.00 |   80.00 | 19-21
#   reaction-events.test.mjs                      |  92.80 |    86.67 |   78.57 | 29-33 59-61 109
#   revert-video-dtag.test.mjs                    |  99.21 |    93.75 |   86.67 | 24
#   session-actor.test.mjs                        |  99.03 |    85.71 |  100.00 | 53
#   sessionActor.test.mjs                         |  97.50 |    75.00 |  100.00 | 20-22
#   sign-request-queue.test.mjs                   | 100.00 |   100.00 |  100.00 |
#   signers.test.mjs                              |  97.37 |    75.00 |   33.33 | 33
#   syncMetadataStore.test.mjs                    | 100.00 |   100.00 |  100.00 |
#   toolkit.test.mjs                              | 100.00 |   100.00 |   62.50 |
#   videoEventBuffer.test.mjs                     | 100.00 |    95.00 |   94.12 |
#   videoPayloadBuilder.test.mjs                  | 100.00 |    94.44 |  100.00 |
#  performance                                    |        |          |         |
#   resolvePostedAt.test.mjs                      |  83.48 |    75.00 |   38.10 | 7-21 25-28
#  services                                       |        |          |         |
#   attachmentService.test.mjs                    |  96.39 |    87.50 |  100.00 | 13-14 34-35 39-40
#   authUtils.test.mjs                            | 100.00 |   100.00 |  100.00 |
#   discussionCountService.test.mjs               | 100.00 |   100.00 |  100.00 |
#   exploreDataService.optimization.test.mjs      | 100.00 |   100.00 |  100.00 |
#   exploreDataService.test.mjs                   | 100.00 |    96.67 |  100.00 |
#   link-preview-service.test.mjs                 |  97.56 |    94.44 |   88.24 | 38-39 70
#   moderation-action-controller.test.mjs         | 100.00 |   100.00 |   85.71 |
#   nostr-service.test.mjs                        | 100.00 |   100.00 |   88.24 |
#   playbackService_forcedSource.test.mjs         |  95.73 |    93.55 |   87.50 | 22-29 70
#   playbackService_order.test.mjs                |  98.68 |   100.00 |   86.67 | 28-30
#   playbackService.test.mjs                      |  96.24 |    96.55 |  100.00 | 18-25
#   profileMetadataService.test.mjs               |  99.22 |   100.00 |   92.59 | 18-19
#   r2Service.test.mjs                            |  98.34 |    89.47 |  100.00 | 30-31 131
#   relay-health-service.test.mjs                 |  98.71 |    92.68 |  100.00 | 74 180 201-202
#   s3Service.test.mjs                            | 100.00 |   100.00 |  100.00 |
#   s3UploadService.test.mjs                      | 100.00 |   100.00 |  100.00 |
#   trustBootstrap.test.mjs                       |  96.34 |    74.07 |   95.00 | 6-12
#  state                                          |        |          |         |
#   appState.test.mjs                             | 100.00 |   100.00 |  100.00 |
#   cache-saved-profiles.test.mjs                 | 100.00 |   100.00 |  100.00 |
#   cache.test.mjs                                |  98.73 |    92.31 |  100.00 | 113-114
#   profile-cache.test.mjs                        | 100.00 |   100.00 |  100.00 |
#   profile-settings-store.test.mjs               |  97.83 |    85.71 |  100.00 | 8-9
#  test-helpers                                   |        |          |         |
#   setup-localstorage.mjs                        |  92.94 |    80.00 |   60.00 | 10-11 14-15 62-63
#   wait-for.mjs                                  |  50.00 |    66.67 |   50.00 | 10-19
#  test-setup.mjs                                 |  93.94 |    33.33 |    0.00 | 17-18
#  torrent                                        |        |          |         |
#   service-worker-fallback-message.test.mjs      | 100.00 |   100.00 |  100.00 |
#   style-helpers.test.mjs                        | 100.00 |   100.00 |  100.00 |
#   toast-service.test.mjs                        | 100.00 |   100.00 |  100.00 |
#  ui                                             |        |          |         |
#   app-chrome-controller.test.mjs                | 100.00 |   100.00 |   50.00 |
#   creatorProfileController.test.mjs             | 100.00 |   100.00 |   82.61 |
#   engagement-controller.test.mjs                | 100.00 |   100.00 |  100.00 |
#   hashtag-strip-helper-bounce.test.mjs          |  97.22 |    90.00 |   72.73 | 26 114-115 136
#   helpers                                       |        |          |         |
#    jsdom-test-helpers.mjs                       |  86.96 |    50.00 |  100.00 | 25-26 28-29 31-32
#   mocks                                         |        |          |         |
#    floating-ui-test-loader.mjs                  | 100.00 |   100.00 |  100.00 |
#   popoverEngine.test.mjs                        |  99.48 |    95.56 |   97.30 | 16-19
#   profile-modal-moderation-settings.test.mjs    | 100.00 |   100.00 |   58.62 |
#   profileModalController-addProfile.test.mjs    |  96.07 |    88.46 |   67.74 | 49-55
#   reactionController.test.mjs                   | 100.00 |   100.00 |   91.67 |
#   similar-content-card.test.mjs                 |  97.96 |    90.00 |  100.00 | 168-171
#   similarContentController.test.mjs             | 100.00 |   100.00 |   93.10 |
#   storageService.test.mjs                       |  92.31 |    75.00 |   84.62 | 19-20 23-26 51-53 56-59
#   tag-pill-list.test.mjs                        | 100.00 |   100.00 |  100.00 |
#   tag-preference-menu.test.mjs                  | 100.00 |   100.00 |  100.00 |
#   tagPreferenceMenuController.test.mjs          | 100.00 |   100.00 |   87.50 |
#   torrentStatusController.test.mjs              | 100.00 |   100.00 |  100.00 |
#   uploadModal-integration.test.mjs              |  99.53 |    95.45 |   66.67 | 99
#   uploadModal-reset.test.mjs                    |  96.96 |   100.00 |   64.52 | 22-23 26-28 156-157
#   url-health-controller.test.mjs                |  94.87 |    87.23 |   86.84 | 54-56 61-62 64-65 108 136 168
#   video-list-view-popular-tags.test.mjs         | 100.00 |    93.33 |   68.75 |
#   video-list-view-sorting.test.mjs              | 100.00 |    77.78 |  100.00 |
#  unit                                           |        |          |         |
#   app_guard_logic.test.mjs                      | 100.00 |   100.00 |   91.67 |
#   client-count-resilience.test.mjs              |  89.47 |    85.71 |   55.56 | 8-13
#   comment-avatar.test.mjs                       | 100.00 |   100.00 |  100.00 |
#   editModalController.test.mjs                  |  98.75 |    93.55 |   93.33 | 76-77
#   embed_player_modal.test.mjs                   |  79.41 |    83.33 |   50.00 | 7-13
#   embed-accent.test.mjs                         | 100.00 |   100.00 |  100.00 |
#   hashChangeHandler.test.mjs                    | 100.00 |   100.00 |   71.43 |
#   notificationController.test.mjs               | 100.00 |   100.00 |   94.74 |
#   searchFilters.test.mjs                        | 100.00 |   100.00 |  100.00 |
#   security-config.test.mjs                      | 100.00 |   100.00 |  100.00 |
#  utils                                          |        |          |         |
#   cardSourceVisibility.test.mjs                 | 100.00 |   100.00 |  100.00 |
#   domUtils.test.mjs                             | 100.00 |   100.00 |  100.00 |
#   hex.test.mjs                                  | 100.00 |   100.00 |  100.00 |
#   linkPreviewSettings.test.mjs                  |  99.49 |   100.00 |   96.67 | 133
#   lruCache.test.mjs                             | 100.00 |   100.00 |  100.00 |
#   profileMedia.test.mjs                         | 100.00 |   100.00 |  100.00 |
#   video-deduper.test.mjs                        | 100.00 |   100.00 |  100.00 |
#   video-tags.test.mjs                           | 100.00 |   100.00 |  100.00 |
#   videoPointer.test.mjs                         | 100.00 |   100.00 |  100.00 |
#   videoTimestamps.test.mjs                      | 100.00 |   100.00 |  100.00 |
#  watchHistory                                   |        |          |         |
#   watch-history-telemetry.test.mjs              |  95.54 |    90.91 |   64.29 | 62-63 71-78
# torrent                                         |        |          |         |
#  ui                                             |        |          |         |
#   styleHelpers.js                               | 100.00 |   100.00 |  100.00 |
#   toastService.js                               |  85.34 |    52.38 |   55.56 | 19-20 27-28 103-104 110-111 141-144 153-156 161-162 168-172 175 181 184 190-191
# vendor                                          |        |          |         |
#  crypto-helpers.bundle.min.js                   | 100.00 |    69.51 |   55.84 |
#  floating-ui.dom.bundle.min.js                  | 100.00 |   100.00 |    1.33 |
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# all files                                       |  42.39 |    59.63 |   48.63 |
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# end of coverage report
