pixlstash 1.12.0.dev4__tar.gz → 1.12.0.dev5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (849) hide show
  1. {pixlstash-1.12.0.dev4/pixlstash.egg-info → pixlstash-1.12.0.dev5}/PKG-INFO +1 -1
  2. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/frontend/package-lock.json +2 -2
  3. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/frontend/package.json +1 -1
  4. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/authz/registry.py +10 -14
  5. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/picture.py +12 -0
  6. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/saved_recipe.py +1 -1
  7. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/AppBarButton-KLbu807S.js +1 -0
  8. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/AppButton-DhGWIIrt.js → pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/AppButton-DV7Exi1C.js +1 -1
  9. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/ChipRow-CAwvND-M.css → pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/ChipRow-CI8I63lz.css +1 -1
  10. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/ChipRow-ChlIxtV1.js +2 -0
  11. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/DuplicateQueue-BhgZD-D8.css → pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/DuplicateQueue-BI8vE3-Q.css +1 -1
  12. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/DuplicateQueue-CDWZ72TA.js +1 -0
  13. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/LibraryInsights-DHQytD-M.js → pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/LibraryInsights-BwbnpCFm.js +1 -1
  14. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/MakeMoreDialog-DUkx3nsp.js +1 -0
  15. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/ModelShelf-BEh6TPei.js +5 -0
  16. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/ModelShelf-CJs77rW_.css +1 -0
  17. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/MovesReview-1Kf5lFmA.css +1 -0
  18. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/MovesReview-C24oAbUk.js +1 -0
  19. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/PicturePicker-DXlwchDq.js +1 -0
  20. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/ReviewSessionsOverlay-DZVEjhvy.css +1 -0
  21. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/ReviewSessionsOverlay-Dj6CEZwe.js +1 -0
  22. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/RunDialog-1PmLgxjL.css +1 -0
  23. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/RunDialog-CKQOnDf-.js +1 -0
  24. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/RunReasonNotice-BqovQ0XL.js +1 -0
  25. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/Segmented-C06GFsBt.js +1 -0
  26. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/Segmented-DwNdtFel.css +1 -0
  27. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/WorkflowRecipesTab-Bs8qIXdO.js +1 -0
  28. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/EditLorasDialog-DNW4QA84.css → pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/WorkflowRecipesTab-CWoi0YNM.css +1 -1
  29. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/WorkflowTab-BvbJ67sh.js +1 -0
  30. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/WorkflowTab-bOAEhiMz.css +1 -0
  31. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/WorkflowsView-Dj77bfbX.css +1 -0
  32. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/WorkflowsView-Dz5tNx22.js +2 -0
  33. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/characters-xrfTzIdd.js +1 -0
  34. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/dedup-C53oDEav.js → pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/dedup-BaLvKQg0.js +1 -1
  35. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/index-BPsV6jN6.js +12 -0
  36. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/index-INn618u_.css → pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/index-CYCBg8Ld.css +1 -1
  37. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/pictureSets-3gI4WCtT.js +1 -0
  38. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/pinia-DQmHL7SR.js → pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/pinia-Dorb4XWM.js +1 -1
  39. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/useProjectStore-DAu-eZAn.js → pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/useProjectStore-P3RjCmJk.js +1 -1
  40. pixlstash-1.12.0.dev5/pixlstash/frontend/dist/assets/vue-router-CdMary_x.js +1 -0
  41. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/index.html +14 -13
  42. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/hub/bootstrap.py +2 -10
  43. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/hub/registry.py +92 -7
  44. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/hub/schema.py +175 -12
  45. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/hub/workflow_card_reads.py +321 -193
  46. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/hub/workflow_card_writes.py +42 -0
  47. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/hub/workflow_cards.py +245 -45
  48. pixlstash-1.12.0.dev5/pixlstash/hub/workflow_group_convert.py +1818 -0
  49. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/hub/workflow_group_writes.py +93 -129
  50. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/hub/workflow_origin.py +73 -48
  51. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/hub/workflows.py +2 -3
  52. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/mcp_server.py +16 -22
  53. pixlstash-1.12.0.dev5/pixlstash/migrations/versions/0125_refile_recipes_off_hand_made_workflows.py +43 -0
  54. pixlstash-1.12.0.dev5/pixlstash/migrations/versions/0126_add_picture_run_workflow_id.py +51 -0
  55. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/comfyui.py +338 -437
  56. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/libraries.py +12 -36
  57. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/model_shelf.py +6 -2
  58. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_listing.py +47 -6
  59. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/recipes.py +65 -7
  60. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/workflows.py +673 -372
  61. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/server.py +4 -8
  62. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/comfyui_recipe_service.py +7 -3
  63. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/comfyui_service.py +27 -0
  64. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/folder_structure_commit_service.py +5 -19
  65. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/library_switch_service.py +4 -23
  66. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/model_shelf_service.py +4 -3
  67. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/model_workflow_sets.py +18 -20
  68. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/saved_recipe_service.py +12 -0
  69. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/workflow_bindings.py +5 -2
  70. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/workflow_card_service.py +247 -54
  71. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/workflow_events.py +25 -3
  72. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/workflow_export.py +3 -3
  73. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/workflow_identity.py +193 -14
  74. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/workflow_inbox.py +21 -6
  75. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/workflow_io.py +21 -0
  76. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/workflow_library_service.py +69 -29
  77. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/stacking.py +46 -0
  78. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tagger_plugins/clip_service.py +6 -3
  79. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/comfyui_extraction_task.py +48 -7
  80. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/comfyui_workflow_pull_task.py +23 -22
  81. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_saved_recipe_workflow_finder.py +14 -2
  82. pixlstash-1.12.0.dev5/pixlstash/tasks/saved_recipe_convert_task.py +361 -0
  83. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/watch_folder_import_task.py +4 -0
  84. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/workflow_card_backfill_finder.py +81 -3
  85. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/workflow_card_backfill_task.py +29 -0
  86. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/known_base_models.py +4 -2
  87. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/media_files.py +32 -4
  88. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/model_utils.py +20 -6
  89. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/query/predicate_filter.py +60 -11
  90. pixlstash-1.12.0.dev5/pixlstash/utils/workflow_ids.py +64 -0
  91. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/vault.py +5 -5
  92. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/ws/broadcaster.py +14 -1
  93. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5/pixlstash.egg-info}/PKG-INFO +1 -1
  94. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash.egg-info/SOURCES.txt +37 -33
  95. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pyproject.toml +1 -1
  96. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_architecture_guardrails.py +9 -2
  97. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_authz_host_capability_16_3.py +10 -4
  98. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_authz_library_pin.py +2 -3
  99. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_comfyui_pixlstash_saver.py +25 -3
  100. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_comfyui_recipe_route.py +32 -9
  101. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_comfyui_workflow_pull.py +124 -102
  102. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_hub_model_shelf_schema.py +29 -7
  103. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_known_base_model_identify.py +14 -0
  104. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_libraries_routes.py +21 -0
  105. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_library_switch.py +29 -0
  106. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_mcp_server.py +11 -13
  107. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_migrations.py +74 -0
  108. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_model_shelf_api.py +98 -25
  109. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_model_unload_race.py +98 -0
  110. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_read_token_security.py +44 -0
  111. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_saved_recipes.py +85 -29
  112. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_temp_vault_first_import.py +79 -0
  113. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_watch_folder_worker.py +9 -1
  114. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_websocket_auth.py +22 -0
  115. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_workflow_cards.py +649 -163
  116. pixlstash-1.12.0.dev5/tests/test_workflow_group_convert.py +2159 -0
  117. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_workflow_identity.py +285 -1
  118. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_workflow_io.py +254 -139
  119. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_workflow_library.py +116 -2
  120. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_workflow_stage_bypass.py +22 -1
  121. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_workflows_api.py +782 -375
  122. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/AppBarButton-BLXhewdp.js +0 -1
  123. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/ChipRow-BEu53zcn.js +0 -2
  124. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/DuplicateQueue-S-_wAEz3.js +0 -1
  125. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/EditLorasDialog-BetKIz8Q.js +0 -1
  126. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/MakeMoreDialog-6H8J_ewg.js +0 -1
  127. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/ModelShelf-B7jauQwa.js +0 -5
  128. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/ModelShelf-ibyawyjn.css +0 -1
  129. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/MovesReview-EVwDdCWs.js +0 -1
  130. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/MovesReview-NJRjEk81.css +0 -1
  131. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/PicturePicker-BZTmSC4y.js +0 -1
  132. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/ReviewSessionsOverlay-B2ma0Qci.css +0 -1
  133. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/ReviewSessionsOverlay-BCl3zuMF.js +0 -1
  134. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/RunDialog-DdDE_9Ex.css +0 -1
  135. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/RunDialog-T3UEBV3J.js +0 -1
  136. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/RunReasonNotice-BCe4Gq5Y.js +0 -1
  137. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/Segmented-Dp64c2Fn.js +0 -1
  138. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/Segmented-KYtQ1Si0.css +0 -1
  139. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/WorkflowTab-CJBbJFRT.css +0 -1
  140. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/WorkflowTab-C_YpSkoG.js +0 -1
  141. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/WorkflowsView-9a9Jq6Hn.css +0 -1
  142. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/WorkflowsView-BSTBmeef.js +0 -2
  143. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/characters-DwgEUdJA.js +0 -1
  144. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/index-DtLFT5zL.js +0 -12
  145. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/pictureSets-BE1GpRnr.js +0 -1
  146. pixlstash-1.12.0.dev4/pixlstash/hub/workflow_group_convert.py +0 -738
  147. pixlstash-1.12.0.dev4/pixlstash/tasks/saved_recipe_convert_task.py +0 -176
  148. pixlstash-1.12.0.dev4/tests/test_workflow_group_convert.py +0 -640
  149. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/LICENSE +0 -0
  150. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/MANIFEST.in +0 -0
  151. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/README.md +0 -0
  152. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/frontend/LICENSE +0 -0
  153. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/LICENSE +0 -0
  154. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/__init__.py +0 -0
  155. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/alembic.ini +0 -0
  156. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/app.py +0 -0
  157. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/auth.py +0 -0
  158. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/authz/__init__.py +0 -0
  159. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/authz/gate.py +0 -0
  160. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/authz/membership.py +0 -0
  161. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/authz/policy.py +0 -0
  162. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/cli.py +0 -0
  163. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/data/anchors/builtin_bad.npy +0 -0
  164. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/data/anchors/builtin_good.npy +0 -0
  165. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/data/anchors/clipiqa_bad.npy +0 -0
  166. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/data/anchors/clipiqa_good.npy +0 -0
  167. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/data/comfyui-workflows/built-in/Flux2-Klein-Image-Edit.json +0 -0
  168. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/data/comfyui-workflows/built-in/Flux2-Klein-t2i.json +0 -0
  169. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/data/comfyui-workflows/built-in/Upscale-2x-RealESRGAN.json +0 -0
  170. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/data/scalar-assets/ScreenshotToken.jpg +0 -0
  171. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/data/scalar-assets/ScreenshotTokens.jpg +0 -0
  172. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/data/scalar-assets/ScreenshotsUserSettings.jpg +0 -0
  173. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/data/scalar-assets/WhereIsUserSettings.jpg +0 -0
  174. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/data/scalar-assets/logo.png +0 -0
  175. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/database.py +0 -0
  176. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/__init__.py +0 -0
  177. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/adapter_attachment.py +0 -0
  178. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/character.py +0 -0
  179. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/dedup.py +0 -0
  180. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/deleted_file_log.py +0 -0
  181. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/detection.py +0 -0
  182. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/entity_project.py +0 -0
  183. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/external_move_review.py +0 -0
  184. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/face.py +0 -0
  185. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/folder_mapping_commit.py +0 -0
  186. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/generation.py +0 -0
  187. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/guest_score.py +0 -0
  188. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/guest_session.py +0 -0
  189. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/import_folder.py +0 -0
  190. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/library_settings.py +0 -0
  191. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/metadata.py +0 -0
  192. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/mixed_stack.py +0 -0
  193. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/operation.py +0 -0
  194. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/pending_score_invalidation.py +0 -0
  195. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/picture_likeness.py +0 -0
  196. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/picture_move.py +0 -0
  197. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/picture_project.py +0 -0
  198. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/picture_set.py +0 -0
  199. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/picture_stack.py +0 -0
  200. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/project.py +0 -0
  201. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/quality.py +0 -0
  202. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/reference_folder.py +0 -0
  203. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/review.py +0 -0
  204. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/snapshot.py +0 -0
  205. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/tag.py +0 -0
  206. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/tag_health.py +0 -0
  207. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/tag_prediction.py +0 -0
  208. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/tag_suggestion.py +0 -0
  209. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/tagger_run.py +0 -0
  210. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/user.py +0 -0
  211. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/db_models/user_token.py +0 -0
  212. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/event_types.py +0 -0
  213. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/Empty.png +0 -0
  214. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/EmptyTrash.png +0 -0
  215. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/Logo.png +0 -0
  216. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/Watermark.png +0 -0
  217. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/assets/AppButton-BY94xBEn.css +0 -0
  218. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/assets/LibraryInsights-dMJWAwPs.css +0 -0
  219. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/assets/MakeMoreDialog-B4eXIlNU.css +0 -0
  220. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/assets/PicturePicker-CFBKhqDn.css +0 -0
  221. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/assets/RunReasonNotice-6IH3i2C4.css +0 -0
  222. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/assets/Tiny5-Regular-WaYIHWdr.ttf +0 -0
  223. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-B7mPwVP_.ttf +0 -0
  224. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-CSr8KVlo.eot +0 -0
  225. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-Dp5v-WZN.woff2 +0 -0
  226. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-PXm3-2wK.woff +0 -0
  227. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/assets/setAppearance-qVi6o8tK.js +0 -0
  228. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/assets/shortcutHints-BuTsgQZw.js +0 -0
  229. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/favicon.ico +0 -0
  230. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/frontend/dist/vite.svg +0 -0
  231. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/hub/__init__.py +0 -0
  232. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/hub/cli_hint.py +0 -0
  233. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/hub/db.py +0 -0
  234. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/hub/engine.py +0 -0
  235. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/image_loading_dataset_prepper.py +0 -0
  236. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/image_plugins/__init__.py +0 -0
  237. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/image_plugins/base.py +0 -0
  238. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/image_plugins/built-in/blur_sharpen.py +0 -0
  239. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/image_plugins/built-in/brightness_contrast.py +0 -0
  240. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/image_plugins/built-in/colour_filter.py +0 -0
  241. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/image_plugins/built-in/pixelate.py +0 -0
  242. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/image_plugins/built-in/plugin_template.py +0 -0
  243. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/image_plugins/built-in/rotate.py +0 -0
  244. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/image_plugins/built-in/scaling.py +0 -0
  245. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/image_plugins/registry.py +0 -0
  246. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/image_plugins/service.py +0 -0
  247. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/inference/__init__.py +0 -0
  248. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/inference/engine.py +0 -0
  249. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/inference/model_lifecycle.py +0 -0
  250. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/inference/vram_budget.py +0 -0
  251. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/inference/workflows/__init__.py +0 -0
  252. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/inference/workflows/clip_embedding.py +0 -0
  253. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/inference/workflows/description.py +0 -0
  254. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/inference/workflows/face_embedding.py +0 -0
  255. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/inference/workflows/tagging.py +0 -0
  256. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/inference/workflows/text_embedding.py +0 -0
  257. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/listeners.py +0 -0
  258. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/maintenance.py +0 -0
  259. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/middleware/library_admission.py +0 -0
  260. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/env.py +0 -0
  261. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/script.py.mako +0 -0
  262. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0001_baseline.py +0 -0
  263. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0002_add_text_score.py +0 -0
  264. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0003_add_original_file_name.py +0 -0
  265. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0004_add_comfyui_fields.py +0 -0
  266. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0005_add_projects.py +0 -0
  267. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0006_add_attachment_url.py +0 -0
  268. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0007_add_picture_project_id.py +0 -0
  269. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0008_add_compact_mode.py +0 -0
  270. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0009_add_picture_project_membership.py +0 -0
  271. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0010_project_name_uniqueness.py +0 -0
  272. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0011_pictureset_name_uniqueness.py +0 -0
  273. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0012_character_name_uniqueness.py +0 -0
  274. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0013_tag_prediction.py +0 -0
  275. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0014_tag_prediction_composite_index.py +0 -0
  276. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0015_tag_prediction_model_version_rename.py +0 -0
  277. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0016_tag_prediction_confirm_applied.py +0 -0
  278. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0017_anomaly_tag_uncertainty.py +0 -0
  279. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0018_anomaly_tag_uncertainty_disagreement.py +0 -0
  280. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0019_pending_character_id.py +0 -0
  281. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0020_source_picture_id.py +0 -0
  282. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0021_tagger_enabled_flags.py +0 -0
  283. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0022_add_check_for_updates.py +0 -0
  284. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0023_add_show_keyboard_hint.py +0 -0
  285. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0024_add_deleted_file_log.py +0 -0
  286. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0025_add_reference_folders.py +0 -0
  287. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0026_add_caption_file_and_sync_captions.py +0 -0
  288. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0027_add_caption_file_mtime.py +0 -0
  289. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0028_add_smart_score.py +0 -0
  290. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0029_add_import_excluded_to_picture.py +0 -0
  291. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0030_add_import_folders.py +0 -0
  292. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0031_migrate_watch_folders_to_import_folder.py +0 -0
  293. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0032_add_reference_folder_host_path.py +0 -0
  294. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0033_add_import_folder_host_path.py +0 -0
  295. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0034_add_token_scope_fields.py +0 -0
  296. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0035_drop_face_quality.py +0 -0
  297. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0036_add_token_include_attachments.py +0 -0
  298. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0037_add_user_public_url.py +0 -0
  299. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0038_add_watermark_fields.py +0 -0
  300. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0039_drop_color_histogram.py +0 -0
  301. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0040_move_text_score_to_picture.py +0 -0
  302. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0041_guest_scores.py +0 -0
  303. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0042_guest_session_cookie_token.py +0 -0
  304. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0043_pictureset_icon_color.py +0 -0
  305. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0044_add_grid_sort_indexes.py +0 -0
  306. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0045_tagger_settings.py +0 -0
  307. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0046_tag_sentinel_rename.py +0 -0
  308. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0047_add_stack_leader_grid_indexes.py +0 -0
  309. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0048_normalize_stack_positions.py +0 -0
  310. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0049_snapshots.py +0 -0
  311. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0050_reset_metadata_hash_membership.py +0 -0
  312. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0051_deleted_file_log_path_sha.py +0 -0
  313. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0052_drop_import_excluded_sentinel.py +0 -0
  314. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0053_add_face_model_pack.py +0 -0
  315. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0054_add_sidebar_docked.py +0 -0
  316. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0055_add_sidebar_width.py +0 -0
  317. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0056_add_hide_purge_snapshot_warning.py +0 -0
  318. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0057_split_caption_sidecars.py +0 -0
  319. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0058_add_tag_suggestion.py +0 -0
  320. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0059_add_tagger_run.py +0 -0
  321. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0060_tag_prediction_label_ledger.py +0 -0
  322. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0061_add_detection.py +0 -0
  323. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0062_recompute_smart_score_calibrated_anomaly.py +0 -0
  324. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0063_rename_pixelated_tag_to_blocky.py +0 -0
  325. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0064_add_sidebar_pinned.py +0 -0
  326. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0065_add_review_sessions.py +0 -0
  327. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0066_add_tag_health.py +0 -0
  328. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0067_add_tag_health_precision_adj.py +0 -0
  329. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0068_add_picture_split.py +0 -0
  330. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0069_add_tag_eval_slice.py +0 -0
  331. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0070_add_tag_health_eval_candidate_n_pos.py +0 -0
  332. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0071_remove_tag_review_scoring_subsystem.py +0 -0
  333. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0072_add_review_receipt_snapshot_and_suggestion_prior_decision.py +0 -0
  334. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0073_add_pictureset_locked.py +0 -0
  335. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0074_recompute_tag_health_exclude_human_decisions.py +0 -0
  336. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0075_add_tag_health_ground_truth.py +0 -0
  337. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0076_recompute_smart_score_after_stale_tag_edits.py +0 -0
  338. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0077_add_deleted_file_log_file_removed.py +0 -0
  339. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0078_add_reference_folder_pending_reimport.py +0 -0
  340. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0079_add_picture_deleted_at.py +0 -0
  341. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0080_add_thumbnail_dimensions.py +0 -0
  342. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0082_add_thumbnail_size_level.py +0 -0
  343. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0083_recompute_smart_score_unapplied_anomaly_predictions.py +0 -0
  344. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0084_recompute_smart_score_rebalanced_weights.py +0 -0
  345. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0085_recompute_smart_score_restored_builtin_anchors.py +0 -0
  346. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0086_add_operation_log.py +0 -0
  347. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0086_reissue_api_tokens.py +0 -0
  348. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0087_add_entity_project_membership.py +0 -0
  349. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0088_add_dedup_tier_tables.py +0 -0
  350. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0089_add_dedupverdict_reopen_batch_id.py +0 -0
  351. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0090_add_usertoken_public_id.py +0 -0
  352. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0091_add_mixed_stack_cohesion_and_dismissal.py +0 -0
  353. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0092_add_stackcohesion_nearest_edges.py +0 -0
  354. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0093_invalidate_stackcohesion_inputs.py +0 -0
  355. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0094_add_telemetry_consent.py +0 -0
  356. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0095_add_finder_partial_indexes.py +0 -0
  357. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0096_add_picture_is_video.py +0 -0
  358. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0097_add_usertoken_library_uuid.py +0 -0
  359. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0098_add_library_settings.py +0 -0
  360. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0099_guest_tables_reference_token_public_id.py +0 -0
  361. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0100_add_pending_score_invalidation.py +0 -0
  362. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0101_add_settings_fingerprint.py +0 -0
  363. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0102_add_snapshot_identity_scrubbed_at.py +0 -0
  364. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0103_add_adapter_attachment.py +0 -0
  365. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0104_add_picture_orientation.py +0 -0
  366. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0105_add_character_thumbnail_picture.py +0 -0
  367. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0106_add_picture_workflow_hashes.py +0 -0
  368. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0107_add_library_views_settings.py +0 -0
  369. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0108_add_library_layout_and_move_journal.py +0 -0
  370. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0109_add_external_move_review.py +0 -0
  371. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0110_add_folder_mapping_commit.py +0 -0
  372. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0111_add_text_embedding_missing_index.py +0 -0
  373. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0112_add_image_embedding_probe_indexes.py +0 -0
  374. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0113_reset_size_bin_without_likeness_parameters.py +0 -0
  375. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0114_remove_views_and_project_cover.py +0 -0
  376. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0115_add_folder_mapping_commit_captions.py +0 -0
  377. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0116_add_library_settings_caption_sync.py +0 -0
  378. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0117_add_pending_ghost_cascade.py +0 -0
  379. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0118_add_generation_tables.py +0 -0
  380. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0119_rescan_pictures_for_a1111_recipes.py +0 -0
  381. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0120_add_picture_ocr_text.py +0 -0
  382. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0121_add_saved_recipe.py +0 -0
  383. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0122_rescan_pictures_for_controlnet_model_names.py +0 -0
  384. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0123_resample_animated_gifs.py +0 -0
  385. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/migrations/versions/0124_saved_recipe_models_and_workflow_id.py +0 -0
  386. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/openapi_custom.py +0 -0
  387. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/pixl_logging.py +0 -0
  388. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/plugin_check.py +0 -0
  389. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/plugin_create.py +0 -0
  390. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/plugin_install.py +0 -0
  391. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/route_inventory.py +0 -0
  392. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/__init__.py +0 -0
  393. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/_helpers.py +0 -0
  394. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/characters.py +0 -0
  395. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/characters_faces.py +0 -0
  396. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/config.py +0 -0
  397. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/dedup.py +0 -0
  398. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/filesystem.py +0 -0
  399. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/folder_structure.py +0 -0
  400. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/guest_scores.py +0 -0
  401. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/import_folders.py +0 -0
  402. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/insights.py +0 -0
  403. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/library_captions.py +0 -0
  404. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/library_layout.py +0 -0
  405. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/model_files.py +0 -0
  406. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/model_folders.py +0 -0
  407. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/model_icons.py +0 -0
  408. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/model_imports.py +0 -0
  409. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/model_moves.py +0 -0
  410. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/model_stacks.py +0 -0
  411. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/moves.py +0 -0
  412. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/operations.py +0 -0
  413. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/picture_sets.py +0 -0
  414. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/__init__.py +0 -0
  415. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_anomaly.py +0 -0
  416. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_character_likeness.py +0 -0
  417. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_crud.py +0 -0
  418. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_export.py +0 -0
  419. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_face_search.py +0 -0
  420. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_faces.py +0 -0
  421. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_helpers.py +0 -0
  422. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_import.py +0 -0
  423. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_likeness_search.py +0 -0
  424. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_misc.py +0 -0
  425. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_search.py +0 -0
  426. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_serving.py +0 -0
  427. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_text.py +0 -0
  428. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/pictures/_thumbnails.py +0 -0
  429. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/projects.py +0 -0
  430. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/reference_folders.py +0 -0
  431. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/reviews.py +0 -0
  432. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/share.py +0 -0
  433. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/snapshots.py +0 -0
  434. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/stacks.py +0 -0
  435. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/tag_health.py +0 -0
  436. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/tag_predictions.py +0 -0
  437. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/tag_suggestions.py +0 -0
  438. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/tagger_runs.py +0 -0
  439. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/taggers.py +0 -0
  440. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/tags.py +0 -0
  441. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/telemetry.py +0 -0
  442. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/routes/test_hooks.py +0 -0
  443. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/scoring/__init__.py +0 -0
  444. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/scoring/character_likeness.py +0 -0
  445. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/scoring/smart_score.py +0 -0
  446. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/server_config_io.py +0 -0
  447. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/__init__.py +0 -0
  448. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/a1111_recipe.py +0 -0
  449. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/builtin_caches.py +0 -0
  450. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/builtin_models.py +0 -0
  451. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/comfyui_ui_graph.py +0 -0
  452. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/comfyui_userdata.py +0 -0
  453. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/config_service.py +0 -0
  454. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/dedup_sweep_service.py +0 -0
  455. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/dedup_tier_service.py +0 -0
  456. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/dedup_verdict_service.py +0 -0
  457. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/folder_structure_service.py +0 -0
  458. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/import_dedup_service.py +0 -0
  459. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/impossible_tag_clear_service.py +0 -0
  460. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/keep_cover_only_service.py +0 -0
  461. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/layout_migration_service.py +0 -0
  462. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/layout_move_service.py +0 -0
  463. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/library_backup_service.py +0 -0
  464. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/library_generation_coordinator.py +0 -0
  465. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/library_insights_service.py +0 -0
  466. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/library_restore_service.py +0 -0
  467. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/library_settings_service.py +0 -0
  468. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/managed_model_store.py +0 -0
  469. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/mixed_stack_service.py +0 -0
  470. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/model_features.py +0 -0
  471. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/model_folder_scanner.py +0 -0
  472. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/model_icons.py +0 -0
  473. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/model_mover.py +0 -0
  474. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/move_reconciliation_service.py +0 -0
  475. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/operation_log_service.py +0 -0
  476. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/picture_recipe_service.py +0 -0
  477. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/picture_service.py +0 -0
  478. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/plugin_service.py +0 -0
  479. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/portable_identity.py +0 -0
  480. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/project_membership_service.py +0 -0
  481. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/restore/__init__.py +0 -0
  482. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/restore/_models.py +0 -0
  483. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/restore/full_restore.py +0 -0
  484. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/restore/preview.py +0 -0
  485. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/restore/resource_restore.py +0 -0
  486. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/restore/schema_upgrade.py +0 -0
  487. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/review_service.py +0 -0
  488. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/run_importer.py +0 -0
  489. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/scrapheap_service.py +0 -0
  490. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/search_query_service.py +0 -0
  491. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/set_lock_service.py +0 -0
  492. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/share_service.py +0 -0
  493. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/snapshot_service.py +0 -0
  494. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/stack_detector.py +0 -0
  495. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/stack_membership.py +0 -0
  496. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/tag_health_service.py +0 -0
  497. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/tag_prediction_service.py +0 -0
  498. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/tag_scan_service.py +0 -0
  499. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/tag_suggestion_service.py +0 -0
  500. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/tagger_run_service.py +0 -0
  501. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/workflow_ghost_service.py +0 -0
  502. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/workflow_hash.py +0 -0
  503. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/workflow_inputs.py +0 -0
  504. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/workflow_parameters.py +0 -0
  505. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/services/workflow_run_service.py +0 -0
  506. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/ssl_setup.py +0 -0
  507. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/startup_checks.py +0 -0
  508. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/startup_permissions.py +0 -0
  509. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tagger_plugins/__init__.py +0 -0
  510. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tagger_plugins/base.py +0 -0
  511. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tagger_plugins/florence2.py +0 -0
  512. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tagger_plugins/joycaption.py +0 -0
  513. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tagger_plugins/pixlstash_tagger.py +0 -0
  514. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tagger_plugins/plugin_template.py +0 -0
  515. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tagger_plugins/registry.py +0 -0
  516. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tagger_plugins/sbert.py +0 -0
  517. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tagger_plugins/wd14.py +0 -0
  518. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/task_runner.py +0 -0
  519. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/__init__.py +0 -0
  520. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/base_task.py +0 -0
  521. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/base_task_finder.py +0 -0
  522. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/checkpoint_hash_task.py +0 -0
  523. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/dedup_scan_finder.py +0 -0
  524. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/dedup_scan_task.py +0 -0
  525. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/description_task.py +0 -0
  526. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/detection_task.py +0 -0
  527. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/ensure_gfs_snapshot_finder.py +0 -0
  528. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/ensure_gfs_snapshot_task.py +0 -0
  529. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/face_detection_task.py +0 -0
  530. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/face_extraction_task.py +0 -0
  531. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/face_model_refresh_task.py +0 -0
  532. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/ghost_cascade_finder.py +0 -0
  533. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/ghost_cascade_task.py +0 -0
  534. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/image_embedding_task.py +0 -0
  535. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/layout_move_finder.py +0 -0
  536. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/layout_move_task.py +0 -0
  537. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/likeness_parameters_task.py +0 -0
  538. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/likeness_task.py +0 -0
  539. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_checkpoint_hash_finder.py +0 -0
  540. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_comfyui_extraction_finder.py +0 -0
  541. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_description_finder.py +0 -0
  542. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_face_extraction_finder.py +0 -0
  543. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_face_model_refresh_finder.py +0 -0
  544. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_file_purge_finder.py +0 -0
  545. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_file_purge_task.py +0 -0
  546. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_image_embedding_finder.py +0 -0
  547. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_likeness_finder.py +0 -0
  548. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_likeness_parameters_finder.py +0 -0
  549. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_ocr_finder.py +0 -0
  550. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_orientation_finder.py +0 -0
  551. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_pixel_sha_finder.py +0 -0
  552. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_quality_finder.py +0 -0
  553. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_smart_score_finder.py +0 -0
  554. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_snapshot_identity_scrub_finder.py +0 -0
  555. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_source_face_likeness_finder.py +0 -0
  556. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_stack_cohesion_finder.py +0 -0
  557. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_tag_finder.py +0 -0
  558. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_tag_prediction_finder.py +0 -0
  559. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_text_embedding_finder.py +0 -0
  560. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_text_score_finder.py +0 -0
  561. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_thumbnail_finder.py +0 -0
  562. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/missing_watch_folder_import_finder.py +0 -0
  563. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/model_folder_scan_task.py +0 -0
  564. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/ocr_task.py +0 -0
  565. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/orientation_task.py +0 -0
  566. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/pending_score_invalidation_finder.py +0 -0
  567. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/pending_score_invalidation_task.py +0 -0
  568. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/picture_import_task.py +0 -0
  569. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/pixel_sha_task.py +0 -0
  570. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/quality_task.py +0 -0
  571. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/reference_folder_scan_finder.py +0 -0
  572. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/reference_folder_scan_task.py +0 -0
  573. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/scrapheap_retention_purge_finder.py +0 -0
  574. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/scrapheap_retention_purge_task.py +0 -0
  575. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/smart_score_task.py +0 -0
  576. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/snapshot_identity_scrub_task.py +0 -0
  577. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/source_face_likeness_task.py +0 -0
  578. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/stack_cohesion_task.py +0 -0
  579. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/tag_health_auto_rebuild_finder.py +0 -0
  580. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/tag_health_auto_rebuild_task.py +0 -0
  581. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/tag_health_rebuild_task.py +0 -0
  582. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/tag_prediction_backfill_task.py +0 -0
  583. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/tag_task.py +0 -0
  584. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/task_type.py +0 -0
  585. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/text_embedding_task.py +0 -0
  586. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/text_score_task.py +0 -0
  587. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/tasks/thumbnail_generation_task.py +0 -0
  588. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/telemetry/__init__.py +0 -0
  589. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/telemetry/install_id.py +0 -0
  590. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/telemetry/sender.py +0 -0
  591. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/trusted_sqlite.py +0 -0
  592. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/__init__.py +0 -0
  593. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/accelerator.py +0 -0
  594. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/adapter_header.py +0 -0
  595. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/aitoolkit_run.py +0 -0
  596. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/atomic_write.py +0 -0
  597. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/caption_file_utils.py +0 -0
  598. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/comfyui_utilities.py +0 -0
  599. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/face_tags.py +0 -0
  600. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/field_allowlist.py +0 -0
  601. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/host_open.py +0 -0
  602. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/host_path_utils.py +0 -0
  603. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/http_cache.py +0 -0
  604. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/image_processing/__init__.py +0 -0
  605. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/image_processing/face_utils.py +0 -0
  606. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/image_processing/image_utils.py +0 -0
  607. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/image_processing/orientation.py +0 -0
  608. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/image_processing/video_utils.py +0 -0
  609. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/insightface_batched.py +0 -0
  610. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/insightface_model_utils.py +0 -0
  611. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/library_layout.py +0 -0
  612. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/library_roots.py +0 -0
  613. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/likeness/__init__.py +0 -0
  614. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/likeness/likeness_parameter_utils.py +0 -0
  615. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/likeness/likeness_utils.py +0 -0
  616. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/near_neighbor.py +0 -0
  617. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/path_mapper.py +0 -0
  618. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/path_utils.py +0 -0
  619. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/quality/__init__.py +0 -0
  620. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/quality/anomaly_penalty.py +0 -0
  621. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/quality/quality_utils.py +0 -0
  622. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/quality/smart_score_utils.py +0 -0
  623. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/query/__init__.py +0 -0
  624. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/rate_limiter.py +0 -0
  625. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/reference_folder_validator.py +0 -0
  626. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/reference_folder_watcher.py +0 -0
  627. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/request_origin.py +0 -0
  628. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/serialization_utils.py +0 -0
  629. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/service/__init__.py +0 -0
  630. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/service/anomaly_thresholds.py +0 -0
  631. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/service/caption_utils.py +0 -0
  632. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/service/export_utils.py +0 -0
  633. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/service/filter_helpers.py +0 -0
  634. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/service/label_ledger.py +0 -0
  635. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/service/person_tags.py +0 -0
  636. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/service/picture_stats.py +0 -0
  637. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/service/scope_table.py +0 -0
  638. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/service/smart_score_invalidation.py +0 -0
  639. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/service/tag_prediction_utils.py +0 -0
  640. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/service/user_settings_utils.py +0 -0
  641. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/snapshot_compression.py +0 -0
  642. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/sql_chunking.py +0 -0
  643. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/stack/__init__.py +0 -0
  644. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/stack/stack_utils.py +0 -0
  645. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/system_utils.py +0 -0
  646. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/tag_reset_registry.py +0 -0
  647. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/unprocessable_image_registry.py +0 -0
  648. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/vram_utils.py +0 -0
  649. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/utils/watermark.py +0 -0
  650. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/work_planner.py +0 -0
  651. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/worker_config.py +0 -0
  652. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash/ws/__init__.py +0 -0
  653. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash.egg-info/dependency_links.txt +0 -0
  654. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash.egg-info/entry_points.txt +0 -0
  655. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash.egg-info/requires.txt +0 -0
  656. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/pixlstash.egg-info/top_level.txt +0 -0
  657. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/setup.cfg +0 -0
  658. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/setup.py +0 -0
  659. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_adapter_attachment.py +0 -0
  660. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_adapter_header.py +0 -0
  661. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_aitoolkit_run.py +0 -0
  662. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_anomaly_penalty.py +0 -0
  663. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_anomaly_region_scope.py +0 -0
  664. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_anomaly_thresholds_cache.py +0 -0
  665. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_api_coverage.py +0 -0
  666. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_app_permission_repair.py +0 -0
  667. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_async_import_staging.py +0 -0
  668. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_auth_read_path.py +0 -0
  669. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_authentication.py +0 -0
  670. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_authz_gate_step3.py +0 -0
  671. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_authz_gate_step4.py +0 -0
  672. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_backend_order_stability.py +0 -0
  673. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_batch_apply_scores.py +0 -0
  674. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_batch_character_likeness_scope.py +0 -0
  675. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_build_desktop_runtime.py +0 -0
  676. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_builtin_models.py +0 -0
  677. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_character_face_assignment.py +0 -0
  678. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_characters_api.py +0 -0
  679. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_checkpoint_hash_finder.py +0 -0
  680. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_ci_shards.py +0 -0
  681. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_cli_documentation.py +0 -0
  682. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_clip_text_embedding_similarity.py +0 -0
  683. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_comfyui_api_prompt_extraction.py +0 -0
  684. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_comfyui_recipe_preflight.py +0 -0
  685. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_comfyui_stack_filter.py +0 -0
  686. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_comfyui_submit_prompt.py +0 -0
  687. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_comfyui_ui_graph_conversion.py +0 -0
  688. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_comfyui_workflow_extraction.py +0 -0
  689. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_database_engine_config.py +0 -0
  690. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_dedup_mixed_stacks.py +0 -0
  691. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_dedup_sweep_api.py +0 -0
  692. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_dedup_sweep_service.py +0 -0
  693. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_dedup_tier_service.py +0 -0
  694. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_dedup_tiers_api.py +0 -0
  695. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_dedup_verdict_service.py +0 -0
  696. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_default_device_override.py +0 -0
  697. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_description_cancel_blanking.py +0 -0
  698. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_detection_florence.py +0 -0
  699. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_detection_model.py +0 -0
  700. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_detections_scope.py +0 -0
  701. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_docker_demo_hub_rewrite.py +0 -0
  702. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_docker_windows_host_paths.py +0 -0
  703. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_except_hygiene_guardrail.py +0 -0
  704. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_export_api.py +0 -0
  705. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_face_detection_extreme_aspect_ratio.py +0 -0
  706. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_face_extraction_speed.py +0 -0
  707. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_face_score_aggregation.py +0 -0
  708. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_facial_features_worker.py +0 -0
  709. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_find_orphaned_files.py +0 -0
  710. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_finder_query_cost.py +0 -0
  711. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_florence.py +0 -0
  712. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_florence_model_variant.py +0 -0
  713. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_folder_structure_commit.py +0 -0
  714. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_folder_structure_read.py +0 -0
  715. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_frame_count.py +0 -0
  716. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_full_pipeline.py +0 -0
  717. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_gfs_snapshot_schedule.py +0 -0
  718. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_guest_scoring.py +0 -0
  719. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_hub_bootstrap.py +0 -0
  720. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_hub_engine.py +0 -0
  721. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_hub_registry.py +0 -0
  722. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_identity_storage_guardrail.py +0 -0
  723. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_image_embedding_worker.py +0 -0
  724. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_image_plugins_api.py +0 -0
  725. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_import_scrapheap_match.py +0 -0
  726. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_impossible_clear.py +0 -0
  727. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_impossible_clear_authz.py +0 -0
  728. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_impossible_filter.py +0 -0
  729. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_index_install_type.py +0 -0
  730. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_inline_rotate.py +0 -0
  731. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_insightface_model_pack.py +0 -0
  732. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_insightface_relocation.py +0 -0
  733. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_install_type_buckets.py +0 -0
  734. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_invalid_image_endless_retry.py +0 -0
  735. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_ip_locality_fail_closed.py +0 -0
  736. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_justified_thumbnails.py +0 -0
  737. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_keep_cover_only.py +0 -0
  738. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_known_base_models.py +0 -0
  739. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_label_ledger.py +0 -0
  740. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_library_backup.py +0 -0
  741. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_library_caption_sync.py +0 -0
  742. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_library_destination_blocklist.py +0 -0
  743. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_library_generation_coordinator.py +0 -0
  744. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_library_insights.py +0 -0
  745. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_library_layout.py +0 -0
  746. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_library_restore_cli.py +0 -0
  747. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_library_root_scan.py +0 -0
  748. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_library_settings.py +0 -0
  749. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_likeness_and_face_search.py +0 -0
  750. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_likeness_worker.py +0 -0
  751. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_managed_model_store.py +0 -0
  752. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_many_to_many_face_data.py +0 -0
  753. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_metadata_hash.py +0 -0
  754. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_metadata_hash_batching.py +0 -0
  755. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_model_file_classification.py +0 -0
  756. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_model_folder_scanner.py +0 -0
  757. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_model_icons.py +0 -0
  758. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_model_move.py +0 -0
  759. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_model_run_import.py +0 -0
  760. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_model_shelf_fixtures.py +0 -0
  761. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_model_shelf_library_fixture.py +0 -0
  762. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_model_shelf_scan_invariants.py +0 -0
  763. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_mps_device_check.py +0 -0
  764. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_mps_memory_and_providers.py +0 -0
  765. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_near_neighbor.py +0 -0
  766. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_ocr_text.py +0 -0
  767. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_openapi_response_schemas.py +0 -0
  768. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_operation_log.py +0 -0
  769. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_orientation.py +0 -0
  770. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_path_containment.py +0 -0
  771. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_pending_score_invalidation.py +0 -0
  772. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_person_tags.py +0 -0
  773. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_picture_is_video.py +0 -0
  774. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_picture_mutation_scope.py +0 -0
  775. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_picture_plugins.py +0 -0
  776. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_picture_recipe.py +0 -0
  777. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_picture_set_locking.py +0 -0
  778. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_picture_sets.py +0 -0
  779. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_picture_sets_query_cost.py +0 -0
  780. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_picture_stack_utils.py +0 -0
  781. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_pictures_stream.py +0 -0
  782. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_pipeline_stage_contracts.py +0 -0
  783. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_pipeline_throughput_verification.py +0 -0
  784. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_plugin_create.py +0 -0
  785. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_plugin_install.py +0 -0
  786. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_plugin_lifecycle_gaps.py +0 -0
  787. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_predicate_filter.py +0 -0
  788. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_process_teardown.py +0 -0
  789. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_project_membership_service.py +0 -0
  790. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_projects_api.py +0 -0
  791. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_quality_task_shutdown.py +0 -0
  792. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_rate_limiter.py +0 -0
  793. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_reference_folder_listing_count_parity.py +0 -0
  794. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_reference_folder_moves.py +0 -0
  795. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_reference_folder_sidecars.py +0 -0
  796. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_reference_folder_watcher.py +0 -0
  797. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_repair_copied_face_rows.py +0 -0
  798. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_restore.py +0 -0
  799. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_reviews_api.py +0 -0
  800. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_rocm_device_check.py +0 -0
  801. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_root_scan_first_import.py +0 -0
  802. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_scope_table.py +0 -0
  803. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_score_agreement_stats.py +0 -0
  804. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_scrapheap_retention.py +0 -0
  805. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_security_supported_versions.py +0 -0
  806. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_server.py +0 -0
  807. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_server_external_listener.py +0 -0
  808. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_server_simple.py +0 -0
  809. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_share_link_library_pin.py +0 -0
  810. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_sidebar_counts_query_cost.py +0 -0
  811. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_smart_score_consistency.py +0 -0
  812. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_smart_score_invalidation.py +0 -0
  813. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_snapshot_compression.py +0 -0
  814. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_snapshots.py +0 -0
  815. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_snapshots_auth.py +0 -0
  816. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_ssl_generation.py +0 -0
  817. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_stack_detection.py +0 -0
  818. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_stack_leader_scope.py +0 -0
  819. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_stack_position_invariant.py +0 -0
  820. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_stack_state_filter.py +0 -0
  821. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_stacks_api.py +0 -0
  822. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_stacks_membership.py +0 -0
  823. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_startup_banner_encoding.py +0 -0
  824. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_startup_permissions.py +0 -0
  825. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_stats_api.py +0 -0
  826. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_system_utils.py +0 -0
  827. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_tag_health_api.py +0 -0
  828. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_tag_prediction_backfill.py +0 -0
  829. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_tag_prediction_scope.py +0 -0
  830. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_tag_predictions_api.py +0 -0
  831. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_tag_suggestions_api.py +0 -0
  832. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_tag_task.py +0 -0
  833. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_tag_worker.py +0 -0
  834. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_tagger_plugin_registry.py +0 -0
  835. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_tagger_runs_api.py +0 -0
  836. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_tagger_user_plugins.py +0 -0
  837. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_telemetry_install_id.py +0 -0
  838. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_telemetry_install_id_authz.py +0 -0
  839. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_telemetry_sender.py +0 -0
  840. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_thumbnail_cache_headers.py +0 -0
  841. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_thumbnail_location.py +0 -0
  842. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_token_identity.py +0 -0
  843. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_user_settings_tagger_settings.py +0 -0
  844. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_vram_batch_budget.py +0 -0
  845. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_vram_oom_retry.py +0 -0
  846. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_work_planner.py +0 -0
  847. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_workers_api.py +0 -0
  848. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_workflow_parameters.py +0 -0
  849. {pixlstash-1.12.0.dev4 → pixlstash-1.12.0.dev5}/tests/test_ws_broadcaster.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pixlstash
3
- Version: 1.12.0.dev4
3
+ Version: 1.12.0.dev5
4
4
  Summary: Self-hosted picture library with AI tagging, semantic search, and a clean web UI
5
5
  Author-email: Gaute Lindkvist <lindkvis@gmail.com>
6
6
  License-Expression: GPL-3.0-only AND MIT
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pixlstash-frontend",
3
- "version": "1.12.0-dev.4",
3
+ "version": "1.12.0-dev.5",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pixlstash-frontend",
9
- "version": "1.12.0-dev.4",
9
+ "version": "1.12.0-dev.5",
10
10
  "dependencies": {
11
11
  "@mdi/font": "^7.4.47",
12
12
  "axios": "^1.18.0",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pixlstash-frontend",
3
3
  "private": true,
4
- "version": "1.12.0-dev.4",
4
+ "version": "1.12.0-dev.5",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
@@ -459,11 +459,6 @@ ROUTE_POLICIES: dict[tuple[str, str], RoutePolicy] = {
459
459
  library_access=LibraryAccessMode.SWITCH_WRITER,
460
460
  justification="§16.3 and the strictest reading of it: it DELETES files inside a host folder - the import's temporary database and the thumbnail cache PixlStash wrote - and closes and reopens the active vault to do it. Both halves are already on this tier (POST /libraries for write authority inside a folder, POST /libraries/active for resetting every client's session). It takes a registry uuid, never a caller-supplied path, and the registry refuses anything but a library still on its first import, so the only files it can reach are ones PixlStash created itself and the owner never kept. No picture file is touched; owner + loopback/LAN/Tailscale, or remote owner iff allow_remote_host_ops=true (§16.3.1)",
461
461
  ),
462
- ("POST", "/api/v1/libraries/{library_uuid}/promote"): RoutePolicy(
463
- _LOCAL,
464
- library_access=LibraryAccessMode.SWITCH_WRITER,
465
- justification="§16.3 for both reasons its siblings hold one each. It renames a file inside a host folder - the import's temporary database onto vault.db - which is POST /libraries' write-authority class; and it closes and reopens the active vault to do it, which resets every connected client's session exactly as POST /libraries/active does. It takes a registry uuid, never a caller-supplied path, and the file it renames is one PixlStash created itself; owner + loopback/LAN/Tailscale, or remote owner iff allow_remote_host_ops=true (§16.3.1)",
466
- ),
467
462
  ("POST", "/api/v1/libraries/active"): RoutePolicy(
468
463
  _LOCAL,
469
464
  library_independent=True,
@@ -774,7 +769,7 @@ ROUTE_POLICIES: dict[tuple[str, str], RoutePolicy] = {
774
769
  # ── folder_structure.py commit (§16.3 host-capability; v1.11 Phase 3) ───
775
770
  ("POST", "/api/v1/folder-structure/commit"): RoutePolicy(
776
771
  _LOCAL,
777
- justification="§16.3: commits an accepted mapping over the same host path the read already walked - registers it for in-place indexing (the reference-folders/POST write) and creates the projects/people/sets/tags it names; owner + loopback/LAN/Tailscale, or remote owner iff allow_remote_host_ops=true (§16.3.1)",
772
+ justification="§16.3: commits an accepted mapping over the same host path the read already walked - registers it for in-place indexing (the reference-folders/POST write) and creates the projects/people/sets/tags it names. For a library still on its first import it is also the only way that import becomes a library: when the commit finishes it renames the temporary database onto vault.db and closes and reopens the active vault, resetting every client's session - POST /libraries/active's class, which the removed /promote route used to carry; owner + loopback/LAN/Tailscale, or remote owner iff allow_remote_host_ops=true (§16.3.1)",
778
773
  ),
779
774
  ("GET", "/api/v1/folder-structure/commit/status"): RoutePolicy(
780
775
  _LOCAL,
@@ -1775,14 +1770,6 @@ ROUTE_POLICIES: dict[tuple[str, str], RoutePolicy] = {
1775
1770
  _OWNER,
1776
1771
  justification="Name, notes and hidden on one workflow; PATCH blocked for READ tokens; owner only",
1777
1772
  ),
1778
- ("POST", "/api/v1/workflows/merge"): RoutePolicy(
1779
- _OWNER,
1780
- justification="Fold workflows into one, moving their topologies and saved recipes; POST blocked for READ tokens; owner only",
1781
- ),
1782
- ("POST", "/api/v1/workflows/{workflow_id}/split"): RoutePolicy(
1783
- _OWNER,
1784
- justification="Take one topology out of a workflow into one of its own; POST blocked for READ tokens; owner only",
1785
- ),
1786
1773
  # The workflow's LoRAs counted over the whole vault.
1787
1774
  ("GET", "/api/v1/workflows/{workflow_id}/lora-summary"): RoutePolicy(
1788
1775
  _OWNER,
@@ -1932,6 +1919,15 @@ ROUTE_POLICIES: dict[tuple[str, str], RoutePolicy] = {
1932
1919
  _OWNER,
1933
1920
  justification="Export a saved recipe, prompt included; owner only",
1934
1921
  ),
1922
+ # Builds the recipe's graph the way a run does, out of the whole library,
1923
+ # and stores it as a new manual workflow: a hub write of the owner's own.
1924
+ ("POST", "/api/v1/recipes/{recipe_id}/extract-workflow"): RoutePolicy(
1925
+ _OWNER,
1926
+ justification=(
1927
+ "Store a saved recipe's run graph as a manual workflow; POST "
1928
+ "blocked for READ tokens; owner only"
1929
+ ),
1930
+ ),
1935
1931
  # ── test_hooks.py (mounted ONLY when enable_test_hooks=True) ─────────────
1936
1932
  # Conditionally mounted, but ALWAYS declared: the gate resolves declarations
1937
1933
  # against the routes actually mounted at startup, so an undeclared
@@ -344,6 +344,18 @@ class Picture(SQLModel, table=True):
344
344
  "workflow_instance_hash", String, default=None, nullable=True, index=True
345
345
  ),
346
346
  )
347
+ # The MANUAL workflow (``manual:<uuid>``, a hub row) a run of which made
348
+ # this picture, or NULL. Written once, by the import of a manual run's
349
+ # outputs; filing is exclusive, so such a picture counts on the manual
350
+ # workflow and not on the automatic one its graph is in - while the
351
+ # manual workflow lives. Delete it and the picture falls back, with no
352
+ # write here (the reads take the hub's list of live ids).
353
+ run_workflow_id: Optional[str] = Field(
354
+ default=None,
355
+ sa_column=Column(
356
+ "run_workflow_id", String, default=None, nullable=True, index=True
357
+ ),
358
+ )
347
359
  # The scanned-marker, and the re-hash selector when the rule changes.
348
360
  # NULL means never scanned; set means scanned, with ALL THREE
349
361
  # `workflow_*_hash` columns above NULL when the picture carried no
@@ -81,7 +81,7 @@ class SavedRecipe(SQLModel, table=True):
81
81
  in this library. Nulled rather than cascaded when that picture
82
82
  goes: deleting the picture does not unmake the look it taught.
83
83
  created_at: When it was saved.
84
- workflow_id: The workflow it runs on (#1622): ``auto:<core hash>`` or an
84
+ workflow_id: The workflow it runs on (#1622): ``auto:<core and families digest>`` or an
85
85
  owner's group. NULL until the cut-over (#1623) fills it in from
86
86
  ``workflow_key_successor``; a run with it applies that
87
87
  workflow's default recipe under this one.
@@ -0,0 +1 @@
1
+ import{Ct as e,Gt as t,Ht as n,Lt as r,Ot as i,Qt as a,R as o,Tt as s,Xt as c,Zt as l,cn as u,gn as d,hn as f,kt as p,r as m,wt as h,xt as g,yn as _}from"./AppButton-DV7Exi1C.js";var v=[`disabled`,`aria-busy`,`aria-label`],y={key:1,class:`bar-icon-badge-wrap`},b={key:0,class:`bar-filter-badge`},x={key:2,class:`bar-btn-prefix`},S={__name:`AppBarButton`,props:{icon:{type:String,default:``},iconSize:{type:[Number,String],default:0},shape:{type:String,default:`boxed`},prefix:{type:String,default:``},badge:{type:[Number,String],default:null},chevron:{type:Boolean,default:!1},active:{type:Boolean,default:!1},open:{type:Boolean,default:!1},danger:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},tooltip:{type:String,default:``},tooltipLocation:{type:String,default:`bottom`}},setup(S,{expose:C}){let w=S,T=c(),E=g(()=>!T.default&&!w.prefix),D=g(()=>w.icon.startsWith(`mdi-`)?w.icon:`mdi-${w.icon}`),O=u(null),k=!1;l(()=>w.loading,e=>{if(e){k=O.value===document.activeElement;return}k&&(k=!1,r(()=>O.value?.focus()))});function A(){O.value?.focus()}return C({focus:A,el:O}),(r,c)=>(n(),s(`button`,{ref_key:`rootEl`,ref:O,type:`button`,class:d([`bar-btn`,`bar-btn--${S.shape}`,{"bar-btn--icon":E.value&&!S.chevron,"bar-btn--active":S.active,"bar-btn--open":S.open,"bar-btn--danger":S.danger,"bar-btn--loading":S.loading}]),disabled:S.disabled||S.loading,"aria-busy":S.loading?`true`:void 0,"aria-label":E.value&&S.tooltip?S.tooltip:void 0},[S.tooltip?(n(),e(m,{key:0,text:S.tooltip,activator:`parent`,location:S.tooltipLocation,describe:!E.value},null,8,[`text`,`location`,`describe`])):h(``,!0),S.loading||S.icon?(n(),s(`span`,y,[p(f(o),{size:S.iconSize||(E.value?24:18),class:d({"mdi-spin":S.loading})},{default:a(()=>[i(_(S.loading?`mdi-loading`:D.value),1)]),_:1},8,[`size`,`class`]),S.badge!=null&&S.badge!==``&&!S.loading?(n(),s(`span`,b,_(S.badge),1)):h(``,!0)])):h(``,!0),S.prefix?(n(),s(`span`,x,_(S.prefix),1)):h(``,!0),t(r.$slots,`default`),S.chevron?(n(),e(f(o),{key:3,size:`16`,class:`bar-btn-chevron`},{default:a(()=>[...c[0]||=[i(`mdi-menu-down`,-1)]]),_:1})):h(``,!0)],10,v))}};export{S as t};
@@ -7,4 +7,4 @@ var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],en
7
7
  `);return e===-1?``:t.stack.slice(e+1)})();try{if(!e.stack)e.stack=n;else if(n){let t=n.indexOf(`
8
8
  `),r=t===-1?-1:n.indexOf(`
9
9
  `,t+1),i=r===-1?``:n.slice(r+1);String(e.stack).endsWith(i)||(e.stack+=`
10
- `+n)}}catch{}}throw e}}_request(e,t){typeof e==`string`?(t||={},t.url=e):t=e||{},t=bO(this.defaults,t);let{transitional:n,paramsSerializer:r,headers:i}=t;n!==void 0&&ek.assertOptions(n,{silentJSONParsing:tk.transitional(tk.boolean),forcedJSONParsing:tk.transitional(tk.boolean),clarifyTimeoutError:tk.transitional(tk.boolean),legacyInterceptorReqResOrdering:tk.transitional(tk.boolean),advertiseZstdAcceptEncoding:tk.transitional(tk.boolean),validateStatusUndefinedResolves:tk.transitional(tk.boolean)},!1),r!=null&&(Q.isFunction(r)?t.paramsSerializer={serialize:r}:ek.assertOptions(r,{encode:tk.function,serialize:tk.function},!0)),t.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls===void 0?t.allowAbsoluteUrls=!0:t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls),ek.assertOptions(t,{baseUrl:tk.spelling(`baseURL`),withXsrfToken:tk.spelling(`withXSRFToken`)},!0),t.method=(t.method||this.defaults.method||`get`).toLowerCase();let a=i&&Q.merge(i.common,i[t.method]);i&&Q.forEach([`delete`,`get`,`head`,`post`,`put`,`patch`,`query`,`common`],e=>{delete i[e]}),t.headers=yD.concat(a,i);let o=[],s=!0;this.interceptors.request.forEach(function(e){if(typeof e.runWhen==`function`&&e.runWhen(t)===!1)return;s&&=e.synchronous;let n=t.transitional||FD;n&&n.legacyInterceptorReqResOrdering?o.unshift(e.fulfilled,e.rejected):o.push(e.fulfilled,e.rejected)});let c=[];this.interceptors.response.forEach(function(e){c.push(e.fulfilled,e.rejected)});let l,u=0,d;if(!s){let e=[XO.bind(this),void 0];for(e.unshift(...o),e.push(...c),d=e.length,l=Promise.resolve(t);u<d;)l=l.then(e[u++],e[u++]);return l}d=o.length;let f=t;for(;u<d;){let e=o[u++],t=o[u++];try{f=e(f)}catch(e){t.call(this,e);break}}try{l=XO.call(this,f)}catch(e){return Promise.reject(e)}for(u=0,d=c.length;u<d;)l=l.then(c[u++],c[u++]);return l}getUri(e){return e=bO(this.defaults,e),ND(vO(e.baseURL,e.url,e.allowAbsoluteUrls,e),e.params,e.paramsSerializer)}};Q.forEach([`delete`,`get`,`head`,`options`],function(e){nk.prototype[e]=function(t,n){return this.request(bO(n||{},{method:e,url:t,data:n&&Q.hasOwnProp(n,`data`)?n.data:void 0}))}}),Q.forEach([`post`,`put`,`patch`,`query`],function(e){function t(t){return function(n,r,i){return this.request(bO(i||{},{method:e,headers:t?{"Content-Type":`multipart/form-data`}:{},url:n,data:r}))}}nk.prototype[e]=t(),e!==`query`&&(nk.prototype[e+`Form`]=t(!0))});var rk=class e{constructor(e){if(typeof e!=`function`)throw TypeError(`executor must be a function.`);let t;this.promise=new Promise(function(e){t=e});let n=this;this.promise.then(e=>{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null}),this.promise.then=e=>{let t,r=new Promise(e=>{n.subscribe(e),t=e}).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e(function(e,r,i){n.reason||(n.reason=new tO(e,r,i),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){let e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let t;return{token:new e(function(e){t=e}),cancel:t}}};function ik(e){return function(t){return e.apply(null,t)}}function ak(e){return Q.isObject(e)&&e.isAxiosError===!0}var ok={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(ok).forEach(([e,t])=>{ok[t]=e});function sk(e){let t=new nk(e),n=BT(nk.prototype.request,t);return Q.extend(n,nk.prototype,t,{allOwnKeys:!0}),Q.extend(n,t,null,{allOwnKeys:!0}),n.create=function(t){return sk(bO(e,t))},n}var ck=sk(QD);ck.Axios=nk,ck.CanceledError=tO,ck.CancelToken=rk,ck.isCancel=eO,ck.VERSION=PO,ck.toFormData=OD,ck.AxiosError=$,ck.Cancel=ck.CanceledError,ck.all=function(e){return Promise.all(e)},ck.spread=ik,ck.isAxiosError=ak,ck.mergeConfig=bO,ck.AxiosHeaders=yD,ck.formToJSON=e=>YD(Q.isHTMLForm(e)?new FormData(e):e),ck.getAdapter=JO.getAdapter,ck.HttpStatusCode=ok,ck.default=ck;var lk=P(!1),uk=null,dk=P(null),fk=H(()=>dk.value?.scope===`READ`),pk=null;function mk(e){pk=typeof e==`string`&&e?e.slice(0,200):null}var hk=new Set;function gk(e){return typeof e==`function`?(hk.add(e),()=>hk.delete(e)):()=>{}}function _k(e){for(let t of hk)try{t()}catch(t){console.error(`Session-reset handler failed after ${e}:`,t)}uk=null,dk.value=null}function vk(e){_k(`share-token entry`),uk=e}function yk(){return`cli-${typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID().replace(/-/g,``):`${Date.now().toString(36)}${Math.random().toString(36).slice(2,12)}`}`}function bk(e){if(e)return{headers:{"X-Operation-Batch-Id":e}}}function xk(e){if(!uk||!e||!Dk(e,{allowWebSocket:!0})||e.includes(`token=${encodeURIComponent(uk)}`))return e;let[t,...n]=e.split(`#`),r=t.includes(`?`)?`&`:`?`,i=n.length?`#${n.join(`#`)}`:``;return`${t}${r}token=${encodeURIComponent(uk)}${i}`}var Sk=9537,Ck=`/api/v1`;function wk(){if(typeof window>`u`)return`http://localhost:${Sk}`;let{protocol:e,hostname:t,port:n}=window.location;return e===`https:`&&(n===``||n===`443`)||e===`http:`&&(n===``||n===`80`)?`${e}//${t}`:`${e}//${t}:${n}`}var Tk=wk(),Ek=`${Tk}${Ck}`;function Dk(e,{allowWebSocket:t=!1}={}){if(typeof e!=`string`||!e.trim())return null;let n,r;try{let t=typeof window<`u`?window.location.origin:void 0;n=new URL(Tk,t),r=new URL(e,`${n.origin}/`)}catch{return null}return![`http:`,`https:`].includes(n.protocol)||n.username||n.password||r.username||r.password||(t&&[`ws:`,`wss:`].includes(r.protocol)&&(r.protocol=r.protocol===`wss:`?`https:`:`http:`),![`http:`,`https:`].includes(r.protocol))?null:r.origin===n.origin?r:null}function Ok(e){let t=Dk(e);return t?(t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.toString()):``}var kk=ck.create({baseURL:Tk,timeout:6e4,headers:{"Content-Type":`application/json`},withCredentials:!0}),Ak=new Set([`post`,`put`,`patch`,`delete`]);function jk(e){let t=(e?.method||`get`).toLowerCase();return Ak.has(t)}function Mk(e){if(typeof FormData>`u`||!(e?.data instanceof FormData))return;let t=e.headers;if(t){if(typeof t.delete==`function`){t.delete(`Content-Type`);return}for(let e of Object.keys(t))e.toLowerCase()===`content-type`&&delete t[e]}}kk.interceptors.request.use(e=>{Mk(e);let t=e?.url;if(!t||typeof t!=`string`)return e;if(!Dk(t))return e.withCredentials=!1,e;e.withCredentials=!0,uk&&(e.params={...e.params||{},token:uk}),pk&&jk(e)&&(e.headers={...e.headers||{},"X-Client-Id":pk});let n=t.trim();return/^[a-z][a-z\d+.-]*:/i.test(n)||/^[\\/]{2}/.test(n)||t.startsWith(Ck)||(e.url=t.startsWith(`/`)?`${Ck}${t}`:`${Ck}/${t}`),e});async function Nk(e,t){try{let n=await kk.post(`/login`,{username:e,password:t});if(_k(`login`),lk.value=!0,typeof window<`u`&&`credentials`in navigator&&`PasswordCredential`in window&&e&&t)try{let n=new PasswordCredential({id:e,name:e,password:t});await navigator.credentials.store(n)}catch{}return n.data}catch(e){throw console.error(`Login failed:`,e),e}}async function Pk(){_k(`logout`);try{await kk.post(`/logout`)}catch(e){console.error(`Logout failed:`,e)}lk.value=!1}async function Fk(){try{let e=await kk.get(`/check-session`);return lk.value=!0,{status:`ok`,data:e.data}}catch(e){return e.response&&e.response.status===401?(console.warn(`Session invalid or expired:`,e),lk.value=!1,{status:`invalid`}):(console.warn(`Backend unreachable while checking session:`,e),{status:`unreachable`})}}async function Ik(){try{return(await kk.get(`/login`)).data}catch(e){throw console.error(`Login status check failed:`,e),e}}kk.interceptors.response.use(e=>e,e=>(e.response&&e.response.status===401&&!(e?.config?.url||``).includes(`/users/me/auth`)&&!uk&&(console.error(`Unauthorised! Logging out...`),Pk()),Promise.reject(e)));var Lk=e=>e.then(e=>e.data),Rk={key:0,class:`app-tooltip__key`},zk;function Bk(){if(!zk){let e=getComputedStyle(document.documentElement);zk={openDelay:(t=>parseFloat(e.getPropertyValue(t))||0)(`--tooltip-delay`)}}return zk}var Vk=new Set,Hk=null,Uk=0;function Wk(){Hk||(Hk=document.createElement(`div`),Hk.hidden=!0,Hk.className=`app-tooltip-descriptions`,document.body.appendChild(Hk));let e=document.createElement(`span`);return e.id=`app-tooltip-desc-${++Uk}`,Hk.appendChild(e),e}var Gk=e=>(e||``).split(/\s+/).filter(Boolean),Kk={__name:`Tooltip`,props:{text:{type:String,default:``},shortcut:{type:String,default:``},location:{type:String,default:`top`},disabled:{type:Boolean,default:!1},describe:{type:Boolean,default:!0}},setup(e){let t=e,n=ui(),r=li(),i=_o(),a=P(!1),o=P(null),{openDelay:s}=Bk(),c=H(()=>t.describe&&t.text?t.text:``);function l(e){let t={...e};return delete t[`aria-describedby`],t}let u=n.activator===`parent`,d=P(!u),f=P(null),p=P(void 0),m=0,h=()=>f.value??o.value?.activatorEl??null,g=H(()=>h()?.closest(`[data-tooltip-layer]`)??null),_=()=>g.value?.dataset.tooltipLayer||``;function v(e){let n=f.value;n.removeEventListener(`mouseenter`,v);let i=Gk(n.getAttribute(`aria-describedby`)).filter(e=>e!==x?.id);p.value=i.length?i.join(` `):void 0,d.value=!0,!(e.type!==`mouseenter`||t.disabled)&&(t.text||r.default)&&(m=setTimeout(()=>a.value=!0,s),n.addEventListener(`mouseleave`,()=>clearTimeout(m),{once:!0}))}function y(e){d.value||v(e),ee(e)}function b(e){f.value?.contains(e.relatedTarget)||M()}Lr(()=>{if(!u)return;let e=i?.proxy?.$el?.parentElement??null;for(;e?.hasAttribute(`data-no-activator`);)e=e.parentElement;f.value=e,e?.addEventListener(`mouseenter`,v),e?.addEventListener(`focusin`,y),e?.addEventListener(`focusout`,b),e?.addEventListener(`mousedown`,A),e?.addEventListener(`mouseleave`,j)});let x=null,S=null,C=null;function w(e){let t=Gk(e.getAttribute(`aria-describedby`)),n=x?.id,r=c.value&&n,i=t.filter(e=>e!==n);r&&i.push(n),i.join(` `)!==t.join(` `)&&(i.length?e.setAttribute(`aria-describedby`,i.join(` `)):e.removeAttribute(`aria-describedby`))}ua(()=>{let e=h();c.value&&!x&&(x=Wk()),x&&(x.textContent=c.value),!(!e||!x)&&(C!==e&&(S?.disconnect(),S=new MutationObserver(()=>w(e)),S.observe(e,{attributeFilter:[`aria-describedby`]}),C=e),w(e))});let T=null,E=null;Br(()=>{clearTimeout(m),Vk.delete(O),S?.disconnect(),E=h();let e=f.value;e&&(e.removeEventListener(`mouseenter`,v),e.removeEventListener(`focusin`,y),e.removeEventListener(`focusout`,b),e.removeEventListener(`mousedown`,A),e.removeEventListener(`mouseleave`,j)),E&&(T=Gk(E.getAttribute(`aria-describedby`)).filter(e=>e!==x?.id).join(` `)),x?.remove()}),Vr(()=>{E&&(T?E.setAttribute(`aria-describedby`,T):E.removeAttribute(`aria-describedby`)),document.removeEventListener(`keydown`,te)});let D=H(()=>u?{"aria-describedby":p.value}:{"aria-describedby":p.value,onFocus:ee,onMousedown:A,onMouseleave:j}),O={host:h,close:M};R(a,e=>{if(e&&k){a.value=!1;return}if(!e){Vk.delete(O),document.removeEventListener(`keydown`,te);return}let t=h();for(let e of Vk){let n=e.host();if(!(!t||!n||n===t)){if(t.contains(n)){a.value=!1;return}n.contains(t)&&e.close()}}Vk.add(O),document.addEventListener(`keydown`,te)});function ee(e){t.disabled||!(t.text||r.default)||e.target?.matches?.(`:focus-visible`)&&(a.value=!0)}let k=!1;function A(){k=!0,M()}function j(){k=!1}function M(){clearTimeout(m),a.value=!1}function te(e){e.key===`Escape`&&M()}return(t,n)=>d.value?(Wa(),Xa(tn(LT),{key:0,ref_key:`tipRef`,ref:o,modelValue:a.value,"onUpdate:modelValue":n[0]||=e=>a.value=e,location:_()||e.location,attach:g.value||!1,"open-delay":tn(s),disabled:e.disabled||!(e.text||t.$slots.default),"activator-props":D.value,eager:!1,"content-class":`app-tooltip`},ti({default:Vn(()=>[ni(t.$slots,`default`,{},()=>[ao(Ce(e.text),1)]),e.shortcut?(Wa(),Ya(`kbd`,Rk,Ce(e.shortcut),1)):so(``,!0)]),_:2},[t.$slots.activator?{name:`activator`,fn:Vn(e=>[ni(t.$slots,`activator`,he(ro({...e,props:l(e.props)})))]),key:`0`}:void 0]),1032,[`modelValue`,`location`,`attach`,`open-delay`,`disabled`,`activator-props`])):so(``,!0)}},qk=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},Jk=[`disabled`,`aria-busy`,`aria-label`,`aria-keyshortcuts`],Yk={key:1,class:me([`app-btn__icon`,`app-btn__icon--custom`])},Xk={key:3,class:`app-btn__label`},Zk={key:4,class:`app-btn__key`,"aria-hidden":`true`},Qk=qk({__name:`AppButton`,props:{variant:{type:String,default:`secondary`},size:{type:String,default:`md`},iconLeft:{type:String,default:``},iconOnly:{type:Boolean,default:!1},block:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},tooltip:{type:String,default:``},tooltipLocation:{type:String,default:`top`},keyHint:{type:String,default:``}},setup(e,{expose:t}){let n=e,r=H(()=>n.keyHint===`enter`?`↵`:n.keyHint===`esc`?`Esc`:n.keyHint.toUpperCase()),i=H(()=>n.keyHint===`enter`?`Enter`:n.keyHint===`esc`?`Escape`:n.keyHint?n.keyHint.toUpperCase():void 0),a=P(null),o=!1;R(()=>n.loading,e=>{if(e){o=a.value===document.activeElement;return}o&&(o=!1,kn(()=>a.value?.focus()))});function s(){a.value?.focus()}return t({focus:s}),(t,n)=>(Wa(),Ya(`button`,{ref_key:`rootEl`,ref:a,type:`button`,class:me([`app-btn`,`app-btn--${e.variant}`,`app-btn--${e.size}`,{"app-btn--icon-only":e.iconOnly,"app-btn--loading":e.loading,"app-btn--block":e.block}]),disabled:e.disabled||e.loading,"aria-busy":e.loading?`true`:void 0,"aria-label":e.iconOnly&&e.tooltip?e.tooltip:void 0,"aria-keyshortcuts":i.value},[e.tooltip?(Wa(),Xa(Kk,{key:0,text:e.tooltip,activator:`parent`,location:e.tooltipLocation,describe:!e.iconOnly},null,8,[`text`,`location`,`describe`])):so(``,!0),!e.loading&&t.$slots.icon?(Wa(),Ya(`span`,Yk,[ni(t.$slots,`icon`,{size:e.size===`sm`?16:18},void 0,!0)])):e.loading||e.iconLeft?(Wa(),Xa(tn(ah),{key:2,size:e.size===`sm`?16:18,class:me([`app-btn__icon`,{"mdi-spin":e.loading}])},{default:Vn(()=>[ao(Ce(e.loading?`mdi-loading`:`mdi-${e.iconLeft}`),1)]),_:1},8,[`size`,`class`])):so(``,!0),e.iconOnly?so(``,!0):(Wa(),Ya(`span`,Xk,[ni(t.$slots,`default`,{},void 0,!0)])),e.keyHint?(Wa(),Ya(`kbd`,Zk,Ce(r.value),1)):so(``,!0)],10,Jk))}},[[`__scopeId`,`data-v-9fc252c2`]]);export{Zu as $,Gt as $t,Mv as A,Fo as At,ap as B,Mi as Bt,LT as C,ti as Ct,ky as D,Dr as Dt,tb as E,B as Et,ah as F,Br as Ft,Gf as G,ii as Gt,Jf as H,ni as Ht,xm as I,Lr as It,Pf as J,R as Jt,Nf as K,yr as Kt,mp as L,Vr as Lt,Jh as M,L as Mt,ph as N,V as Nt,dy as O,vr as Ot,ch as P,kn as Pt,rd as Q,ke as Qt,vp as R,zr as Rt,zT as S,Ya as St,Ib as T,ao as Tt,$f as U,Jr as Ut,fp as V,ei as Vt,zf as W,Xr as Wt,Md as X,Hn as Xt,Ad as Y,Vn as Yt,hd as Z,Oe as Zt,gk as _,t as _n,er as _t,vk as a,P as an,Ks as at,mk as b,Xa as bt,xk as c,N as cn,nc as ct,lk as d,nn as dn,ac as dt,Qt as en,Qu as et,fk as f,tn as fn,tc as ft,_k as g,Ce as gn,z as gt,yk as h,le as hn,mc as ht,Lk as i,Ut as in,Zo as it,jg as j,Ni as jt,Bv as k,ro as kt,Ik as l,I as ln,lc as lt,Pk as m,he as mn,gc as mt,qk as n,Ae as nn,ll as nt,Ek as o,Ht as on,xc as ot,Nk as p,me as pn,hs as pt,Mf as q,li as qt,Kk as r,Vt as rn,Tc as rt,kk as s,F as sn,bc as st,Qk as t,Yt as tn,zc as tt,Fk as u,on as un,ic as ut,bk as v,H as vt,dT as w,oo as wt,Ok as x,so as xt,dk as y,to as yt,bp as z,Wa as zt};
10
+ `+n)}}catch{}}throw e}}_request(e,t){typeof e==`string`?(t||={},t.url=e):t=e||{},t=bO(this.defaults,t);let{transitional:n,paramsSerializer:r,headers:i}=t;n!==void 0&&ek.assertOptions(n,{silentJSONParsing:tk.transitional(tk.boolean),forcedJSONParsing:tk.transitional(tk.boolean),clarifyTimeoutError:tk.transitional(tk.boolean),legacyInterceptorReqResOrdering:tk.transitional(tk.boolean),advertiseZstdAcceptEncoding:tk.transitional(tk.boolean),validateStatusUndefinedResolves:tk.transitional(tk.boolean)},!1),r!=null&&(Q.isFunction(r)?t.paramsSerializer={serialize:r}:ek.assertOptions(r,{encode:tk.function,serialize:tk.function},!0)),t.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls===void 0?t.allowAbsoluteUrls=!0:t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls),ek.assertOptions(t,{baseUrl:tk.spelling(`baseURL`),withXsrfToken:tk.spelling(`withXSRFToken`)},!0),t.method=(t.method||this.defaults.method||`get`).toLowerCase();let a=i&&Q.merge(i.common,i[t.method]);i&&Q.forEach([`delete`,`get`,`head`,`post`,`put`,`patch`,`query`,`common`],e=>{delete i[e]}),t.headers=yD.concat(a,i);let o=[],s=!0;this.interceptors.request.forEach(function(e){if(typeof e.runWhen==`function`&&e.runWhen(t)===!1)return;s&&=e.synchronous;let n=t.transitional||FD;n&&n.legacyInterceptorReqResOrdering?o.unshift(e.fulfilled,e.rejected):o.push(e.fulfilled,e.rejected)});let c=[];this.interceptors.response.forEach(function(e){c.push(e.fulfilled,e.rejected)});let l,u=0,d;if(!s){let e=[XO.bind(this),void 0];for(e.unshift(...o),e.push(...c),d=e.length,l=Promise.resolve(t);u<d;)l=l.then(e[u++],e[u++]);return l}d=o.length;let f=t;for(;u<d;){let e=o[u++],t=o[u++];try{f=e(f)}catch(e){t.call(this,e);break}}try{l=XO.call(this,f)}catch(e){return Promise.reject(e)}for(u=0,d=c.length;u<d;)l=l.then(c[u++],c[u++]);return l}getUri(e){return e=bO(this.defaults,e),ND(vO(e.baseURL,e.url,e.allowAbsoluteUrls,e),e.params,e.paramsSerializer)}};Q.forEach([`delete`,`get`,`head`,`options`],function(e){nk.prototype[e]=function(t,n){return this.request(bO(n||{},{method:e,url:t,data:n&&Q.hasOwnProp(n,`data`)?n.data:void 0}))}}),Q.forEach([`post`,`put`,`patch`,`query`],function(e){function t(t){return function(n,r,i){return this.request(bO(i||{},{method:e,headers:t?{"Content-Type":`multipart/form-data`}:{},url:n,data:r}))}}nk.prototype[e]=t(),e!==`query`&&(nk.prototype[e+`Form`]=t(!0))});var rk=class e{constructor(e){if(typeof e!=`function`)throw TypeError(`executor must be a function.`);let t;this.promise=new Promise(function(e){t=e});let n=this;this.promise.then(e=>{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null}),this.promise.then=e=>{let t,r=new Promise(e=>{n.subscribe(e),t=e}).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e(function(e,r,i){n.reason||(n.reason=new tO(e,r,i),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){let e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let t;return{token:new e(function(e){t=e}),cancel:t}}};function ik(e){return function(t){return e.apply(null,t)}}function ak(e){return Q.isObject(e)&&e.isAxiosError===!0}var ok={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(ok).forEach(([e,t])=>{ok[t]=e});function sk(e){let t=new nk(e),n=BT(nk.prototype.request,t);return Q.extend(n,nk.prototype,t,{allOwnKeys:!0}),Q.extend(n,t,null,{allOwnKeys:!0}),n.create=function(t){return sk(bO(e,t))},n}var ck=sk(QD);ck.Axios=nk,ck.CanceledError=tO,ck.CancelToken=rk,ck.isCancel=eO,ck.VERSION=PO,ck.toFormData=OD,ck.AxiosError=$,ck.Cancel=ck.CanceledError,ck.all=function(e){return Promise.all(e)},ck.spread=ik,ck.isAxiosError=ak,ck.mergeConfig=bO,ck.AxiosHeaders=yD,ck.formToJSON=e=>YD(Q.isHTMLForm(e)?new FormData(e):e),ck.getAdapter=JO.getAdapter,ck.HttpStatusCode=ok,ck.default=ck;var lk=P(!1),uk=null,dk=P(null),fk=H(()=>dk.value?.scope===`READ`),pk=null;function mk(e){pk=typeof e==`string`&&e?e.slice(0,200):null}var hk=new Set;function gk(e){return typeof e==`function`?(hk.add(e),()=>hk.delete(e)):()=>{}}function _k(e){for(let t of hk)try{t()}catch(t){console.error(`Session-reset handler failed after ${e}:`,t)}uk=null,dk.value=null}function vk(e){_k(`share-token entry`),uk=e}function yk(){return`cli-${typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID().replace(/-/g,``):`${Date.now().toString(36)}${Math.random().toString(36).slice(2,12)}`}`}function bk(e){if(e)return{headers:{"X-Operation-Batch-Id":e}}}function xk(e){if(!uk||!e||!Dk(e,{allowWebSocket:!0})||e.includes(`token=${encodeURIComponent(uk)}`))return e;let[t,...n]=e.split(`#`),r=t.includes(`?`)?`&`:`?`,i=n.length?`#${n.join(`#`)}`:``;return`${t}${r}token=${encodeURIComponent(uk)}${i}`}var Sk=9537,Ck=`/api/v1`;function wk(){if(typeof window>`u`)return`http://localhost:${Sk}`;let{protocol:e,hostname:t,port:n}=window.location;return e===`https:`&&(n===``||n===`443`)||e===`http:`&&(n===``||n===`80`)?`${e}//${t}`:`${e}//${t}:${n}`}var Tk=wk(),Ek=`${Tk}${Ck}`;function Dk(e,{allowWebSocket:t=!1}={}){if(typeof e!=`string`||!e.trim())return null;let n,r;try{let t=typeof window<`u`?window.location.origin:void 0;n=new URL(Tk,t),r=new URL(e,`${n.origin}/`)}catch{return null}return![`http:`,`https:`].includes(n.protocol)||n.username||n.password||r.username||r.password||(t&&[`ws:`,`wss:`].includes(r.protocol)&&(r.protocol=r.protocol===`wss:`?`https:`:`http:`),![`http:`,`https:`].includes(r.protocol))?null:r.origin===n.origin?r:null}function Ok(e){let t=Dk(e);return t?(t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.toString()):``}var kk=ck.create({baseURL:Tk,timeout:6e4,headers:{"Content-Type":`application/json`},withCredentials:!0}),Ak=new Set([`post`,`put`,`patch`,`delete`]);function jk(e){let t=(e?.method||`get`).toLowerCase();return Ak.has(t)}function Mk(e){if(typeof FormData>`u`||!(e?.data instanceof FormData))return;let t=e.headers;if(t){if(typeof t.delete==`function`){t.delete(`Content-Type`);return}for(let e of Object.keys(t))e.toLowerCase()===`content-type`&&delete t[e]}}kk.interceptors.request.use(e=>{Mk(e);let t=e?.url;if(!t||typeof t!=`string`)return e;if(!Dk(t))return e.withCredentials=!1,e;e.withCredentials=!0,uk&&(e.params={...e.params||{},token:uk}),pk&&jk(e)&&(e.headers={...e.headers||{},"X-Client-Id":pk});let n=t.trim();return/^[a-z][a-z\d+.-]*:/i.test(n)||/^[\\/]{2}/.test(n)||t.startsWith(Ck)||(e.url=t.startsWith(`/`)?`${Ck}${t}`:`${Ck}/${t}`),e});async function Nk(e,t){try{let n=await kk.post(`/login`,{username:e,password:t});if(_k(`login`),lk.value=!0,typeof window<`u`&&`credentials`in navigator&&`PasswordCredential`in window&&e&&t)try{let n=new PasswordCredential({id:e,name:e,password:t});await navigator.credentials.store(n)}catch{}return n.data}catch(e){throw console.error(`Login failed:`,e),e}}async function Pk(){_k(`logout`);try{await kk.post(`/logout`)}catch(e){console.error(`Logout failed:`,e)}lk.value=!1}async function Fk(){try{let e=await kk.get(`/check-session`);return lk.value=!0,{status:`ok`,data:e.data}}catch(e){return e.response&&e.response.status===401?(console.warn(`Session invalid or expired:`,e),lk.value=!1,{status:`invalid`}):(console.warn(`Backend unreachable while checking session:`,e),{status:`unreachable`})}}async function Ik(){try{return(await kk.get(`/login`)).data}catch(e){throw console.error(`Login status check failed:`,e),e}}kk.interceptors.response.use(e=>e,e=>(e.response&&e.response.status===401&&!(e?.config?.url||``).includes(`/users/me/auth`)&&!uk&&(console.error(`Unauthorised! Logging out...`),Pk()),Promise.reject(e)));var Lk=e=>e.then(e=>e.data);function Rk(e){return e instanceof HTMLElement&&(e.isContentEditable||[`INPUT`,`TEXTAREA`,`SELECT`].includes(e.tagName)||e.getAttribute(`role`)===`textbox`)}function zk(e){return[e,typeof document>`u`?null:document.activeElement].some(Rk)}function Bk(e,t,n=0){let r=e.getPropertyValue(t).trim(),i=parseFloat(r);return Number.isNaN(i)?n:r.endsWith(`s`)&&!r.endsWith(`ms`)?i*1e3:i}var Vk={key:0,class:`app-tooltip__key`},Hk;function Uk(){return Hk||={openDelay:Bk(getComputedStyle(document.documentElement),`--tooltip-delay`)},Hk}var Wk=new Set,Gk=null,Kk=0;function qk(){Gk||(Gk=document.createElement(`div`),Gk.hidden=!0,Gk.className=`app-tooltip-descriptions`,document.body.appendChild(Gk));let e=document.createElement(`span`);return e.id=`app-tooltip-desc-${++Kk}`,Gk.appendChild(e),e}var Jk=e=>(e||``).split(/\s+/).filter(Boolean),Yk={__name:`Tooltip`,props:{text:{type:String,default:``},shortcut:{type:String,default:``},location:{type:String,default:`top`},disabled:{type:Boolean,default:!1},describe:{type:Boolean,default:!0}},setup(e){let t=e,n=ui(),r=li(),i=_o(),a=P(!1),o=P(null),{openDelay:s}=Uk(),c=H(()=>t.describe&&t.text?t.text:``);function l(e){let t={...e};return delete t[`aria-describedby`],t}let u=n.activator===`parent`,d=P(!u),f=P(null),p=P(void 0),m=0,h=()=>f.value??o.value?.activatorEl??null,g=H(()=>h()?.closest(`[data-tooltip-layer]`)??null),_=()=>g.value?.dataset.tooltipLayer||``;function v(e){let n=f.value;n.removeEventListener(`mouseenter`,v);let i=Jk(n.getAttribute(`aria-describedby`)).filter(e=>e!==x?.id);p.value=i.length?i.join(` `):void 0,d.value=!0,!(e.type!==`mouseenter`||t.disabled)&&(t.text||r.default)&&(m=setTimeout(()=>a.value=!0,s),n.addEventListener(`mouseleave`,()=>clearTimeout(m),{once:!0}))}function y(e){d.value||v(e),ee(e)}function b(e){f.value?.contains(e.relatedTarget)||M()}Lr(()=>{if(!u)return;let e=i?.proxy?.$el?.parentElement??null;for(;e?.hasAttribute(`data-no-activator`);)e=e.parentElement;f.value=e,e?.addEventListener(`mouseenter`,v),e?.addEventListener(`focusin`,y),e?.addEventListener(`focusout`,b),e?.addEventListener(`mousedown`,A),e?.addEventListener(`mouseleave`,j)});let x=null,S=null,C=null;function w(e){let t=Jk(e.getAttribute(`aria-describedby`)),n=x?.id,r=c.value&&n,i=t.filter(e=>e!==n);r&&i.push(n),i.join(` `)!==t.join(` `)&&(i.length?e.setAttribute(`aria-describedby`,i.join(` `)):e.removeAttribute(`aria-describedby`))}ua(()=>{let e=h();c.value&&!x&&(x=qk()),x&&(x.textContent=c.value),!(!e||!x)&&(C!==e&&(S?.disconnect(),S=new MutationObserver(()=>w(e)),S.observe(e,{attributeFilter:[`aria-describedby`]}),C=e),w(e))});let T=null,E=null;Br(()=>{clearTimeout(m),Wk.delete(O),S?.disconnect(),E=h();let e=f.value;e&&(e.removeEventListener(`mouseenter`,v),e.removeEventListener(`focusin`,y),e.removeEventListener(`focusout`,b),e.removeEventListener(`mousedown`,A),e.removeEventListener(`mouseleave`,j)),E&&(T=Jk(E.getAttribute(`aria-describedby`)).filter(e=>e!==x?.id).join(` `)),x?.remove()}),Vr(()=>{E&&(T?E.setAttribute(`aria-describedby`,T):E.removeAttribute(`aria-describedby`)),document.removeEventListener(`keydown`,te)});let D=H(()=>u?{"aria-describedby":p.value}:{"aria-describedby":p.value,onFocus:ee,onMousedown:A,onMouseleave:j}),O={host:h,close:M};R(a,e=>{if(e&&k){a.value=!1;return}if(!e){Wk.delete(O),document.removeEventListener(`keydown`,te);return}let t=h();for(let e of Wk){let n=e.host();if(!(!t||!n||n===t)){if(t.contains(n)){a.value=!1;return}n.contains(t)&&e.close()}}Wk.add(O),document.addEventListener(`keydown`,te)});function ee(e){t.disabled||!(t.text||r.default)||e.target?.matches?.(`:focus-visible`)&&(a.value=!0)}let k=!1;function A(){k=!0,M()}function j(){k=!1}function M(){clearTimeout(m),a.value=!1}function te(e){e.key===`Escape`&&M()}return(t,n)=>d.value?(Wa(),Xa(tn(LT),{key:0,ref_key:`tipRef`,ref:o,modelValue:a.value,"onUpdate:modelValue":n[0]||=e=>a.value=e,location:_()||e.location,attach:g.value||!1,"open-delay":tn(s),disabled:e.disabled||!(e.text||t.$slots.default),"activator-props":D.value,eager:!1,"content-class":`app-tooltip`},ti({default:Vn(()=>[ni(t.$slots,`default`,{},()=>[ao(Ce(e.text),1)]),e.shortcut?(Wa(),Ya(`kbd`,Vk,Ce(e.shortcut),1)):so(``,!0)]),_:2},[t.$slots.activator?{name:`activator`,fn:Vn(e=>[ni(t.$slots,`activator`,he(ro({...e,props:l(e.props)})))]),key:`0`}:void 0]),1032,[`modelValue`,`location`,`attach`,`open-delay`,`disabled`,`activator-props`])):so(``,!0)}},Xk=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},Zk=[`disabled`,`aria-busy`,`aria-label`,`aria-keyshortcuts`],Qk={key:1,class:me([`app-btn__icon`,`app-btn__icon--custom`])},$k={key:3,class:`app-btn__label`},eA={key:4,class:`app-btn__key`,"aria-hidden":`true`},tA=Xk({__name:`AppButton`,props:{variant:{type:String,default:`secondary`},size:{type:String,default:`md`},iconLeft:{type:String,default:``},iconOnly:{type:Boolean,default:!1},block:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},tooltip:{type:String,default:``},tooltipLocation:{type:String,default:`top`},keyHint:{type:String,default:``}},setup(e,{expose:t}){let n=e,r=H(()=>n.keyHint===`enter`?`↵`:n.keyHint===`esc`?`Esc`:n.keyHint.toUpperCase()),i=H(()=>n.keyHint===`enter`?`Enter`:n.keyHint===`esc`?`Escape`:n.keyHint?n.keyHint.toUpperCase():void 0),a=P(null),o=!1;R(()=>n.loading,e=>{if(e){o=a.value===document.activeElement;return}o&&(o=!1,kn(()=>a.value?.focus()))});function s(){a.value?.focus()}return t({focus:s}),(t,n)=>(Wa(),Ya(`button`,{ref_key:`rootEl`,ref:a,type:`button`,class:me([`app-btn`,`app-btn--${e.variant}`,`app-btn--${e.size}`,{"app-btn--icon-only":e.iconOnly,"app-btn--loading":e.loading,"app-btn--block":e.block}]),disabled:e.disabled||e.loading,"aria-busy":e.loading?`true`:void 0,"aria-label":e.iconOnly&&e.tooltip?e.tooltip:void 0,"aria-keyshortcuts":i.value},[e.tooltip?(Wa(),Xa(Yk,{key:0,text:e.tooltip,activator:`parent`,location:e.tooltipLocation,describe:!e.iconOnly},null,8,[`text`,`location`,`describe`])):so(``,!0),!e.loading&&t.$slots.icon?(Wa(),Ya(`span`,Qk,[ni(t.$slots,`icon`,{size:e.size===`sm`?16:18},void 0,!0)])):e.loading||e.iconLeft?(Wa(),Xa(tn(ah),{key:2,size:e.size===`sm`?16:18,class:me([`app-btn__icon`,{"mdi-spin":e.loading}])},{default:Vn(()=>[ao(Ce(e.loading?`mdi-loading`:`mdi-${e.iconLeft}`),1)]),_:1},8,[`size`,`class`])):so(``,!0),e.iconOnly?so(``,!0):(Wa(),Ya(`span`,$k,[ni(t.$slots,`default`,{},void 0,!0)])),e.keyHint?(Wa(),Ya(`kbd`,eA,Ce(r.value),1)):so(``,!0)],10,Zk))}},[[`__scopeId`,`data-v-9fc252c2`]]);export{Md as $,Hn as $t,ky as A,Dr as At,mp as B,Vr as Bt,mk as C,Xa as Ct,dT as D,oo as Dt,LT as E,ti as Et,Jh as F,L as Ft,Jf as G,ni as Gt,bp as H,Wa as Ht,ph as I,V as It,Gf as J,ii as Jt,$f as K,Jr as Kt,ch as L,kn as Lt,Bv as M,ro as Mt,Mv as N,Fo as Nt,Ib as O,ao as Ot,jg as P,Ni as Pt,Ad as Q,Vn as Qt,ah as R,Br as Rt,dk as S,to as St,zT as T,Ya as Tt,ap as U,Mi as Ut,vp as V,zr as Vt,fp as W,ei as Wt,Mf as X,li as Xt,Nf as Y,yr as Yt,Pf as Z,R as Zt,Pk as _,he as _n,gc as _t,Rk as a,Ae as an,ll as at,gk as b,t as bn,er as bt,vk as c,P as cn,Ks as ct,xk as d,N as dn,nc as dt,Oe as en,hd as et,Ik as f,I as fn,lc as ft,Nk as g,me as gn,hs as gt,fk as h,tn as hn,tc as ht,Bk as i,Yt as in,zc as it,dy as j,vr as jt,tb as k,B as kt,Ek as l,Ht as ln,xc as lt,lk as m,nn as mn,ac as mt,Xk as n,Gt as nn,Zu as nt,zk as o,Vt as on,Tc as ot,Fk as p,on as pn,ic as pt,zf as q,Xr as qt,Yk as r,Qt as rn,Qu as rt,Lk as s,Ut as sn,Zo as st,tA as t,ke as tn,rd as tt,kk as u,F as un,bc as ut,yk as v,le as vn,mc as vt,Ok as w,so as wt,bk as x,H as xt,_k as y,Ce as yn,z as yt,xm as z,Lr as zt};
@@ -1 +1 @@
1
- .field-label[data-v-2c082f06]{font-size:var(--text-2xs);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:var(--tracking-label);color:rgba(var(--v-theme-on-surface), .6);margin-bottom:var(--space-2)}.app-input[data-v-612eb2fa]{display:block}.app-input__wrap[data-v-612eb2fa]{align-items:center;gap:var(--space-3);background:rgb(var(--v-theme-input-background));border:1px solid rgb(var(--v-theme-border));border-radius:var(--radius-sm);padding:0 var(--space-3);height:var(--control-h);display:flex}.app-input__wrap--error[data-v-612eb2fa]{border-color:rgb(var(--v-theme-surface-error))}.app-input__wrap[data-v-612eb2fa]:has(.app-input__field:focus-visible){outline:var(--focus-width) solid var(--focus-stroke);outline-offset:var(--focus-offset)}.app-input__icon[data-v-612eb2fa]{color:rgba(var(--v-theme-on-surface), .5);flex-shrink:0}.app-input__field[data-v-612eb2fa]{min-width:0;height:100%;color:rgb(var(--v-theme-on-surface));font-family:var(--font-ui);font-size:var(--text-base);background:0 0;border:none;outline:none;flex:1}.app-input__wrap--mono .app-input__field[data-v-612eb2fa]{font-family:var(--font-mono);font-size:var(--text-sm)}.app-input__field[data-v-612eb2fa]::placeholder,.app-input__field[data-v-612eb2fa]:disabled{color:rgba(var(--v-theme-on-surface), .45)}.app-input__error[data-v-612eb2fa]{margin-top:var(--space-2);font-size:var(--text-xs);color:rgb(var(--v-theme-surface-error));display:block}.chip-row[data-v-4b351333]{align-items:center;gap:var(--space-2);white-space:nowrap;min-width:0;display:flex;position:relative;overflow:hidden}.chip-row__chip[data-v-4b351333],.chip-row__more[data-v-4b351333]{align-items:center;gap:var(--space-2);box-sizing:border-box;height:var(--tag-h-xs);padding:0 var(--space-2);border:1px solid rgb(var(--v-theme-border));border-radius:var(--radius-sm);background:rgb(var(--v-theme-input-background));color:rgb(var(--v-theme-on-surface));font-size:var(--text-2xs);font-weight:var(--weight-regular);line-height:var(--leading-snug);flex-shrink:0;display:inline-flex;overflow:hidden}.chip-row__icon[data-v-4b351333]{color:rgba(var(--v-theme-on-surface), var(--opacity-text-secondary));flex-shrink:0}.chip-row__label[data-v-4b351333]{text-overflow:ellipsis;min-width:0;overflow:hidden}.chip-row>.chip-row__chip[data-v-4b351333]{max-width:100%}.chip-row>.chip-row__chip[data-v-4b351333]:first-child{flex-shrink:1;min-width:0}.chip-row__chip--dashed[data-v-4b351333]{color:rgba(var(--v-theme-on-surface), var(--opacity-text-secondary));background:0 0;border-style:dashed}.chip-row__chip--fact[data-v-4b351333]{background:0 0}.chip-row__more[data-v-4b351333]{color:rgba(var(--v-theme-on-surface), var(--opacity-text-secondary));font-variant-numeric:tabular-nums;background:0 0}.chip-row__measure[data-v-4b351333]{gap:var(--space-2);visibility:hidden;pointer-events:none;height:0;display:flex;position:absolute;top:0;left:0;overflow:hidden}
1
+ .field-label[data-v-2c082f06]{font-size:var(--text-2xs);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:var(--tracking-label);color:rgba(var(--v-theme-on-surface), .6);margin-bottom:var(--space-2)}.app-input[data-v-612eb2fa]{display:block}.app-input__wrap[data-v-612eb2fa]{align-items:center;gap:var(--space-3);background:rgb(var(--v-theme-input-background));border:1px solid rgb(var(--v-theme-border));border-radius:var(--radius-sm);padding:0 var(--space-3);height:var(--control-h);display:flex}.app-input__wrap--error[data-v-612eb2fa]{border-color:rgb(var(--v-theme-surface-error))}.app-input__wrap[data-v-612eb2fa]:has(.app-input__field:focus-visible){outline:var(--focus-width) solid var(--focus-stroke);outline-offset:var(--focus-offset)}.app-input__icon[data-v-612eb2fa]{color:rgba(var(--v-theme-on-surface), .5);flex-shrink:0}.app-input__field[data-v-612eb2fa]{min-width:0;height:100%;color:rgb(var(--v-theme-on-surface));font-family:var(--font-ui);font-size:var(--text-base);background:0 0;border:none;outline:none;flex:1}.app-input__wrap--mono .app-input__field[data-v-612eb2fa]{font-family:var(--font-mono);font-size:var(--text-sm)}.app-input__field[data-v-612eb2fa]::placeholder,.app-input__field[data-v-612eb2fa]:disabled{color:rgba(var(--v-theme-on-surface), .45)}.app-input__error[data-v-612eb2fa]{margin-top:var(--space-2);font-size:var(--text-xs);color:rgb(var(--v-theme-surface-error));display:block}.chip-row[data-v-e36d8592]{align-items:center;gap:var(--space-2);white-space:nowrap;min-width:0;display:flex;position:relative;overflow:hidden}.chip-row__chip[data-v-e36d8592],.chip-row__more[data-v-e36d8592]{align-items:center;gap:var(--space-2);box-sizing:border-box;height:var(--tag-h-xs);padding:0 var(--space-2);border:1px solid rgb(var(--v-theme-border));border-radius:var(--radius-sm);background:rgb(var(--v-theme-input-background));color:rgb(var(--v-theme-on-surface));font-size:var(--text-2xs);font-weight:var(--weight-regular);line-height:var(--leading-snug);flex-shrink:0;display:inline-flex;overflow:hidden}.chip-row__icon[data-v-e36d8592]{color:rgba(var(--v-theme-on-surface), var(--opacity-text-secondary));flex-shrink:0}.chip-row__label[data-v-e36d8592]{text-overflow:ellipsis;min-width:0;overflow:hidden}.chip-row>.chip-row__chip[data-v-e36d8592]{max-width:100%}.chip-row>.chip-row__chip[data-v-e36d8592]:first-child{flex-shrink:1;min-width:0}.chip-row__chip--dashed[data-v-e36d8592]{color:rgba(var(--v-theme-on-surface), var(--opacity-text-secondary));background:0 0;border-style:dashed}.chip-row__chip--fact[data-v-e36d8592]{background:0 0}.chip-row__chip--badge[data-v-e36d8592]{border-radius:var(--radius-pill);font-weight:var(--weight-semibold)}.chip-row__more[data-v-e36d8592]{color:rgba(var(--v-theme-on-surface), var(--opacity-text-secondary));font-variant-numeric:tabular-nums;background:0 0}.chip-row__measure[data-v-e36d8592]{gap:var(--space-2);visibility:hidden;pointer-events:none;height:0;display:flex;position:absolute;top:0;left:0;overflow:hidden}
@@ -0,0 +1,2 @@
1
+ import{$t as e,Ct as t,Gt as n,Ht as r,Lt as i,Ot as a,Qt as o,R as s,Rt as c,St as l,Tt as u,Wt as d,Zt as f,_t as p,cn as m,gn as h,gt as ee,hn as g,n as _,r as te,wt as v,xt as ne,yn as y,yt as re,zt as b}from"./AppButton-DV7Exi1C.js";import{n as x}from"./setAppearance-qVi6o8tK.js";var S=/^(?:i?q|tq)\d+$/i,C=new Set([`k`,`s`,`m`,`l`,`xs`,`xl`,`xxs`,`nl`,`0`,`1`]),w={fp32:`fp32`,f32:`fp32`,fp16:`fp16`,f16:`fp16`,bf16:`bf16`,fp8:`fp8`,f8:`fp8`,e4m3:`fp8_e4m3`,e4m3fn:`fp8_e4m3`,e5m2:`fp8_e5m2`,nvfp4:`nvfp4`,mxfp4:`mxfp4`,fp4:`fp4`,nf4:`nf4`,int8:`int8`,i8:`int8`,int4:`int4`,i4:`int4`},T=new Set([`scaled`,`awq`,`gptq`,`fast`]);function E(e){for(let t of[3,2,1]){if(e.length<t)continue;let n=e.slice(e.length-t);if(S.test(n[0])&&n.slice(1).every(e=>C.has(e.toLowerCase())))return{tokens:e.slice(0,e.length-t),quant:n.map(e=>e.toLowerCase()).join(`_`)}}let t=[...e],n=[];for(;t.length;){let e=t[t.length-1].toLowerCase();if(!(e in w)&&!T.has(e))break;n.push(t.pop())}let r=n.find(e=>e.toLowerCase()in w);return r?{tokens:t,quant:w[r.toLowerCase()]}:{tokens:[...e],quant:null}}var D=/^(?:step\d+|epoch\d+|\d+ep|\d{5,})$/i;function O(e){return String(e||``).split(/[\\/]/).pop().replace(/\.[^.]+$/,``).replace(/[_-]/g,` `).trim()}function k(e){let{tokens:t}=E(O(e).split(/\s+/).filter(Boolean));for(;t.length&&D.test(t[t.length-1]);)t.pop();return t.join(` `)}var ie={fp32:[`FP32`,`32-bit float`],fp16:[`FP16`,`16-bit float`],bf16:[`BF16`,`bfloat16`],fp8_e4m3:[`FP8`,`FP8 E4M3`],fp8_e5m2:[`FP8`,`FP8 E5M2`],fp8:[`FP8`,`8-bit float`],nvfp4:[`NVFP4`,`NVIDIA FP4`],mxfp4:[`MXFP4`,`mixed FP4`],fp4:[`FP4`,`4-bit float`],nf4:[`NF4`,`4-bit NormalFloat`],int8:[`INT8`,`8-bit integer`],int4:[`INT4`,`4-bit integer`],int32:[`INT32`,`32-bit integer`],mixed:[`MIXED`,`No single dtype holds most of the parameters`]},ae=/^(?:i?q|tq)\d+(?:_[a-z0-9]+)*$/i;function A(e){let t=String(e??``).trim();if(!t)return null;let n=ie[t.toLowerCase()];if(n)return{label:n[0],title:n[1]};let r=t.toUpperCase();return{label:r,title:ae.test(t)?`GGUF ${r} quantisation`:`Stored as ${r}`}}function oe(e){let t=String(e?.display_name||``).trim();if(t)return{text:t,state:`named`};let n=String(e?.matched_name||``).trim();if(n)return{text:n,state:`derived`};let r=String(e?.filename||``).trim(),i=k(r);return i?{text:i,state:`derived`}:r?{text:r,state:`from-file`}:{text:``,state:`needs-a-name`}}var se={added_at:{label:`Date added`,icon:`mdi-clock-plus-outline`},file_mtime:{label:`File date`,icon:`mdi-file-clock-outline`},name:{label:`Name`,icon:`mdi-sort-alphabetical-variant`},size:{label:`Size`,icon:`mdi-harddisk`},base_model:{label:`Base model`,icon:`mdi-cube-outline`}};function ce(e){return e===`file_mtime`?`file_mtime`:`added_at`}function le(e,t,n=!1){if(ce(t)===`file_mtime`){let t=Number(e?.newest_file_mtime);if(!(t>0))return``;let n=new Date(t/1e6);return Number.isNaN(n.getTime())?``:n.toISOString()}return!n&&e?.newest_member_at||e?.added_at||``}var ue={added_at:[`Oldest first`,`Newest first`],file_mtime:[`Oldest first`,`Newest first`],name:[`A to Z`,`Z to A`],base_model:[`A to Z`,`Z to A`],size:[`Smallest first`,`Largest first`]};function de(e,t){let n=ue[e]||ue.name;return t===`asc`?n[0]:n[1]}function fe(e){return e===`name`||e===`base_model`?`asc`:`desc`}var pe={none:{label:`None`,icon:`mdi-format-list-bulleted`},workflow_set:{label:`Workflow set`,icon:`mdi-view-grid-outline`},base_model:{label:`Base model`,icon:`mdi-cube-outline`},folder:{label:`Folder`,icon:`mdi-folder-outline`},feature:{label:`Feature`,icon:`mdi-star-four-points-outline`}},me={captioner:`Captioning`,tagger:`Tagging`,detector:`Detection`,face:`Faces`,search:`Search`,scorer:`Quality score`,checkpoint:`Checkpoint`,other:`Other`};function he(e){return M(me,String(e||``))}var j={checkpoint:`Checkpoint`,vae:`VAE`,text_encoder:`Text encoder`,unknown:`Unclassified`};function ge(e){let t=String(e||``);return Object.hasOwn(j,t)?j[t]:``}function M(e,t){return Object.hasOwn(e,t)?e[t]:t}var _e={lora:`LoRA`,lokr:`LoKr`,loha:`LoHa`,dora:`DoRA`,oft:`OFT`,unknown:`Unknown`};function N(e){return String(e||``).trim().toLowerCase()}function ve(e){return M(_e,N(e))}var ye={captioner:`mdi-text-box-outline`,tagger:`mdi-tag-outline`,detector:`mdi-shape-outline`,face:`mdi-face-recognition`,search:`mdi-magnify`,scorer:`mdi-star-outline`,checkpoint:`mdi-package-variant-closed`,other:`mdi-dots-horizontal-circle-outline`};function be(e){return ye[String(e||``)]||``}var P=[`B`,`KB`,`MB`,`GB`,`TB`];function xe(e){if(e==null||e===``)return``;let t=Number(e);if(!Number.isFinite(t)||t<0)return``;let n=t,r=0;for(;n>=1024&&r<P.length-1;)n/=1024,r+=1;let i=r===0?0:1;return`${n.toFixed(i)} ${P[r]}`}var Se=`\0unset`;function F(e,t){return e.key===`\0unset`?t.key===`\0unset`?0:1:t.key===`\0unset`?-1:e.label.localeCompare(t.label,void 0,{numeric:!0,sensitivity:`base`})}function Ce(e,t){let n=new Set(e.map(e=>e.key)),r=[];for(let e of t||[]){let t=String(e.path||e.id||``);if(!t||n.has(t))continue;let i=!e.last_checked;!i&&Number(e.file_count)>0||r.push({key:t,label:t,labelKind:`path`,folderId:Number(e.id),emptyReason:i?`unscanned`:`empty`,rows:[]})}return r.length?[...e,...r].sort(F):e}function I(e){return e?.base_model_canonical||e?.base_model_folded||e?.base_model||``}var we=new Set([`filename`,`declared_fuzzy`,`filename_fuzzy`]);function Te(e){let t=e?.base_model_canonical||``,n=e?.base_model_source||``;if(t&&we.has(n)){let r=String(e?.base_model||``).trim();return{text:t,guess:`${n===`declared_fuzzy`&&r?`The file says “${r}”, read as ${t}.`:`Guessed from the filename. Nothing in the file says this.`} Double-click or press Shift+F2 to correct it.`}}return{text:e?.base_model||t,guess:null}}var Ee={drive:{label:`Drive, then folder`,icon:`mdi-harddisk`},alpha:{label:`Folder, A to Z`,icon:`mdi-sort-alphabetical-variant`}},L={managed:{icon:`mdi-folder-home-outline`,chip:`Managed`,note:`PixlStash keeps its own models here.`},foreign:{icon:`mdi-folder-lock-outline`,chip:`Locked`,note:`Owned by another tool. PixlStash reads it and never writes to it.`},source:{icon:`mdi-folder-cog-outline`,chip:`ai-toolkit`,note:`Training output. Models are imported from here, not catalogued in place.`},user:{icon:`mdi-folder-outline`,chip:``,note:``}},De=`mdi-lan-disconnect`,Oe=60,ke=50;function Ae(e){let t=x[e%x.length].value;return`hsl(${K(t)} ${Oe}% ${ke}%)`}function je(e,t){if(!e||!t||e===t)return!1;let n=t.replace(/[/\\]+$/,``),r=e.slice(n.length);return e.startsWith(n)&&/^[/\\]/.test(r)}function Me(e,{folders:t=[],deviceByFolderId:n=null,offlineFolderIds:r=null}={}){let i=new Map((t||[]).map(e=>[Number(e.id),e])),a=(t||[]).map(e=>String(e.path||``)),o=new Map([...new Set([...n?.values?.()||[]].map(e=>e?.device_id).filter(Boolean).map(String))].sort().map((e,t)=>[e,t]));return(e||[]).map(e=>{let t=Number(e.folderId),s=Number.isInteger(t)?i.get(t):null,c=Number.isInteger(t)&&n?.get?.(t)||null,l=L[s?.kind]?s.kind:`user`,u=!!r?.has?.(t),d=c?.device_id?String(c.device_id):``;return{...e,tier:s?l:null,icon:u?De:L[l].icon,chip:s?L[l].chip:``,note:s?L[l].note:``,drive:d?{label:c.label||c.mount_point||``,rail:Ae(o.get(d)??0)}:null,offline:u,nested:a.some(e=>je(String(s?.path||``),e))}})}function R(e,t){let n=t?.get?.(Number(e))||null;return n?.device_id?`d:${n.device_id}`:`f:${Number(e)}`}function Ne(e,t){let n=new Map,r=e.filter(e=>!Number.isInteger(e.folderId));for(let r of e){if(!Number.isInteger(r.folderId))continue;let e=Number(r.folderId),i=t?.get?.(e)||null,a=R(e,t),o=n.get(a);o||(o={key:a,label:i?.label||i?.mount_point||r.label,mountPoint:i?.mount_point||r.label,kind:i?.kind||null,measured:!!i?.device_id,totalBytes:i?.total_bytes??null,freeBytes:i?.free_bytes??null,shelfBytes:i?.shelf_bytes??null,groups:[]},n.set(a,o)),o.groups.push(r)}let i=[...n.values()].sort((e,t)=>e.measured===t.measured?e.label.localeCompare(t.label,void 0,{numeric:!0,sensitivity:`base`}):e.measured?-1:1),a=[];for(let e of i)e.groups.forEach((t,n)=>{a.push({...t,band:e,bandStart:n===0})});for(let e of r)a.push({...e,band:null,bandStart:!1});return a}var z=50*1024**3;function B(e){let t=Number(e?.totalBytes),n=Number(e?.freeBytes);if(!Number.isFinite(t)||t<=0||!Number.isFinite(n)||n<0)return null;let r=Math.min(n,t),i=t-r,a=Math.max(0,Math.min(i,Number(e?.shelfBytes)||0));return{shelfPct:a/t*100,otherPct:(i-a)/t*100,freePct:r/t*100,usedPct:i/t*100,lowFree:r<z}}function Pe(e,t){let n=B(e);if(!n)return null;let r=Number(e.totalBytes),i=Math.min(Number(e.freeBytes),r),a=Math.max(0,Number(t)||0),o=Math.min(a,i),s=i-a;return{...n,addedPct:o/r*100,freePct:(i-o)/r*100,usedPct:(r-i+o)/r*100,lowFree:s<z,addedBytes:a,freeAfter:s,fits:a<=i}}function Fe(e){return(Array.isArray(e)?e:[]).filter(e=>e?.state===`present`).length}function Ie(e){let t=Array.isArray(e)?e:[];return t.length?t.some(e=>e?.state===`present`)?`present`:t.some(e=>e?.state===`unreachable`)?`unreachable`:t.every(e=>e?.state===`not_downloaded`)?`not_downloaded`:t.every(e=>e?.state===`removed`)?`removed`:`missing`:`forgotten`}var V={missing:`not where it was`,unreachable:`out of reach`,not_downloaded:`not downloaded yet`,removed:`removed as a duplicate`};function Le(e){let t=String(e||``);return Object.hasOwn(V,t)?V[t]:``}function Re(e){return(Array.isArray(e)?e:[]).map(e=>{let t=String(e?.folder_path||``),n=String(e?.relpath||``);if(!t||!n)return``;let r=t.includes(`\\`)&&!t.includes(`/`),i=r?`\\`:`/`,a=r?n.replace(/\//g,`\\`):n,o=`${t.replace(/[/\\]+$/,``)}${i}${a.replace(/^[/\\]+/,``)}`,s=Le(e?.state);return s?`${o} · ${s}`:o}).filter(Boolean).join(`
2
+ `)}function ze(e){let t=new Map;for(let n of Array.isArray(e)?e:[]){let e=new Set;for(let r of n?.locations||[]){let n=Number(r?.folder_id);if(!Number.isInteger(n))continue;let i=t.get(n);i||(i={folderId:n,path:String(r?.folder_path||``),count:0,offline:!0},t.set(n,i)),r?.state===`unreachable`?e.has(n)||(e.add(n),i.count+=1):i.offline=!1}}return[...t.values()].filter(e=>e.offline&&e.count).map(({folderId:e,path:t,count:n})=>({folderId:e,path:t,count:n})).sort((e,t)=>e.path.localeCompare(t.path,void 0,{numeric:!0,sensitivity:`base`}))}function Be(e,t=null){let n=[],r=new Map,i=0;for(let a of Array.isArray(e)?e:[])for(let e of a?.locations||[]){if(e?.state!==`present`)continue;let o=t?.get(Number(e.folder_id));if(o?.owner===`pixlstash`||o?.movable===`external`)continue;let s=Number(a.file_size)||0,c=Number(e.folder_id);n.push({folder_id:e.folder_id,relpath:e.relpath}),r.set(c,(r.get(c)||0)+s),i+=s}return{items:n,totalBytes:i,bytesByFolderId:r}}function Ve(e=typeof navigator<`u`?navigator:null){let t=e?.userAgentData?.platform||e?.userAgent||``;return/win/i.test(t)?`Recycle Bin`:`Trash`}function H(e){let t=e.map(e=>e.name);return t.length<=3?t.length===1?t[0]:`${t.slice(0,-1).join(`, `)} and ${t.at(-1)}`:`${t.slice(0,3).join(`, `)} and ${t.length-3} more`}function He(e,t){if(!e)return`PixlStash could not check which VAEs and text encoders these models use.`;let n=[],{in_use:r=[],orphaned:i=[],shared:a=[],unknown:o=[]}=e,s=(e,t,n)=>e.length===1?t:n;if(r.length&&n.push(`${H(r)} ${s(r,`is`,`are`)} still used by models you are keeping.`),i.length){n.push(`In the workflows PixlStash has read, ${H(i)} ran only with models you are deleting; ${s(i,`it stays`,`they stay`)} on disk.`);let t=e.unrecorded??0;t&&n.push(`${t===1?`1 other base model has`:`${t} other base models have`} no workflow on record and may still need ${s(i,`it`,`them`)}.`)}a.length&&n.push(`${H(a)} ${s(a,`is`,`are`)} still used by other models.`),o.length&&n.push(`Whether ${H(o)} ${s(o,`is`,`are`)} still needed is unknown: another file on the shelf has the same name.`);let c=e.no_evidence?.length??0;if(c){let e=t===1?`this model`:c===t?`these models`:`${c} of these models`;n.push(`No workflow PixlStash has read uses ${e}, so which support files ${c===1?`it needs`:`they need`} is unknown.`)}return n.join(` `)}function Ue(e,t=null){return(Array.isArray(e)?e:[]).filter(e=>(e?.members?.length?e.members:[e]).every(e=>e?.file_kind===`engine`?!1:(e?.locations||[]).every(e=>e?.state===`unreachable`?!1:!!t?.get(Number(e.folder_id))?.deletable)))}function We(e,t=null){let n=Array.isArray(e)?e:[];if(!n.length)return``;if(!t)return`The folder list has not loaded yet, so nothing can be deleted.`;let r=!1,i=!1,a=new Set,o=!1;for(let e of n)for(let n of e?.members?.length?e.members:[e]){n?.file_kind===`engine`&&(r=!0);for(let e of n?.locations||[]){if(e?.state===`unreachable`){i=!0;continue}let n=t.get(Number(e?.folder_id));n&&!n.deletable&&(a.add(String(n.path||``)),n.movable===`fixed`&&(o=!0))}}let s=[];if(a.size){let e=a.size===1?[...a][0]:`${a.size} folders PixlStash does not delete from`;s.push(`PixlStash does not delete from ${e}. It removes files from folders you registered, its own managed store and the folder it downloads engines into.`),o&&s.push(`Another tool owns that folder, so remove them with that.`)}return r&&s.push(`PixlStash downloaded some of these for itself and would fetch them again.`),i&&s.push(`Some sit on a drive that is not plugged in.`),s.join(` `)}function Ge(e){let t=Array.isArray(e)?e:[],n=new Map;for(let e of t){if(e?.stack_id==null)continue;let t=n.get(e.stack_id);t?t.push(e):n.set(e.stack_id,[e])}let r=new Set,i=[];for(let e of t){if(e?.stack_id==null){i.push(e);continue}if(r.has(e.stack_id))continue;r.add(e.stack_id);let t=[...n.get(e.stack_id)].sort((e,t)=>(e.stack_position??1/0)-(t.stack_position??1/0)||e.id-t.id),a=t[0];i.push({...a,members:t,memberIds:t.map(e=>e.id),memberCount:t.length,spansVersions:new Set(t.map(e=>Xe(W(e.filename)))).size>1})}return i}function Ke(e,t){let n=e=>`${e.toLocaleString()} ${e===1?`stack`:`stacks`}`;if(!e)return t?`Nothing was grouped. ${n(t)} could not be, and the files are unchanged.`:`Nothing to group.`;let r=t?` ${n(t)} could not be grouped; something changed them first.`:``;return`Grouped ${n(e)}.${r}`}function qe(e,t){let n=e=>`${e.toLocaleString()} ${e===1?`stack`:`stacks`}`;if(!e)return t?`Nothing was ungrouped. ${n(t)} could not be, and the files are unchanged.`:`Nothing to ungroup.`;let r=t?` ${n(t)} could not be ungrouped.`:``;return`Ungrouped ${n(e)}; the files are still on the shelf.${r}`}function Je(e,t,n){let r=e=>`${e.toLocaleString()} ${e===1?`file`:`files`}`,i=e=>`${e.toLocaleString()} ${e===1?`run`:`runs`}`;if(!e)return n?`Nothing was taken out. ${r(n)} could not be, and the runs are unchanged.`:`Nothing to take out.`;let a=t?` ${i(t)} had a single file left and stopped being a run.`:``,o=n?` ${r(n)} could not be taken out.`:``;return`Took ${r(e)} out; still on the shelf.${a}${o}`}function Ye(e){let t=O(e).split(/\s+/).filter(Boolean),n=t[t.length-1];if(!n||!D.test(n))return null;let r=n.replace(/\D/g,``);return r?Number(r):null}var U=/^v(\d+)(?:\.(\d+))?$/i;function W(e){let t=k(e).split(/\s+/).filter(Boolean),n=t[t.length-1];return n&&U.test(n)?n:null}function Xe(e){let t=U.exec(e||``);return t?`${Number(t[1])}.${Number(t[2]||0)}`:`1.0`}function G(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return t}function Ze(e){let t=String(e||``).split(/[\s_\-.]+/).filter(Boolean);return t.length?t.length===1?t[0].slice(0,2).toUpperCase():(t[0][0]+t[1][0]).toUpperCase():`?`}var Qe=55,$e=30;function K(e){let[t,n,r]=[1,3,5].map(t=>parseInt(e.slice(t,t+2),16)/255),i=Math.max(t,n,r),a=i-Math.min(t,n,r);if(!a)return 0;let o;return o=i===t?(n-r)/a%6:i===n?(r-t)/a+2:(t-n)/a+4,Math.round(o*60+360)%360}function et(e){return`hsl(${K(e)} ${Qe}% ${$e}%)`}function tt(){return`#ffffff`}function nt(e){let t=x[G(I(e))%x.length].value,n=oe(e);return{color:et(t),ink:tt(),initials:Ze(n.text)}}var rt=[`solid`,`dashed`,`thick`,`double`],q=new WeakMap;function J(e){if(!Array.isArray(e))return new Map;let t=q.get(e);return t||(t=new Map(e.map(e=>[String(e.id),e])),q.set(e,t)),t}var it={character:{list:`characters`,noun:`person`,colorKey:`character_color`},set:{list:`sets`,noun:`set`,colorKey:`set_color`,iconKey:`set_icon`}};function at(e,{characters:t=[],sets:n=[]}={}){let r={characters:J(t),sets:J(n)},i=(e??[]).map(e=>{let t=e.entity_type===`character`?`character`:`set`,n=it[t],i=r[n.list].get(String(e.entity_id)),a=i?.name||`#${e.entity_id}`;return{key:`${t}:${e.entity_id}`,type:t,id:e.entity_id,label:`${a} (${n.noun})`,icon:n.iconKey&&i?.[n.iconKey]&&i[n.iconKey]!==`cards`?i[n.iconKey]:``,iconHue:i?.[n.colorKey]||``,hue:i?.[n.colorKey]||x[G(`${t}:${e.entity_id}`)%x.length].value}});if(!i.length)return{style:`none`,hue:``,type:``,id:null,icon:``,iconHue:``,label:`Unassigned`,count:0};let[a]=i;return{style:rt[G(a.key)%rt.length],hue:a.hue,type:a.type,id:a.id,icon:a.icon,iconHue:a.iconHue,label:i.map(e=>e.label).join(`, `),count:i.length}}function Y(e){if(!e||e.square_crop_x==null||e.square_crop_y==null)return null;let t=Number(e.thumbnail_width),n=Number(e.thumbnail_height),r=Number(e.square_crop_x),i=Number(e.square_crop_y);if(!(t>0)||!(n>0)||!Number.isFinite(r)||!Number.isFinite(i))return null;let a=Number(e.square_crop_side);return a>0||(a=Math.min(t,n)),{tw:t,th:n,cx:r,cy:i,side:a}}function ot(e,t){if(!(t>0))return null;let{tw:n,th:r,cx:i,cy:a,side:o}=e,s=t>=1?o*t:o,c=s/t;return s>n&&(s=n,c=n/t),c>r&&(c=r,s=r*t),{x:Math.min(Math.max(i+o/2-s/2,0),n-s),y:Math.min(Math.max(a+o/2-c/2,0),r-c),w:s,h:c}}function X(e,t=1){let n=Y(e);if(!n)return null;let r=ot(n,t);if(!r)return null;let{tw:i,th:a}=n;return{width:`${i/r.w*100}%`,height:`${a/r.h*100}%`,left:`${-r.x/r.w*100}%`,top:`${-r.y/r.h*100}%`,aspectRatio:`auto`,objectFit:`cover`,objectPosition:`center`,borderRadius:`0`}}function st(e){return X(e,1)}function ct(e,t,n){let{cx:r,cy:i,side:a}=t,o=n/a;return{left:(e[0]-r)*o,top:(e[1]-i)*o,width:(e[2]-e[0])*o,height:(e[3]-e[1])*o}}function lt(e,t,n,r,i){let a=Math.max(r/t,i/n);return{left:(r-t*a)/2+e[0]*a,top:0+e[1]*a,width:(e[2]-e[0])*a,height:(e[3]-e[1])*a}}var ut={1:6/5,2:3/5,3:4/5};function dt(e){return ut[e]}function ft(e,t){return X(e,dt(t))}function pt(e,t,n,r){if(e.reduce((e,t)=>e+t,0)+n*Math.max(e.length-1,0)<=t)return e.length;let i=0,a=0;for(let o of e){if(i+=o+n,i+r>t)break;a+=1}return Math.min(Math.max(a,1),e.length)}function mt(e){return(e.variant_count??1)===0}function ht(e){return mt(e)&&!Z(e)}function gt(e){return(e.models??[]).some(e=>vt.includes(e.kind)&&!e.name)}function _t(e){return mt(e)&&!(e.loras??[]).length}var vt=[`checkpoint`,`unet`];function Z(e){return Q(e)[0]??null}function Q(e){let t=e.models??[];for(let e of vt){let n=t.filter(t=>t.kind===e&&t.name);if(n.length){let e=new Set;return n.filter(t=>!e.has(t.name)&&e.add(t.name))}}return[]}function $(e){return e?.title||e?.name||null}function yt(e,t=$){return[...new Set(e.map(t))].join(` + `)}var bt={txt2img:`T2I`,img2img:`I2I`};function xt(e,{short:t=!1}={}){return[e.hidden?`hidden`:null,e.manual?`Manual`:null,t&&bt[e.type]||e.type_label||e.type,e.imported&&!e.manual?`imported`:null,e.manual&&e.from_name?`from ${e.from_name}`:null].filter(Boolean).map((t,n)=>({key:`fact-${n}`,label:t,fact:!0,badge:!!e.manual&&t===`Manual`}))}function St(e){return e>0?`${e.toFixed(1)} of 5`:null}function Ct(e){let t=e.picture_count??0,n=Q(e),r=n[0],i=(e.loras??[]).map(e=>{let t=A(e.quant);return`${$(e)}, ${t?`${t.title}, `:``}workflow LoRA`}),a=xt(e).map(e=>e.label);return[e.name,r?[r.kind,[...new Set(n.map(e=>[$(e),A(e.quant)?.title].filter(Boolean).join(` `)))].join(` and `)].join(` `):null,ht(e)?`base model not read`:null,!r&&gt(e)?`checkpoint missing`:null,i.length?`LoRAs: ${i.join(`; `)}`:_t(e)?`LoRAs not read`:`no LoRAs`,a.length?`facts: ${a.join(`, `)}`:null,t===1?`1 picture`:`${t} pictures`,St(e.rating)?`rated ${St(e.rating)}`:null].filter(Boolean).join(`, `)}var wt={},Tt={class:`field-label`};function Et(e,t){return r(),u(`div`,Tt,[n(e.$slots,`default`,{},void 0,!0)])}var Dt=_(wt,[[`render`,Et],[`__scopeId`,`data-v-2c082f06`]]),Ot={class:`app-input`},kt=[`type`,`value`,`placeholder`,`disabled`,`readonly`,`autofocus`,`min`,`max`,`aria-label`,`aria-invalid`],At={key:1,class:`app-input__error`},jt=_({__name:`AppInput`,props:{modelValue:{type:[String,Number,null],default:``},label:{type:String,default:``},placeholder:{type:String,default:``},icon:{type:String,default:``},type:{type:String,default:`text`},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},mono:{type:Boolean,default:!1},error:{type:[String,Boolean],default:!1},ariaLabel:{type:String,default:``},min:{type:[String,Number],default:``},max:{type:[String,Number],default:``}},emits:[`update:modelValue`,`enter`,`blur`],setup(e,{expose:n,emit:i}){let c=e,d=i,f=m(null);return b(()=>{c.autofocus&&f.value?.focus()}),n({focus:()=>f.value?.focus(),select:()=>f.value?.select()}),(n,i)=>(r(),u(`label`,Ot,[e.label?(r(),t(Dt,{key:0},{default:o(()=>[a(y(e.label),1)]),_:1})):v(``,!0),l(`div`,{class:h([`app-input__wrap`,{"app-input__wrap--error":!!e.error,"app-input__wrap--mono":e.mono}])},[e.icon?(r(),t(g(s),{key:0,size:`18`,class:`app-input__icon`},{default:o(()=>[a(`mdi-`+y(e.icon),1)]),_:1})):v(``,!0),l(`input`,{ref_key:`inputRef`,ref:f,class:`app-input__field`,type:e.type,value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,readonly:e.readonly,autofocus:e.autofocus,min:e.min===``?void 0:e.min,max:e.max===``?void 0:e.max,"aria-label":e.ariaLabel||void 0,"aria-invalid":e.error?`true`:void 0,onInput:i[0]||=e=>d(`update:modelValue`,e.target.value),onBlur:i[1]||=e=>d(`blur`),onKeydown:i[2]||=p(e=>d(`enter`),[`enter`])},null,40,kt)],2),typeof e.error==`string`&&e.error?(r(),u(`span`,At,y(e.error),1)):v(``,!0)]))}},[[`__scopeId`,`data-v-612eb2fa`]]),Mt={class:`chip-row__label`},Nt={key:0,class:`chip-row__more`,"aria-hidden":`true`},Pt={class:`chip-row__label`},Ft={class:`chip-row__more`},It=_({__name:`ChipRow`,props:{items:{type:Array,default:()=>[]}},emits:[`overflow`],setup(n,{expose:p,emit:_}){let x=n,S=e=>[`chip-row__chip`,{"chip-row__chip--dashed":e.dashed,"chip-row__chip--fact":e.fact,"chip-row__chip--badge":e.badge}],C=_,w=m(null),T=m(null),E=m(x.items.length),D=ne(()=>Math.max(x.items.length-E.value,0));function O(){let e=w.value,t=T.value;if(!e||!t)return;let n=[...t.children],r=n.pop(),i=parseFloat(getComputedStyle(e).columnGap)||0;E.value=pt(n.map(e=>e.getBoundingClientRect().width),e.clientWidth,i,r.getBoundingClientRect().width)}f(D,e=>C(`overflow`,e)),f(()=>x.items,()=>i(O),{deep:!0});let k=null;return b(()=>{O(),k=new ResizeObserver(O),k.observe(w.value)}),c(()=>k?.disconnect()),p({measure:O}),(i,c)=>(r(),u(`div`,{ref_key:`rowEl`,ref:w,class:`chip-row`},[(r(!0),u(re,null,d(n.items,(n,i)=>e((r(),u(`span`,{key:n.key??i,class:h(S(n))},[n.title?(r(),t(te,{key:0,text:n.title,activator:`parent`},null,8,[`text`])):v(``,!0),n.icon?(r(),t(g(s),{key:1,size:`12`,class:`chip-row__icon`},{default:o(()=>[a(y(`mdi-${n.icon}`),1)]),_:2},1024)):v(``,!0),l(`span`,Mt,y(n.label),1)],2)),[[ee,i<E.value]])),128)),D.value>0?(r(),u(`span`,Nt,`+`+y(D.value),1)):v(``,!0),l(`div`,{ref_key:`measureEl`,ref:T,class:`chip-row__measure`,"aria-hidden":`true`},[(r(!0),u(re,null,d(n.items,(e,n)=>(r(),u(`span`,{key:e.key??n,class:h(S(e))},[e.icon?(r(),t(g(s),{key:0,size:`12`,class:`chip-row__icon`},{default:o(()=>[a(y(`mdi-${e.icon}`),1)]),_:2},1024)):v(``,!0),l(`span`,Pt,y(e.label),1)],2))),128)),l(`span`,Ft,`+`+y(n.items.length),1)],512)],512))}},[[`__scopeId`,`data-v-e36d8592`]]);export{Je as $,Te as A,Ue as B,N as C,R as D,Ne as E,He as F,Ie as G,ge as H,F as I,W as J,le as K,Re as L,be as M,he as N,Pe as O,Ge as P,A as Q,ce as R,Se as S,at as T,xe as U,k as V,nt as W,ze as X,Be as Y,Fe as Z,Y as _,Q as a,qe as at,pe as b,Z as c,xt as d,de as et,_t as f,st as g,ct as h,yt as i,We as it,I as j,B as k,ht as l,lt as m,jt as n,Ye as nt,Ct as o,Ce as ot,$ as p,oe as q,Dt as r,Ve as rt,gt as s,Me as st,It as t,Ke as tt,ft as u,Ee as v,ve as w,se as x,L as y,fe as z};
@@ -1 +1 @@
1
- .conf-pill[data-v-3c392313]{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);border-radius:var(--radius-pill);font-size:var(--text-xs);line-height:var(--leading-snug);font-weight:var(--weight-medium);white-space:nowrap;border:1px solid #0000;display:inline-flex}.conf-pill--exact[data-v-3c392313]{background:rgb(var(--v-theme-accent));color:rgb(var(--v-theme-on-accent))}.conf-pill--near[data-v-3c392313]{background:rgba(var(--v-theme-primary), .12);border-color:rgba(var(--v-theme-primary), .35);color:rgb(var(--v-theme-on-surface))}.conf-pill--near .conf-pill__ico[data-v-3c392313]{color:rgb(var(--v-theme-primary))}.conf-pill--unknown[data-v-3c392313]{border-color:rgb(var(--v-theme-border));color:rgba(var(--v-theme-on-surface), .8);background:0 0}.conf-pill__label[data-v-3c392313]{font-variant-numeric:tabular-nums}.conf-pill__ico[data-v-3c392313]{flex-shrink:0}.gstrip[data-v-bc69f033]{gap:var(--space-2);scrollbar-width:thin;scrollbar-gutter:stable;padding-top:var(--space-2);padding-bottom:var(--space-1);display:flex;overflow-x:auto}.gstrip--cursor[data-v-bc69f033]{padding-bottom:var(--space-3)}.gunit[data-v-bc69f033]{height:var(--gthumb-h);flex:none;display:flex;position:relative}.gunit--cursor[data-v-bc69f033]:after{content:"";left:0;right:0;bottom:calc(-1 * var(--space-2));height:var(--rail-w);border-radius:var(--radius-pill);background:var(--active-bar);position:absolute}.gthumb[data-v-bc69f033]{width:auto;min-width:44px;height:var(--gthumb-h);border-radius:var(--radius-md);background:rgba(var(--v-theme-on-surface), .06);border:1px solid #0000;flex:none;padding:0;position:relative;overflow:hidden}.gthumb--cover[data-v-bc69f033]{border-color:var(--active-bar)}.gthumb--marked[data-v-bc69f033]{border-color:rgb(var(--v-theme-surface-warning))}.gthumb--out .gt[data-v-bc69f033],.gthumb--locked .gt[data-v-bc69f033]{opacity:var(--opacity-disabled)}.gt[data-v-bc69f033]{width:auto;height:100%;max-width:var(--gthumb-max-w);object-fit:cover;transition:opacity var(--dur-1) var(--ease-standard);display:block}.gt--placeholder[data-v-bc69f033]{width:var(--gthumb-fallback-w);background:rgba(var(--v-theme-on-surface), .08)}.gtl[data-v-bc69f033],.gtr[data-v-bc69f033]{top:var(--space-2);gap:var(--space-1);pointer-events:none;flex-direction:column;display:flex;position:absolute}.gtl[data-v-bc69f033]{left:var(--space-2);align-items:flex-start}.gtr[data-v-bc69f033]{right:var(--space-2);z-index:var(--z-raised);align-items:flex-end}.gnum[data-v-bc69f033],.gcv[data-v-bc69f033]{font-size:var(--text-2xs);font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;border-radius:var(--radius-sm);padding:0 var(--space-2);background:var(--scrim-photo);color:rgb(var(--v-theme-on-dark-surface))}.gnum[data-v-bc69f033]{min-width:var(--badge-size);text-align:center}.gcv[data-v-bc69f033]{bottom:var(--space-2);left:var(--space-2);text-transform:uppercase;letter-spacing:var(--tracking-label);position:absolute}.gx[data-v-bc69f033]{color:rgb(var(--v-theme-on-dark-surface));position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.gthumb--locked[data-v-bc69f033]{cursor:not-allowed}.glock[data-v-bc69f033],.gmark[data-v-bc69f033]{border-radius:var(--radius-sm);background:var(--scrim-photo);width:18px;height:18px;color:rgb(var(--v-theme-on-dark-surface));pointer-events:none;justify-content:center;align-items:center;display:inline-flex}.gmark[data-v-bc69f033]{bottom:var(--space-2);left:var(--space-2);position:absolute}.glock--flash[data-v-bc69f033]{animation:g-lock-flash-bc69f033 var(--dur-2) var(--ease-standard)}@keyframes g-lock-flash-bc69f033{50%{background:color-mix(in srgb, rgb(var(--v-theme-warning)) 26%, transparent);color:rgb(var(--v-theme-dark-surface-warning))}}@media (prefers-reduced-motion:reduce){.glock--flash[data-v-bc69f033]{background:color-mix(in srgb, rgb(var(--v-theme-warning)) 26%, transparent);color:rgb(var(--v-theme-dark-surface-warning));animation:none}}.gsmart[data-v-bc69f033],.gstars[data-v-bc69f033-s]{opacity:0;transition:opacity var(--dur-1) var(--ease-standard);pointer-events:none}.gunit:hover .gsmart[data-v-bc69f033],.gunit:hover .gstars[data-v-bc69f033-s]{opacity:1}.gsmart[data-v-bc69f033]{bottom:var(--space-2);right:var(--space-2);align-items:center;gap:var(--space-1);padding:0 var(--space-2);border-radius:var(--radius-sm);background:var(--scrim-photo);color:rgb(var(--v-theme-on-dark-surface));font-size:var(--text-2xs);font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;display:inline-flex;position:absolute}.why-pills[data-v-e00fb7a7]{align-items:center;gap:var(--space-2);flex-wrap:wrap;max-width:100%;margin:0;padding:0;list-style:none;display:flex}.why-pill[data-v-e00fb7a7]{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);border-radius:var(--radius-pill);font-size:var(--text-xs);line-height:var(--leading-snug);color:rgb(var(--v-theme-on-surface));white-space:nowrap;box-sizing:border-box;border:1px solid #0000;min-width:0;max-width:100%;display:inline-flex}.why-pill--pos[data-v-e00fb7a7]{background:rgba(var(--v-theme-primary), .12);border-color:rgba(var(--v-theme-primary), .35)}.why-pill--pos .why-pill__ico[data-v-e00fb7a7]{color:rgb(var(--v-theme-primary))}.why-pill--neg[data-v-e00fb7a7]{background:rgba(var(--v-theme-error), .12);border-color:rgba(var(--v-theme-surface-error), .35)}.why-pill--neg .why-pill__ico[data-v-e00fb7a7]{color:rgb(var(--v-theme-surface-error))}.why-pill--fact[data-v-e00fb7a7]{border-color:rgb(var(--v-theme-border));background:0 0}.why-pill--fact .why-pill__ico[data-v-e00fb7a7]{color:rgba(var(--v-theme-on-surface), .6)}.why-pill__ico[data-v-e00fb7a7]{flex-shrink:0}.why-pill__label[data-v-e00fb7a7]{text-overflow:ellipsis;min-width:0;overflow:hidden}.sxstrip[data-v-67de73f4]{gap:var(--space-3);padding:var(--space-3);border-radius:var(--radius-md);border:1px solid rgb(var(--v-theme-divider));background:rgb(var(--v-theme-surface));flex-direction:column;display:flex}.sxhead[data-v-67de73f4]{align-items:center;gap:var(--space-3);flex-wrap:wrap;display:flex}.sxico[data-v-67de73f4]{color:rgb(var(--v-theme-on-surface));flex-shrink:0}.sxtitle[data-v-67de73f4]{font-size:var(--text-base);font-weight:var(--weight-semibold);line-height:var(--leading-snug);color:rgb(var(--v-theme-on-surface))}.sxmeta[data-v-67de73f4]{font-size:var(--text-xs);line-height:var(--leading-snug);color:rgba(var(--v-theme-on-surface), .6)}.sxrow[data-v-67de73f4]{align-items:center;gap:var(--space-3);scrollbar-width:thin;scrollbar-gutter:stable;padding-bottom:var(--space-1);display:flex;overflow-x:auto}.sxthumb[data-v-67de73f4]{width:auto;min-width:44px;height:var(--sx-thumb-h,96px);border-radius:var(--radius-md);background:rgba(var(--v-theme-on-surface), .06);border:1px solid #0000;flex:none;padding:0;position:relative;overflow:hidden}.sxthumb[data-v-67de73f4]:hover:not(:disabled){background:var(--hover-wash)}.sxthumb--cover[data-v-67de73f4]{border-color:var(--active-bar)}.sxrow>.bar-btn[data-v-67de73f4]{flex:none}.sxthumb[data-v-67de73f4]:disabled{cursor:default}.sxt[data-v-67de73f4]{width:auto;height:100%;max-width:var(--sx-thumb-max-w,230px);object-fit:cover;display:block}.sxcv[data-v-67de73f4]{bottom:var(--space-2);left:var(--space-2);padding:0 var(--space-2);border-radius:var(--radius-sm);background:var(--scrim-photo);color:rgb(var(--v-theme-on-dark-surface));font-size:var(--text-2xs);font-weight:var(--weight-semibold);line-height:var(--leading-snug);text-transform:uppercase;letter-spacing:var(--tracking-label);position:absolute}.grow[data-v-9c0c0df0]{align-items:center;gap:var(--space-3) var(--space-5);padding:var(--space-3) var(--space-4);padding-left:var(--space-5);border-radius:var(--radius-md);border:1px solid rgb(var(--v-theme-divider));background:rgb(var(--v-theme-surface));cursor:pointer;transition:background var(--dur-1) var(--ease-standard), border-color var(--dur-1) var(--ease-standard);grid-template-columns:minmax(150px,190px) minmax(0,1fr) auto;display:grid;position:relative;container:grow/inline-size}.grow[data-v-9c0c0df0]:hover{background:var(--hover-wash)}.grow--focus[data-v-9c0c0df0]{background:var(--active-wash);border-color:var(--active-bar)}.grow--focus[data-v-9c0c0df0]:before{content:"";border-radius:var(--radius-md) 0 0 var(--radius-md);background:var(--active-bar);width:3px;position:absolute;inset:0 auto 0 0}.grow--selected[data-v-9c0c0df0]{border-color:var(--active-bar);background:var(--active-wash)}.ginfo[data-v-9c0c0df0]{align-items:flex-start;gap:var(--space-2);flex-direction:column;min-width:0;display:flex}.gcaret[data-v-9c0c0df0]{color:var(--active-text);margin-left:calc(-1 * var(--space-2));flex-shrink:0;align-self:center}.gn[data-v-9c0c0df0]{align-items:baseline;gap:var(--space-3);min-width:0;display:flex}.gn-sep[data-v-9c0c0df0]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .35)}.gn b[data-v-9c0c0df0]{font-size:var(--text-base);font-weight:var(--weight-semibold);color:rgb(var(--v-theme-on-surface))}.gn span[data-v-9c0c0df0]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .6)}.gverdict[data-v-9c0c0df0]{align-items:center;gap:var(--space-2);height:var(--control-h);padding:0 var(--space-5);font-size:var(--text-sm);font-weight:var(--weight-medium);color:rgba(var(--v-theme-on-surface), .75);border:1px solid #0000;display:inline-flex}.gdecided-at[data-v-9c0c0df0]{padding:0 var(--space-5);font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .6);font-variant-numeric:tabular-nums;white-space:nowrap;border-inline:1px solid #0000}.gexp[data-v-9c0c0df0]{cursor:default;grid-column:1/-1;min-width:0}.gexp-state[data-v-9c0c0df0]{align-items:center;gap:var(--space-3);padding:var(--space-4);border:1px solid rgb(var(--v-theme-divider));border-radius:var(--radius-md);background:rgb(var(--v-theme-surface));font-size:var(--text-sm);color:rgba(var(--v-theme-on-surface), .7);display:flex}.gexp-state--error[data-v-9c0c0df0]{border-color:rgb(var(--v-theme-surface-warning));color:rgb(var(--v-theme-on-surface))}.gexp-state--error .v-icon[data-v-9c0c0df0]{color:rgb(var(--v-theme-surface-warning))}.gexp-flag[data-v-9c0c0df0]{align-items:center;gap:var(--space-3);padding:0 var(--space-1) var(--space-3);font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .75);display:flex}.gexp-flag .v-icon[data-v-9c0c0df0]{color:rgb(var(--v-theme-surface-warning));flex-shrink:0}.gact[data-v-9c0c0df0]{align-items:stretch;gap:var(--space-2);flex-direction:column;display:flex}.gact>button[data-v-9c0c0df0]{justify-content:flex-start}.gsl--mid[data-v-9c0c0df0],.gsl--short[data-v-9c0c0df0]{display:none}@container grow (width<=880px){.gsl--full[data-v-9c0c0df0]{display:none}.gsl--mid[data-v-9c0c0df0]{display:inline}}@container grow (width<=720px){.gsl--mid[data-v-9c0c0df0]{display:none}.gsl--short[data-v-9c0c0df0]{display:inline}}kbd[data-v-9c0c0df0]{font-family:var(--font-mono);font-size:var(--text-2xs);line-height:var(--leading-snug);padding:0 var(--space-2);border-radius:var(--radius-sm);opacity:.7;border:1px solid}.grow[data-v-3c47b90d]{align-items:center;gap:var(--space-3) var(--space-5);padding:var(--space-3) var(--space-4);padding-left:var(--space-5);border-radius:var(--radius-md);border:1px solid rgb(var(--v-theme-divider));background:rgb(var(--v-theme-surface));cursor:pointer;transition:background var(--dur-1) var(--ease-standard), border-color var(--dur-1) var(--ease-standard);grid-template-columns:minmax(150px,220px) minmax(0,1fr) auto;display:grid;position:relative;container:grow/inline-size}.grow[data-v-3c47b90d]:hover{background:var(--hover-wash)}.grow--focus[data-v-3c47b90d]{background:var(--active-wash);border-color:var(--active-bar)}.grow--focus[data-v-3c47b90d]:before{content:"";width:var(--rail-w);border-radius:var(--radius-md) 0 0 var(--radius-md);background:var(--active-bar);position:absolute;inset:0 auto 0 0}.grow--selected[data-v-3c47b90d]{border-color:var(--active-bar);background:var(--active-wash)}.grow--revealed[data-v-3c47b90d]:not(.grow--focus){background:var(--active-wash)}.ginfo[data-v-3c47b90d]{align-items:flex-start;gap:var(--space-2);flex-direction:column;min-width:0;display:flex}.gcaret[data-v-3c47b90d]{color:var(--active-text);margin-left:calc(-1 * var(--space-2));flex-shrink:0;align-self:center}.gn[data-v-3c47b90d]{align-items:baseline;gap:var(--space-3);min-width:0;display:flex}.gn-sep[data-v-3c47b90d]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .35)}.gn b[data-v-3c47b90d]{font-size:var(--text-base);font-weight:var(--weight-semibold);color:rgb(var(--v-theme-on-surface))}.gn span[data-v-3c47b90d]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .6)}.mqnote[data-v-3c47b90d]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .55)}.mqlock[data-v-3c47b90d]{align-self:flex-start;align-items:center;gap:var(--space-2);margin-left:calc(-1 * var(--space-2));padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);font-size:var(--text-2xs);font-weight:var(--weight-semibold);color:rgba(var(--v-theme-on-surface), .7);display:inline-flex}.mqlock .v-icon[data-v-3c47b90d]{color:inherit}.mqlock--flash[data-v-3c47b90d]{animation:mq-lock-flash-3c47b90d var(--dur-2) var(--ease-standard)}@keyframes mq-lock-flash-3c47b90d{50%{background:color-mix(in srgb, rgb(var(--v-theme-warning)) 26%, transparent)}}@media (prefers-reduced-motion:reduce){.mqlock--flash[data-v-3c47b90d]{background:color-mix(in srgb, rgb(var(--v-theme-warning)) 26%, transparent);animation:none}}.gact[data-v-3c47b90d]{align-items:stretch;gap:var(--space-2);flex-direction:column;display:flex}.gact>button[data-v-3c47b90d]{justify-content:flex-start}kbd[data-v-3c47b90d]{font-family:var(--font-mono);font-size:var(--text-2xs);line-height:var(--leading-snug);padding:0 var(--space-2);border-radius:var(--radius-sm);opacity:.7;border:1px solid}.dth[data-v-7f21b90f]{align-items:center;gap:var(--space-3);max-width:var(--stats-panel-w);padding:var(--space-2) var(--space-3);display:flex}.dth-label[data-v-7f21b90f]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .7);white-space:nowrap}.dth-input[data-v-7f21b90f]{min-width:0;accent-color:rgb(var(--v-theme-primary));flex:1}.dth-input[data-v-7f21b90f]:disabled{opacity:var(--opacity-disabled)}.dth-value[data-v-7f21b90f]{font-size:var(--text-xs);font-variant-numeric:tabular-nums;color:rgba(var(--v-theme-on-surface), .7)}.tiermenu[data-v-87bd865d]{gap:var(--space-2);min-width:300px;padding:var(--space-3);border-radius:var(--radius-lg);border:1px solid rgb(var(--v-theme-border));background:rgb(var(--v-theme-surface));color:rgb(var(--v-theme-on-surface));box-shadow:var(--elevation-3);flex-direction:column;display:flex}.tm-head[data-v-87bd865d]{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);display:flex}.tm-sp[data-v-87bd865d]{flex:1}.tm-count[data-v-87bd865d]{font-size:var(--text-xs);font-variant-numeric:tabular-nums;color:rgba(var(--v-theme-on-surface), .6)}.tierrow[data-v-87bd865d]{align-items:center;gap:var(--space-3);width:100%;padding:var(--space-3);border-radius:var(--radius-md);color:inherit;font-family:var(--font-ui);font-size:var(--text-base);text-align:left;cursor:pointer;transition:background var(--dur-1) var(--ease-standard);background:0 0;border:1px solid #0000;display:flex}.tierrow[data-v-87bd865d]:hover:not(:disabled):not(.tierrow--locked){background:var(--hover-wash)}.tierrow[data-v-87bd865d]:disabled{opacity:.38;cursor:default}.tierrow--on[data-v-87bd865d]{background:var(--active-wash)}.tierrow--locked[data-v-87bd865d]{cursor:default;background:var(--active-wash)}.cbox[data-v-87bd865d]{width:var(--space-5);height:var(--space-5);border-radius:var(--radius-sm);border:1px solid rgb(var(--v-theme-border));flex:none;justify-content:center;align-items:center;display:inline-flex}.cbox--on[data-v-87bd865d]{background:rgb(var(--v-theme-primary));border-color:rgb(var(--v-theme-primary));color:rgb(var(--v-theme-on-primary))}.tname[data-v-87bd865d]{align-items:baseline;gap:var(--space-2);flex-wrap:wrap;flex:1;min-width:0;display:flex}.trange[data-v-87bd865d],.tlock[data-v-87bd865d]{font-size:var(--text-2xs);color:rgba(var(--v-theme-on-surface), .55)}.tcount[data-v-87bd865d]{font-size:var(--text-xs);font-variant-numeric:tabular-nums;color:rgba(var(--v-theme-on-surface), .6)}.tierwarn[data-v-87bd865d]{align-items:flex-start;gap:var(--space-2);padding:var(--space-3);border-radius:var(--radius-md);background:rgba(var(--v-theme-warning), .12);border:1px solid rgba(var(--v-theme-surface-warning), .35);font-size:var(--text-xs);line-height:var(--leading-body);color:rgb(var(--v-theme-on-surface));margin:0;display:flex}.vmenu[data-v-917fc444]{gap:var(--space-2);min-width:300px;padding:var(--space-3);border-radius:var(--radius-lg);border:1px solid rgb(var(--v-theme-border));background:rgb(var(--v-theme-surface));color:rgb(var(--v-theme-on-surface));box-shadow:var(--elevation-3);flex-direction:column;display:flex}.vm-head[data-v-917fc444]{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);display:flex}.vm-sp[data-v-917fc444]{flex:1}.vm-count[data-v-917fc444]{font-size:var(--text-xs);font-variant-numeric:tabular-nums;color:rgba(var(--v-theme-on-surface), .6)}.vrow[data-v-917fc444]{align-items:center;gap:var(--space-3);width:100%;padding:var(--space-3);border-radius:var(--radius-md);color:inherit;font-family:var(--font-ui);font-size:var(--text-base);text-align:left;transition:background var(--dur-1) var(--ease-standard);border:1px solid #0000;display:flex}.vrow[data-v-917fc444]:hover:not(:disabled){background:var(--hover-wash)}.vrow[data-v-917fc444]:disabled{cursor:default}.vrow--on[data-v-917fc444]{background:var(--active-wash)}.cbox[data-v-917fc444]{width:var(--space-5);height:var(--space-5);border-radius:var(--radius-sm);border:1px solid rgb(var(--v-theme-border));flex:none;justify-content:center;align-items:center;display:inline-flex}.cbox--on[data-v-917fc444]{background:rgb(var(--v-theme-primary));border-color:rgb(var(--v-theme-primary));color:rgb(var(--v-theme-on-primary))}.vname[data-v-917fc444]{align-items:baseline;gap:var(--space-2);flex-wrap:wrap;flex:1;min-width:0;display:flex}.vhint[data-v-917fc444]{font-size:var(--text-2xs);color:rgba(var(--v-theme-on-surface), .55)}.vcount[data-v-917fc444]{font-size:var(--text-xs);font-variant-numeric:tabular-nums;color:rgba(var(--v-theme-on-surface), .6)}.vnote[data-v-917fc444]{padding:var(--space-2) var(--space-3);font-size:var(--text-2xs);line-height:var(--leading-body);color:rgba(var(--v-theme-on-surface), .55);margin:0}.scan-banner[data-v-a50ea666]{align-items:center;gap:var(--space-3);margin-inline:var(--space-5);padding:var(--space-3);border-radius:var(--radius-md);background:rgb(var(--v-theme-panel));color:rgb(var(--v-theme-on-panel));box-shadow:var(--elevation-1);grid-template-columns:auto 1fr auto;display:grid;position:relative;overflow:hidden}.scan-banner__ico[data-v-a50ea666]{color:rgb(var(--v-theme-on-panel));flex-shrink:0}.scan-banner--warning .scan-banner__ico[data-v-a50ea666],.scan-banner--warning .scan-banner__meta[data-v-a50ea666]{color:rgb(var(--v-theme-surface-warning))}.scan-banner__line[data-v-a50ea666]{min-width:0;font-size:var(--text-sm);line-height:var(--leading-snug);margin:0}.scan-banner__line b[data-v-a50ea666]{font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums}.scan-banner__meta[data-v-a50ea666]{font-size:var(--text-xs);line-height:var(--leading-snug);color:rgba(var(--v-theme-on-panel), .7);font-variant-numeric:tabular-nums;white-space:nowrap;justify-self:end}.scan-banner__track[data-v-a50ea666]{inset-inline:0;height:var(--countdown-h);background:rgba(var(--v-theme-on-panel), .14);position:absolute;bottom:0}.scan-banner__fill[data-v-a50ea666]{background:rgb(var(--v-theme-accent));height:100%;transition:width var(--dur-2) var(--ease-standard);display:block}.scope-pill[data-v-0f9c99d9]{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-2) var(--space-2) var(--space-3);border-radius:var(--radius-pill);background:var(--active-wash);border:1px solid var(--active-bar);font-size:var(--text-sm);line-height:var(--leading-snug);color:rgb(var(--v-theme-on-surface));max-width:100%;display:inline-flex;position:relative}.scope-pill__ico[data-v-0f9c99d9]{color:rgb(var(--v-theme-on-surface));flex-shrink:0}.scope-pill__label[data-v-0f9c99d9]{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.scope-pill__count[data-v-0f9c99d9]{font-size:var(--text-xs);font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;color:rgba(var(--v-theme-on-surface), .7);flex-shrink:0}.scope-pill__dismiss[data-v-0f9c99d9]{padding:var(--space-1);border-radius:var(--radius-pill);color:rgb(var(--v-theme-on-surface));flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.scope-pill__dismiss[data-v-0f9c99d9]:hover{background:var(--hover-wash)}@container toolbar (width<=820px){.scope-pill__label[data-v-0f9c99d9],.scope-pill__count[data-v-0f9c99d9]{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}}.dc-confidence[data-v-af7b7f79]{font-size:var(--text-sm);font-weight:var(--weight-medium);color:rgba(var(--v-theme-on-surface), .7)}.dc-strip[data-v-af7b7f79]{align-items:stretch;gap:var(--space-4);scrollbar-gutter:stable;min-height:0;padding-bottom:var(--space-3);scrollbar-width:thin;scrollbar-color:rgba(var(--v-theme-on-surface), .4) transparent;flex:1;display:flex;overflow-x:auto}.dc-card[data-v-af7b7f79]{border:1px solid rgb(var(--v-theme-border));border-radius:var(--radius-md);background:rgb(var(--v-theme-surface));max-width:640px;box-shadow:var(--elevation-1);flex-direction:column;flex:1 0 300px;display:flex;position:relative;overflow:hidden}.dc-card--out[data-v-af7b7f79]{border-style:dashed;border-color:rgba(var(--v-theme-on-surface), .35)}.dc-card--split[data-v-af7b7f79]{border-color:rgb(var(--v-theme-surface-warning))}.dc-pick[data-v-af7b7f79]{text-align:left;width:100%;min-height:0;color:inherit;font:inherit;transition:background var(--dur-1) var(--ease-standard);flex-direction:column;flex:1;padding:0;display:flex}.dc-pick[data-v-af7b7f79]:hover{background:var(--hover-wash)}.dc-pick[aria-pressed=true][data-v-af7b7f79]{background:var(--active-wash)}.dc-thumb[data-v-af7b7f79]{background:rgba(var(--v-theme-on-surface), .06);flex:1;min-height:220px;display:block;position:relative}.dc-thumb-img[data-v-af7b7f79]{object-fit:contain;width:100%;height:100%;display:block;position:absolute;inset:0}.dc-index[data-v-af7b7f79]{top:var(--space-2);left:var(--space-2);min-width:var(--badge-size);height:var(--badge-size);padding:0 var(--space-2);border-radius:var(--radius-pill);background:rgb(var(--v-theme-primary));color:rgb(var(--v-theme-on-primary));font-size:var(--text-2xs);font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;justify-content:center;align-items:center;display:inline-flex;position:absolute}.dc-flag[data-v-af7b7f79]{top:var(--space-2);right:var(--space-2);padding:var(--space-1) var(--space-2);border-radius:var(--radius-pill);background:var(--scrim-photo);color:rgb(var(--v-theme-on-dark-surface));font-size:var(--text-2xs);font-weight:var(--weight-semibold);position:absolute}.dc-flag--out[data-v-af7b7f79],.dc-flag--split[data-v-af7b7f79]{top:auto;bottom:var(--space-2)}.dc-flag--leader[data-v-af7b7f79]{top:auto;right:auto;bottom:var(--space-2);left:var(--space-2)}.dc-zoom[data-v-af7b7f79]{top:calc(var(--space-2) + var(--badge-size) + var(--space-2));left:var(--space-2);z-index:var(--z-raised);border-radius:var(--radius-sm);background:var(--scrim-photo);width:26px;height:26px;color:rgb(var(--v-theme-on-dark-surface));justify-content:center;align-items:center;display:inline-flex;position:absolute}.dc-zoom[data-v-af7b7f79]:hover{background:rgba(var(--v-theme-on-dark-surface), .16)}.dc-zoom[data-v-af7b7f79]:focus-visible{outline-color:rgb(var(--v-theme-on-dark-surface))}.dc-meta[data-v-af7b7f79]{gap:var(--space-2) var(--space-3);padding:var(--space-3) var(--space-4);grid-template-columns:1fr 1fr;align-content:start;display:grid}.dc-cell[data-v-af7b7f79]{flex-direction:column;min-width:0;display:flex}.dc-cell--wide[data-v-af7b7f79]{grid-column:1/-1}.dc-label[data-v-af7b7f79]{font-size:var(--text-2xs);letter-spacing:var(--tracking-label);text-transform:uppercase;color:rgba(var(--v-theme-on-surface), .6)}.dc-val[data-v-af7b7f79]{font-size:var(--text-sm);color:rgb(var(--v-theme-on-surface));font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap;border-block:1px solid #0000;overflow:hidden}.dc-val--best[data-v-af7b7f79]{font-weight:var(--weight-semibold);background:rgba(var(--v-theme-primary), .18);border:1px solid rgba(var(--v-theme-primary), .5);border-radius:var(--radius-sm);padding:0 var(--space-2);align-self:flex-start;max-width:100%}.dc-val--gap[data-v-af7b7f79]{font-weight:var(--weight-semibold);background:rgba(var(--v-theme-warning), .12);border:1px solid rgba(var(--v-theme-surface-warning), .35);border-radius:var(--radius-sm);padding:0 var(--space-2);align-self:flex-start;max-width:100%}.dc-star[data-v-af7b7f79]{color:rgb(var(--v-theme-accent))}.dc-path[data-v-af7b7f79]{font-family:var(--font-mono);font-size:var(--text-xs)}.dc-path-icon[data-v-af7b7f79]{color:rgba(var(--v-theme-on-surface), .6)}.dc-instack[data-v-af7b7f79]{align-items:center;gap:var(--space-2);display:inline-flex}.dc-toggle[data-v-af7b7f79]{padding:var(--space-1);border-radius:var(--radius-sm);color:rgba(var(--v-theme-on-surface), .7);transition:background var(--dur-1) var(--ease-standard), color var(--dur-1) var(--ease-standard);justify-content:center;align-items:center;display:inline-flex}.dc-toggle[data-v-af7b7f79]:hover{background:var(--hover-wash);color:rgb(var(--v-theme-on-surface))}.dc-expand[data-v-af7b7f79]{align-items:center;gap:var(--space-1);max-width:100%;color:inherit;font:inherit;font-variant-numeric:tabular-nums;text-align:left;border-radius:var(--radius-sm);padding:0;display:inline-flex}.dc-expand[data-v-af7b7f79]:hover{background:var(--hover-wash)}.dc-expansion[data-v-af7b7f79]{flex-shrink:0}.dc-expansion-state[data-v-af7b7f79]{align-items:center;gap:var(--space-3);padding:var(--space-4);border:1px solid rgb(var(--v-theme-divider));border-radius:var(--radius-md);background:rgb(var(--v-theme-surface));font-size:var(--text-sm);color:rgba(var(--v-theme-on-surface), .7);display:flex}.dc-mixed-error[data-v-af7b7f79]{flex-shrink:0}.dc-expansion-state--error[data-v-af7b7f79]{border-color:rgb(var(--v-theme-surface-warning));color:rgb(var(--v-theme-on-surface))}.dc-expansion-state--error .v-icon[data-v-af7b7f79]{color:rgb(var(--v-theme-surface-warning))}.dc-promote[data-v-af7b7f79]{align-items:center;gap:var(--space-3);margin-top:var(--space-3);padding:var(--space-3);border:1px solid rgb(var(--v-theme-border));border-radius:var(--radius-md);background:rgb(var(--v-theme-surface));display:flex}.dc-promote-icon[data-v-af7b7f79]{color:rgba(var(--v-theme-on-surface), .6);flex-shrink:0}.dc-promote-text[data-v-af7b7f79]{min-width:0;font-size:var(--text-sm);line-height:var(--leading-snug);color:rgb(var(--v-theme-on-surface));flex:1}.dc-why[data-v-af7b7f79]{flex-shrink:0}.dc-hint[data-v-af7b7f79]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .6);margin-right:auto}.dc-zv[data-v-af7b7f79]{z-index:calc(var(--z-modal) + 100);background:#0a0a0a;flex-direction:column;display:flex;position:fixed;inset:0}.dc-zv-top[data-v-af7b7f79]{align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-4);flex-shrink:0;display:flex}.dc-zv-flip[data-v-af7b7f79]{gap:var(--space-1);display:flex}.dc-zv-flip button[data-v-af7b7f79]{border-radius:var(--radius-sm);color:#fff;min-width:30px;height:30px;font-family:var(--font-ui);font-size:var(--text-xs);font-variant-numeric:tabular-nums;cursor:pointer;background:0 0;border:1px solid #ffffff3d}.dc-zv-flip button[data-v-af7b7f79]:hover{background:rgba(var(--v-theme-on-dark-surface), .16)}.dc-zv .dc-zv-on[data-v-af7b7f79]{background:rgba(var(--v-theme-dark-surface-primary), .2);border-color:rgb(var(--v-theme-dark-surface-primary));color:#fff;font-weight:var(--weight-semibold)}.dc-zv[data-v-af7b7f79] :focus-visible{outline-color:rgb(var(--v-theme-on-dark-surface))}.dc-flag--zv[data-v-af7b7f79]{position:static}.dc-zv-meta[data-v-af7b7f79]{font-size:var(--text-xs);color:#ffffffb8;font-variant-numeric:tabular-nums;white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.dc-zv-mode[data-v-af7b7f79]{--v-theme-on-surface:var(--v-theme-on-dark-surface);--hover-wash:rgba(var(--v-theme-on-dark-surface), .16);--track-trough:rgba(var(--v-theme-scrim), .34);--track-ring:rgba(var(--v-theme-on-dark-surface), .4);--focus-stroke:rgb(var(--v-theme-on-dark-surface));--v-theme-primary:var(--v-theme-dark-surface-primary);--v-theme-on-primary:var(--v-theme-dark-surface);flex-shrink:0}.dc-zv-pct[data-v-af7b7f79]{text-align:right;min-width:5ch;font-size:var(--text-xs);font-variant-numeric:tabular-nums;color:#ffffffb8}.dc-zv-close[data-v-af7b7f79]{border-radius:var(--radius-sm);color:#ffffffb8;flex-shrink:0;justify-content:center;align-items:center;width:30px;height:30px;display:inline-flex}.dc-zv-close[data-v-af7b7f79]:hover{background:rgba(var(--v-theme-on-dark-surface), .16);color:#fff}.dc-zv-img[data-v-af7b7f79]{flex:1;min-height:0;display:flex;overflow:hidden}.dc-zv-img--pannable[data-v-af7b7f79]{cursor:grab}.dc-zv-img img[data-v-af7b7f79]{object-fit:contain;flex-shrink:0;width:auto;max-width:100%;height:100%;margin:auto;display:block}.dc-zv-foot[data-v-af7b7f79]{justify-content:center;align-items:center;gap:var(--space-5);padding:var(--space-3);font-size:var(--text-xs);color:#fff9;flex-shrink:0;display:flex}.dc-zv-foot kbd[data-v-af7b7f79]{padding:0 var(--space-2);border-radius:var(--radius-sm);color:#fff;font-family:var(--font-mono);font-size:var(--text-2xs);background:#ffffff24}.as-lede[data-v-d0706c6b]{font-size:var(--text-base);line-height:var(--leading-body);color:rgba(var(--v-theme-on-surface), .8);margin:0}.as-failed[data-v-d0706c6b]{align-items:flex-start;gap:var(--space-2);padding:var(--space-3);border-radius:var(--radius-md);background:rgba(var(--v-theme-warning), .12);border:1px solid rgba(var(--v-theme-surface-warning), .35);font-size:var(--text-xs);line-height:var(--leading-body);color:rgb(var(--v-theme-on-surface));margin:0;display:flex}.as-rows[data-v-d0706c6b]{flex-direction:column;margin:0;padding:0;display:flex}.as-row[data-v-d0706c6b]{align-items:baseline;gap:var(--space-4);padding:var(--space-3) 0;border-bottom:1px solid rgb(var(--v-theme-divider));grid-template-columns:1fr auto;display:grid}.as-row[data-v-d0706c6b]:last-child{border-bottom:none}.as-term[data-v-d0706c6b]{align-items:center;gap:var(--space-2);font-size:var(--text-sm);color:rgba(var(--v-theme-on-surface), .8);display:flex}.as-icon[data-v-d0706c6b]{color:rgba(var(--v-theme-on-surface), .6);flex-shrink:0}.as-value[data-v-d0706c6b]{font-size:var(--text-md);font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;color:rgb(var(--v-theme-on-surface));margin:0}.as-reversible[data-v-d0706c6b]{align-items:center;gap:var(--space-2);font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .6);margin:0;display:flex}.as-reversible kbd[data-v-d0706c6b]{font-family:var(--font-mono);font-size:var(--text-2xs);padding:var(--space-1) var(--space-2);border:1px solid rgba(var(--v-theme-on-surface), .3);border-radius:var(--radius-sm);background:rgba(var(--v-theme-on-surface), .08)}.dq[data-v-8d173505]{background:rgb(var(--v-theme-background));height:100%;min-height:0;color:rgb(var(--v-theme-on-background));outline:none;flex-direction:column;display:flex;position:relative}.dq-toolbar[data-v-8d173505]{align-items:center;gap:var(--space-3);box-sizing:border-box;height:36px;padding:0 var(--space-3) 0 var(--space-5);background:rgb(var(--v-theme-toolbar));color:rgb(var(--v-theme-toolbar-text));border-bottom:1px solid rgb(var(--v-theme-divider));display:flex;container:dqbar toolbar/inline-size}.dq-tb-left[data-v-8d173505],.dq-tb-right[data-v-8d173505]{align-items:center;gap:var(--space-3);display:flex}.dq-tb-left[data-v-8d173505]{flex:0 auto;min-width:0}.dq-tb-right[data-v-8d173505]{flex:none;margin-left:auto}.dq-tb-sep[data-v-8d173505]{background:rgb(var(--v-theme-divider));flex-shrink:0;width:1px;height:18px}.dq-size[data-v-8d173505]{align-items:center;gap:var(--space-3);display:flex}.dq-size-slider[data-v-8d173505]{flex:0 0 96px;width:96px}.dq-size-slider[data-v-8d173505] .v-input__control{height:20px;min-height:0}.dq-size-value[data-v-8d173505]{width:11ch;font-size:var(--text-xs);color:rgba(var(--v-theme-toolbar-text), .7);white-space:nowrap}.dq-tier-wrap[data-v-8d173505]{min-width:0;display:flex;position:relative}.dq-tier-label[data-v-8d173505]{text-overflow:ellipsis;min-width:0;overflow:hidden}.dq-tier-menu[data-v-8d173505]{top:calc(100% + var(--space-2));z-index:var(--z-dropdown);position:absolute;left:0}.dq-bar-action[data-v-8d173505]{min-width:0}.dq-bar-action[data-v-8d173505] .app-btn__label{align-items:center;gap:var(--space-2);min-width:0;display:flex}.dq-bar-action .v-icon[data-v-8d173505]{flex-shrink:0}.dq-bar-action.dq-bar-action--on[data-v-8d173505]{background:var(--active-wash);border-color:var(--active-bar);color:var(--active-text)}.dq-bar-action.dq-bar-action--on[data-v-8d173505]:not(:disabled):not([aria-disabled=true]):hover{background:linear-gradient(var(--hover-wash), var(--hover-wash)) var(--active-wash)}.queue[data-v-8d173505]{flex-direction:column;flex:1;min-height:0;display:flex}.qtitle[data-v-8d173505]{font-size:var(--text-md);font-weight:var(--weight-semibold);white-space:nowrap;text-overflow:ellipsis;flex-shrink:6;min-width:0;overflow:hidden}.qsub[data-v-8d173505]{font-size:var(--text-xs);color:rgba(var(--v-theme-toolbar-text), .6);white-space:nowrap}.dq-toggle-label[data-v-8d173505]{text-overflow:ellipsis;min-width:0;overflow:hidden}.qmixed-count[data-v-8d173505]{min-width:var(--badge-size);min-height:var(--badge-size);padding:0 var(--space-2);border-radius:var(--radius-pill);background:rgba(var(--v-theme-on-surface), .1);font-size:var(--text-2xs);font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;flex-shrink:0;align-items:center;display:inline-flex}.qselbar[data-v-8d173505]{padding:var(--space-2) var(--space-5) 0;align-items:center;display:flex}.qselchip[data-v-8d173505]{align-items:center;gap:var(--space-2);padding:var(--space-1) var(--space-3);border:1px solid var(--active-bar);border-radius:var(--radius-pill);background:var(--active-wash);font-size:var(--text-xs);color:rgb(var(--v-theme-on-surface));display:inline-flex}.qselclear[data-v-8d173505]{font:inherit;font-weight:var(--weight-semibold);color:var(--active-text);border-radius:var(--radius-sm);padding:0;text-decoration:underline}.qlist[data-v-8d173505]{gap:var(--space-3);padding:0 var(--space-5) var(--space-4);scrollbar-gutter:stable;flex-direction:column;flex:1;min-height:0;display:flex;overflow-y:auto}.qspacer[data-v-8d173505]{flex:none}.qmore[data-v-8d173505]{align-self:center;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-4);border-radius:var(--radius-pill);background:rgb(var(--v-theme-surface));border:1px solid rgb(var(--v-theme-divider));box-shadow:var(--elevation-1);font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .75);display:inline-flex;position:sticky;bottom:0}.dq-state[data-v-8d173505]{padding:var(--space-6) var(--space-5);font-size:var(--text-sm);color:rgba(var(--v-theme-on-background), .6)}.mixed[data-v-8d173505]{flex-direction:column;flex:1;min-height:0;display:flex}.mixed-list[data-v-8d173505]{min-height:0;padding:0 var(--space-5) var(--space-4);scrollbar-gutter:stable;flex-direction:column;flex:1;display:flex;overflow-y:auto}.mixed-head[data-v-8d173505]{z-index:var(--z-sticky);align-items:center;gap:var(--space-5);padding:var(--space-4) 0 var(--space-3);background:rgb(var(--v-theme-background));border-bottom:1px solid rgb(var(--v-theme-divider));flex-wrap:wrap;display:flex;position:sticky;top:0}.mixed-lede[data-v-8d173505]{min-width:0;max-width:78ch;font-size:var(--text-sm);line-height:var(--leading-body);color:rgba(var(--v-theme-on-background), .7);flex:1;margin:0}.mixed-lede b[data-v-8d173505]{font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;color:rgb(var(--v-theme-on-background))}.mixed-threshold[data-v-8d173505]{flex:0 1 var(--stats-panel-w)}.mlist[data-v-8d173505]{gap:var(--space-3);padding-top:var(--space-3);flex-direction:column;display:flex;container:mixedlist/inline-size}.mixed-more[data-v-8d173505]{margin-top:var(--space-4);align-self:center}.qdone[data-v-8d173505]{justify-content:center;align-items:center;gap:var(--space-3);padding:var(--space-9) var(--space-6);text-align:center;color:rgba(var(--v-theme-on-background), .75);flex-direction:column;flex:1;display:flex}.qdone h3[data-v-8d173505]{font-size:var(--text-lg);font-weight:var(--weight-semibold);color:rgb(var(--v-theme-on-background));margin:0}.qdone p[data-v-8d173505]{max-width:52ch;font-size:var(--text-sm);line-height:var(--leading-body);margin:0}.qdone .qdone-hint[data-v-8d173505]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-background), .6)}.visually-hidden[data-v-8d173505]{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.dq-auto-short[data-v-8d173505],.dq-auto-count[data-v-8d173505],.dq-overflow[data-v-8d173505]{display:none}.dq-auto-full[data-v-8d173505]{text-overflow:ellipsis;min-width:0;overflow:hidden}@container dqbar (width<=1384px){.qsub[data-v-8d173505],.dq-size-value[data-v-8d173505]{display:none}}@container dqbar (width<=1178px){.dq-auto-full[data-v-8d173505]{display:none}.dq-auto-short[data-v-8d173505]{display:inline}}@container dqbar (width<=1087px){.dq-tier-label[data-v-8d173505]{display:none}}@container dqbar (width<=950px){.dq-auto-short[data-v-8d173505]{display:none}.dq-auto-count[data-v-8d173505]{display:inline}}@container dqbar (width<=882px){.dq-fold-906[data-v-8d173505]{display:none}.dq-overflow[data-v-8d173505]{display:flex}.dq-toggle-label[data-v-8d173505]{display:none}}@container toolbar (width<=420px){.dq-tb-left[data-v-8d173505],.dq-tb-right[data-v-8d173505]{gap:var(--space-2)}}
1
+ .conf-pill[data-v-3c392313]{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);border-radius:var(--radius-pill);font-size:var(--text-xs);line-height:var(--leading-snug);font-weight:var(--weight-medium);white-space:nowrap;border:1px solid #0000;display:inline-flex}.conf-pill--exact[data-v-3c392313]{background:rgb(var(--v-theme-accent));color:rgb(var(--v-theme-on-accent))}.conf-pill--near[data-v-3c392313]{background:rgba(var(--v-theme-primary), .12);border-color:rgba(var(--v-theme-primary), .35);color:rgb(var(--v-theme-on-surface))}.conf-pill--near .conf-pill__ico[data-v-3c392313]{color:rgb(var(--v-theme-primary))}.conf-pill--unknown[data-v-3c392313]{border-color:rgb(var(--v-theme-border));color:rgba(var(--v-theme-on-surface), .8);background:0 0}.conf-pill__label[data-v-3c392313]{font-variant-numeric:tabular-nums}.conf-pill__ico[data-v-3c392313]{flex-shrink:0}.gstrip[data-v-bc69f033]{gap:var(--space-2);scrollbar-width:thin;scrollbar-gutter:stable;padding-top:var(--space-2);padding-bottom:var(--space-1);display:flex;overflow-x:auto}.gstrip--cursor[data-v-bc69f033]{padding-bottom:var(--space-3)}.gunit[data-v-bc69f033]{height:var(--gthumb-h);flex:none;display:flex;position:relative}.gunit--cursor[data-v-bc69f033]:after{content:"";left:0;right:0;bottom:calc(-1 * var(--space-2));height:var(--rail-w);border-radius:var(--radius-pill);background:var(--active-bar);position:absolute}.gthumb[data-v-bc69f033]{width:auto;min-width:44px;height:var(--gthumb-h);border-radius:var(--radius-md);background:rgba(var(--v-theme-on-surface), .06);border:1px solid #0000;flex:none;padding:0;position:relative;overflow:hidden}.gthumb--cover[data-v-bc69f033]{border-color:var(--active-bar)}.gthumb--marked[data-v-bc69f033]{border-color:rgb(var(--v-theme-surface-warning))}.gthumb--out .gt[data-v-bc69f033],.gthumb--locked .gt[data-v-bc69f033]{opacity:var(--opacity-disabled)}.gt[data-v-bc69f033]{width:auto;height:100%;max-width:var(--gthumb-max-w);object-fit:cover;transition:opacity var(--dur-1) var(--ease-standard);display:block}.gt--placeholder[data-v-bc69f033]{width:var(--gthumb-fallback-w);background:rgba(var(--v-theme-on-surface), .08)}.gtl[data-v-bc69f033],.gtr[data-v-bc69f033]{top:var(--space-2);gap:var(--space-1);pointer-events:none;flex-direction:column;display:flex;position:absolute}.gtl[data-v-bc69f033]{left:var(--space-2);align-items:flex-start}.gtr[data-v-bc69f033]{right:var(--space-2);z-index:var(--z-raised);align-items:flex-end}.gnum[data-v-bc69f033],.gcv[data-v-bc69f033]{font-size:var(--text-2xs);font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;border-radius:var(--radius-sm);padding:0 var(--space-2);background:var(--scrim-photo);color:rgb(var(--v-theme-on-dark-surface))}.gnum[data-v-bc69f033]{min-width:var(--badge-size);text-align:center}.gcv[data-v-bc69f033]{bottom:var(--space-2);left:var(--space-2);text-transform:uppercase;letter-spacing:var(--tracking-label);position:absolute}.gx[data-v-bc69f033]{color:rgb(var(--v-theme-on-dark-surface));position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.gthumb--locked[data-v-bc69f033]{cursor:not-allowed}.glock[data-v-bc69f033],.gmark[data-v-bc69f033]{border-radius:var(--radius-sm);background:var(--scrim-photo);width:18px;height:18px;color:rgb(var(--v-theme-on-dark-surface));pointer-events:none;justify-content:center;align-items:center;display:inline-flex}.gmark[data-v-bc69f033]{bottom:var(--space-2);left:var(--space-2);position:absolute}.glock--flash[data-v-bc69f033]{animation:g-lock-flash-bc69f033 var(--dur-2) var(--ease-standard)}@keyframes g-lock-flash-bc69f033{50%{background:color-mix(in srgb, rgb(var(--v-theme-warning)) 26%, transparent);color:rgb(var(--v-theme-dark-surface-warning))}}@media (prefers-reduced-motion:reduce){.glock--flash[data-v-bc69f033]{background:color-mix(in srgb, rgb(var(--v-theme-warning)) 26%, transparent);color:rgb(var(--v-theme-dark-surface-warning));animation:none}}.gsmart[data-v-bc69f033],.gstars[data-v-bc69f033-s]{opacity:0;transition:opacity var(--dur-1) var(--ease-standard);pointer-events:none}.gunit:hover .gsmart[data-v-bc69f033],.gunit:hover .gstars[data-v-bc69f033-s]{opacity:1}.gsmart[data-v-bc69f033]{bottom:var(--space-2);right:var(--space-2);align-items:center;gap:var(--space-1);padding:0 var(--space-2);border-radius:var(--radius-sm);background:var(--scrim-photo);color:rgb(var(--v-theme-on-dark-surface));font-size:var(--text-2xs);font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;display:inline-flex;position:absolute}.why-pills[data-v-e00fb7a7]{align-items:center;gap:var(--space-2);flex-wrap:wrap;max-width:100%;margin:0;padding:0;list-style:none;display:flex}.why-pill[data-v-e00fb7a7]{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);border-radius:var(--radius-pill);font-size:var(--text-xs);line-height:var(--leading-snug);color:rgb(var(--v-theme-on-surface));white-space:nowrap;box-sizing:border-box;border:1px solid #0000;min-width:0;max-width:100%;display:inline-flex}.why-pill--pos[data-v-e00fb7a7]{background:rgba(var(--v-theme-primary), .12);border-color:rgba(var(--v-theme-primary), .35)}.why-pill--pos .why-pill__ico[data-v-e00fb7a7]{color:rgb(var(--v-theme-primary))}.why-pill--neg[data-v-e00fb7a7]{background:rgba(var(--v-theme-error), .12);border-color:rgba(var(--v-theme-surface-error), .35)}.why-pill--neg .why-pill__ico[data-v-e00fb7a7]{color:rgb(var(--v-theme-surface-error))}.why-pill--fact[data-v-e00fb7a7]{border-color:rgb(var(--v-theme-border));background:0 0}.why-pill--fact .why-pill__ico[data-v-e00fb7a7]{color:rgba(var(--v-theme-on-surface), .6)}.why-pill__ico[data-v-e00fb7a7]{flex-shrink:0}.why-pill__label[data-v-e00fb7a7]{text-overflow:ellipsis;min-width:0;overflow:hidden}.sxstrip[data-v-67de73f4]{gap:var(--space-3);padding:var(--space-3);border-radius:var(--radius-md);border:1px solid rgb(var(--v-theme-divider));background:rgb(var(--v-theme-surface));flex-direction:column;display:flex}.sxhead[data-v-67de73f4]{align-items:center;gap:var(--space-3);flex-wrap:wrap;display:flex}.sxico[data-v-67de73f4]{color:rgb(var(--v-theme-on-surface));flex-shrink:0}.sxtitle[data-v-67de73f4]{font-size:var(--text-base);font-weight:var(--weight-semibold);line-height:var(--leading-snug);color:rgb(var(--v-theme-on-surface))}.sxmeta[data-v-67de73f4]{font-size:var(--text-xs);line-height:var(--leading-snug);color:rgba(var(--v-theme-on-surface), .6)}.sxrow[data-v-67de73f4]{align-items:center;gap:var(--space-3);scrollbar-width:thin;scrollbar-gutter:stable;padding-bottom:var(--space-1);display:flex;overflow-x:auto}.sxthumb[data-v-67de73f4]{width:auto;min-width:44px;height:var(--sx-thumb-h,96px);border-radius:var(--radius-md);background:rgba(var(--v-theme-on-surface), .06);border:1px solid #0000;flex:none;padding:0;position:relative;overflow:hidden}.sxthumb[data-v-67de73f4]:hover:not(:disabled){background:var(--hover-wash)}.sxthumb--cover[data-v-67de73f4]{border-color:var(--active-bar)}.sxrow>.bar-btn[data-v-67de73f4]{flex:none}.sxthumb[data-v-67de73f4]:disabled{cursor:default}.sxt[data-v-67de73f4]{width:auto;height:100%;max-width:var(--sx-thumb-max-w,230px);object-fit:cover;display:block}.sxcv[data-v-67de73f4]{bottom:var(--space-2);left:var(--space-2);padding:0 var(--space-2);border-radius:var(--radius-sm);background:var(--scrim-photo);color:rgb(var(--v-theme-on-dark-surface));font-size:var(--text-2xs);font-weight:var(--weight-semibold);line-height:var(--leading-snug);text-transform:uppercase;letter-spacing:var(--tracking-label);position:absolute}.grow[data-v-9c0c0df0]{align-items:center;gap:var(--space-3) var(--space-5);padding:var(--space-3) var(--space-4);padding-left:var(--space-5);border-radius:var(--radius-md);border:1px solid rgb(var(--v-theme-divider));background:rgb(var(--v-theme-surface));cursor:pointer;transition:background var(--dur-1) var(--ease-standard), border-color var(--dur-1) var(--ease-standard);grid-template-columns:minmax(150px,190px) minmax(0,1fr) auto;display:grid;position:relative;container:grow/inline-size}.grow[data-v-9c0c0df0]:hover{background:var(--hover-wash)}.grow--focus[data-v-9c0c0df0]{background:var(--active-wash);border-color:var(--active-bar)}.grow--focus[data-v-9c0c0df0]:before{content:"";border-radius:var(--radius-md) 0 0 var(--radius-md);background:var(--active-bar);width:3px;position:absolute;inset:0 auto 0 0}.grow--selected[data-v-9c0c0df0]{border-color:var(--active-bar);background:var(--active-wash)}.ginfo[data-v-9c0c0df0]{align-items:flex-start;gap:var(--space-2);flex-direction:column;min-width:0;display:flex}.gcaret[data-v-9c0c0df0]{color:var(--active-text);margin-left:calc(-1 * var(--space-2));flex-shrink:0;align-self:center}.gn[data-v-9c0c0df0]{align-items:baseline;gap:var(--space-3);min-width:0;display:flex}.gn-sep[data-v-9c0c0df0]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .35)}.gn b[data-v-9c0c0df0]{font-size:var(--text-base);font-weight:var(--weight-semibold);color:rgb(var(--v-theme-on-surface))}.gn span[data-v-9c0c0df0]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .6)}.gverdict[data-v-9c0c0df0]{align-items:center;gap:var(--space-2);height:var(--control-h);padding:0 var(--space-5);font-size:var(--text-sm);font-weight:var(--weight-medium);color:rgba(var(--v-theme-on-surface), .75);border:1px solid #0000;display:inline-flex}.gdecided-at[data-v-9c0c0df0]{padding:0 var(--space-5);font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .6);font-variant-numeric:tabular-nums;white-space:nowrap;border-inline:1px solid #0000}.gexp[data-v-9c0c0df0]{cursor:default;grid-column:1/-1;min-width:0}.gexp-state[data-v-9c0c0df0]{align-items:center;gap:var(--space-3);padding:var(--space-4);border:1px solid rgb(var(--v-theme-divider));border-radius:var(--radius-md);background:rgb(var(--v-theme-surface));font-size:var(--text-sm);color:rgba(var(--v-theme-on-surface), .7);display:flex}.gexp-state--error[data-v-9c0c0df0]{border-color:rgb(var(--v-theme-surface-warning));color:rgb(var(--v-theme-on-surface))}.gexp-state--error .v-icon[data-v-9c0c0df0]{color:rgb(var(--v-theme-surface-warning))}.gexp-flag[data-v-9c0c0df0]{align-items:center;gap:var(--space-3);padding:0 var(--space-1) var(--space-3);font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .75);display:flex}.gexp-flag .v-icon[data-v-9c0c0df0]{color:rgb(var(--v-theme-surface-warning));flex-shrink:0}.gact[data-v-9c0c0df0]{align-items:stretch;gap:var(--space-2);flex-direction:column;display:flex}.gact>button[data-v-9c0c0df0]{justify-content:flex-start}.gsl--mid[data-v-9c0c0df0],.gsl--short[data-v-9c0c0df0]{display:none}@container grow (width<=880px){.gsl--full[data-v-9c0c0df0]{display:none}.gsl--mid[data-v-9c0c0df0]{display:inline}}@container grow (width<=720px){.gsl--mid[data-v-9c0c0df0]{display:none}.gsl--short[data-v-9c0c0df0]{display:inline}}kbd[data-v-9c0c0df0]{font-family:var(--font-mono);font-size:var(--text-2xs);line-height:var(--leading-snug);padding:0 var(--space-2);border-radius:var(--radius-sm);opacity:.7;border:1px solid}.grow[data-v-3c47b90d]{align-items:center;gap:var(--space-3) var(--space-5);padding:var(--space-3) var(--space-4);padding-left:var(--space-5);border-radius:var(--radius-md);border:1px solid rgb(var(--v-theme-divider));background:rgb(var(--v-theme-surface));cursor:pointer;transition:background var(--dur-1) var(--ease-standard), border-color var(--dur-1) var(--ease-standard);grid-template-columns:minmax(150px,220px) minmax(0,1fr) auto;display:grid;position:relative;container:grow/inline-size}.grow[data-v-3c47b90d]:hover{background:var(--hover-wash)}.grow--focus[data-v-3c47b90d]{background:var(--active-wash);border-color:var(--active-bar)}.grow--focus[data-v-3c47b90d]:before{content:"";width:var(--rail-w);border-radius:var(--radius-md) 0 0 var(--radius-md);background:var(--active-bar);position:absolute;inset:0 auto 0 0}.grow--selected[data-v-3c47b90d]{border-color:var(--active-bar);background:var(--active-wash)}.grow--revealed[data-v-3c47b90d]:not(.grow--focus){background:var(--active-wash)}.ginfo[data-v-3c47b90d]{align-items:flex-start;gap:var(--space-2);flex-direction:column;min-width:0;display:flex}.gcaret[data-v-3c47b90d]{color:var(--active-text);margin-left:calc(-1 * var(--space-2));flex-shrink:0;align-self:center}.gn[data-v-3c47b90d]{align-items:baseline;gap:var(--space-3);min-width:0;display:flex}.gn-sep[data-v-3c47b90d]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .35)}.gn b[data-v-3c47b90d]{font-size:var(--text-base);font-weight:var(--weight-semibold);color:rgb(var(--v-theme-on-surface))}.gn span[data-v-3c47b90d]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .6)}.mqnote[data-v-3c47b90d]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .55)}.mqlock[data-v-3c47b90d]{align-self:flex-start;align-items:center;gap:var(--space-2);margin-left:calc(-1 * var(--space-2));padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);font-size:var(--text-2xs);font-weight:var(--weight-semibold);color:rgba(var(--v-theme-on-surface), .7);display:inline-flex}.mqlock .v-icon[data-v-3c47b90d]{color:inherit}.mqlock--flash[data-v-3c47b90d]{animation:mq-lock-flash-3c47b90d var(--dur-2) var(--ease-standard)}@keyframes mq-lock-flash-3c47b90d{50%{background:color-mix(in srgb, rgb(var(--v-theme-warning)) 26%, transparent)}}@media (prefers-reduced-motion:reduce){.mqlock--flash[data-v-3c47b90d]{background:color-mix(in srgb, rgb(var(--v-theme-warning)) 26%, transparent);animation:none}}.gact[data-v-3c47b90d]{align-items:stretch;gap:var(--space-2);flex-direction:column;display:flex}.gact>button[data-v-3c47b90d]{justify-content:flex-start}kbd[data-v-3c47b90d]{font-family:var(--font-mono);font-size:var(--text-2xs);line-height:var(--leading-snug);padding:0 var(--space-2);border-radius:var(--radius-sm);opacity:.7;border:1px solid}.dth[data-v-7f21b90f]{align-items:center;gap:var(--space-3);max-width:var(--stats-panel-w);padding:var(--space-2) var(--space-3);display:flex}.dth-label[data-v-7f21b90f]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .7);white-space:nowrap}.dth-input[data-v-7f21b90f]{min-width:0;accent-color:rgb(var(--v-theme-primary));flex:1}.dth-input[data-v-7f21b90f]:disabled{opacity:var(--opacity-disabled)}.dth-value[data-v-7f21b90f]{font-size:var(--text-xs);font-variant-numeric:tabular-nums;color:rgba(var(--v-theme-on-surface), .7)}.tiermenu[data-v-87bd865d]{gap:var(--space-2);min-width:300px;padding:var(--space-3);border-radius:var(--radius-lg);border:1px solid rgb(var(--v-theme-border));background:rgb(var(--v-theme-surface));color:rgb(var(--v-theme-on-surface));box-shadow:var(--elevation-3);flex-direction:column;display:flex}.tm-head[data-v-87bd865d]{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);display:flex}.tm-sp[data-v-87bd865d]{flex:1}.tm-count[data-v-87bd865d]{font-size:var(--text-xs);font-variant-numeric:tabular-nums;color:rgba(var(--v-theme-on-surface), .6)}.tierrow[data-v-87bd865d]{align-items:center;gap:var(--space-3);width:100%;padding:var(--space-3);border-radius:var(--radius-md);color:inherit;font-family:var(--font-ui);font-size:var(--text-base);text-align:left;cursor:pointer;transition:background var(--dur-1) var(--ease-standard);background:0 0;border:1px solid #0000;display:flex}.tierrow[data-v-87bd865d]:hover:not(:disabled):not(.tierrow--locked){background:var(--hover-wash)}.tierrow[data-v-87bd865d]:disabled{opacity:.38;cursor:default}.tierrow--on[data-v-87bd865d]{background:var(--active-wash)}.tierrow--locked[data-v-87bd865d]{cursor:default;background:var(--active-wash)}.cbox[data-v-87bd865d]{width:var(--space-5);height:var(--space-5);border-radius:var(--radius-sm);border:1px solid rgb(var(--v-theme-border));flex:none;justify-content:center;align-items:center;display:inline-flex}.cbox--on[data-v-87bd865d]{background:rgb(var(--v-theme-primary));border-color:rgb(var(--v-theme-primary));color:rgb(var(--v-theme-on-primary))}.tname[data-v-87bd865d]{align-items:baseline;gap:var(--space-2);flex-wrap:wrap;flex:1;min-width:0;display:flex}.trange[data-v-87bd865d],.tlock[data-v-87bd865d]{font-size:var(--text-2xs);color:rgba(var(--v-theme-on-surface), .55)}.tcount[data-v-87bd865d]{font-size:var(--text-xs);font-variant-numeric:tabular-nums;color:rgba(var(--v-theme-on-surface), .6)}.tierwarn[data-v-87bd865d]{align-items:flex-start;gap:var(--space-2);padding:var(--space-3);border-radius:var(--radius-md);background:rgba(var(--v-theme-warning), .12);border:1px solid rgba(var(--v-theme-surface-warning), .35);font-size:var(--text-xs);line-height:var(--leading-body);color:rgb(var(--v-theme-on-surface));margin:0;display:flex}.vmenu[data-v-917fc444]{gap:var(--space-2);min-width:300px;padding:var(--space-3);border-radius:var(--radius-lg);border:1px solid rgb(var(--v-theme-border));background:rgb(var(--v-theme-surface));color:rgb(var(--v-theme-on-surface));box-shadow:var(--elevation-3);flex-direction:column;display:flex}.vm-head[data-v-917fc444]{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);display:flex}.vm-sp[data-v-917fc444]{flex:1}.vm-count[data-v-917fc444]{font-size:var(--text-xs);font-variant-numeric:tabular-nums;color:rgba(var(--v-theme-on-surface), .6)}.vrow[data-v-917fc444]{align-items:center;gap:var(--space-3);width:100%;padding:var(--space-3);border-radius:var(--radius-md);color:inherit;font-family:var(--font-ui);font-size:var(--text-base);text-align:left;transition:background var(--dur-1) var(--ease-standard);border:1px solid #0000;display:flex}.vrow[data-v-917fc444]:hover:not(:disabled){background:var(--hover-wash)}.vrow[data-v-917fc444]:disabled{cursor:default}.vrow--on[data-v-917fc444]{background:var(--active-wash)}.cbox[data-v-917fc444]{width:var(--space-5);height:var(--space-5);border-radius:var(--radius-sm);border:1px solid rgb(var(--v-theme-border));flex:none;justify-content:center;align-items:center;display:inline-flex}.cbox--on[data-v-917fc444]{background:rgb(var(--v-theme-primary));border-color:rgb(var(--v-theme-primary));color:rgb(var(--v-theme-on-primary))}.vname[data-v-917fc444]{align-items:baseline;gap:var(--space-2);flex-wrap:wrap;flex:1;min-width:0;display:flex}.vhint[data-v-917fc444]{font-size:var(--text-2xs);color:rgba(var(--v-theme-on-surface), .55)}.vcount[data-v-917fc444]{font-size:var(--text-xs);font-variant-numeric:tabular-nums;color:rgba(var(--v-theme-on-surface), .6)}.vnote[data-v-917fc444]{padding:var(--space-2) var(--space-3);font-size:var(--text-2xs);line-height:var(--leading-body);color:rgba(var(--v-theme-on-surface), .55);margin:0}.scan-banner[data-v-a50ea666]{align-items:center;gap:var(--space-3);margin-inline:var(--space-5);padding:var(--space-3);border-radius:var(--radius-md);background:rgb(var(--v-theme-panel));color:rgb(var(--v-theme-on-panel));box-shadow:var(--elevation-1);grid-template-columns:auto 1fr auto;display:grid;position:relative;overflow:hidden}.scan-banner__ico[data-v-a50ea666]{color:rgb(var(--v-theme-on-panel));flex-shrink:0}.scan-banner--warning .scan-banner__ico[data-v-a50ea666],.scan-banner--warning .scan-banner__meta[data-v-a50ea666]{color:rgb(var(--v-theme-surface-warning))}.scan-banner__line[data-v-a50ea666]{min-width:0;font-size:var(--text-sm);line-height:var(--leading-snug);margin:0}.scan-banner__line b[data-v-a50ea666]{font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums}.scan-banner__meta[data-v-a50ea666]{font-size:var(--text-xs);line-height:var(--leading-snug);color:rgba(var(--v-theme-on-panel), .7);font-variant-numeric:tabular-nums;white-space:nowrap;justify-self:end}.scan-banner__track[data-v-a50ea666]{inset-inline:0;height:var(--countdown-h);background:rgba(var(--v-theme-on-panel), .14);position:absolute;bottom:0}.scan-banner__fill[data-v-a50ea666]{background:rgb(var(--v-theme-accent));height:100%;transition:width var(--dur-2) var(--ease-standard);display:block}.scope-pill[data-v-0f9c99d9]{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-2) var(--space-2) var(--space-3);border-radius:var(--radius-pill);background:var(--active-wash);border:1px solid var(--active-bar);font-size:var(--text-sm);line-height:var(--leading-snug);color:rgb(var(--v-theme-on-surface));max-width:100%;display:inline-flex;position:relative}.scope-pill__ico[data-v-0f9c99d9]{color:rgb(var(--v-theme-on-surface));flex-shrink:0}.scope-pill__label[data-v-0f9c99d9]{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.scope-pill__count[data-v-0f9c99d9]{font-size:var(--text-xs);font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;color:rgba(var(--v-theme-on-surface), .7);flex-shrink:0}.scope-pill__dismiss[data-v-0f9c99d9]{padding:var(--space-1);border-radius:var(--radius-pill);color:rgb(var(--v-theme-on-surface));flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.scope-pill__dismiss[data-v-0f9c99d9]:hover{background:var(--hover-wash)}@container toolbar (width<=820px){.scope-pill__label[data-v-0f9c99d9],.scope-pill__count[data-v-0f9c99d9]{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}}.dc-confidence[data-v-5cc79e96]{font-size:var(--text-sm);font-weight:var(--weight-medium);color:rgba(var(--v-theme-on-surface), .7)}.dc-strip[data-v-5cc79e96]{align-items:stretch;gap:var(--space-4);scrollbar-gutter:stable;min-height:0;padding-bottom:var(--space-3);scrollbar-width:thin;scrollbar-color:rgba(var(--v-theme-on-surface), .4) transparent;flex:1;display:flex;overflow-x:auto}.dc-card[data-v-5cc79e96]{border:1px solid rgb(var(--v-theme-border));border-radius:var(--radius-md);background:rgb(var(--v-theme-surface));max-width:640px;box-shadow:var(--elevation-1);flex-direction:column;flex:1 0 300px;display:flex;position:relative;overflow:hidden}.dc-card--out[data-v-5cc79e96]{border-style:dashed;border-color:rgba(var(--v-theme-on-surface), .35)}.dc-card--split[data-v-5cc79e96]{border-color:rgb(var(--v-theme-surface-warning))}.dc-pick[data-v-5cc79e96]{text-align:left;width:100%;min-height:0;color:inherit;font:inherit;transition:background var(--dur-1) var(--ease-standard);flex-direction:column;flex:1;padding:0;display:flex}.dc-pick[data-v-5cc79e96]:hover{background:var(--hover-wash)}.dc-pick[aria-pressed=true][data-v-5cc79e96]{background:var(--active-wash)}.dc-thumb[data-v-5cc79e96]{background:rgba(var(--v-theme-on-surface), .06);flex:1;min-height:220px;display:block;position:relative}.dc-thumb-img[data-v-5cc79e96]{object-fit:contain;width:100%;height:100%;display:block;position:absolute;inset:0}.dc-index[data-v-5cc79e96]{top:var(--space-2);left:var(--space-2);min-width:var(--badge-size);height:var(--badge-size);padding:0 var(--space-2);border-radius:var(--radius-pill);background:rgb(var(--v-theme-primary));color:rgb(var(--v-theme-on-primary));font-size:var(--text-2xs);font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;justify-content:center;align-items:center;display:inline-flex;position:absolute}.dc-flag[data-v-5cc79e96]{top:var(--space-2);right:var(--space-2);padding:var(--space-1) var(--space-2);border-radius:var(--radius-pill);background:var(--scrim-photo);color:rgb(var(--v-theme-on-dark-surface));font-size:var(--text-2xs);font-weight:var(--weight-semibold);position:absolute}.dc-flag--out[data-v-5cc79e96],.dc-flag--split[data-v-5cc79e96]{top:auto;bottom:var(--space-2)}.dc-flag--leader[data-v-5cc79e96]{top:auto;right:auto;bottom:var(--space-2);left:var(--space-2)}.dc-zoom[data-v-5cc79e96]{top:calc(var(--space-2) + var(--badge-size) + var(--space-2));left:var(--space-2);z-index:var(--z-raised);border-radius:var(--radius-sm);background:var(--scrim-photo);width:26px;height:26px;color:rgb(var(--v-theme-on-dark-surface));justify-content:center;align-items:center;display:inline-flex;position:absolute}.dc-zoom[data-v-5cc79e96]:hover{background:rgba(var(--v-theme-on-dark-surface), .16)}.dc-zoom[data-v-5cc79e96]:focus-visible{outline-color:rgb(var(--v-theme-on-dark-surface))}.dc-meta[data-v-5cc79e96]{gap:var(--space-2) var(--space-3);padding:var(--space-3) var(--space-4);grid-template-columns:1fr 1fr;align-content:start;display:grid}.dc-cell[data-v-5cc79e96]{flex-direction:column;min-width:0;display:flex}.dc-cell--wide[data-v-5cc79e96]{grid-column:1/-1}.dc-label[data-v-5cc79e96]{font-size:var(--text-2xs);letter-spacing:var(--tracking-label);text-transform:uppercase;color:rgba(var(--v-theme-on-surface), .6)}.dc-val[data-v-5cc79e96]{font-size:var(--text-sm);color:rgb(var(--v-theme-on-surface));font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap;border-block:1px solid #0000;overflow:hidden}.dc-val--best[data-v-5cc79e96]{font-weight:var(--weight-semibold);background:rgba(var(--v-theme-primary), .18);border:1px solid rgba(var(--v-theme-primary), .5);border-radius:var(--radius-sm);padding:0 var(--space-2);align-self:flex-start;max-width:100%}.dc-val--gap[data-v-5cc79e96]{font-weight:var(--weight-semibold);background:rgba(var(--v-theme-warning), .12);border:1px solid rgba(var(--v-theme-surface-warning), .35);border-radius:var(--radius-sm);padding:0 var(--space-2);align-self:flex-start;max-width:100%}.dc-star[data-v-5cc79e96]{color:rgb(var(--v-theme-accent))}.dc-path[data-v-5cc79e96]{font-family:var(--font-mono);font-size:var(--text-xs)}.dc-path-icon[data-v-5cc79e96]{color:rgba(var(--v-theme-on-surface), .6)}.dc-instack[data-v-5cc79e96]{align-items:center;gap:var(--space-2);display:inline-flex}.dc-toggle[data-v-5cc79e96]{padding:var(--space-1);border-radius:var(--radius-sm);color:rgba(var(--v-theme-on-surface), .7);transition:background var(--dur-1) var(--ease-standard), color var(--dur-1) var(--ease-standard);justify-content:center;align-items:center;display:inline-flex}.dc-toggle[data-v-5cc79e96]:hover{background:var(--hover-wash);color:rgb(var(--v-theme-on-surface))}.dc-expand[data-v-5cc79e96]{align-items:center;gap:var(--space-1);max-width:100%;color:inherit;font:inherit;font-variant-numeric:tabular-nums;text-align:left;border-radius:var(--radius-sm);padding:0;display:inline-flex}.dc-expand[data-v-5cc79e96]:hover{background:var(--hover-wash)}.dc-expansion[data-v-5cc79e96]{flex-shrink:0}.dc-expansion-state[data-v-5cc79e96]{align-items:center;gap:var(--space-3);padding:var(--space-4);border:1px solid rgb(var(--v-theme-divider));border-radius:var(--radius-md);background:rgb(var(--v-theme-surface));font-size:var(--text-sm);color:rgba(var(--v-theme-on-surface), .7);display:flex}.dc-mixed-error[data-v-5cc79e96]{flex-shrink:0}.dc-expansion-state--error[data-v-5cc79e96]{border-color:rgb(var(--v-theme-surface-warning));color:rgb(var(--v-theme-on-surface))}.dc-expansion-state--error .v-icon[data-v-5cc79e96]{color:rgb(var(--v-theme-surface-warning))}.dc-promote[data-v-5cc79e96]{align-items:center;gap:var(--space-3);margin-top:var(--space-3);padding:var(--space-3);border:1px solid rgb(var(--v-theme-border));border-radius:var(--radius-md);background:rgb(var(--v-theme-surface));display:flex}.dc-promote-icon[data-v-5cc79e96]{color:rgba(var(--v-theme-on-surface), .6);flex-shrink:0}.dc-promote-text[data-v-5cc79e96]{min-width:0;font-size:var(--text-sm);line-height:var(--leading-snug);color:rgb(var(--v-theme-on-surface));flex:1}.dc-why[data-v-5cc79e96]{flex-shrink:0}.dc-hint[data-v-5cc79e96]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .6);margin-right:auto}.dc-zv[data-v-5cc79e96]{inset:var(--titlebar-h) 0 0 0;background:#0a0a0a;flex-direction:column;display:flex;position:fixed}.dc-zv-top[data-v-5cc79e96]{align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-4);flex-shrink:0;display:flex}.dc-zv-flip[data-v-5cc79e96]{gap:var(--space-1);display:flex}.dc-zv-flip button[data-v-5cc79e96]{border-radius:var(--radius-sm);color:#fff;min-width:30px;height:30px;font-family:var(--font-ui);font-size:var(--text-xs);font-variant-numeric:tabular-nums;cursor:pointer;background:0 0;border:1px solid #ffffff3d}.dc-zv-flip button[data-v-5cc79e96]:hover{background:rgba(var(--v-theme-on-dark-surface), .16)}.dc-zv .dc-zv-on[data-v-5cc79e96]{background:rgba(var(--v-theme-dark-surface-primary), .2);border-color:rgb(var(--v-theme-dark-surface-primary));color:#fff;font-weight:var(--weight-semibold)}.dc-zv[data-v-5cc79e96] :focus-visible{outline-color:rgb(var(--v-theme-on-dark-surface))}.dc-flag--zv[data-v-5cc79e96]{position:static}.dc-zv-meta[data-v-5cc79e96]{font-size:var(--text-xs);color:#ffffffb8;font-variant-numeric:tabular-nums;white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.dc-zv-mode[data-v-5cc79e96]{--v-theme-on-surface:var(--v-theme-on-dark-surface);--hover-wash:rgba(var(--v-theme-on-dark-surface), .16);--track-trough:rgba(var(--v-theme-scrim), .34);--track-ring:rgba(var(--v-theme-on-dark-surface), .4);--focus-stroke:rgb(var(--v-theme-on-dark-surface));--v-theme-primary:var(--v-theme-dark-surface-primary);--v-theme-on-primary:var(--v-theme-dark-surface);flex-shrink:0}.dc-zv-pct[data-v-5cc79e96]{text-align:right;min-width:5ch;font-size:var(--text-xs);font-variant-numeric:tabular-nums;color:#ffffffb8}.dc-zv-close[data-v-5cc79e96]{border-radius:var(--radius-sm);color:#ffffffb8;flex-shrink:0;justify-content:center;align-items:center;width:30px;height:30px;display:inline-flex}.dc-zv-close[data-v-5cc79e96]:hover{background:rgba(var(--v-theme-on-dark-surface), .16);color:#fff}.dc-zv-img[data-v-5cc79e96]{flex:1;min-height:0;display:flex;overflow:hidden}.dc-zv-img--pannable[data-v-5cc79e96]{cursor:grab}.dc-zv-img img[data-v-5cc79e96]{object-fit:contain;flex-shrink:0;width:auto;max-width:100%;height:100%;margin:auto;display:block}.dc-zv-foot[data-v-5cc79e96]{justify-content:center;align-items:center;gap:var(--space-5);padding:var(--space-3);font-size:var(--text-xs);color:#fff9;flex-shrink:0;display:flex}.dc-zv-foot kbd[data-v-5cc79e96]{padding:0 var(--space-2);border-radius:var(--radius-sm);color:#fff;font-family:var(--font-mono);font-size:var(--text-2xs);background:#ffffff24}.as-lede[data-v-d0706c6b]{font-size:var(--text-base);line-height:var(--leading-body);color:rgba(var(--v-theme-on-surface), .8);margin:0}.as-failed[data-v-d0706c6b]{align-items:flex-start;gap:var(--space-2);padding:var(--space-3);border-radius:var(--radius-md);background:rgba(var(--v-theme-warning), .12);border:1px solid rgba(var(--v-theme-surface-warning), .35);font-size:var(--text-xs);line-height:var(--leading-body);color:rgb(var(--v-theme-on-surface));margin:0;display:flex}.as-rows[data-v-d0706c6b]{flex-direction:column;margin:0;padding:0;display:flex}.as-row[data-v-d0706c6b]{align-items:baseline;gap:var(--space-4);padding:var(--space-3) 0;border-bottom:1px solid rgb(var(--v-theme-divider));grid-template-columns:1fr auto;display:grid}.as-row[data-v-d0706c6b]:last-child{border-bottom:none}.as-term[data-v-d0706c6b]{align-items:center;gap:var(--space-2);font-size:var(--text-sm);color:rgba(var(--v-theme-on-surface), .8);display:flex}.as-icon[data-v-d0706c6b]{color:rgba(var(--v-theme-on-surface), .6);flex-shrink:0}.as-value[data-v-d0706c6b]{font-size:var(--text-md);font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;color:rgb(var(--v-theme-on-surface));margin:0}.as-reversible[data-v-d0706c6b]{align-items:center;gap:var(--space-2);font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .6);margin:0;display:flex}.as-reversible kbd[data-v-d0706c6b]{font-family:var(--font-mono);font-size:var(--text-2xs);padding:var(--space-1) var(--space-2);border:1px solid rgba(var(--v-theme-on-surface), .3);border-radius:var(--radius-sm);background:rgba(var(--v-theme-on-surface), .08)}.dq[data-v-8d173505]{background:rgb(var(--v-theme-background));height:100%;min-height:0;color:rgb(var(--v-theme-on-background));outline:none;flex-direction:column;display:flex;position:relative}.dq-toolbar[data-v-8d173505]{align-items:center;gap:var(--space-3);box-sizing:border-box;height:36px;padding:0 var(--space-3) 0 var(--space-5);background:rgb(var(--v-theme-toolbar));color:rgb(var(--v-theme-toolbar-text));border-bottom:1px solid rgb(var(--v-theme-divider));display:flex;container:dqbar toolbar/inline-size}.dq-tb-left[data-v-8d173505],.dq-tb-right[data-v-8d173505]{align-items:center;gap:var(--space-3);display:flex}.dq-tb-left[data-v-8d173505]{flex:0 auto;min-width:0}.dq-tb-right[data-v-8d173505]{flex:none;margin-left:auto}.dq-tb-sep[data-v-8d173505]{background:rgb(var(--v-theme-divider));flex-shrink:0;width:1px;height:18px}.dq-size[data-v-8d173505]{align-items:center;gap:var(--space-3);display:flex}.dq-size-slider[data-v-8d173505]{flex:0 0 96px;width:96px}.dq-size-slider[data-v-8d173505] .v-input__control{height:20px;min-height:0}.dq-size-value[data-v-8d173505]{width:11ch;font-size:var(--text-xs);color:rgba(var(--v-theme-toolbar-text), .7);white-space:nowrap}.dq-tier-wrap[data-v-8d173505]{min-width:0;display:flex;position:relative}.dq-tier-label[data-v-8d173505]{text-overflow:ellipsis;min-width:0;overflow:hidden}.dq-tier-menu[data-v-8d173505]{top:calc(100% + var(--space-2));z-index:var(--z-dropdown);position:absolute;left:0}.dq-bar-action[data-v-8d173505]{min-width:0}.dq-bar-action[data-v-8d173505] .app-btn__label{align-items:center;gap:var(--space-2);min-width:0;display:flex}.dq-bar-action .v-icon[data-v-8d173505]{flex-shrink:0}.dq-bar-action.dq-bar-action--on[data-v-8d173505]{background:var(--active-wash);border-color:var(--active-bar);color:var(--active-text)}.dq-bar-action.dq-bar-action--on[data-v-8d173505]:not(:disabled):not([aria-disabled=true]):hover{background:linear-gradient(var(--hover-wash), var(--hover-wash)) var(--active-wash)}.queue[data-v-8d173505]{flex-direction:column;flex:1;min-height:0;display:flex}.qtitle[data-v-8d173505]{font-size:var(--text-md);font-weight:var(--weight-semibold);white-space:nowrap;text-overflow:ellipsis;flex-shrink:6;min-width:0;overflow:hidden}.qsub[data-v-8d173505]{font-size:var(--text-xs);color:rgba(var(--v-theme-toolbar-text), .6);white-space:nowrap}.dq-toggle-label[data-v-8d173505]{text-overflow:ellipsis;min-width:0;overflow:hidden}.qmixed-count[data-v-8d173505]{min-width:var(--badge-size);min-height:var(--badge-size);padding:0 var(--space-2);border-radius:var(--radius-pill);background:rgba(var(--v-theme-on-surface), .1);font-size:var(--text-2xs);font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;flex-shrink:0;align-items:center;display:inline-flex}.qselbar[data-v-8d173505]{padding:var(--space-2) var(--space-5) 0;align-items:center;display:flex}.qselchip[data-v-8d173505]{align-items:center;gap:var(--space-2);padding:var(--space-1) var(--space-3);border:1px solid var(--active-bar);border-radius:var(--radius-pill);background:var(--active-wash);font-size:var(--text-xs);color:rgb(var(--v-theme-on-surface));display:inline-flex}.qselclear[data-v-8d173505]{font:inherit;font-weight:var(--weight-semibold);color:var(--active-text);border-radius:var(--radius-sm);padding:0;text-decoration:underline}.qlist[data-v-8d173505]{gap:var(--space-3);padding:0 var(--space-5) var(--space-4);scrollbar-gutter:stable;flex-direction:column;flex:1;min-height:0;display:flex;overflow-y:auto}.qspacer[data-v-8d173505]{flex:none}.qmore[data-v-8d173505]{align-self:center;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-4);border-radius:var(--radius-pill);background:rgb(var(--v-theme-surface));border:1px solid rgb(var(--v-theme-divider));box-shadow:var(--elevation-1);font-size:var(--text-xs);color:rgba(var(--v-theme-on-surface), .75);display:inline-flex;position:sticky;bottom:0}.dq-state[data-v-8d173505]{padding:var(--space-6) var(--space-5);font-size:var(--text-sm);color:rgba(var(--v-theme-on-background), .6)}.mixed[data-v-8d173505]{flex-direction:column;flex:1;min-height:0;display:flex}.mixed-list[data-v-8d173505]{min-height:0;padding:0 var(--space-5) var(--space-4);scrollbar-gutter:stable;flex-direction:column;flex:1;display:flex;overflow-y:auto}.mixed-head[data-v-8d173505]{z-index:var(--z-sticky);align-items:center;gap:var(--space-5);padding:var(--space-4) 0 var(--space-3);background:rgb(var(--v-theme-background));border-bottom:1px solid rgb(var(--v-theme-divider));flex-wrap:wrap;display:flex;position:sticky;top:0}.mixed-lede[data-v-8d173505]{min-width:0;max-width:78ch;font-size:var(--text-sm);line-height:var(--leading-body);color:rgba(var(--v-theme-on-background), .7);flex:1;margin:0}.mixed-lede b[data-v-8d173505]{font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums;color:rgb(var(--v-theme-on-background))}.mixed-threshold[data-v-8d173505]{flex:0 1 var(--stats-panel-w)}.mlist[data-v-8d173505]{gap:var(--space-3);padding-top:var(--space-3);flex-direction:column;display:flex;container:mixedlist/inline-size}.mixed-more[data-v-8d173505]{margin-top:var(--space-4);align-self:center}.qdone[data-v-8d173505]{justify-content:center;align-items:center;gap:var(--space-3);padding:var(--space-9) var(--space-6);text-align:center;color:rgba(var(--v-theme-on-background), .75);flex-direction:column;flex:1;display:flex}.qdone h3[data-v-8d173505]{font-size:var(--text-lg);font-weight:var(--weight-semibold);color:rgb(var(--v-theme-on-background));margin:0}.qdone p[data-v-8d173505]{max-width:52ch;font-size:var(--text-sm);line-height:var(--leading-body);margin:0}.qdone .qdone-hint[data-v-8d173505]{font-size:var(--text-xs);color:rgba(var(--v-theme-on-background), .6)}.visually-hidden[data-v-8d173505]{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.dq-auto-short[data-v-8d173505],.dq-auto-count[data-v-8d173505],.dq-overflow[data-v-8d173505]{display:none}.dq-auto-full[data-v-8d173505]{text-overflow:ellipsis;min-width:0;overflow:hidden}@container dqbar (width<=1384px){.qsub[data-v-8d173505],.dq-size-value[data-v-8d173505]{display:none}}@container dqbar (width<=1178px){.dq-auto-full[data-v-8d173505]{display:none}.dq-auto-short[data-v-8d173505]{display:inline}}@container dqbar (width<=1087px){.dq-tier-label[data-v-8d173505]{display:none}}@container dqbar (width<=950px){.dq-auto-short[data-v-8d173505]{display:none}.dq-auto-count[data-v-8d173505]{display:inline}}@container dqbar (width<=882px){.dq-fold-906[data-v-8d173505]{display:none}.dq-overflow[data-v-8d173505]{display:flex}.dq-toggle-label[data-v-8d173505]{display:none}}@container toolbar (width<=420px){.dq-tb-left[data-v-8d173505],.dq-tb-right[data-v-8d173505]{gap:var(--space-2)}}