From 99467464e42f26ae41f1a9eedb3ce17b3b527bed Mon Sep 17 00:00:00 2001 From: Home Assistant Version Control Date: Sat, 19 Sep 2026 17:31:12 +0000 Subject: [PATCH] 203 files --- .HA_VERSION | 2 +- .ha_run.lock | 2 +- .storage/lovelace_resources | 64 +++--- custom_components/album_slideshow/camera.py | 63 +++++- .../album_slideshow/config_flow.py | 7 +- custom_components/album_slideshow/const.py | 7 + custom_components/album_slideshow/icloud.py | 178 ++++++++++++---- .../album_slideshow/manifest.json | 2 +- custom_components/album_slideshow/number.py | 32 +++ custom_components/album_slideshow/store.py | 2 + .../album_slideshow/strings.json | 4 +- .../album_slideshow/translations/en.json | 4 +- .../www/album-slideshow-card.js | 26 ++- .../__pycache__/__init__.cpython-314.pyc | Bin 6418 -> 6418 bytes .../__pycache__/binary_sensor.cpython-314.pyc | Bin 1199 -> 1199 bytes .../spook/__pycache__/button.cpython-314.pyc | Bin 1176 -> 1176 bytes .../__pycache__/config_flow.cpython-314.pyc | Bin 6379 -> 6379 bytes .../spook/__pycache__/const.cpython-314.pyc | Bin 1092 -> 1092 bytes .../spook/__pycache__/entity.cpython-314.pyc | Bin 1596 -> 1596 bytes .../entity_filtering.cpython-314.pyc | Bin 27248 -> 27264 bytes .../spook/__pycache__/event.cpython-314.pyc | Bin 1173 -> 1173 bytes .../integration_linking.cpython-314.pyc | Bin 2933 -> 2933 bytes .../__pycache__/listeners.cpython-314.pyc | Bin 2862 -> 2862 bytes .../spook/__pycache__/number.cpython-314.pyc | Bin 1176 -> 1176 bytes .../spook/__pycache__/repairs.cpython-314.pyc | Bin 59425 -> 60190 bytes .../spook/__pycache__/select.cpython-314.pyc | Bin 1176 -> 1176 bytes .../spook/__pycache__/sensor.cpython-314.pyc | Bin 1176 -> 1176 bytes .../__pycache__/services.cpython-314.pyc | Bin 28602 -> 28602 bytes .../__pycache__/setup_helpers.cpython-314.pyc | Bin 7347 -> 7347 bytes .../spook/__pycache__/switch.cpython-314.pyc | Bin 1177 -> 1177 bytes .../spook/__pycache__/time.cpython-314.pyc | Bin 1170 -> 1170 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 187 -> 187 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 198 -> 198 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 197 -> 197 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 206 -> 206 bytes .../__pycache__/importer.cpython-314.pyc | Bin 3825 -> 3825 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 193 -> 193 bytes .../cloud/__pycache__/entity.cpython-314.pyc | Bin 2571 -> 2571 bytes .../cloud/__pycache__/switch.cpython-314.pyc | Bin 9098 -> 9098 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 193 -> 193 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 201 -> 201 bytes .../__pycache__/button.cpython-314.pyc | Bin 4139 -> 4139 bytes .../__pycache__/device.cpython-314.pyc | Bin 4566 -> 4566 bytes .../__pycache__/entity.cpython-314.pyc | Bin 1754 -> 1754 bytes .../__pycache__/sensor.cpython-314.pyc | Bin 32394 -> 32394 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 2298 -> 2298 bytes .../add_alias_to_area.cpython-314.pyc | Bin 2471 -> 2471 bytes .../add_alias_to_floor.cpython-314.pyc | Bin 2482 -> 2482 bytes .../add_area_to_floor.cpython-314.pyc | Bin 2495 -> 2495 bytes .../add_device_to_area.cpython-314.pyc | Bin 2526 -> 2526 bytes .../add_entity_to_area.cpython-314.pyc | Bin 2500 -> 2500 bytes .../add_label_to_area.cpython-314.pyc | Bin 2656 -> 2656 bytes .../add_label_to_device.cpython-314.pyc | Bin 2695 -> 2695 bytes .../add_label_to_entity.cpython-314.pyc | Bin 2669 -> 2669 bytes .../__pycache__/create_area.cpython-314.pyc | Bin 2103 -> 2103 bytes .../__pycache__/create_floor.cpython-314.pyc | Bin 2296 -> 2296 bytes .../__pycache__/create_label.cpython-314.pyc | Bin 2692 -> 2692 bytes ...lete_all_orphaned_entities.cpython-314.pyc | Bin 2083 -> 2083 bytes .../__pycache__/delete_area.cpython-314.pyc | Bin 1744 -> 1744 bytes .../__pycache__/delete_floor.cpython-314.pyc | Bin 1750 -> 1750 bytes .../__pycache__/delete_label.cpython-314.pyc | Bin 1744 -> 1744 bytes .../disable_config_entry.cpython-314.pyc | Bin 2050 -> 2050 bytes .../disable_device.cpython-314.pyc | Bin 1941 -> 1941 bytes .../disable_entity.cpython-314.pyc | Bin 2019 -> 2019 bytes .../disable_polling.cpython-314.pyc | Bin 2109 -> 2109 bytes .../__pycache__/disable_user.cpython-314.pyc | Bin 2386 -> 2386 bytes .../enable_config_entry.cpython-314.pyc | Bin 1929 -> 1929 bytes .../__pycache__/enable_device.cpython-314.pyc | Bin 1927 -> 1927 bytes .../__pycache__/enable_entity.cpython-314.pyc | Bin 1927 -> 1927 bytes .../enable_polling.cpython-314.pyc | Bin 2106 -> 2106 bytes .../__pycache__/enable_user.cpython-314.pyc | Bin 2382 -> 2382 bytes .../__pycache__/hide_entity.cpython-314.pyc | Bin 2022 -> 2022 bytes .../ignore_all_discovered.cpython-314.pyc | Bin 3921 -> 3921 bytes ...orphaned_database_entities.cpython-314.pyc | Bin 3335 -> 3335 bytes .../remove_alias_from_area.cpython-314.pyc | Bin 2491 -> 2491 bytes .../remove_alias_from_floor.cpython-314.pyc | Bin 2500 -> 2500 bytes .../remove_area_from_floor.cpython-314.pyc | Bin 1922 -> 1922 bytes .../remove_device_from_area.cpython-314.pyc | Bin 1961 -> 1961 bytes .../remove_entity_from_area.cpython-314.pyc | Bin 1936 -> 1936 bytes .../remove_label_from_area.cpython-314.pyc | Bin 2684 -> 2684 bytes .../remove_label_from_device.cpython-314.pyc | Bin 2723 -> 2723 bytes .../remove_label_from_entity.cpython-314.pyc | Bin 2697 -> 2697 bytes .../__pycache__/rename_entity.cpython-314.pyc | Bin 2049 -> 2049 bytes .../__pycache__/restart.cpython-314.pyc | Bin 2692 -> 2692 bytes .../set_area_aliases.cpython-314.pyc | Bin 2349 -> 2349 bytes .../set_floor_aliases.cpython-314.pyc | Bin 2355 -> 2355 bytes .../__pycache__/unhide_entity.cpython-314.pyc | Bin 1925 -> 1925 bytes .../update_entity_id.cpython-314.pyc | Bin 1938 -> 1938 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 200 -> 200 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 3883 -> 3883 bytes .../__pycache__/create.cpython-314.pyc | Bin 5344 -> 5344 bytes .../__pycache__/decrement.cpython-314.pyc | Bin 2264 -> 2264 bytes .../__pycache__/delete.cpython-314.pyc | Bin 2246 -> 2246 bytes .../__pycache__/increment.cpython-314.pyc | Bin 2264 -> 2264 bytes .../services/__pycache__/max.cpython-314.pyc | Bin 1487 -> 1487 bytes .../services/__pycache__/min.cpython-314.pyc | Bin 1487 -> 1487 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 200 -> 200 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 209 -> 209 bytes .../__pycache__/random.cpython-314.pyc | Bin 790 -> 790 bytes .../__pycache__/shuffle.cpython-314.pyc | Bin 1674 -> 1674 bytes .../services/__pycache__/sort.cpython-314.pyc | Bin 1630 -> 1630 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 199 -> 199 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 196 -> 196 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 194 -> 194 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 1190 -> 1190 bytes .../__pycache__/decrement.cpython-314.pyc | Bin 2489 -> 2489 bytes .../__pycache__/increment.cpython-314.pyc | Bin 2489 -> 2489 bytes .../services/__pycache__/max.cpython-314.pyc | Bin 1732 -> 1732 bytes .../services/__pycache__/min.cpython-314.pyc | Bin 1732 -> 1732 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 194 -> 194 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 203 -> 203 bytes .../add_device_tracker.cpython-314.pyc | Bin 2965 -> 2965 bytes .../remove_device_tracker.cpython-314.pyc | Bin 2999 -> 2999 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 197 -> 197 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 196 -> 196 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 205 -> 205 bytes .../import_statistics.cpython-314.pyc | Bin 4221 -> 4221 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 195 -> 195 bytes .../__pycache__/button.cpython-314.pyc | Bin 3561 -> 3561 bytes .../__pycache__/entity.cpython-314.pyc | Bin 1722 -> 1722 bytes .../repairs/__pycache__/event.cpython-314.pyc | Bin 3600 -> 3600 bytes .../__pycache__/sensor.cpython-314.pyc | Bin 6516 -> 6516 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 204 -> 204 bytes .../__pycache__/create.cpython-314.pyc | Bin 2828 -> 2828 bytes .../__pycache__/ignore_all.cpython-314.pyc | Bin 1595 -> 1595 bytes .../__pycache__/remove.cpython-314.pyc | Bin 1748 -> 1748 bytes .../__pycache__/unignore_all.cpython-314.pyc | Bin 1601 -> 1601 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 193 -> 193 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 194 -> 194 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 194 -> 194 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 203 -> 203 bytes .../__pycache__/random.cpython-314.pyc | Bin 2057 -> 2057 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 193 -> 193 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 202 -> 202 bytes .../services/__pycache__/boo.cpython-314.pyc | Bin 1305 -> 1305 bytes .../__pycache__/random_fail.cpython-314.pyc | Bin 1455 -> 1455 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 199 -> 199 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 193 -> 193 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 202 -> 202 bytes .../__pycache__/set_duration.cpython-314.pyc | Bin 2916 -> 2916 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 193 -> 193 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 201 -> 201 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 209 -> 209 bytes .../zone/__pycache__/__init__.cpython-314.pyc | Bin 192 -> 192 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 201 -> 201 bytes .../__pycache__/create.cpython-314.pyc | Bin 1901 -> 1901 bytes .../__pycache__/delete.cpython-314.pyc | Bin 2911 -> 2911 bytes .../__pycache__/update.cpython-314.pyc | Bin 3153 -> 3153 bytes custom_components/spook/entity_filtering.py | 9 +- custom_components/spook/icons.json | 9 + .../integrations/spook_inverse/manifest.json | 2 +- .../spook_inverse/translations/en_GB.json | 52 ++++- .../spook_inverse/translations/fi.json | 2 +- .../spook_inverse/translations/pt.json | 12 +- custom_components/spook/manifest.json | 2 +- custom_components/spook/repairs.py | 29 ++- custom_components/spook/services.yaml | 67 ++++++ custom_components/spook/translations/de.json | 84 ++++++++ .../spook/translations/en-GB.json | 13 ++ custom_components/spook/translations/en.json | 86 +++++++- custom_components/spook/translations/es.json | 86 +++++++- custom_components/spook/translations/fi.json | 90 +++++++- custom_components/spook/translations/pt.json | 79 ++++++- custom_components/spook/translations/sk.json | 84 ++++++++ .../spook/translations/sr-Latn.json | 160 ++++++++++---- custom_components/spook/translations/sv.json | 24 +-- .../spook/translations/zh-Hans.json | 84 ++++++++ .../spook/translations/zh-Hant.json | 84 ++++++++ custom_components/spook/triggers.yaml | 32 +++ custom_components/taskmate/__init__.py | 10 +- custom_components/taskmate/const.py | 5 + custom_components/taskmate/coord_chores.py | 61 +++++- custom_components/taskmate/coord_rewards.py | 14 +- custom_components/taskmate/manifest.json | 2 +- custom_components/taskmate/models.py | 13 ++ custom_components/taskmate/sensor.py | 13 ++ custom_components/taskmate/services.yaml | 25 +++ custom_components/taskmate/strings.json | 12 ++ .../taskmate/translations/de.json | 12 ++ .../taskmate/translations/en-GB.json | 12 ++ .../taskmate/translations/en.json | 12 ++ .../taskmate/translations/fr.json | 12 ++ .../taskmate/translations/nb.json | 12 ++ .../taskmate/translations/nn.json | 12 ++ .../taskmate/translations/pt-BR.json | 12 ++ .../taskmate/translations/pt.json | 12 ++ custom_components/taskmate/websocket.py | 6 +- .../taskmate/www/locales/de.json | 12 ++ .../taskmate/www/locales/en-GB.json | 12 ++ .../taskmate/www/locales/en.json | 12 ++ .../taskmate/www/locales/fr.json | 12 ++ .../taskmate/www/locales/nb.json | 12 ++ .../taskmate/www/locales/nn.json | 12 ++ .../taskmate/www/locales/pt-BR.json | 12 ++ .../taskmate/www/locales/pt.json | 12 ++ .../taskmate/www/taskmate-approvals-card.js | 201 +++++++++++++++++- .../taskmate/www/taskmate-child-card.js | 130 ++++++++++- .../taskmate/www/taskmate-panel.js | 4 + .../taskmate/www/taskmate-rewards-card.js | 47 ++-- www/community/lovelace-wallpanel/wallpanel.js | 2 +- .../lovelace-wallpanel/wallpanel.js.gz | Bin 69244 -> 70218 bytes zigbee2mqtt/coordinator_backup.json | 4 +- zigbee2mqtt/state.json | 52 ++--- 203 files changed, 2035 insertions(+), 241 deletions(-) diff --git a/.HA_VERSION b/.HA_VERSION index 61a41c87..bba4b7aa 100644 --- a/.HA_VERSION +++ b/.HA_VERSION @@ -1 +1 @@ -2026.9.2 \ No newline at end of file +2026.9.3 \ No newline at end of file diff --git a/.ha_run.lock b/.ha_run.lock index 7b3c1dae..c02f233a 100644 --- a/.ha_run.lock +++ b/.ha_run.lock @@ -1 +1 @@ -{"pid": 71, "version": 1, "ha_version": "2026.9.2", "start_ts": 1789746086.7330012} \ No newline at end of file +{"pid": 71, "version": 1, "ha_version": "2026.9.3", "start_ts": 1789839023.3776524} \ No newline at end of file diff --git a/.storage/lovelace_resources b/.storage/lovelace_resources index d7941fd6..f8763933 100644 --- a/.storage/lovelace_resources +++ b/.storage/lovelace_resources @@ -81,117 +81,117 @@ }, { "id": "88b90f2b1d6b45f0b44bee786ee1a525", - "url": "/taskmate/taskmate-attr-resolver.js?v=5.6.1", + "url": "/taskmate/taskmate-attr-resolver.js?v=5.7.0", "type": "module" }, { "id": "0796c92931dd458e81dc9c2677248274", - "url": "/taskmate/taskmate-localize.js?v=5.6.1", + "url": "/taskmate/taskmate-localize.js?v=5.7.0", "type": "module" }, { "id": "d2e281920ac7409583eafff1f1db69bd", - "url": "/taskmate/taskmate-design.js?v=5.6.1", + "url": "/taskmate/taskmate-design.js?v=5.7.0", "type": "module" }, { "id": "9eae9632f0734480be5edd784b030673", - "url": "/taskmate/taskmate-badges-card.js?v=5.6.1", + "url": "/taskmate/taskmate-badges-card.js?v=5.7.0", "type": "module" }, { "id": "5df49cd8a4eb420497b5df22cb31362c", - "url": "/taskmate/taskmate-child-card.js?v=5.6.1", + "url": "/taskmate/taskmate-child-card.js?v=5.7.0", "type": "module" }, { "id": "b44c87d0d74f468cb96c5eabc340f9ee", - "url": "/taskmate/taskmate-rewards-card.js?v=5.6.1", + "url": "/taskmate/taskmate-rewards-card.js?v=5.7.0", "type": "module" }, { "id": "787a96f9c30548708165a48457c99feb", - "url": "/taskmate/taskmate-approvals-card.js?v=5.6.1", + "url": "/taskmate/taskmate-approvals-card.js?v=5.7.0", "type": "module" }, { "id": "84031597de424ad68e7c2bc66d06b72e", - "url": "/taskmate/taskmate-points-card.js?v=5.6.1", + "url": "/taskmate/taskmate-points-card.js?v=5.7.0", "type": "module" }, { "id": "02613225844746b699bfbfac9642eca2", - "url": "/taskmate/taskmate-reorder-card.js?v=5.6.1", + "url": "/taskmate/taskmate-reorder-card.js?v=5.7.0", "type": "module" }, { "id": "7a06a07e17ba4b31b712bc91b77360b4", - "url": "/taskmate/taskmate-overview-card.js?v=5.6.1", + "url": "/taskmate/taskmate-overview-card.js?v=5.7.0", "type": "module" }, { "id": "08b42b53b33b4fa88db932455cf8d5aa", - "url": "/taskmate/taskmate-activity-card.js?v=5.6.1", + "url": "/taskmate/taskmate-activity-card.js?v=5.7.0", "type": "module" }, { "id": "15907eff51784acdba88ff694b574509", - "url": "/taskmate/taskmate-streak-card.js?v=5.6.1", + "url": "/taskmate/taskmate-streak-card.js?v=5.7.0", "type": "module" }, { "id": "1bd6bb5c0a6d4f0d916e3d82cb7fac39", - "url": "/taskmate/taskmate-weekly-card.js?v=5.6.1", + "url": "/taskmate/taskmate-weekly-card.js?v=5.7.0", "type": "module" }, { "id": "289ce5943f5a4972a593697db4c96ece", - "url": "/taskmate/taskmate-graph-card.js?v=5.6.1", + "url": "/taskmate/taskmate-graph-card.js?v=5.7.0", "type": "module" }, { "id": "d2904acee4c74a398dcc7b996c23e7e7", - "url": "/taskmate/taskmate-reward-progress-card.js?v=5.6.1", + "url": "/taskmate/taskmate-reward-progress-card.js?v=5.7.0", "type": "module" }, { "id": "46d378736fd54a26be253f2dfb27202e", - "url": "/taskmate/taskmate-leaderboard-card.js?v=5.6.1", + "url": "/taskmate/taskmate-leaderboard-card.js?v=5.7.0", "type": "module" }, { "id": "db11ae36457842fa826c7991e1d9c6f4", - "url": "/taskmate/taskmate-parent-dashboard-card.js?v=5.6.1", + "url": "/taskmate/taskmate-parent-dashboard-card.js?v=5.7.0", "type": "module" }, { "id": "ce85f301b59a412e9abfe5ffd51cb9a2", - "url": "/taskmate/taskmate-penalties-card.js?v=5.6.1", + "url": "/taskmate/taskmate-penalties-card.js?v=5.7.0", "type": "module" }, { "id": "1959e1629de2422daa8adaf87069c288", - "url": "/taskmate/taskmate-bonuses-card.js?v=5.6.1", + "url": "/taskmate/taskmate-bonuses-card.js?v=5.7.0", "type": "module" }, { "id": "2548524b269c4959bc7e0e967df943af", - "url": "/taskmate/taskmate-points-display-card.js?v=5.6.1", + "url": "/taskmate/taskmate-points-display-card.js?v=5.7.0", "type": "module" }, { "id": "36ada49368db4187a283fbbbef45454f", - "url": "/taskmate/taskmate-calendar-card.js?v=5.6.1", + "url": "/taskmate/taskmate-calendar-card.js?v=5.7.0", "type": "module" }, { "id": "67c32687acd2497b90030ef141f4b6db", - "url": "/taskmate/taskmate-photo-gallery-card.js?v=5.6.1", + "url": "/taskmate/taskmate-photo-gallery-card.js?v=5.7.0", "type": "module" }, { "id": "6f0c8348a91f4b74a9b846ab3f62621f", - "url": "/taskmate/taskmate-family-goal-card.js?v=5.6.1", + "url": "/taskmate/taskmate-family-goal-card.js?v=5.7.0", "type": "module" }, { @@ -206,7 +206,7 @@ }, { "id": "d3c3e144a91247ce8ac524814737d7f8", - "url": "/hacsfiles/lovelace-wallpanel/wallpanel.js?hacstag=3095064164663", + "url": "/hacsfiles/lovelace-wallpanel/wallpanel.js?hacstag=3095064164670", "type": "module" }, { @@ -276,7 +276,7 @@ }, { "id": "73dbd2de03de4530b451a55bfe6c46cf", - "url": "/taskmate/taskmate-routine-card.js?v=5.6.1", + "url": "/taskmate/taskmate-routine-card.js?v=5.7.0", "type": "module" }, { @@ -304,11 +304,6 @@ "url": "/climate_scheduler/static/climate-scheduler-card.js?v=1.15.1", "type": "module" }, - { - "id": "6f76aeefdbb14d87a0da4c28957efb47", - "url": "/album_slideshow_static/album-slideshow-card.js?v=1.9.1", - "type": "module" - }, { "id": "aafb0bb764874be384629a0ca0a18c53", "url": "/my_music_library/my-music-library-card.js?v=3.14.0", @@ -316,11 +311,16 @@ }, { "id": "1a4939ce1d2b47f89502176d3c5ac6e7", - "url": "/taskmate/taskmate-sounds.js?v=5.6.1", + "url": "/taskmate/taskmate-sounds.js?v=5.7.0", "type": "module" }, { - "id": "6669c4f2fe44455b96d5e652e39bea01", + "id": "2dfca9e286bb4c5fb92ac3a46332fb3b", + "url": "/album_slideshow_static/album-slideshow-card.js?v=1.10.0", + "type": "module" + }, + { + "id": "2e1a9bdf3bfd46859371e8f3389286a9", "url": "/climate_scheduler/static/climate-scheduler-card.js?v=1.15.1", "type": "module" } diff --git a/custom_components/album_slideshow/camera.py b/custom_components/album_slideshow/camera.py index 8dc12ac6..973ed67a 100644 --- a/custom_components/album_slideshow/camera.py +++ b/custom_components/album_slideshow/camera.py @@ -52,6 +52,29 @@ _SKIP_SEARCH_LIMIT = 30 _MAX_RENDER_ATTEMPTS = 10 +# Fixed floor (in items) for the pairing cooldown exclusion zone, applied on +# each side of the current index in addition to the percentage-based radius. +# Keeps tiny albums from pairing consecutive/near-consecutive shots even when +# a small percentage rounds down to zero. +_PAIR_GAP_FLOOR = 2 + + +def _pair_exclusion_radius(n: int, min_gap_percent: float) -> int: + """Items to exclude on each side of the current index for pairing. + + Combines ``_PAIR_GAP_FLOOR`` with a percentage of the album size so tiny + albums still get some separation while large albums scale + proportionally. A ``min_gap_percent`` of 0 disables the cooldown + entirely. The result is capped well below ``n / 2`` so eligible + candidates always remain, even for small albums (a ring buffer of + ``n`` items only has ``n - 1`` non-self candidates to begin with). + """ + if n <= 3 or min_gap_percent <= 0: + return 0 + radius = max(_PAIR_GAP_FLOOR, round(n * (min_gap_percent / 100.0))) + max_radius = (n - 3) // 2 + return max(0, min(radius, max_radius)) + @dataclass(frozen=True, slots=True) class _NavigationCursor: @@ -315,6 +338,7 @@ class AlbumSlideshowCamera(Camera): "aspect_ratio": self.store.aspect_ratio, "pair_divider_px": int(self.store.pair_divider_px), "pair_divider_color": self.store.pair_divider_color, + "pair_min_gap_percent": int(self.store.pair_min_gap_percent), "frame_id": self._frame_id, "navigation_buffer_size": self._buffer_depth, "previous_frames_cached": len(self._previous_frames), @@ -1129,6 +1153,27 @@ class AlbumSlideshowCamera(Camera): ) -> tuple[Image.Image, MediaItem] | None: """Find an image with the opposite orientation of the canvas. + By default (``pair_min_gap_percent`` = 0) this is the original + search: walk forward from the very next item, nearest candidate + wins, fully deterministic. Setting ``pair_min_gap_percent`` above 0 + opts into a cooldown search instead - candidates within that + percentage of the current index (wrapping on both sides, since the + album is a ring buffer) are excluded so the partner comes from a + meaningfully different part of the collection, and the remaining + candidates are shuffled before scanning so the same nearby partner + isn't picked deterministically every time. Small albums where the + cooldown would leave no candidates fall back to the deterministic + search (see ``_pair_exclusion_radius``); no eligible partner at all + (orientation, recent-repeat, or download failures) is a normal + outcome and simply returns ``None``, which the caller renders as a + single unpaired image. + + This is a pure function of ``self._index``, ``self._recent_urls`` + and ``self._rng``'s state, which is exactly what the navigation + buffer's cursor snapshots capture - so replaying a cached cursor + (Previous/Next) always reproduces the same paired frame; only + rendering a slide for the first time consumes new randomness. + Uses metadata wherever possible - only candidates without width/height metadata are downloaded and decoded for their orientation. The returned PIL image is the caller's to close. The matching ``MediaItem`` is @@ -1137,12 +1182,22 @@ class AlbumSlideshowCamera(Camera): if not items: return None n = len(items) + radius = _pair_exclusion_radius(n, self.store.pair_min_gap_percent) + if radius > 0: + excluded = {(self._index + d) % n for d in range(-radius, radius + 1)} + candidates = [idx for idx in range(n) if idx not in excluded] + self._rng.shuffle(candidates) + else: + candidates = ( + (self._index + offset) % n + for offset in range(1, min(n, limit + 1)) + ) + tries = 0 - offset = 1 - while tries < limit and offset < n: - idx = (self._index + offset) % n + for idx in candidates: + if tries >= limit: + break it = items[idx] - offset += 1 tries += 1 if it.url in self._recent_urls: diff --git a/custom_components/album_slideshow/config_flow.py b/custom_components/album_slideshow/config_flow.py index b3b0ef9a..b7690c69 100644 --- a/custom_components/album_slideshow/config_flow.py +++ b/custom_components/album_slideshow/config_flow.py @@ -1254,7 +1254,12 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): } ) return self.async_show_form( - step_id="ente", data_schema=schema, errors=errors + step_id="ente", + data_schema=schema, + errors=errors, + description_placeholders={ + "example_url": "https://albums.ente.io/?t=TOKEN#KEY" + }, ) diff --git a/custom_components/album_slideshow/const.py b/custom_components/album_slideshow/const.py index 469eab1b..6cefd24b 100644 --- a/custom_components/album_slideshow/const.py +++ b/custom_components/album_slideshow/const.py @@ -290,6 +290,13 @@ DEFAULT_ORDER_MODE = ORDER_RANDOM DEFAULT_ASPECT_RATIO = "16:9" DEFAULT_PAIR_DIVIDER_PX = 8 DEFAULT_PAIR_DIVIDER_COLOR = "#FFFFFF" +# Minimum separation (as a percentage of album size) enforced between the +# current slide's index and a candidate orientation-mismatch pairing +# partner. Helps avoid nearby photos; does not detect photo sessions. Opt-in: 0 +# (the default) keeps the original deterministic "nearest candidate first" +# search; a positive value switches to a shuffled search that excludes the +# cooldown zone around the current index. +DEFAULT_PAIR_MIN_GAP_PERCENT = 0 DEFAULT_RECURSIVE = True # Per-album download cache. Multiple albums add up: 4 × 150 MB = 600 MB # of just-in-case downloaded JPEGs. 75 MB caches roughly 10-20 photos diff --git a/custom_components/album_slideshow/icloud.py b/custom_components/album_slideshow/icloud.py index c94ff06b..c0c262a8 100644 --- a/custom_components/album_slideshow/icloud.py +++ b/custom_components/album_slideshow/icloud.py @@ -9,8 +9,8 @@ Legacy "shared streams" backend (``www.icloud.com/sharedalbum/#TOKEN``): - ``POST {base}/webstream`` ``{"streamCtag": null}`` -> ``{streamName, photos: [{photoGuid, derivatives:{:{checksum,width,height,fileSize}}, dateCreated, caption, width, height}]}``. May first answer with a - ``330`` redirect carrying an ``X-Apple-MMe-Host`` header pointing at the - correct partition host; retry there. + ``330`` redirect carrying ``X-Apple-MMe-Host`` in the JSON body (or a + response header) pointing at the correct partition host; retry there. - ``POST {base}/webasseturls`` ``{"photoGuids": [...]}`` -> ``{items: {: {url_location, url_path, url_expiry}}}``. Build the image URL as ``https://{url_location}{url_path}``; it is a signed CDN link that @@ -31,14 +31,35 @@ Apple strips GPS from shared-album web data, so there is no location. from __future__ import annotations import base64 +from asyncio import sleep as _sleep from datetime import datetime, timezone +import json +import logging +import re +from time import monotonic from typing import Any from urllib.parse import quote, urlencode +from aiohttp import ( + ClientConnectionError, + ClientError, + ClientPayloadError, + ClientSSLError, + ClientTimeout, +) import async_timeout from homeassistant.helpers.aiohttp_client import async_get_clientsession +_LOGGER = logging.getLogger(__name__) + +# CloudKit retains its existing timeout. Legacy listing/URL resolution can be +# slow for large albums; keep connection, idle-read and total time bounded. _TIMEOUT = 30 +_LEGACY_TIMEOUT = ClientTimeout(total=90, connect=15, sock_read=60) +_REQUEST_ATTEMPTS = 2 +_RETRY_DELAY_SECONDS = 1.0 +_RETRYABLE_STATUSES = {408, 500, 502, 503, 504} +_PARTITION_HOST_RE = re.compile(r"p[0-9]+-sharedstreams\.icloud\.com") _MAX_ASSETS = 20_000 # webasseturls request batch size. A single call handled 40+ guids fine in # testing; chunking keeps request bodies bounded for very large albums. @@ -277,6 +298,10 @@ def parse_photo_meta(photo: dict[str, Any]) -> dict[str, Any]: return out +class IcloudRequestError(RuntimeError): + """A request failure safe to surface without share URLs or response data.""" + + class IcloudClient: """Thin async wrapper over the iCloud shared-streams web API.""" @@ -291,62 +316,139 @@ class IcloudClient: def base_url(self) -> str: return base_url(self.token, self._host) - async def _post(self, path: str, body: dict[str, Any]) -> tuple[int, dict[str, str], bytes]: + async def _post( + self, path: str, body: dict[str, Any], *, operation: str + ) -> dict[str, Any]: + """Read JSON with a bounded retry and at most one trusted redirect. + + All calls are read-only despite using POST. Retry only the failing + request, not previously completed URL batches. Never include a share + token, response body, or raw transport exception in diagnostics. + """ session = async_get_clientsession(self.hass) - async with async_timeout.timeout(_TIMEOUT): - async with session.post( - self.base_url + path, json=body, headers=_API_HEADERS - ) as resp: - return resp.status, dict(resp.headers), await resp.read() + started = monotonic() + attempt = 1 + redirects = 0 + while True: + request_started = monotonic() + host = self._host or partition_host(self.token) + phase = "waiting for response headers" + retryable = False + try: + async with session.post( + self.base_url + path, + json=body, + headers=_API_HEADERS, + timeout=_LEGACY_TIMEOUT, + allow_redirects=False, + ) as resp: + status = resp.status + if status not in (200, 330): + detail = f"HTTP {status}" + retryable = status in _RETRYABLE_STATUSES + else: + # A usable 330 header needs no body. Do not let a + # stalled redirect body prevent reaching the new host. + target = resp.headers.get("X-Apple-MMe-Host") if status == 330 else None + payload = None + if not target: + phase = "reading response body" + raw = await resp.read() + phase = "decoding JSON" + try: + payload = json.loads(raw) + except (ValueError, UnicodeDecodeError): + payload = None + if status == 330: + phase = "handling partition redirect" + if not target and isinstance(payload, dict): + target = payload.get("X-Apple-MMe-Host") + target = target.strip().lower() if isinstance(target, str) else "" + if not _PARTITION_HOST_RE.fullmatch(target): + detail = "HTTP 330 with invalid or missing partition host" + elif redirects or target == host: + detail = "HTTP 330 partition redirect loop" + else: + # The share token must never be sent to a + # caller-supplied or lookalike redirect host. + self._host = target + redirects += 1 + _LOGGER.debug( + "iCloud %s: partition redirect %s -> %s", + operation, host, target, + ) + continue + elif isinstance(payload, dict): + _LOGGER.debug( + "iCloud %s succeeded (host=%s; endpoint=%s; " + "attempt=%d/%d; elapsed=%.1fs; total_elapsed=%.1fs)", + operation, host, path, attempt, _REQUEST_ATTEMPTS, + monotonic() - request_started, monotonic() - started, + ) + return payload + else: + detail = "Invalid JSON response (expected an object)" + except TimeoutError: + detail = ( + "TimeoutError " + f"(connect={_LEGACY_TIMEOUT.connect}s, " + f"read={_LEGACY_TIMEOUT.sock_read}s, " + f"total={_LEGACY_TIMEOUT.total}s)" + ) + retryable = True + except ClientSSLError as err: + detail = type(err).__name__ + except (ClientConnectionError, ClientPayloadError) as err: + detail = type(err).__name__ + retryable = True + except ClientError as err: + detail = type(err).__name__ + + error = IcloudRequestError( + f"iCloud {operation} failed while {phase} " + f"(host={host}; endpoint={path}; attempt={attempt}/{_REQUEST_ATTEMPTS}; " + f"elapsed={monotonic() - request_started:.1f}s; " + f"total_elapsed={monotonic() - started:.1f}s): {detail}" + ) + if not retryable or attempt >= _REQUEST_ATTEMPTS: + # Raw aiohttp errors can contain the full album URL. Suppress + # that context even when HA logs a traceback of this error. + raise error from None + _LOGGER.warning("%s; retrying in %.1fs", error, _RETRY_DELAY_SECONDS) + await _sleep(_RETRY_DELAY_SECONDS) + attempt += 1 async def async_get_photos(self) -> list[dict[str, Any]]: """Fetch the album's photo list, following a partition redirect once.""" - import json as _json - - status, headers, raw = await self._post("/webstream", {"streamCtag": None}) - redirect_host = headers.get("X-Apple-MMe-Host") - if redirect_host and redirect_host != self._host: - # Our partition guess was wrong; Apple told us the right host. - self._host = redirect_host - status, headers, raw = await self._post("/webstream", {"streamCtag": None}) - if status != 200: - raise RuntimeError(f"iCloud webstream failed: HTTP {status}") - payload = _json.loads(raw) + payload = await self._post( + "/webstream", {"streamCtag": None}, operation="photo list" + ) return parse_webstream(payload)[:_MAX_ASSETS] async def async_get_asset_urls( self, guids: list[str] ) -> dict[str, dict[str, Any]]: """Resolve signed asset URLs for photo guids, keyed by checksum.""" - import json as _json - out: dict[str, dict[str, Any]] = {} + batch_count = (len(guids) + _URL_BATCH - 1) // _URL_BATCH for start in range(0, len(guids), _URL_BATCH): chunk = guids[start : start + _URL_BATCH] - status, _headers, raw = await self._post( - "/webasseturls", {"photoGuids": chunk} + batch_number = start // _URL_BATCH + 1 + payload = await self._post( + "/webasseturls", {"photoGuids": chunk}, + operation=f"image URLs batch {batch_number}/{batch_count} ({len(chunk)} photos)", ) - if status != 200: - raise RuntimeError(f"iCloud webasseturls failed: HTTP {status}") - payload = _json.loads(raw) - items = payload.get("items") if isinstance(payload, dict) else None + items = payload.get("items") if isinstance(items, dict): out.update(items) return out async def async_validate(self) -> str | None: """Return the album name if the token works, else raise.""" - import json as _json - - status, headers, raw = await self._post("/webstream", {"streamCtag": None}) - redirect_host = headers.get("X-Apple-MMe-Host") - if redirect_host and redirect_host != self._host: - self._host = redirect_host - status, headers, raw = await self._post("/webstream", {"streamCtag": None}) - if status != 200: - raise RuntimeError(f"iCloud webstream failed: HTTP {status}") - payload = _json.loads(raw) - return payload.get("streamName") if isinstance(payload, dict) else None + payload = await self._post( + "/webstream", {"streamCtag": None}, operation="link validation" + ) + return payload.get("streamName") # --- CloudKit backend helpers --------------------------------------------- diff --git a/custom_components/album_slideshow/manifest.json b/custom_components/album_slideshow/manifest.json index 52e452b0..dd01b78f 100644 --- a/custom_components/album_slideshow/manifest.json +++ b/custom_components/album_slideshow/manifest.json @@ -8,5 +8,5 @@ "iot_class": "cloud_polling", "issue_tracker": "https://github.com/eyalgal/album_slideshow/issues", "requirements": ["Pillow", "PyNaCl>=1.5.0"], - "version": "1.9.1" + "version": "1.10.0" } diff --git a/custom_components/album_slideshow/number.py b/custom_components/album_slideshow/number.py index e35ed7c7..cdd245ef 100644 --- a/custom_components/album_slideshow/number.py +++ b/custom_components/album_slideshow/number.py @@ -20,6 +20,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry, async_add_e SlideIntervalNumber(entry, store), RefreshHoursNumber(entry, store, coordinator), PairDividerWidthNumber(entry, store), + PairMinGapPercentNumber(entry, store), NavigationBufferSizeNumber(entry, store), ImageCacheMbNumber(entry, store), ] @@ -144,6 +145,37 @@ class PairDividerWidthNumber(_BaseNumber): return +class PairMinGapPercentNumber(_BaseNumber): + _attr_icon = "mdi:arrow-expand-horizontal" + _attr_native_min_value = 0 + _attr_native_max_value = 50 + _attr_native_step = 1 + _attr_native_unit_of_measurement = "%" + + def __init__(self, entry: ConfigEntry, store: SlideshowStore) -> None: + super().__init__(entry, store) + self._attr_unique_id = f"{entry.entry_id}_pair_min_gap_percent" + self._attr_name = "Pair minimum gap (% of album)" + + @property + def native_value(self): + return int(self.store.pair_min_gap_percent) + + async def async_set_native_value(self, value: float) -> None: + self.store.pair_min_gap_percent = min(50, max(0, int(value))) + self.store.notify() + + async def async_added_to_hass(self) -> None: + await super().async_added_to_hass() + old = await self.async_get_last_state() + if old and old.state not in (None, "unknown", "unavailable"): + try: + self.store.pair_min_gap_percent = min(50, max(0, int(float(old.state)))) + self.store.notify() + except Exception: + return + + class NavigationBufferSizeNumber(_BaseNumber): _attr_icon = "mdi:page-previous-outline" _attr_native_min_value = 0 diff --git a/custom_components/album_slideshow/store.py b/custom_components/album_slideshow/store.py index 84e9d075..a354171e 100644 --- a/custom_components/album_slideshow/store.py +++ b/custom_components/album_slideshow/store.py @@ -12,6 +12,7 @@ from .const import ( DEFAULT_ASPECT_RATIO, DEFAULT_PAIR_DIVIDER_PX, DEFAULT_PAIR_DIVIDER_COLOR, + DEFAULT_PAIR_MIN_GAP_PERCENT, DEFAULT_IMAGE_CACHE_MB, DEFAULT_NAVIGATION_BUFFER_SIZE, DEFAULT_MAX_RESOLUTION, @@ -33,6 +34,7 @@ class SlideshowStore: aspect_ratio: str = DEFAULT_ASPECT_RATIO pair_divider_px: int = DEFAULT_PAIR_DIVIDER_PX pair_divider_color: str = DEFAULT_PAIR_DIVIDER_COLOR + pair_min_gap_percent: int = DEFAULT_PAIR_MIN_GAP_PERCENT image_cache_mb: int = DEFAULT_IMAGE_CACHE_MB navigation_buffer_size: int = DEFAULT_NAVIGATION_BUFFER_SIZE max_resolution: str = DEFAULT_MAX_RESOLUTION diff --git a/custom_components/album_slideshow/strings.json b/custom_components/album_slideshow/strings.json index 41af6598..4f7b1f61 100644 --- a/custom_components/album_slideshow/strings.json +++ b/custom_components/album_slideshow/strings.json @@ -132,7 +132,7 @@ }, "ente": { "title": "Ente Photos public album", - "description": "Paste a public Ente album link, for example https://albums.ente.io/?t=TOKEN#KEY. Copy the whole link including the part after the # - that fragment is the decryption key and the album cannot be read without it. No Ente account or password is needed. Leave the API endpoint blank unless you self-host Ente.", + "description": "Paste a public Ente album link, for example {example_url}. Copy the whole link including the part after the # - that fragment is the decryption key and the album cannot be read without it. No Ente account or password is needed. Leave the API endpoint blank unless you self-host Ente.", "data": { "album_name": "Album name", "ente_url": "Album share link", @@ -172,7 +172,7 @@ "nextcloud_cannot_connect": "Could not connect to Nextcloud. Check the URL, username, app password and folder path.", "invalid_nextcloud_url": "That does not look like a Nextcloud Photos public album link.", "nextcloud_public_cannot_connect": "Could not connect to that Nextcloud album. Check the link is still valid.", - "invalid_ente_url": "That does not look like an Ente public album link. It should look like https://albums.ente.io/?t=TOKEN#KEY, including the part after the #." + "invalid_ente_url": "That does not look like an Ente public album link. It should look like {example_url}, including the part after the #." ,"ente_cannot_connect": "Could not open that Ente album. The link may be expired, revoked, or password-protected." } }, diff --git a/custom_components/album_slideshow/translations/en.json b/custom_components/album_slideshow/translations/en.json index 41af6598..4f7b1f61 100644 --- a/custom_components/album_slideshow/translations/en.json +++ b/custom_components/album_slideshow/translations/en.json @@ -132,7 +132,7 @@ }, "ente": { "title": "Ente Photos public album", - "description": "Paste a public Ente album link, for example https://albums.ente.io/?t=TOKEN#KEY. Copy the whole link including the part after the # - that fragment is the decryption key and the album cannot be read without it. No Ente account or password is needed. Leave the API endpoint blank unless you self-host Ente.", + "description": "Paste a public Ente album link, for example {example_url}. Copy the whole link including the part after the # - that fragment is the decryption key and the album cannot be read without it. No Ente account or password is needed. Leave the API endpoint blank unless you self-host Ente.", "data": { "album_name": "Album name", "ente_url": "Album share link", @@ -172,7 +172,7 @@ "nextcloud_cannot_connect": "Could not connect to Nextcloud. Check the URL, username, app password and folder path.", "invalid_nextcloud_url": "That does not look like a Nextcloud Photos public album link.", "nextcloud_public_cannot_connect": "Could not connect to that Nextcloud album. Check the link is still valid.", - "invalid_ente_url": "That does not look like an Ente public album link. It should look like https://albums.ente.io/?t=TOKEN#KEY, including the part after the #." + "invalid_ente_url": "That does not look like an Ente public album link. It should look like {example_url}, including the part after the #." ,"ente_cannot_connect": "Could not open that Ente album. The link may be expired, revoked, or password-protected." } }, diff --git a/custom_components/album_slideshow/www/album-slideshow-card.js b/custom_components/album_slideshow/www/album-slideshow-card.js index 71f48519..0492589b 100644 --- a/custom_components/album_slideshow/www/album-slideshow-card.js +++ b/custom_components/album_slideshow/www/album-slideshow-card.js @@ -26,7 +26,7 @@ * tap_action: none # none | more-info */ -const VERSION = "1.9.1"; +const VERSION = "1.10.0"; const ANIMATED_TRANSITIONS = [ "fade", @@ -969,6 +969,7 @@ const LIVE_FIELDS = [ "slide_interval", "pair_divider_px", "pair_divider_color", + "pair_min_gap_percent", ]; const LIVE_SUFFIX = { @@ -980,6 +981,7 @@ const LIVE_SUFFIX = { slide_interval: "_interval", pair_divider_px: "_pair_divider_px", pair_divider_color: "_pair_divider_color", + pair_min_gap_percent: "_pair_min_gap_percent", previous_button: "_previous_button", next_button: "_next_button", refresh_button: "_refresh_button", @@ -994,6 +996,7 @@ const LIVE_LABELS = { live_slide_interval: "Slide interval (seconds)", live_pair_divider_px: "Pair divider size (px)", live_pair_divider_color: "Pair divider color", + live_pair_min_gap_percent: "Pair minimum gap (% of album)", }; function humanizeOption(value) { @@ -1189,6 +1192,19 @@ function createAlbumSlideshowCardEditorClass(Base) { if (s.pair_divider_color) { items.push({ name: "live_pair_divider_color", selector: { text: {} } }); } + if (s.pair_min_gap_percent) { + items.push({ + name: "live_pair_min_gap_percent", + selector: { + number: this._liveNumberConfig(s.pair_min_gap_percent, { + min: 0, + max: 50, + step: 1, + unit: "%", + }), + }, + }); + } return items; } @@ -1401,7 +1417,7 @@ function createAlbumSlideshowCardEditorClass(Base) { out[`live_${f}`] = e ? e.state : ""; } } - for (const f of ["slide_interval", "pair_divider_px"]) { + for (const f of ["slide_interval", "pair_divider_px", "pair_min_gap_percent"]) { if (s[f]) { const e = st(s[f]); out[`live_${f}`] = e ? Number(e.state) : null; @@ -1594,7 +1610,11 @@ function createAlbumSlideshowCardEditorClass(Base) { entity_id: id, option: value, }); - } else if (field === "slide_interval" || field === "pair_divider_px") { + } else if ( + field === "slide_interval" || + field === "pair_divider_px" || + field === "pair_min_gap_percent" + ) { hass.callService("number", "set_value", { entity_id: id, value: Number(value), diff --git a/custom_components/spook/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/__pycache__/__init__.cpython-314.pyc index f09549a46a6b28527ab57e87361906bf7324e7da..70282b5a868f976bd2df09aaecce99806b4c9dbd 100644 GIT binary patch delta 20 acmbPaG|7ltn~#@^0SF!*S+|j!T@nB@69p3h delta 20 acmbPaG|7ltn~#@^0SNZ9&)CS#E(riFNdz7M diff --git a/custom_components/spook/__pycache__/binary_sensor.cpython-314.pyc b/custom_components/spook/__pycache__/binary_sensor.cpython-314.pyc index 94f47b163d3dbd53c253f63fda7e32cb79343ad8..9dea33b5958bbe72f3f097927cc502bca4bf5fbd 100644 GIT binary patch delta 20 acmZ3_xt^0-n~#@^0SF!*S+|jU2@3!+!Ucl> delta 20 acmZ3_xt^0-n~#@^0SNZ9&)CSlgarUB_ymps diff --git a/custom_components/spook/__pycache__/button.cpython-314.pyc b/custom_components/spook/__pycache__/button.cpython-314.pyc index 4d924f714ce796f94a9a12d26e37e1dde3130e83..793d254a6f11172f1152ae86ec44be8ed16b27de 100644 GIT binary patch delta 20 acmbQiIfIj1n~#@^0SF!*S+|k9mjwVXDg{0O delta 20 acmbQiIfIj1n~#@^0SNZ9&)CS_%K`u?U<643 diff --git a/custom_components/spook/__pycache__/config_flow.cpython-314.pyc b/custom_components/spook/__pycache__/config_flow.cpython-314.pyc index e005041e74238e67a44603eaeb213beef58c4529..943807aa5b0d2472112f35e94f5b3d4d78c467e3 100644 GIT binary patch delta 20 acmaED_}Y+Ln~#@^0SF!*S+|ky5w`V%Umn>H{ObyHE)MZu!`>gY)D@W8|Qe4o#A&VCa%--5+w=`}H` zPtUh+e8}Ik*x_U2bQt7VZGy+K0)ChlPv8#R<}?c}`B6@r>DqLr1MR;I$e4_vLoqXALrz<$hqSWMIs};wrw=T#&;*n#;J# zn2`;!cwG!n+2C090j>GouB&q@FNE}hs;8sr`9hMbk!Vg$VJ5nM_y_&8b{}`5A*(XD zr?__&cheKvQ^HLpjP}?T^okd;b$}impZ*Ps7@4U6*zlqL23(?&$O4?im&pbUi(9h+ zF#9CNs^4gA^*b)biVzge)FwbcJW3k@G_jqz3lPE4>@P?QZ|;jkS6|)>P!?kgpJiAT xgUdAuBz&bhWe@0{qNrbgCSkgiF!^XzI&7^Wo|e9XX@3KlV-j|l9Urf}{s$@io%;X) delta 660 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 O+f{J<`a&YE& diff --git a/custom_components/spook/__pycache__/select.cpython-314.pyc b/custom_components/spook/__pycache__/select.cpython-314.pyc index 3f22c3bc70a27c44276a629e2f9ef8fea4d475f6..797add5131e17c0004e3d76079d69c8650628c9b 100644 GIT binary patch delta 20 acmbQiIfIj1n~#@^0SF!*S+|k9mjwVXDg{0O delta 20 acmbQiIfIj1n~#@^0SNZ9&)CS_%K`u?U<643 diff --git a/custom_components/spook/__pycache__/sensor.cpython-314.pyc b/custom_components/spook/__pycache__/sensor.cpython-314.pyc index 69589c312dce2ad19bf7cd3c2acf6934e0e0980c..082ce04351d8cd5bb297ac0de06e452f4d84f30f 100644 GIT binary patch delta 20 acmbQiIfIj1n~#@^0SF!*S+|k9mjwVXDg{0O delta 20 acmbQiIfIj1n~#@^0SNZ9&)CS_%K`u?U<643 diff --git a/custom_components/spook/__pycache__/services.cpython-314.pyc b/custom_components/spook/__pycache__/services.cpython-314.pyc index f8fbe8c533949cfd78d2f1df0462785eb775f2c8..c483de93c5145498347d0a02acff4cdd06188fa5 100644 GIT binary patch delta 22 ccmdmWpK;fHMs96BUM>b8cz9&pM(*|b09Wq^y#N3J delta 22 ccmdmWpK;fHMs96BUM>b8*v~#=Blr4z08%9e$N&HU diff --git a/custom_components/spook/__pycache__/setup_helpers.cpython-314.pyc b/custom_components/spook/__pycache__/setup_helpers.cpython-314.pyc index 60db71d4958da77f8f90f543af34caef4d0b200c..75fb47403d8d0032ee4e7283ee64aa7d8e725121 100644 GIT binary patch delta 20 acmdmNx!ICin~#@^0SF!*S+|jUg$w{XItB*- delta 20 acmdmNx!ICin~#@^0SNZ9&)CSlLIwada0L diff --git a/custom_components/spook/ectoplasms/blueprint/services/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/blueprint/services/__pycache__/__init__.cpython-314.pyc index 6c24ab3b8e3640beeae58114e819a29bf2942f6b..30d07c135c9c4597c5bd127f309afd1e5b213557 100644 GIT binary patch delta 19 ZcmX@dc#e@;`)P delta 20 acmew;`%#u#n~#@^0SNZ9&)CTQj1K@hA_ay3 diff --git a/custom_components/spook/ectoplasms/cloud/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/cloud/__pycache__/__init__.cpython-314.pyc index 9d5ef965192e3f917c38fea610f25f1e0c15d557..401895fe27bf61db79fb2f42ecaa532c91ff2393 100644 GIT binary patch delta 19 ZcmX@ec#x4>n~#@^0SF!*SvQe;8vrh81%&_r delta 19 ZcmX@ec#x4>n~#@^0SNZ9&zQ))4FD;W1dsp# diff --git a/custom_components/spook/ectoplasms/cloud/__pycache__/entity.cpython-314.pyc b/custom_components/spook/ectoplasms/cloud/__pycache__/entity.cpython-314.pyc index a46a68b0da8dcffb1075292661bd44cf56ab03e2..0bde8db352dbecdf22f21cf7f3a3d1d829226d93 100644 GIT binary patch delta 19 ZcmeAc=@#ME=HumJ0D^}{)-B}b0stu61fu`| delta 19 ZcmeAc=@#ME=HumJ0D}GOGZu1l0RSWh1Fir7 diff --git a/custom_components/spook/ectoplasms/cloud/__pycache__/switch.cpython-314.pyc b/custom_components/spook/ectoplasms/cloud/__pycache__/switch.cpython-314.pyc index 41ce71df46c0080135b9b42825076d06b2e3ee71..1af9899ecd06bd2124d28381dc440c6cc415a2e8 100644 GIT binary patch delta 20 acmeBj?{eqX=HumJ0D^}{)@|gjR|Wtz(FLyn delta 20 acmeBj?{eqX=HumJ0D}GOGd6P9D+2&92L!qR diff --git a/custom_components/spook/ectoplasms/group/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/group/__pycache__/__init__.cpython-314.pyc index f5a53a52c97bd813d0aaf2daa5bd4177d7ecaf0e..a6f24f4ebe799b029ffaa81b83f77098a77109d0 100644 GIT binary patch delta 19 ZcmX@ec#x4>n~#@^0SF!*SvQe;8vrh81%&_r delta 19 ZcmX@ec#x4>n~#@^0SNZ9&zQ))4FD;W1dsp# diff --git a/custom_components/spook/ectoplasms/homeassistant/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/__pycache__/__init__.cpython-314.pyc index 33c0e8f40dbd70f260d4f184b2ac8fde47a4d0e4..a7a42a51aebc7aba121835470686cb4fb2f01c05 100644 GIT binary patch delta 19 ZcmX@fc#@G@n~#@^0SF!*SvQe;9{?|r1)Tr@ delta 19 ZcmX@fc#@G@n~#@^0SNZ9&zQ))4*)8>1gHQ2 diff --git a/custom_components/spook/ectoplasms/homeassistant/__pycache__/button.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/__pycache__/button.cpython-314.pyc index 4202ce39631eaaad44986dc625da3240ae1b3d62..c721e94e02e069d1357e5231aaad8dae5bc33429 100644 GIT binary patch delta 20 acmZ3juv&pzn~#@^0SF!*S+|i}K>z?WY6UR> delta 20 acmZ3juv&pzn~#@^0SNZ9&)CSVAOHX^paeVs diff --git a/custom_components/spook/ectoplasms/homeassistant/__pycache__/device.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/__pycache__/device.cpython-314.pyc index a062e80b90c3163690a985916ecea3c4c73325f8..edf9895c65e216f60296389a82800b3d1f68dbe7 100644 GIT binary patch delta 20 acmcbnd`+2Kn~#@^0SF!*S+|k*UHj|Mpa delta 20 acmcbnd`+2Kn~#@^0SNZ9&)CR)S`Yv>#RWtF diff --git a/custom_components/spook/ectoplasms/homeassistant/__pycache__/entity.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/__pycache__/entity.cpython-314.pyc index 9f954cad28d1030d46be8cececa518a91131f226..220cc09be154f814dfb32e6c1db42898910fa481 100644 GIT binary patch delta 20 acmcb`dyAJ_n~#@^0SF!*S+|kgokz1ROmx}=i9v)e@k-NSQ091encmMzZ delta 22 ccmeDB%h>gokz1ROmx}=i_Os8}$X#Ct08X|Bg8%>k diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/__init__.cpython-314.pyc index fa1e0f1c3a01e2ea6d2cc1a9a4c1dce4495ef46c..d199d25adca305c22e2bb9b39626a5b8c042464c 100644 GIT binary patch delta 20 acmew*_)Cymn~#@^0SF!*S+|kp-2|`z diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/add_area_to_floor.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/add_area_to_floor.cpython-314.pyc index eef699bc881632d0420dffba8d87408b61425862..4d65c47dd6f7968e08f33d6104e5214241937951 100644 GIT binary patch delta 20 acmdllykD4Gn~#@^0SF!*S+|jU3nu_JuLaBi delta 20 acmdllykD4Gn~#@^0SNZ9&)CSlg%bcUid_id_Yafn~#@^0SF!*S+|ipi3Yafn~#@^0SNZ9&)CSF#03C1It1hZ diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/create_area.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/create_area.cpython-314.pyc index b83151bc11aacdf272b388d967dc34f308d92620..ea23bd022004b2e2baf7e34630756aecb8c177e8 100644 GIT binary patch delta 20 acmdlkuw8&#n~#@^0SF!*S+|i}hXVjK0tGDq delta 20 acmdlkuw8&#n~#@^0SNZ9&)CSV!vO#;I0QHV diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/create_floor.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/create_floor.cpython-314.pyc index f140ecc95d2ca1f6385b15d858777271f7ecfb1a..e66d970a30ae870d2d7f23e45da179a8050f4305 100644 GIT binary patch delta 20 acmew%_(PCen~#@^0SF!*S+|kZ4u?x=HumJ0D^}{)@|gjZ4u?x=HumJ0D}GOGd6NpasdD*_5>>c diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/delete_all_orphaned_entities.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/delete_all_orphaned_entities.cpython-314.pyc index 79dbd2da05ba5d2817a54f0c622f380e2b66aa09..76ccd3d25149916cd519ed58f60f91273db1e7ff 100644 GIT binary patch delta 20 acmZ21uvmawn~#@^0SF!*S+|i}f&&0B;so&k delta 20 acmZ21uvmawn~#@^0SNZ9&)CQdx4i*n~#@^0SF!*S+|ksDcddx4i*n~#@^0SNZ9&)CR)lnnqfvIP48 diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/delete_floor.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/delete_floor.cpython-314.pyc index 7b18ff8cc4abf446fe35989913042dc30cd76607..bcedbfe0aacca76f97fadf9ebfd28375685906f9 100644 GIT binary patch delta 20 acmcb{dySV{n~#@^0SF!*S+|kdx4i*n~#@^0SF!*S+|ksDcddx4i*n~#@^0SNZ9&)CR)lnnqfvIP48 diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/disable_config_entry.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/disable_config_entry.cpython-314.pyc index 8cdac1af19447e09b4b3b20060aee1fa7c03fbb8..84df347f5214cc3cc696d056a9f5ae8f775d3d4a 100644 GIT binary patch delta 20 acmZn?XcFMo=HumJ0D^}{)@|he&JF-Axdn{? delta 20 acmZn?XcFMo=HumJ0D}GOGd6O6X9oZ$?*y0t diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/disable_device.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/disable_device.cpython-314.pyc index 1099bec6216265fc01e9a8c5fccdb0779034f811..3f67114866522ae2921e3fff5ddfc98e6279b6f8 100644 GIT binary patch delta 20 acmbQrKb4C delta 20 acmca4bV-O?n~#@^0SNZ9&)CTA&ItfAxde^? diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/enable_config_entry.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/enable_config_entry.cpython-314.pyc index 82096871d58ad8d73c1d25ba6b71e829af5b39cf..aca120c265c37c6196136295ab6dfad8ac6bb1dc 100644 GIT binary patch delta 20 acmeC=@8sv!=HumJ0D^}{)@|gjV+Q~&tpy+e delta 20 acmeC=@8sv!=HumJ0D}GOGd6P9u>$}n;{+=J diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/enable_device.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/enable_device.cpython-314.pyc index 3b00bd3f7b3e3d638da24d1b06cfd2f913bffbca..57139f2d110388494f5f09a66db385462520a865 100644 GIT binary patch delta 20 acmZqYZ|CRM=HumJ0D^}{)@|gjVFv&$T?HBd delta 20 acmZqYZ|CRM=HumJ0D}GOGd6P9umb=mlLRFI diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/enable_entity.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/enable_entity.cpython-314.pyc index b5a2cf196f6603f41f3a2e1db2955f2b0e415c2d..5af55d7416b455696389553af8ef24739d64dcc9 100644 GIT binary patch delta 20 acmZqYZ|CRM=HumJ0D^}{)@|gjVFv&$T?HBd delta 20 acmZqYZ|CRM=HumJ0D}GOGd6P9umb=mlLRFI diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/enable_polling.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/enable_polling.cpython-314.pyc index 0b44bfad2a639a9bc3f406ae64d2cd8421630728..5c3c970896f4ec4e89784bded7029b4535b82307 100644 GIT binary patch delta 20 acmdlbuuFhjn~#@^0SF!*S+|i}p926idIdHB delta 20 acmdlbuuFhjn~#@^0SNZ9&)CSV&jA1~umnK> diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/enable_user.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/enable_user.cpython-314.pyc index 28325a219fd5a012a62fb80cd28c66ee5de9a6fb..124d27c155c2a12f354dce0fa19698a6ca4b14f1 100644 GIT binary patch delta 20 acmX>nbWVs{n~#@^0SF!*S+|kfnG*mv;{|sB delta 20 acmX>nbWVs{n~#@^0SNZ9&)CTA%n1N883cj= diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/hide_entity.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/hide_entity.cpython-314.pyc index 21120045a6b31e24b26620e8387c09dff9d86033..acfdddf8740dec4a6efd1c7c748dcfde46b30631 100644 GIT binary patch delta 20 acmaFH|BRnon~#@^0SF!*S+|k>?gg~~ delta 20 acmZpdYM0{H=HumJ0D}GOGd6Pn;Q;_DBm}?! diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/remove_alias_from_area.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/remove_alias_from_area.cpython-314.pyc index 44184c408b441af818aa9821da1853028446d153..4a678b171d2dd76f87c3d85fe840f1aeb13086c2 100644 GIT binary patch delta 20 acmdljyjz%Cn~#@^0SF!*S+|jU11A7B4+X#g delta 20 acmdljyjz%Cn~#@^0SNZ9&)CSlffE2QMFh(L diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/remove_alias_from_floor.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/remove_alias_from_floor.cpython-314.pyc index ab8c46dd361bd872be06bfba0db5a9d6893e82b3..cae2d1209b6873a751f902ca32c766d98e601709 100644 GIT binary patch delta 20 acmX>id_id_%H3n~#@^0SF!*S+|jU1{VM_m<4?R delta 20 acmZ21x>%H3n~#@^0SNZ9&)CR4g9`vG&IE`6 diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/remove_label_from_entity.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/remove_label_from_entity.cpython-314.pyc index 3dabf47954786977bf930656424613c9a003117c..0753a099bac4da5d75eb4394d476274b937f0877 100644 GIT binary patch delta 20 acmeAa?G)wK=HumJ0D^}{)@|gj;{pIKhy^bI delta 20 acmeAa?G)wK=HumJ0D}GOGd6P9aRC4*z63e| diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/rename_entity.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/rename_entity.cpython-314.pyc index 5444e9665e41a20402bfe8573b7283e66933d000..bbc16f9ab073095872cf9fb4d2a53dc2deced527 100644 GIT binary patch delta 20 acmZn^XcXYq=HumJ0D^}{)@|he#tr~2kp+qX delta 20 acmZn^XcXYq=HumJ0D}GOGd6O6V+Q~y#{`uC diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/restart.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/restart.cpython-314.pyc index c2aff846778d7bdbd7b864c256d417633f63b21c..aaf2e32e1c01ec595564b875743ad435ab482623 100644 GIT binary patch delta 20 acmZn>Z4u?x=HumJ0D^}{)@|gjZ4u?x=HumJ0D}GOGd6NpasdD*_5>>c diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/set_area_aliases.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/set_area_aliases.cpython-314.pyc index 74b252774dab8606bf0e1274237493b5954ed3c7..e91bc729c0a78ca29d41e5c873245e689e1239ae 100644 GIT binary patch delta 20 acmZ20v{r~)n~#@^0SF!*S+|i}i4y=ay9E>g delta 20 acmZ20v{r~)n~#@^0SNZ9&)CSV#0dZ_@dO_L diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/set_floor_aliases.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/set_floor_aliases.cpython-314.pyc index 9e9b036cfb7b0aaf1cb7924e0bedcaddf1ee2ad4..63ffa5ca8eeba99270493f889de5bcca76b64968 100644 GIT binary patch delta 20 acmdliv{{H-n~#@^0SF!*S+|i}gA)KVs|6+i delta 20 acmdliv{{H-n~#@^0SNZ9&)CSV!3h8@;RG=N diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/unhide_entity.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/unhide_entity.cpython-314.pyc index 3c542b8a66e96467eb3f0bccec8c81766cff0232..a8f23f718003bd567bf1255a99b7ee41eea52560 100644 GIT binary patch delta 20 acmZqWZ{_FK=HumJ0D^}{)@|gjVg~>%4Fwbc delta 20 acmZqWZ{_FK=HumJ0D}GOGd6Npu>$}nLj)fH diff --git a/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/update_entity_id.cpython-314.pyc b/custom_components/spook/ectoplasms/homeassistant/services/__pycache__/update_entity_id.cpython-314.pyc index dc3544605ecea0f6f970abcc0b4a1d99631003b5..22c5f5e908b5cfab42a375739416746cddfc3d3c 100644 GIT binary patch delta 20 acmbQlKZ&1Pn~#@^0SF!*S+|k9ogDx#6$Lv0 delta 20 acmbQlKZ&1Pn~#@^0SNZ9&)CS_&JF-6O9Vy$ diff --git a/custom_components/spook/ectoplasms/input_number/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/input_number/__pycache__/__init__.cpython-314.pyc index c36416987cb392fcc1f83e7afb9b79f45391d241..82a65bf747fa193eff8942d4535ad9477df00786 100644 GIT binary patch delta 19 ZcmX@Xc!H5zn~#@^0SF!*SvQe;F90uW1)2Z= delta 19 ZcmX@Xc!H5zn~#@^0SNZ9&zQ))7XT`k1f>7~ diff --git a/custom_components/spook/ectoplasms/input_number/services/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/input_number/services/__pycache__/__init__.cpython-314.pyc index f92366c3903968f0375508ce8763ce03bc74b940..3aceb64ba06b551bd8cc62e1c6afdbed02c1cab0 100644 GIT binary patch delta 20 acmZ22w_1){n~#@^0SF!*S+|i}fgb=gAq6Y| delta 20 acmZ22w_1){n~#@^0SNZ9&)CSVzz+Z}R|Gcz diff --git a/custom_components/spook/ectoplasms/input_number/services/__pycache__/create.cpython-314.pyc b/custom_components/spook/ectoplasms/input_number/services/__pycache__/create.cpython-314.pyc index 9389455c68ef725225db24eabce23c561964b7e4..383a2179350b10baf82ade821e2969558fc61188 100644 GIT binary patch delta 20 acmaE$`9PCfn~#@^0SF!*S+|kb{ diff --git a/custom_components/spook/ectoplasms/input_number/services/__pycache__/decrement.cpython-314.pyc b/custom_components/spook/ectoplasms/input_number/services/__pycache__/decrement.cpython-314.pyc index ffaab1fd241e50e23c630464e8342c7c634236b3..50fddfab089eb5c443378dfe99f465bbb6fc742c 100644 GIT binary patch delta 20 acmca1ctem|n~#@^0SF!*S+|kmcubI6n~#@^0SF!*S+|jUHwOSWeg)hB delta 20 acmX>mcubI6n~#@^0SNZ9&)CSln*#tbv;^k> diff --git a/custom_components/spook/ectoplasms/input_number/services/__pycache__/increment.cpython-314.pyc b/custom_components/spook/ectoplasms/input_number/services/__pycache__/increment.cpython-314.pyc index 52dac9a51bf36f3c897c50ed43170da60d0f461d..cfa1544378a2960a24e9bdf3141ae496a3ff698d 100644 GIT binary patch delta 20 acmca1ctem|n~#@^0SF!*S+|k7~ diff --git a/custom_components/spook/ectoplasms/input_select/services/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/input_select/services/__pycache__/__init__.cpython-314.pyc index fe81f9db2f0d4597702ed16e26de3de7e458a620..4502a1efeb482d17d4056347464f20bb84236dd0 100644 GIT binary patch delta 19 Zcmcb}c#)A?n~#@^0SF!*SvQgU7yvN21+@SG delta 19 Zcmcb}c#)A?n~#@^0SNZ9&zQ)43;-+S1i%0Q diff --git a/custom_components/spook/ectoplasms/input_select/services/__pycache__/random.cpython-314.pyc b/custom_components/spook/ectoplasms/input_select/services/__pycache__/random.cpython-314.pyc index db128ab419837cbd1f1bf941e310b8da73913b1d..4bb3e4e708e8bf28f0a554bef3755d7bef999c8c 100644 GIT binary patch delta 20 acmbQnHjRy2n~#@^0SF!*S+|j!n;8HtZ3M9Z delta 20 acmbQnHjRy2n~#@^0SNZ9&)CS#%?to1qXWDE diff --git a/custom_components/spook/ectoplasms/input_select/services/__pycache__/shuffle.cpython-314.pyc b/custom_components/spook/ectoplasms/input_select/services/__pycache__/shuffle.cpython-314.pyc index 746cd47c9e1490c38bf1a403c9a2471859f0e2d6..8e108a6b3b3c37a3faac5db5d10d56abdc59f753 100644 GIT binary patch delta 20 acmeC;?c(Lu=HumJ0D^}{)@|gjX9EB&j0GM5 delta 20 acmeC;?c(Lu=HumJ0D}GOGd6P9vjG4n!UQP* diff --git a/custom_components/spook/ectoplasms/input_select/services/__pycache__/sort.cpython-314.pyc b/custom_components/spook/ectoplasms/input_select/services/__pycache__/sort.cpython-314.pyc index f0ff768a8531e5395fdd8548e30c1b043af44a4c..f6983466267f18761b65b519f20b57cc6e102248 100644 GIT binary patch delta 20 acmcb|bB~8xn~#@^0SF!*S+|ipm<<3qhy|Dc delta 20 acmcb|bB~8xn~#@^0SNZ9&)CQv%mx56z67HH diff --git a/custom_components/spook/ectoplasms/integration/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/integration/__pycache__/__init__.cpython-314.pyc index 37d88c9d00a4423f148eb7b85fce2d3c4e0e30b6..11be7e4e824a8c3afef03b1c504f802e651d4905 100644 GIT binary patch delta 19 ZcmX@kc$|@2n~#@^0SF!*SvQe;4*)Mm1(yH- delta 19 ZcmX@kc$|@2n~#@^0SNZ9&zQ))2LLK^1fl={ diff --git a/custom_components/spook/ectoplasms/lovelace/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/lovelace/__pycache__/__init__.cpython-314.pyc index 39045c35d8e54350ace5c2c535a205b9726b46ef..6e4601b818e4db6314a7557e89e19f58ef360381 100644 GIT binary patch delta 19 ZcmX@Yc!ZH#n~#@^0SF!*SvQe;Cjc(k1&#m! delta 19 ZcmX@Yc!ZH#n~#@^0SNZ9&zQ))696g$1epK; diff --git a/custom_components/spook/ectoplasms/number/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/number/__pycache__/__init__.cpython-314.pyc index 0a28a4b454a191ac4ebce83cd866a54a33da1a68..774249904b6b3514083e60ea6400bfb67397e291 100644 GIT binary patch delta 19 ZcmX@ac!-f(n~#@^0SF!*SvQe;I{+?@1&9Cu delta 19 ZcmX@ac!-f(n~#@^0SNZ9&zQ))9RMl01d{*& diff --git a/custom_components/spook/ectoplasms/number/services/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/number/services/__pycache__/__init__.cpython-314.pyc index c752394ecd3d10495eeffd42e468ac025c88d9d6..0d7f0a6f3a0d698790628499448a33f56f7e6185 100644 GIT binary patch delta 20 acmZ3+xr~!rn~#@^0SF!*S+|jUHVXhTS_NnT delta 20 acmZ3+xr~!rn~#@^0SNZ9&)CR4n*{(XkOXr8 diff --git a/custom_components/spook/ectoplasms/number/services/__pycache__/decrement.cpython-314.pyc b/custom_components/spook/ectoplasms/number/services/__pycache__/decrement.cpython-314.pyc index b802b7fd2b8204be7334db8f331a3818bc46ef6f..f09e5dfcee00c57fbc8442951067127e6f9449a8 100644 GIT binary patch delta 20 acmdlfyi=H4n~#@^0SF!*S+|jU9VY-azXiGg delta 20 acmdlfyi=H4n~#@^0SNZ9&)CSljuQYc^#sKL diff --git a/custom_components/spook/ectoplasms/number/services/__pycache__/increment.cpython-314.pyc b/custom_components/spook/ectoplasms/number/services/__pycache__/increment.cpython-314.pyc index d1c94830f5ba7ccf9e37b84e9c93cf2129ce515d..ae89e9e106997bb51a5e44a883a89d6732794fb9 100644 GIT binary patch delta 20 acmdlfyi=H4n~#@^0SF!*S+|jU9VY-azXiGg delta 20 acmdlfyi=H4n~#@^0SNZ9&)CSljuQYc^#sKL diff --git a/custom_components/spook/ectoplasms/number/services/__pycache__/max.cpython-314.pyc b/custom_components/spook/ectoplasms/number/services/__pycache__/max.cpython-314.pyc index c1a191efe14dfcc0d1724a0978e5e5b84fd8b23c..76ca2cfcd00177c32d7942b432f5002655ebc72e 100644 GIT binary patch delta 20 acmX@YdxV!;n~#@^0SF!*S+|jUCmR4ZoCVAP delta 20 acmX@YdxV!;n~#@^0SNZ9&)CSllMMhc(gfE4 diff --git a/custom_components/spook/ectoplasms/number/services/__pycache__/min.cpython-314.pyc b/custom_components/spook/ectoplasms/number/services/__pycache__/min.cpython-314.pyc index 9a80e7c243de5e081827b4679a74f74a52504c7e..bf7f6b07796affc3b05ff8b492be24608151f887 100644 GIT binary patch delta 20 acmX@YdxV!;n~#@^0SF!*S+|jUCmR4ZoCVAP delta 20 acmX@YdxV!;n~#@^0SNZ9&)CSllMMhc(gfE4 diff --git a/custom_components/spook/ectoplasms/person/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/person/__pycache__/__init__.cpython-314.pyc index 8efa7e2f63c9ed15b673fb82708204f30687c5bc..48ae12e1c92fd076fe3bf0e118eace120e4e1944 100644 GIT binary patch delta 19 ZcmX@ac!-f(n~#@^0SF!*SvQe;I{+?@1&9Cu delta 19 ZcmX@ac!-f(n~#@^0SNZ9&zQ))9RMl01d{*& diff --git a/custom_components/spook/ectoplasms/person/services/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/person/services/__pycache__/__init__.cpython-314.pyc index 558960e230648e7ed5d796fe336420143fb4a86b..a1927cb1e7ccb5c2528182976a88487653d519f3 100644 GIT binary patch delta 19 ZcmX@jc$$%0n~#@^0SF!*SvQgU001xB1)~4} delta 19 ZcmX@jc$$%0n~#@^0SNZ9&zQ)4001in1g-!8 diff --git a/custom_components/spook/ectoplasms/person/services/__pycache__/add_device_tracker.cpython-314.pyc b/custom_components/spook/ectoplasms/person/services/__pycache__/add_device_tracker.cpython-314.pyc index c190cad1dc3532137478e84d37eed0b9a41ba028..d9d6c5235b450615da7737005f43b62e568b9300 100644 GIT binary patch delta 20 acmbO#K2@Asn~#@^0SF!*S+|k9iyHtiu?1KF delta 20 acmbO#K2@Asn~#@^0SNZ9&)CS_#SH)|=LBN_ diff --git a/custom_components/spook/ectoplasms/person/services/__pycache__/remove_device_tracker.cpython-314.pyc b/custom_components/spook/ectoplasms/person/services/__pycache__/remove_device_tracker.cpython-314.pyc index ad72e436e486776f60053cd42b99e812fb737bbe..9c2b591e3a7c4e80caec4d000792535b98a1c497 100644 GIT binary patch delta 20 acmdlkzFnMKn~#@^0SF!*S+|jU4L1Nb0R_GQ delta 20 acmdlkzFnMKn~#@^0SNZ9&)CSlh8qAdHw4K5 diff --git a/custom_components/spook/ectoplasms/proximity/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/proximity/__pycache__/__init__.cpython-314.pyc index 3f96ba8de9364a505f4a2396bc43d7ce6e90b57f..5e05d220050d835d53fe52bea94d4b0e7ef60235 100644 GIT binary patch delta 19 ZcmX@gc$AS_n~#@^0SF!*SvQe;7XU8(1(5&% delta 19 ZcmX@gc$AS_n~#@^0SNZ9&zQ))3jiu81e^c> diff --git a/custom_components/spook/ectoplasms/recorder/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/recorder/__pycache__/__init__.cpython-314.pyc index ab2f0c6d79fcd8d33371ac007aba52d22aa1ba90..58933d698c3bba074e0a99acce97310f296cd28b 100644 GIT binary patch delta 19 ZcmX@Yc!ZH#n~#@^0SF!*SvQe;Cjc(k1&#m! delta 19 ZcmX@Yc!ZH#n~#@^0SNZ9&zQ))696g$1epK; diff --git a/custom_components/spook/ectoplasms/recorder/services/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/recorder/services/__pycache__/__init__.cpython-314.pyc index 091f046696a0b4b4dfda40ee2d63fcd7584b7723..ff3fca8713ceb51684ae56f24b05293c5f52804b 100644 GIT binary patch delta 19 ZcmX@hc$Se{n~#@^0SF!*SvQgU5CAYG1*rf4 delta 19 ZcmX@hc$Se{n~#@^0SNZ9&zQ)42mmWk1hfDE diff --git a/custom_components/spook/ectoplasms/recorder/services/__pycache__/import_statistics.cpython-314.pyc b/custom_components/spook/ectoplasms/recorder/services/__pycache__/import_statistics.cpython-314.pyc index 043bade17f6ffa6a28ab886f7215140dde2005ea..aa0ae1f282cecdc3c5b70de78ad1624a292e5149 100644 GIT binary patch delta 20 acmeyX@K=Fbn~#@^0SF!*S+|k9NB{sqItC{I delta 20 acmeyX@K=Fbn~#@^0SNZ9&)CRaBme+Aa0M~| diff --git a/custom_components/spook/ectoplasms/repairs/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/repairs/__pycache__/__init__.cpython-314.pyc index 18af60882f23f537977a12698afa5a06a0dc0360..ac786c94b054ee87f9381f9b9cc0a7ee56f1f1f1 100644 GIT binary patch delta 19 ZcmX@ic$kq}n~#@^0SF!*SvQe;2LLX!1&aUx delta 19 ZcmX@ic$kq}n~#@^0SNZ9&zQ))0{|)B1eO2* diff --git a/custom_components/spook/ectoplasms/repairs/__pycache__/button.cpython-314.pyc b/custom_components/spook/ectoplasms/repairs/__pycache__/button.cpython-314.pyc index 2920a74a51a4a26665ea3e5cd3fc37c8dcb12b1c..05db3698ae16feaab194df89ff69096712548c55 100644 GIT binary patch delta 20 acmaDU{Zg7+n~#@^0SF!*S+|k<9xnhsV+LLT delta 20 acmaDU{Zg7+n~#@^0SNZ9&)CR)j~4(qnFVP8 diff --git a/custom_components/spook/ectoplasms/repairs/__pycache__/entity.cpython-314.pyc b/custom_components/spook/ectoplasms/repairs/__pycache__/entity.cpython-314.pyc index 786b0f5e501c4133b485149b08fc3960ca351474..9b2772c7cb99baa2307bb97a20fdaae51e9b39c1 100644 GIT binary patch delta 20 acmdnRyNj1wn~#@^0SF!*S+|jUJsSWu3rrk;GD=HumJ0D^}{)@|fwk;GD=HumJ0D}GOGd6NFasvP;TLZ=b diff --git a/custom_components/spook/ectoplasms/repairs/services/__pycache__/ignore_all.cpython-314.pyc b/custom_components/spook/ectoplasms/repairs/services/__pycache__/ignore_all.cpython-314.pyc index d032f9d5ed4006b56c90996d71ebaba04b1b5b30..ab1bc57ad8d47a95898bbff65cfbf1348c2fe607 100644 GIT binary patch delta 20 acmdnZvzv!on~#@^0SF!*S+|kffDHgN5Cty) delta 20 acmdnZvzv!on~#@^0SNZ9&)CRqzy<&=Mg%$l diff --git a/custom_components/spook/ectoplasms/repairs/services/__pycache__/remove.cpython-314.pyc b/custom_components/spook/ectoplasms/repairs/services/__pycache__/remove.cpython-314.pyc index adf323c739871fcb4acb8ceb8bd727fe92586ee5..0670504e69f399196e12f3134aabd33fb6a469a8 100644 GIT binary patch delta 20 acmcb@dxe)n~#@^0SF!*SvQe;8vrh81%&_r delta 19 ZcmX@ec#x4>n~#@^0SNZ9&zQ))4FD;W1dsp# diff --git a/custom_components/spook/ectoplasms/script/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/script/__pycache__/__init__.cpython-314.pyc index abf64ecde7f342cf42a236d05bef1729902d3411..2ede262ff566aafbd468ee0507efbb5572727926 100644 GIT binary patch delta 19 ZcmX@ac!-f(n~#@^0SF!*SvQe;I{+?@1&9Cu delta 19 ZcmX@ac!-f(n~#@^0SNZ9&zQ))9RMl01d{*& diff --git a/custom_components/spook/ectoplasms/select/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/select/__pycache__/__init__.cpython-314.pyc index 4d33c5e838b362d22e3a46af2eccfc5f799442da..e59a916de73b849dba6f89875a0e63aa8808d4ac 100644 GIT binary patch delta 19 ZcmX@ac!-f(n~#@^0SF!*SvQe;I{+?@1&9Cu delta 19 ZcmX@ac!-f(n~#@^0SNZ9&zQ))9RMl01d{*& diff --git a/custom_components/spook/ectoplasms/select/services/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/select/services/__pycache__/__init__.cpython-314.pyc index 77bd84c11a9933797f0d1a3f215c07eb7b626389..65e641dbfca23a0083c21ef4f7129e1b697b9338 100644 GIT binary patch delta 19 ZcmX@jc$$%0n~#@^0SF!*SvQgU001xB1)~4} delta 19 ZcmX@jc$$%0n~#@^0SNZ9&zQ)4001in1g-!8 diff --git a/custom_components/spook/ectoplasms/select/services/__pycache__/random.cpython-314.pyc b/custom_components/spook/ectoplasms/select/services/__pycache__/random.cpython-314.pyc index 3717ce681af7c251077eaf65d21e6cb4e5147373..a83852abea9b2ba491a384b62e0d4dbf33043202 100644 GIT binary patch delta 20 acmeAa=oH}A=HumJ0D^}{)@|he#|{84(FLLa delta 20 acmeAa=oH}A=HumJ0D}GOGd6PnV+Q~!2L!DE diff --git a/custom_components/spook/ectoplasms/spook/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/spook/__pycache__/__init__.cpython-314.pyc index 5b2c54ec52d5399e8fcf4d380a237fe59718a5d4..e74be3520dffa280903b9b70dcc9b90feb2142a0 100644 GIT binary patch delta 19 ZcmX@ec#x4>n~#@^0SF!*SvQe;8vrh81%&_r delta 19 ZcmX@ec#x4>n~#@^0SNZ9&zQ))4FD;W1dsp# diff --git a/custom_components/spook/ectoplasms/spook/services/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/spook/services/__pycache__/__init__.cpython-314.pyc index a8578c7344f0844206bcfc265b0099e161fd4843..d50aa466a92774d8db8d5c2fd4485878901b323e 100644 GIT binary patch delta 19 ZcmX@bc#4r*n~#@^0SF!*SvQe;KL9Vb1)u-` delta 19 ZcmX@bc#4r*n~#@^0SNZ9&zQ))9{?)h1gii5 diff --git a/custom_components/spook/ectoplasms/spook/services/__pycache__/boo.cpython-314.pyc b/custom_components/spook/ectoplasms/spook/services/__pycache__/boo.cpython-314.pyc index 520b89f5b5dc520827d13980e16a9f7d17aea405..87f8dcac3d7f9b145efa886d0a5551068b94dae6 100644 GIT binary patch delta 20 acmbQqHIs{5n~#@^0SF!*S+|j!j}-tecLc-$ delta 20 acmbQqHIs{5n~#@^0SNZ9&)CS##|i)_tpm>h diff --git a/custom_components/spook/ectoplasms/spook/services/__pycache__/random_fail.cpython-314.pyc b/custom_components/spook/ectoplasms/spook/services/__pycache__/random_fail.cpython-314.pyc index 67b341ab5a6e216ac24b12435ca6234c17a0ad90..44c1f5e991f66bc5b0ede1a799c92d2ca5ccdff3 100644 GIT binary patch delta 20 acmZ3_y`Gy}n~#@^0SF!*S+|jU2`d0I3k8S( delta 20 acmZ3_y`Gy}n~#@^0SNZ9&)CSlgcSfSK?IWk diff --git a/custom_components/spook/ectoplasms/switch_as_x/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/switch_as_x/__pycache__/__init__.cpython-314.pyc index ff2eac46e3ba4a0e7095dd27e5364c8b54d664c9..8f706c55345dfa55b15badb6d3a135f9f83ed80e 100644 GIT binary patch delta 19 ZcmX@kc$|@2n~#@^0SF!*SvQe;4*)Mm1(yH- delta 19 ZcmX@kc$|@2n~#@^0SNZ9&zQ))2LLK^1fl={ diff --git a/custom_components/spook/ectoplasms/timer/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/timer/__pycache__/__init__.cpython-314.pyc index 7e2dd18f5dd479ed5995e2a1d8de9144adeb425e..487e9c5a02e125f033eea0ee8483a9a6224c96dc 100644 GIT binary patch delta 19 ZcmX@ec#x4>n~#@^0SF!*SvQe;8vrh81%&_r delta 19 ZcmX@ec#x4>n~#@^0SNZ9&zQ))4FD;W1dsp# diff --git a/custom_components/spook/ectoplasms/timer/services/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/timer/services/__pycache__/__init__.cpython-314.pyc index c3d45114e384158540cb25c3c7009a8f2bc61053..96a21744427329dd8fd1b2631013ffc4abff99d6 100644 GIT binary patch delta 19 ZcmX@bc#4r*n~#@^0SF!*SvQe;KL9Vb1)u-` delta 19 ZcmX@bc#4r*n~#@^0SNZ9&zQ))9{?)h1gii5 diff --git a/custom_components/spook/ectoplasms/timer/services/__pycache__/set_duration.cpython-314.pyc b/custom_components/spook/ectoplasms/timer/services/__pycache__/set_duration.cpython-314.pyc index 2bdea4d75445a403b008c877aa8cf7ed4655e500..6541b2fcd45f4dce8705b7216a5c276fb18bbe5e 100644 GIT binary patch delta 20 acmaDN_C$n~#@^0SF!*SvQe;8vrh81%&_r delta 19 ZcmX@ec#x4>n~#@^0SNZ9&zQ))4FD;W1dsp# diff --git a/custom_components/spook/ectoplasms/utility_meter/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/utility_meter/__pycache__/__init__.cpython-314.pyc index c2be39f01a50dd5b23cc2806f90c107db64e9859..f32f818ead472794234afa44ccd35a79fc0f5498 100644 GIT binary patch delta 19 ZcmX@fc#@G@n~#@^0SF!*SvQe;9{?|r1)Tr@ delta 19 ZcmX@fc#@G@n~#@^0SNZ9&zQ))4*)8>1gHQ2 diff --git a/custom_components/spook/ectoplasms/utility_meter/repairs/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/utility_meter/repairs/__pycache__/__init__.cpython-314.pyc index 58c399d3b8dc1b4716cc4c81054b13542882771d..adacaf6d068951a6178fba9feff3ce98503baf31 100644 GIT binary patch delta 19 Zcmcb}c#)A?n~#@^0SF!*SvQgU7yvN21+@SG delta 19 Zcmcb}c#)A?n~#@^0SNZ9&zQ)43;-+S1i%0Q diff --git a/custom_components/spook/ectoplasms/zone/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/zone/__pycache__/__init__.cpython-314.pyc index 66cecdbd448d7547115b4677af2113d714c73709..9cc11446249472be0ec6e788c067da99ea0a2e37 100644 GIT binary patch delta 19 ZcmX@Wcz}^xn~#@^0SF!*SvQe;D*!G;1%dzo delta 19 ZcmX@Wcz}^xn~#@^0SNZ9&zQ))6#yx31dRXy diff --git a/custom_components/spook/ectoplasms/zone/services/__pycache__/__init__.cpython-314.pyc b/custom_components/spook/ectoplasms/zone/services/__pycache__/__init__.cpython-314.pyc index 0c92feab5ad7b9aca59e092a6d1a0d02e6065b72..afac26542cee36933bc342d190f1d1bec45fef92 100644 GIT binary patch delta 19 ZcmX@fc#@G@n~#@^0SF!*SvQe;9{?|r1)Tr@ delta 19 ZcmX@fc#@G@n~#@^0SNZ9&zQ))4*)8>1gHQ2 diff --git a/custom_components/spook/ectoplasms/zone/services/__pycache__/create.cpython-314.pyc b/custom_components/spook/ectoplasms/zone/services/__pycache__/create.cpython-314.pyc index ef3adfd55d1357b7530f7f851ec142a263b0f967..961fd4a752184169e99ddd0f364e19ededd09eea 100644 GIT binary patch delta 20 acmaFM_m+=an~#@^0SF!*S+|ipi5&nuDFw;^ delta 20 acmaFM_m+=an~#@^0SNZ9&)CSF#0~&9Uj)?v diff --git a/custom_components/spook/ectoplasms/zone/services/__pycache__/delete.cpython-314.pyc b/custom_components/spook/ectoplasms/zone/services/__pycache__/delete.cpython-314.pyc index d857d89dcdbceb3e599f9c714b5ead44115abe14..622867e2cac5699b0eaa10ce388624b60af90ccb 100644 GIT binary patch delta 20 acmcaFc3+HJn~#@^0SF!*S+|ipgc|@m9R;)i delta 20 acmcaFc3+HJn~#@^0SNZ9&)CQv!VLg5Qv|;N diff --git a/custom_components/spook/ectoplasms/zone/services/__pycache__/update.cpython-314.pyc b/custom_components/spook/ectoplasms/zone/services/__pycache__/update.cpython-314.pyc index a8c4ad6f6269df0e9b8e5f8cc2014604846a50a3..7bcf5cdec2e6a389eb2bbe378a6bbcd76e2167d9 100644 GIT binary patch delta 20 acmca8aZ!R>n~#@^0SF!*S+|kfjRycZHU*CW delta 20 acmca8aZ!R>n~#@^0SNZ9&)CTA#sdH|Yy_GB diff --git a/custom_components/spook/entity_filtering.py b/custom_components/spook/entity_filtering.py index b452cdf4..5d464930 100644 --- a/custom_components/spook/entity_filtering.py +++ b/custom_components/spook/entity_filtering.py @@ -481,7 +481,12 @@ def async_drop_existing_action_names( # neither `trigger` nor `this` is a domain Home Assistant knows, off a list that # grows every release and was never chosen with these in mind. Named here so # that it is a decision. -NEVER_AN_ENTITY = frozenset({"trigger.entity_id", "this.entity_id"}) +# +# Prefixes rather than the two exact strings, because a card can number them: +# easy-layout-card hands mini-graph-card `this.entity_id1`, `this.entity_id2` +# and so on, one per entity. Anything starting with these is the same variable +# with a number on it, and no domain ever will be. #1606. +NEVER_AN_ENTITY_PREFIXES = ("trigger.entity_id", "this.entity_id") @callback @@ -506,7 +511,7 @@ def async_filter_known_entity_ids( # Process any comma-separated entity lists for entity_id in split_comma_separated_entity_ids(entity_id_raw): if ( - entity_id not in NEVER_AN_ENTITY + not entity_id.startswith(NEVER_AN_ENTITY_PREFIXES) and not entity_id.startswith(IGNORED_ENTITY_DOMAINS) and entity_id not in known_entity_ids and valid_entity_id(entity_id) diff --git a/custom_components/spook/icons.json b/custom_components/spook/icons.json index 3529090e..a9c26d6e 100644 --- a/custom_components/spook/icons.json +++ b/custom_components/spook/icons.json @@ -23,12 +23,18 @@ } }, "triggers": { + "all_of": { + "trigger": "mdi:checkbox-multiple-marked" + }, "condition_met": { "trigger": "mdi:check-circle" }, "cron": { "trigger": "mdi:calendar-clock" }, + "debounce": { + "trigger": "mdi:sine-wave" + }, "flapping": { "trigger": "mdi:bird" }, @@ -47,6 +53,9 @@ "stale": { "trigger": "mdi:grave-stone" }, + "recovered": { + "trigger": "mdi:heart-pulse" + }, "watchdog": { "trigger": "mdi:dog" }, diff --git a/custom_components/spook/integrations/spook_inverse/manifest.json b/custom_components/spook/integrations/spook_inverse/manifest.json index 0061ab45..2ffd48c7 100644 --- a/custom_components/spook/integrations/spook_inverse/manifest.json +++ b/custom_components/spook/integrations/spook_inverse/manifest.json @@ -10,5 +10,5 @@ "iot_class": "calculated", "issue_tracker": "https://github.com/frenck/spook/issues", "requirements": [], - "version": "5.4.0" + "version": "5.5.0" } diff --git a/custom_components/spook/integrations/spook_inverse/translations/en_GB.json b/custom_components/spook/integrations/spook_inverse/translations/en_GB.json index 0967ef42..e1035132 100644 --- a/custom_components/spook/integrations/spook_inverse/translations/en_GB.json +++ b/custom_components/spook/integrations/spook_inverse/translations/en_GB.json @@ -1 +1,51 @@ -{} +{ + "config": { + "step": { + "user": { + "description": "This helper allow you to invert the behaviour of an entity. For example, reverse the open/close or on/off of binary sensors, and switches.", + "menu_options": { + "binary_sensor": "Invert a binary sensor", + "switch": "Invert a switch" + }, + "title": "Inverse 👻" + }, + "binary_sensor": { + "data": { + "entity_id": "Source entity", + "hide_source": "Hide source entity", + "name": "Name" + }, + "title": "Inverse 👻" + }, + "switch": { + "data": { + "entity_id": "Source entity", + "hide_source": "Hide source entity", + "name": "Name" + }, + "title": "Inverse 👻" + } + } + }, + "options": { + "step": { + "binary_sensor": { + "data": { + "entity_id": "Source entity", + "hide_source": "Hide source entity", + "name": "Name" + }, + "title": "Inverse 👻" + }, + "switch": { + "data": { + "entity_id": "Source entity", + "hide_source": "Hide source entity", + "name": "Name" + }, + "title": "Inverse 👻" + } + } + }, + "title": "Inverse 👻" +} diff --git a/custom_components/spook/integrations/spook_inverse/translations/fi.json b/custom_components/spook/integrations/spook_inverse/translations/fi.json index 0d880dd6..5260b02f 100644 --- a/custom_components/spook/integrations/spook_inverse/translations/fi.json +++ b/custom_components/spook/integrations/spook_inverse/translations/fi.json @@ -10,7 +10,7 @@ "title": "Käännä 👻" }, "user": { - "description": "Tämän apurin avulla voit kääntää entiteetin käyttäytymisen. Voit esimerkiksi vaihtaa binäärisensoreiden arvot ja kytkimien auki/kiinni -tilat käänteisiksi.", + "description": "Tämän apurin avulla voit vaihtaa entiteetin toiminnan päinvastaiseksi. Voit esimerkiksi vaihtaa binäärisensoreiden ja kytkimien päällä/pois tai auki/kiinni arvot käänteisiksi.", "menu_options": { "binary_sensor": "Käännä binäärisensori", "switch": "Käännä kytkin" diff --git a/custom_components/spook/integrations/spook_inverse/translations/pt.json b/custom_components/spook/integrations/spook_inverse/translations/pt.json index 3b1556eb..c8905a18 100644 --- a/custom_components/spook/integrations/spook_inverse/translations/pt.json +++ b/custom_components/spook/integrations/spook_inverse/translations/pt.json @@ -19,11 +19,11 @@ }, "user": { "menu_options": { - "binary_sensor": "Inverta um sensor binário", - "switch": "Inverta um interruptor" + "binary_sensor": "Inverte um sensor binário", + "switch": "Inverte um interruptor" }, - "title": "Inverta 👻", - "description": "Este ajudante permite-lhe inverter o comportamento de uma entidade. Por exemplo, inverter aberto/fechado ou ligado/desligado de sensores binários e interruptores." + "title": "Inverte 👻", + "description": "Este ajudante permite-lhe inverter o comportamento de uma entidade. Por exemplo, inverter aberto/fechado ou ligado/desligado, relativamente a sensores binários e interruptores." } } }, @@ -35,11 +35,11 @@ "hide_source": "Ocultar entidade de origem", "name": "Nome" }, - "title": "Inverta 👻" + "title": "Inverte 👻" }, "switch": { "data": { - "hide_source": "Ocultar entidade de origem", + "hide_source": "Oculta a entidade de origem", "name": "Nome", "entity_id": "Entidade de origem" }, diff --git a/custom_components/spook/manifest.json b/custom_components/spook/manifest.json index 38dde93d..bc1bf0d7 100644 --- a/custom_components/spook/manifest.json +++ b/custom_components/spook/manifest.json @@ -36,5 +36,5 @@ "requirements": [ "cronsim==2.7" ], - "version": "5.4.0" + "version": "5.5.0" } diff --git a/custom_components/spook/repairs.py b/custom_components/spook/repairs.py index 81deeac5..77842c00 100644 --- a/custom_components/spook/repairs.py +++ b/custom_components/spook/repairs.py @@ -39,7 +39,7 @@ from homeassistant.helpers.event import async_track_time_interval from homeassistant.util.async_ import create_eager_task from .const import DOMAIN, LOGGER -from .dashboard_resources import redundant_item_ids +from .dashboard_resources import is_yaml_managed, redundant_item_ids from .entity_filtering import async_filter_known_entity_ids, async_get_all_entity_ids from .entity_suggestions import async_describe_unknown_entities @@ -104,9 +104,17 @@ class AbstractSpookRepairBase(ABC): issue_id: str, learn_more_url: str | None = None, severity: ir.IssueSeverity = ir.IssueSeverity.WARNING, + translation_key: str | None = None, translation_placeholders: dict[str, str] | None = None, ) -> None: - """Create an issue.""" + """Create an issue. + + `translation_key` defaults to the repair's own name, which is what + nearly every repair wants. Pass one when the same finding needs to be + worded differently depending on what the house looks like, so that the + alternative is a translated string of its own rather than a sentence + smuggled in through a placeholder. + """ self.issue_ids.add(issue_id) ir.async_create_issue( self.hass, @@ -119,7 +127,7 @@ class AbstractSpookRepairBase(ABC): issue_id=f"{self.repair}_{issue_id}", learn_more_url=learn_more_url, severity=severity, - translation_key=self.repair, + translation_key=translation_key or self.repair, translation_placeholders=translation_placeholders, ) @@ -797,7 +805,7 @@ class DuplicateResourceFixFlow(_RemoveOrIgnoreFixFlow): lovelace = self.hass.data.get(lovelace_const.DOMAIN) resources = lovelace.resources if lovelace is not None else None - if resources is not None and not hasattr(resources, "async_delete_item"): + if resources is not None and is_yaml_managed(resources): return self.async_abort( reason="yaml", description_placeholders=self._menu_placeholders(), @@ -948,6 +956,14 @@ class GroupUnknownMembersFixFlow(_RemoveOrIgnoreFixFlow): self.hass.config_entries.async_update_entry( entry, options={**entry.options, CONF_ENTITIES: remaining} ) + # Writing the options is not the end of it. Nothing in the + # group integration listens for its own entry changing, so + # the group that is running carries on with the list it was + # built from until something reloads it. Leave that out and + # the button reports success, the member is still in the + # group, and the repair goes on reporting it because it reads + # the group rather than the stored options. + await self.hass.config_entries.async_reload(entry.entry_id) return self.async_create_entry(data={}) @@ -997,6 +1013,11 @@ class MinMaxUnknownSourcesFixFlow(_RemoveOrIgnoreFixFlow): self.hass.config_entries.async_update_entry( entry, options={**entry.options, "entity_ids": remaining} ) + # Same as above, and here it is worse than a stale reference: + # the helper keeps listening to the source somebody just took + # out, so if that source comes back it drives the value again + # while the configuration says it is gone. + await self.hass.config_entries.async_reload(entry.entry_id) return self.async_create_entry(data={}) diff --git a/custom_components/spook/services.yaml b/custom_components/spook/services.yaml index 1f4e0c3c..57aecb3f 100644 --- a/custom_components/spook/services.yaml +++ b/custom_components/spook/services.yaml @@ -1745,3 +1745,70 @@ wait_for_condition: example: "00:05:00" selector: duration: + +group_add_members: + name: Add members to a group 👻 + description: >- + Adds entities to a group made through the interface, while Home Assistant + is running. Entities already in the group are left where they are. + fields: + group: + name: Group + description: The group to add to. + required: true + example: light.hallway + selector: + entity: + integration: group + members: + name: Members + description: The entities to add to the group. + required: true + selector: + entity: + multiple: true + +group_remove_members: + name: Remove members from a group 👻 + description: >- + Takes entities out of a group made through the interface, while Home + Assistant is running. Naming something that is not in the group does + nothing, so this is also how you clear out a member that no longer exists. + fields: + group: + name: Group + description: The group to take them out of. + required: true + example: light.hallway + selector: + entity: + integration: group + members: + name: Members + description: The entities to remove from the group. + required: true + selector: + entity: + multiple: true + +group_set_members: + name: Set the members of a group 👻 + description: >- + Replaces the members of a group made through the interface with the ones + given, while Home Assistant is running. + fields: + group: + name: Group + description: The group to change. + required: true + example: light.hallway + selector: + entity: + integration: group + members: + name: Members + description: The entities the group should hold from now on. + required: true + selector: + entity: + multiple: true diff --git a/custom_components/spook/translations/de.json b/custom_components/spook/translations/de.json index ad4aad87..0787c413 100644 --- a/custom_components/spook/translations/de.json +++ b/custom_components/spook/translations/de.json @@ -570,6 +570,10 @@ "yaml": "Diese Ressourcen stehen in deiner YAML-Konfiguration, Spook kann sie also nicht für dich ändern. Bearbeite den Abschnitt `resources:` deiner Lovelace-Konfiguration und entferne die Kopien von `{resource}`, die du nicht mehr brauchst." } } + }, + "lovelace_missing_resources_yaml": { + "title": "Die Ressourcen im Dashboard verweisen auf fehlende Dateien", + "description": "Spook hat einen Geist in deinen Dashboards gefunden 👻\n\nDie folgenden Dashboard-Ressourcen verweisen auf Dateien, die nicht existieren:\n\n{resources}\n\nDas passiert meist, wenn eine benutzerdefinierte Karte oder ihre Dateien entfernt wurden, die Ressource aber zurückgeblieben ist.\n\nDiese Ressourcen sind in deiner YAML-Konfiguration eingetragen, daher kann die Ressourcen-Seite sie nicht ändern. Bearbeite den Abschnitt resources: deiner Lovelace-Konfiguration und entferne oder korrigiere diese Einträge.\n\nSpook 👻 Dein Kumpel." } }, "services": { @@ -1608,6 +1612,48 @@ "description": "Farbe für das Label. Kann ein Farbname aus der Liste sein oder ein Hex-Farbcode (etwa #FF0000)." } } + }, + "group_add_members": { + "name": "Füge Mitglieder einer Gruppe hinzu", + "description": "Fügt Entitäten zu einer über die Oberfläche erstellten Gruppe hinzu, während Home Assistant läuft. Entitäten, die bereits in der Gruppe enthalten sind, bleiben unverändert.", + "fields": { + "group": { + "name": "Gruppe", + "description": "Die Gruppe, zu der hinzugefügt werden soll." + }, + "members": { + "name": "Mitglieder", + "description": "Die Entitäten, die zur Gruppe hinzugefügt werden sollen." + } + } + }, + "group_remove_members": { + "fields": { + "group": { + "name": "Gruppe", + "description": "Die Gruppe, aus der sie entfernt werden sollen." + }, + "members": { + "name": "Mitglieder", + "description": "Die Entitäten, die aus der Gruppe entfernt werden sollen." + } + }, + "name": "Mitglieder aus Gruppe entfernen", + "description": "Entfernt Entitäten aus einer über die Oberfläche erstellten Gruppe, während Home Assistant läuft. Wird etwas angegeben, das nicht in der Gruppe ist, passiert nichts – so lässt sich auch ein Mitglied entfernen, das nicht mehr existiert." + }, + "group_set_members": { + "fields": { + "group": { + "name": "Gruppe", + "description": "Die zu ändernde Gruppe." + }, + "members": { + "name": "Mitglieder", + "description": "Die Entitäten, die die Gruppe ab jetzt enthalten soll." + } + }, + "description": "Ersetzt die Mitglieder einer über die Oberfläche erstellten Gruppe durch die angegebenen, während Home Assistant läuft.", + "name": "Lege die Mitglieder einer Gruppe fest" } }, "conditions": { @@ -1816,6 +1862,44 @@ "description": "Wie lange eine Entität stumm bleiben muss, bevor dies ausgelöst wird. Eine Entität, die immer denselben Wert meldet, ist nicht stumm." } } + }, + "all_of": { + "name": "Alle sind eingetreten", + "fields": { + "within": { + "description": "Wie eng beieinander sie liegen müssen. Das Zeitfenster gleitet mit: Ein Trigger, der länger als diese Zeitspanne zurückliegt, wird vergessen, während die anderen weiterzählen.", + "name": "Innerhalb" + }, + "triggers": { + "description": "Die Trigger, die alle ausgelöst haben müssen. Die Reihenfolge spielt keine Rolle, und ein erneut auslösender Trigger ersetzt seine frühere Auslösung, statt doppelt gezählt zu werden.", + "name": "Trigger" + } + }, + "description": "Löst aus, wenn jeder von mehreren Triggern innerhalb desselben Zeitfensters ausgelöst hat, unabhängig von der Reihenfolge. Die eingebauten Trigger von Home Assistant bilden eine Liste, bei der einer davon genügt; dies ist das Gegenstück dazu." + }, + "debounce": { + "name": "Sobald es sich beruhigt", + "description": "Löst aus, sobald ein Trigger eine Weile lang nicht mehr ausgelöst hat – so kommt eine ganze Salve als eine einzige Auslösung an. Ein Bewegungsmelder meldet Bewegung nicht einmal, sondern zwanzigmal.", + "fields": { + "for": { + "name": "Für", + "description": "Wie lange es ruhig gewesen sein muss, bevor dies auslöst. Jede Auslösung setzt diese Wartezeit zurück, sodass etwas, das nie aufhört auszulösen, nie gemeldet wird." + }, + "triggers": { + "description": "Die Trigger, die abgewartet werden. Löst einer von ihnen aus, beginnt damit eine Salve; löst einer von ihnen erneut aus, verlängert das die Salve. So werden mehrere Trigger zusammengefasst, statt einzeln behandelt zu werden.", + "name": "Trigger" + } + } + }, + "recovered": { + "fields": { + "for": { + "name": "Für", + "description": "Wie lange die Entität weg gewesen sein muss, damit die Rückkehr zählt. Alles Kürzere ist ein Flackern: Das Neuladen einer Integration schickt jede ihrer Entitäten innerhalb einer Sekunde durch „nicht verfügbar\" und wieder zurück." + } + }, + "name": "Entität ist zurückgekehrt", + "description": "Löst aus, wenn eine Entität zurückkehrt, nachdem sie eine Weile nicht verfügbar war, sodass ein neu startender Router nicht so aussieht, als würde alles im Haus gleichzeitig wieder verfügbar." } }, "selector": { diff --git a/custom_components/spook/translations/en-GB.json b/custom_components/spook/translations/en-GB.json index 0fdfb559..eb19567a 100644 --- a/custom_components/spook/translations/en-GB.json +++ b/custom_components/spook/translations/en-GB.json @@ -1816,6 +1816,19 @@ "description": "How long an entity has to stay silent before this fires. An entity that keeps reporting the same value is not silent." } } + }, + "debounce": { + "name": "Once it settles", + "description": "Fires once a trigger has stopped firing for a while, so a burst of them arrives as one. A motion sensor does not report motion once, it reports it twenty times.", + "fields": { + "triggers": { + "name": "Triggers", + "description": "The triggers to wait out. Any of them firing starts a burst and any of them firing again keeps it going, so several triggers are collapsed together rather than one at a time." + }, + "for": { + "name": "For" + } + } } }, "selector": { diff --git a/custom_components/spook/translations/en.json b/custom_components/spook/translations/en.json index 13e13f09..5602268c 100644 --- a/custom_components/spook/translations/en.json +++ b/custom_components/spook/translations/en.json @@ -1,5 +1,43 @@ { "triggers": { + "debounce": { + "name": "Once it settles", + "description": "Fires once a trigger has stopped firing for a while, so a burst of them arrives as one. A motion sensor does not report motion once, it reports it twenty times.", + "fields": { + "triggers": { + "name": "Triggers", + "description": "The triggers to wait out. Any of them firing starts a burst and any of them firing again keeps it going, so several triggers are collapsed together rather than one at a time." + }, + "for": { + "name": "For", + "description": "How long it has to have been quiet before this fires. Every firing starts that wait over, so something that never stops firing never gets reported." + } + } + }, + "all_of": { + "name": "All of these happened", + "description": "Fires when every one of several triggers has fired inside the same window of time, in any order. Home Assistant's own triggers are a list where any one of them is enough; this is the other one.", + "fields": { + "triggers": { + "name": "Triggers", + "description": "The triggers that all have to have fired. Order does not matter, and a trigger firing again replaces its earlier turn rather than counting twice." + }, + "within": { + "name": "Within", + "description": "How close together they have to be. The window slides, so a trigger that fired longer ago than this is forgotten while the others carry on counting." + } + } + }, + "recovered": { + "name": "Entity came back", + "description": "Fires when an entity comes back after having been unavailable for a while, so a router rebooting does not read as everything in the house recovering.", + "fields": { + "for": { + "name": "For", + "description": "How long the entity has to have been away before coming back counts. Anything shorter is a flicker: reloading an integration takes every one of its entities through unavailable and back inside a second." + } + } + }, "sequence": { "name": "Triggers in order", "description": "Fires when several triggers happen one after another, in the order given.", @@ -564,7 +602,11 @@ } }, "lovelace_missing_resources": { - "description": "Spook has found a ghost in your dashboards 👻\n\nThe following dashboard resources point at files that do not exist:\n\n{resources}\n\n\n\nThis usually happens when a custom card or its files were removed but the resource stayed behind. To fix this error, open Settings > Dashboards > Resources and remove or correct these resources.\n\nSpook 👻 Your homie.", + "description": "Spook has found a ghost in your dashboards 👻\n\nThe following dashboard resources point at files that do not exist:\n\n{resources}\n\n\n\nThis usually happens when a custom card or its files were removed but the resource stayed behind. To fix this error, open the [Resources page](/config/lovelace/resources) and remove or correct these resources. It has no tab of its own: on the Dashboards page it is behind the three dots, top right.\n\nSpook 👻 Your homie.", + "title": "Dashboard resources point at missing files" + }, + "lovelace_missing_resources_yaml": { + "description": "Spook has found a ghost in your dashboards 👻\n\nThe following dashboard resources point at files that do not exist:\n\n{resources}\n\n\n\nThis usually happens when a custom card or its files were removed but the resource stayed behind.\n\nThese resources are listed in your YAML configuration, so the Resources page cannot change them. Edit the `resources:` section of your Lovelace configuration and remove or correct these entries.\n\nSpook 👻 Your homie.", "title": "Dashboard resources point at missing files" }, "lovelace_duplicate_resources": { @@ -790,6 +832,48 @@ } }, "services": { + "group_add_members": { + "name": "Add members to a group", + "description": "Adds entities to a group made through the interface, while Home Assistant is running. Entities already in the group are left where they are.", + "fields": { + "group": { + "name": "Group", + "description": "The group to add to." + }, + "members": { + "name": "Members", + "description": "The entities to add to the group." + } + } + }, + "group_remove_members": { + "name": "Remove members from a group", + "description": "Takes entities out of a group made through the interface, while Home Assistant is running. Naming something that is not in the group does nothing, so this is also how you clear out a member that no longer exists.", + "fields": { + "group": { + "name": "Group", + "description": "The group to take them out of." + }, + "members": { + "name": "Members", + "description": "The entities to remove from the group." + } + } + }, + "group_set_members": { + "name": "Set the members of a group", + "description": "Replaces the members of a group made through the interface with the ones given, while Home Assistant is running.", + "fields": { + "group": { + "name": "Group", + "description": "The group to change." + }, + "members": { + "name": "Members", + "description": "The entities the group should hold from now on." + } + } + }, "wait_for_condition": { "name": "Wait for a condition", "description": "Wait until a condition is true. Returns straight away if it already is.", diff --git a/custom_components/spook/translations/es.json b/custom_components/spook/translations/es.json index 5583a40d..60ab57f3 100644 --- a/custom_components/spook/translations/es.json +++ b/custom_components/spook/translations/es.json @@ -413,7 +413,7 @@ "title": "Entidades desconocidas usadas en el panel de energía" }, "lovelace_missing_resources": { - "description": "Spook ha encontrado un fantasma en tus paneles 👻\n\nLos siguientes recursos de panel apuntan a archivos que no existen:\n\n{resources}\n\nEsto suele pasar cuando se ha quitado una tarjeta personalizada o sus archivos, pero el recurso se ha quedado. Para solucionar este error, abre Ajustes > Paneles > Recursos y quita o corrige estos recursos.\n\nSpook 👻 Tu colega.", + "description": "Spook ha encontrado un fantasma en tus paneles 👻\n\nLos siguientes recursos de panel apuntan a archivos que no existen:\n\n{resources}\n\nEsto suele pasar cuando se ha quitado una tarjeta personalizada o sus archivos, pero el recurso se ha quedado. Para solucionar este error, abre la [página de Recursos](/config/lovelace/resources) y quita o corrige estos recursos. No tiene su propia pestaña: en la página de paneles, se encuentra detrás de los tres puntos situados en la esquina superior derecha.\n\nSpook 👻 Tu colega.", "title": "Recursos del panel que apuntan a archivos que faltan" }, "lovelace_unknown_area_references": { @@ -570,6 +570,10 @@ "yaml": "Estos recursos están en tu configuración YAML, así que Spook no puede cambiarlos por ti. Edita la sección `resources:` de tu configuración de Lovelace y quita las copias de `{resource}` que ya no necesites." } } + }, + "lovelace_missing_resources_yaml": { + "description": "Spook ha encontrado un fantasma en tus paneles 👻\n\nLos siguientes recursos de panel hacen referencia a archivos que no existen:\n\n{resources}\n\n\n\nEsto suele ocurrir cuando se elimina una tarjeta personalizada o sus archivos, pero el recurso permanece.\n\nThe Estos recursos figuran en tu configuración YAML, por lo que no es posible modificarlos desde la página de Recursos. Edita la sección `resources:` de tu configuración de Lovelace y elimina o corrige estas entradas.\n\nSpook 👻 Your homie.", + "title": "Los recursos del panel apuntan a archivos inexistentes" } }, "conditions": { @@ -1682,6 +1686,48 @@ "description": "Color que se usará para la etiqueta. Puede ser un nombre de color de la lista o un código de color hexadecimal (como #FF0000)." } } + }, + "group_add_members": { + "name": "Agrega miembros a un grupo", + "description": "Agrega entidades a un grupo creado a través de la interfaz mientras Home Assistant está en ejecución. Las entidades que ya forman parte del grupo permanecen donde están.", + "fields": { + "group": { + "name": "Grupo", + "description": "El grupo al que agregar." + }, + "members": { + "name": "Miembros", + "description": "Las entidades para agregar al grupo." + } + } + }, + "group_remove_members": { + "name": "Eliminar miembros del grupo", + "description": "Elimina entidades de un grupo creado a través de la interfaz mientras Home Assistant está en ejecución. Indicar un elemento que no forma parte del grupo no produce ningún efecto; por tanto, este es también el método para eliminar un miembro que ya no existe.", + "fields": { + "group": { + "name": "Grupo", + "description": "El grupo del cual eliminarlos." + }, + "members": { + "name": "Miembros", + "description": "Las entidades que se deben eliminar del grupo." + } + } + }, + "group_set_members": { + "name": "Establecer los miembros de un grupo", + "description": "Reemplaza los miembros de un grupo creado a través de la interfaz por los indicados, mientras Home Assistant está en ejecución.", + "fields": { + "group": { + "name": "Grupo", + "description": "El grupo a cambiar." + }, + "members": { + "name": "Miembros", + "description": "Las entidades que el grupo debería mantener de ahora en adelante." + } + } } }, "triggers": { @@ -1816,6 +1862,44 @@ "description": "Cuánto tiempo tiene que quedarse callada una entidad antes de que esto se active. Una entidad que sigue informando el mismo valor no está callada." } } + }, + "debounce": { + "name": "Cuando termine", + "description": "Se activa una vez que el disparador ha dejado de emitir señales durante un tiempo, de modo que una ráfaga de ellas llega como una sola. Un sensor de movimiento no informa del movimiento una sola vez, sino veinte veces.", + "fields": { + "triggers": { + "name": "Disparadores", + "description": "Los disparadores que se deben aguardar. La activación de cualquiera de ellos inicia una ráfaga, y si alguno vuelve a activarse, esta continúa; por tanto, varios disparadores se agrupan en lugar de procesarse uno a uno." + }, + "for": { + "name": "Para", + "description": "Cuánto tiempo debe haber permanecido en silencio antes de que esto se dispare. Cada disparo reinicia esa espera, por lo que algo que nunca deja de dispararse nunca llega a notificarse." + } + } + }, + "all_of": { + "name": "Todo esto sucedió.", + "description": "Se activa cuando todos los disparadores de un conjunto se han activado dentro de la misma ventana de tiempo, en cualquier orden. Los disparadores estándar de Home Assistant funcionan como una lista en la que basta con que se active uno solo; este caso es la alternativa a ese funcionamiento.", + "fields": { + "triggers": { + "name": "Disparadores", + "description": "Los disparadores que deben haberse activado todos. El orden no importa, y si un disparador se activa de nuevo, reemplaza su activación anterior en lugar de contar dos veces." + }, + "within": { + "name": "Dentro", + "description": "Qué tan cerca deben estar entre sí. La ventana se desplaza, de modo que un evento desencadenante ocurrido hace más tiempo que eso queda olvidado, mientras los demás continúan contando." + } + } + }, + "recovered": { + "name": "La entidad regresó", + "description": "Se activa cuando una entidad vuelve a estar disponible tras un periodo de inactividad, de modo que el reinicio de un router no se interpreta como la recuperación de todos los dispositivos de la casa.", + "fields": { + "for": { + "name": "Para", + "description": "El tiempo que la entidad haya permanecido ausente antes de regresar es un factor relevante. Cualquier periodo inferior se considera un parpadeo: al recargar una integración, todas sus entidades pasan por un estado de falta de disponibilidad y se restablecen en cuestión de un segundo." + } + } } }, "selector": { diff --git a/custom_components/spook/translations/fi.json b/custom_components/spook/translations/fi.json index 64a38d2d..d1bf7e66 100644 --- a/custom_components/spook/translations/fi.json +++ b/custom_components/spook/translations/fi.json @@ -7,7 +7,7 @@ }, "step": { "user": { - "description": "Luitko readme:n? Luitko lisenssiehdot? Oletko aivan varma?" + "description": "Luitko readme-osion? Luitko lisenssiehdot? Oletko aivan varma?" }, "choice_restart": { "description": "Jotta Spook pystyy viimeistelemään käyttöönoton, Home Assistant pitää käynnistää uudelleen.\n\nHaluatko käynnistää Home Assistantin uudelleen nyt?", @@ -405,7 +405,7 @@ "title": "Tuntemattomia entiteettejä käytetty energiakojelaudalla" }, "lovelace_missing_resources": { - "description": "Spook on löytänyt kummituksen kojelaudoistasi 👻\n\nSeuraavat resurssit viittaavat tiedostoihin joita ei ole:\n\n{resources}\n\n\n\nTämä tapahtuu usein kun mukautettu kortti tai sen tiedostot on poistettu, mutta resurssia ei. Korjataksesi ongelman, avaa Asetukset > Kojelaudat > Resurssit ja poista tai korjaa nämä resurssit.\n\nSpook 👻 Kamusi.", + "description": "Spook on löytänyt kummituksen kojelaudoistasi 👻\n\nSeuraavat resurssit viittaavat tiedostoihin joita ei ole olemassa:\n\n{resources}\n\n\n\nTämä tapahtuu usein kun mukautettu kortti tai sen tiedostot on poistettu, mutta resurssia ei. Korjataksesi ongelman, avaa [Resurssit-sivu](/config/lovelace/resources) ja poista tai korjaa nämä resurssit. Resursseilla ei ole omaa tabia. Löydät ne kojelautojen alta, kolmen pisteen takaa sivun oikeassaa yläkulmassa. \n\nSpook 👻 Kamusi.", "title": "Kojelaudan resurssit viittaavat puuttuvaan tiedostoon." }, "lovelace_unknown_area_references": { @@ -570,6 +570,10 @@ "yaml": "Nämä resurssit ovat YAML-konfiguraatiossasi, joten Spook ei voi muuttaa niitä puolestasi. Muokkaa Lovelace-konfiguraatiosi `resources:`-osiota ja poista ne `{resource}`-kopiot joita et enää tarvitse." } } + }, + "lovelace_missing_resources_yaml": { + "title": "Kojelaudan resurssit viittaavat puuttuvaan tiedostoon", + "description": "Spook on löytänyt kummituksen hälytyksistäsi 👻\n\nSeuraavat kojelautaresurssit viittaavat tiedostoihin joita ei ole enää olemassa:\n\n{resources}\n\nTämä tapahtuu yleensä, kun mukautettu kortti tai sen tiedostot on poistettu, mutta resurssi on yhä määriteltynä.\n\nNämä resurssit on listattu YAML-määrityksessä, joten niitä ei voi muokata resurssisivulla. Korjataksesi ongelman, mene `resources:`-osioon konfiguraatiossasi ja poista tai muokkaa näitä määrityksiä.\n\nSpook 👻 Kamusi." } }, "services": { @@ -649,7 +653,7 @@ "fields": { "alias": { "name": "Alias", - "description": "Kerrokselle lisättävät aliakset." + "description": "Alias (tai lista aliaksia) jotka kerrokselle lisätään." }, "floor_id": { "name": "Kerroksen ID", @@ -1608,6 +1612,48 @@ "description": "Tunnisteelle käytettävä väri. Voi olla värin nimi listasta tai heksadesimaalinen värikoodi (kuten #FF0000)." } } + }, + "group_add_members": { + "name": "Lisää jäseniä ryhmään", + "description": "Lisää entiteettejä käyttöliittymän kautta luotuun ryhmään, Home Assistantin ollessa käynnissä. Ryhmän nykyiset entiteetit säilyvät ennallaan.", + "fields": { + "group": { + "name": "Ryhmä", + "description": "Ryhmä johon lisätään." + }, + "members": { + "name": "Jäsenet", + "description": "Jäsenet jotka lisätään ryhmään." + } + } + }, + "group_remove_members": { + "fields": { + "group": { + "name": "Ryhmä", + "description": "Ryhmä josta poistetaan." + }, + "members": { + "name": "Jäsenet", + "description": "Jäsenet jotka poistetaan ryhmästä." + } + }, + "name": "Poista jäseniä ryhmästä", + "description": "Poistaa jäseniä käyttöliittymän kautta luodusta ryhmästä, Home Assistantin ollessa käynnissä. Sellaisen entiteetin valinta jota ei ole ryhmässä ei tee mitään, joten tällä tavalla saat poistettua myös jäseniä joita ei ole enää olemassa." + }, + "group_set_members": { + "fields": { + "group": { + "name": "Ryhmä", + "description": "Ryhmä jota muokataan." + }, + "members": { + "name": "Jäsenet", + "description": "Jäsenet joista ryhmän pitäisi koostua jatkossa." + } + }, + "description": "Korvaa käyttöliittymän kautta luodun ryhmän jäsenet annetuilla, Home Assistantin ollessa käynnissä.", + "name": "Aseta ryhmän jäsenet" } }, "conditions": { @@ -1816,6 +1862,44 @@ "description": "Kuinka kauan entiteetin on oltava hiljaa ennen kuin tämä laukeaa. Entiteetti joka ilmoittaa yhä samaa arvoa ei ole hiljaa." } } + }, + "all_of": { + "name": "Kaikki nämä tapahtuivat", + "fields": { + "within": { + "description": "Kuinka lähekkäin niiden täytyy olla. Ikkuna on liukuva, joten tätä vanhemmat laukeamiset sivuutetaan, ja ikkunan sisällä olevat lasketaan mukaan.", + "name": "Aikaikkuna" + }, + "triggers": { + "description": "Laukaisimet, joiden on kaikkien pitänyt laueta. Järjestyksellä ei ole väliä, ja ainoastaan laukaisimen uusin laukeaminen lasketaan.", + "name": "Laukaisimet" + } + }, + "description": "Laukeaa kun kaikki annetuista laukaisimista on lauennut saman aikaikkunan sisällä, missä tahansa järjestyksessä. Home Assistantin sisäiset laukaisimet luetaan listaksi, joista yhdenkin laukeaminen riittää." + }, + "recovered": { + "name": "Entiteetti tuli takaisin", + "description": "Laukeaa, kun entiteetti on ollut tovin tavoittamattomissa. Esim. reitittimen uudelleenkäynnistys ei palauta kaikkea normaaliin tilaan.", + "fields": { + "for": { + "name": "Kohde", + "description": "Kuinka pitkään entiteetin on pitänyt olla poissa, ennenkuin paluu huomioidaan. Lyhyemmät poistumiset tulkitaan normaaliksi heilunnaksi. Integraation uudelleenlataaminen käyttää aina kaikki entiteettinsä hetken saavuttamattomissa." + } + } + }, + "debounce": { + "description": "Laukeaa, kun laukaisin on ollut tovin poissa toiminnasta, jonka jälkeen rykelmä tapahtumia saapuu kerralla. Esim. liiketunnistin raportoi 20 tapahtumaa yhden sijaan.", + "fields": { + "for": { + "name": "Kohde", + "description": "Kuinka pitkään on pitänyt olla hiljaista ennen tämän laukaisemista. Jokainen laukaisu aloittaa laskurin uudestaan, joten laukaisin joka ei koskaan hiljene ei tule raportoiduksi." + }, + "triggers": { + "description": "Laukaisimet joita seurataan. Minkä tahansa niistä laukeaminen aloittaa purskeen ja minkä tahansa niistä laukeaminen seuraavaksi pitää purskeen käynnissä, joten useita laukaisimia niputetaan yhteen sen sijaan että niitä seurattaisiin yksittäisinä.", + "name": "Laukaisimet" + } + }, + "name": "Kun laukaisin asettuu" } }, "selector": { diff --git a/custom_components/spook/translations/pt.json b/custom_components/spook/translations/pt.json index d0f869af..a8b4d98f 100644 --- a/custom_components/spook/translations/pt.json +++ b/custom_components/spook/translations/pt.json @@ -570,6 +570,10 @@ "yaml": "Estes recursos estão na tua configuração YAML, por isso o Spook não os pode mudar por ti. Edita a secção `resources:` da tua configuração Lovelace e tira as cópias de `{resource}` que já não precisas." } } + }, + "lovelace_missing_resources_yaml": { + "title": "Os recursos da vista apontam para ficheiros em falta", + "description": "O Spook encontrou um fantasma nos teus painéis 👻\n\nOs seguintes recursos de painel apontam para arquivos que não existem:\n\n{resources}\n\n\n\nIsto geralmente acontece quando um cartão personalizado ou seus arquivos foram removidos, mas o recurso permaneceu.\n\nEsses recursos estão listados na tua configuração YAML, portanto, a página de Recursos não pode alterá-los. Edita a seção `resources:` da tua configuração do Lovelace e remove ou corrige essas entradas.\n\nSpook 👻 O teu amigo." } }, "conditions": { @@ -794,7 +798,7 @@ "name": "Entidade" } }, - "description": "Ativa uma entidade (ou entidades) num instante.", + "description": "Ativa uma entidade (ou entidades) em tempo real.", "name": "Ativar uma entidade" }, "homeassistant_hide_entity": { @@ -999,7 +1003,7 @@ "name": "Alias" } }, - "description": "Adiciona um alias a um piso." + "description": "Adiciona uma alcunha a um piso." }, "homeassistant_add_entity_to_area": { "name": "Adiciona uma entidade a uma área", @@ -1423,7 +1427,7 @@ "name": "Assistentes" }, "entity_id": { - "description": "A entidade ou entidades a deixar de expor.", + "description": "A(s) entidade(s) a deixar de expor.", "name": "Entidade" } }, @@ -1537,7 +1541,7 @@ "name": "Precisão de apresentação" }, "entity_id": { - "description": "A entidade ou entidades de sensor a alterar.", + "description": "A(s) entidade(s) de sensor a atualizar.", "name": "Entidade" } }, @@ -1682,6 +1686,44 @@ "description": "Cor a usar para a etiqueta. Pode ser um nome de cor da lista ou um código de cor hexadecimal (como #FF0000)." } } + }, + "group_remove_members": { + "name": "Remove membros de um grupo", + "fields": { + "members": { + "name": "Membros", + "description": "As entidades a remover do grupo." + }, + "group": { + "name": "Grupo" + } + }, + "description": "Remove entidades de um grupo criado pela interface enquanto o Home Assistant está em execução. Renomear algo que não faz parte do grupo não faz nada, portanto essa também é a maneira de remover um membro que já não existe." + }, + "group_set_members": { + "fields": { + "group": { + "name": "Grupo", + "description": "O grupo a mudar." + }, + "members": { + "name": "Membros", + "description": "As entidades que o grupo deve manter de agora em diante." + } + } + }, + "group_add_members": { + "name": "Adiciona membros a um grupo", + "fields": { + "group": { + "name": "Grupo", + "description": "O grupo a adicionar." + }, + "members": { + "name": "Membros", + "description": "As entidades a adicionar ao grupo." + } + } } }, "triggers": { @@ -1775,7 +1817,7 @@ "fields": { "for": { "name": "Durante", - "description": "Quanto tempo uma entrada tem de continuar a falhar antes de isto disparar. O Home Assistant volta a tentar uma entrada falhada no máximo de dez em dez minutos, por isso um valor mais curto avisa de problemas que ainda se podem resolver sozinhos." + "description": "Quanto tempo uma entrada tem de continuar a falhar antes de isto disparar. O Home Assistant volta a tentar uma entrada falhada no máximo de dez em dez minutos, por isso um valor mais curto avisa sobre problemas que ainda se podem resolver sozinhos." }, "entry_id": { "name": "Entradas", @@ -1808,12 +1850,35 @@ } }, "stale": { - "name": "A entidade calou-se", + "name": "A entidade ficou em silêncio", "description": "Dispara quando já há algum tempo que nada escreve numa entidade, o que apanha um aparelho que morreu em silêncio em vez de ficar indisponível.", "fields": { "for": { "name": "Durante", - "description": "Quanto tempo uma entidade tem de ficar calada antes de isto disparar. Uma entidade que continua a comunicar o mesmo valor não está calada." + "description": "Quanto tempo uma entidade tem de ficar silenciada antes de isto disparar. Uma entidade que continua a comunicar o mesmo valor não está silenciada." + } + } + }, + "debounce": { + "fields": { + "triggers": { + "name": "Gatilhos" + }, + "for": { + "name": "Para", + "description": "Quanto tempo deve permanecer silenciado antes que isto dispare. Cada disparo reinicia essa contagem de tempo, portanto, algo que nunca para de disparar nunca chega a ser relatado." + } + }, + "name": "Assim que ficar configurado" + }, + "all_of": { + "name": "Todos esses aconteceram", + "fields": { + "triggers": { + "name": "Gatilhos" + }, + "within": { + "description": "O quão perto eles têm de estar um do outro. A janela desliza, e um gatilho que tenha disparado há mais tempo que isso é esquecido, enquanto os outros continuam a contar." } } } diff --git a/custom_components/spook/translations/sk.json b/custom_components/spook/translations/sk.json index 49ec6691..bd91496e 100644 --- a/custom_components/spook/translations/sk.json +++ b/custom_components/spook/translations/sk.json @@ -570,6 +570,10 @@ "manage": "Tento štítok si môžeš spravovať sám na [stránke Štítky](/config/labels)." } } + }, + "lovelace_missing_resources_yaml": { + "title": "Zdroje dashboardu poukazujú na chýbajúce súbory", + "description": "Spook našiel ducha vo vašich paneloch 👻\n\nNasledujúce zdroje panelov odkazujú na súbory, ktoré neexistujú:\n\n{resources}\n\n\n\nZvyčajne k tomu dochádza, keď bola odstránená vlastná karta alebo jej súbory, no samotný záznam zdroja v konfigurácii zostal.\n\nTieto zdroje sú uvedené vo vašej konfigurácii YAML, takže ich nemožno upraviť priamo na stránke Zdroje. Upravte sekciu `resources:` v konfigurácii Lovelace a tieto záznamy odstráňte alebo opravte.\n\nSpook 👻 Váš parťák." } }, "services": { @@ -1608,6 +1612,48 @@ "description": "Počet desatinných miest, ktoré sa majú pri senzore zobraziť." } } + }, + "group_add_members": { + "name": "Pridať členov do skupiny", + "description": "Pridáva entity do skupiny vytvorenej prostredníctvom rozhrania počas chodu systému Home Assistant. Entity, ktoré sa už v skupine nachádzajú, zostávajú na svojom mieste.", + "fields": { + "group": { + "name": "Skupina", + "description": "Skupina, do ktorej treba pridať." + }, + "members": { + "name": "Členovia", + "description": "Entity, ktoré sa majú pridať do skupiny." + } + } + }, + "group_remove_members": { + "name": "Odstrániť členov zo skupiny", + "description": "Odstraňuje entity zo skupiny vytvorenej prostredníctvom rozhrania počas chodu systému Home Assistant. Uvedenie názvu entity, ktorá v skupine nie je, nemá žiadny účinok; týmto spôsobom teda môžete odstrániť aj člena, ktorý už neexistuje.", + "fields": { + "group": { + "name": "Skupina", + "description": "Skupina, z ktorej ich treba vybrať." + }, + "members": { + "name": "Členovia", + "description": "Entity, ktoré sa majú zo skupiny odstrániť." + } + } + }, + "group_set_members": { + "name": "Nastavte členov skupiny", + "description": "Počas chodu Home Assistant nahradí členov skupiny vytvorenej prostredníctvom rozhrania zadanými členmi.", + "fields": { + "group": { + "name": "Skupina", + "description": "Skupina, ktorú treba zmeniť." + }, + "members": { + "name": "Členovia", + "description": "Entity, ktoré by skupina mala odteraz držať." + } + } } }, "triggers": { @@ -1742,6 +1788,44 @@ "description": "Ako dlho musí byť entita ticho, kým sa toto spustí. Entita, ktorá stále hlási tú istú hodnotu, ticho nie je." } } + }, + "debounce": { + "name": "Akonáhle sa to ustáli", + "description": "Aktivuje sa až po tom, čo spúšťací signál na chvíľu ustane, takže séria týchto signálov dorazí naraz. Snímač pohybu neohlási pohyb len raz – ohlási ho dvadsaťkrát.", + "fields": { + "triggers": { + "name": "Spúšťače", + "description": "Spúšte, ktoré majú čakať. Ktorýkoľvek z nich vystrelí, spustí dávku a ktorýkoľvek z nich vystrelí znova, ju udrží v chode, takže niekoľko spúští sa zhlukuje naraz, a nie jeden po druhom." + }, + "for": { + "name": "Pre", + "description": "Ako dlho musí byť ticho, kým sa toto spustí. Každé spustenie resetuje toto čakanie, takže niečo, čo sa spúšťa nepretržite, sa nikdy nenahlási." + } + } + }, + "all_of": { + "name": "Všetky tieto veci sa stali.", + "description": "Aktivuje sa vtedy, keď sa v rámci toho istého časového úseku aktivujú všetky z viacerých spúšťačov, a to v ľubovoľnom poradí. Štandardné spúšťače v systéme Home Assistant fungujú na princípe zoznamu, kde stačí aktivácia ktoréhokoľvek z nich; toto je alternatívny spôsob.", + "fields": { + "triggers": { + "name": "Spúšťače", + "description": "Spúšťače, ktoré sa všetky musia aktivovať. Na poradí nezáleží a opätovná aktivácia spúšťača nahrádza jeho predchádzajúce uplatnenie, namiesto toho, aby sa počítala dvakrát." + }, + "within": { + "name": "V rámci", + "description": "Ako blízko pri sebe sa musia nachádzať. Toto okno sa posúva, takže spúšťacia udalosť, ktorá nastala skôr než v tomto časovom rámci, sa považuje za neplatnú, zatiaľ čo ostatné pokračujú v počítaní." + } + } + }, + "recovered": { + "name": "Entita sa vrátila.", + "description": "Aktivuje sa, keď sa entita vráti do stavu dostupnosti po predchádzajúcom výpadku; vďaka tomu sa reštart smerovača neinterpretuje ako obnova všetkých zariadení v domácnosti.", + "fields": { + "for": { + "name": "Pre", + "description": "Počíta sa, ako dlho musela byť entita preč, kým sa vrátila. Čokoľvek kratšie je len blikanie: opätovné načítanie integrácie prevedie všetky jej entity cez stav nedostupnosti a späť v priebehu sekundy." + } + } } }, "selector": { diff --git a/custom_components/spook/translations/sr-Latn.json b/custom_components/spook/translations/sr-Latn.json index 8152ade0..27e4c8a0 100644 --- a/custom_components/spook/translations/sr-Latn.json +++ b/custom_components/spook/translations/sr-Latn.json @@ -36,7 +36,7 @@ "name": "Zanemari sve" }, "repairs_unignore_all": { - "name": "Poništi zanemarivanje za sve" + "name": "Poništi sva zanemarivanja" } }, "event": { @@ -247,15 +247,15 @@ }, "automation_unknown_device_references": { "description": "Spook je pronašao duha u vašim automatizacijama 👻\n\nDok je lebdeo okolo, Spook je naišao na sledeću automatizaciju:\n\n[{automation}]({edit}) (`{entity_id}`)\n\nOva automatizacija koristi sledeće uređaje koji su nepoznati Home Assistant-u:\n\n{devices}\n\n\n\nDa biste ispravili ovu grešku, uredite automatizaciju i uklonite upotrebu ovih nepostojećih uređaja.\n\nSpook 👻 Vaš ortak.", - "title": "Nepoznati uređaji korišćeni u: {automation}" + "title": "Nepoznati uređaji u: {automation}" }, "automation_unknown_entity_references": { "description": "Spook je pronašao duha u vašim automatizacijama 👻\n\nDok je lutao, Spook je naišao na sledeću automatizaciju:\n\n[{automation}]({edit}) (`{entity_id}`)\n\nOva automatizacija referencira sledeće entitete koji su nepoznati Home Assistant‑u:\n\n{entities}\n\n\n\nDa biste ispravili ovu grešku, [uredi automatizaciju]({edit}) i uklonite korišćenje ovih nepostojećih entiteta.\n\nSpook 👻 Vaš ortak.", - "title": "Nepoznati entiteti korišćeni u: {automation}" + "title": "Nepoznati entiteti u: {automation}" }, "automation_unknown_floor_references": { "description": "Spook je pronašao duha u vašim automatizacijama 👻\n\nDok je lebdeo okolo, Spook je naišao na sledeću automatizaciju:\n\n[{automation}]({edit}) (`{entity_id}`)\n\nOva automatizacija koristi sledeće spratove koji su nepoznati Home Assistant-u:\n\n{floors}\n\n\n\nDa biste ispravili ovu grešku, uredite automatizaciju i uklonite upotrebu ovih nepostojećih spratova.\n\nSpook 👻 Vaš ortak.", - "title": "Nepoznati spratovi korišćeni u: {automation}" + "title": "Nepoznati spratovi u: {automation}" }, "automation_unknown_label_references": { "description": "Spook je pronašao duha u vašim automatizacijama 👻\n\nDok je lebdeo okolo, Spook je naišao na sledeću automatizaciju:\n\n[{automation}]({edit}) (`{entity_id}`)\n\nOva automatizacija koristi sledeće oznake koje su nepoznate Home Assistant-u:\n\n{labels}\n\n\n\nDa biste ispravili ovu grešku, uredite automatizaciju i uklonite upotrebu ovih nepostojećih oznaka.\n\nSpook 👻 Vaš ortak.", @@ -287,8 +287,8 @@ } }, "lovelace_unknown_entity_references": { - "description": "SSpook je pronašao duha u vašim kontrolnim tablama 👻\n\nDok je lebdeo okolo, Spook je naišao na sledeću kontrolnu tablu:\n\n[{dashboard}]({edit})\n\nOva kontrolna tabla koristi sledeće entitete koji su nepoznati Home Assistant-u:\n\n{entities}\n\n\n\nDa biste ispravili ovu grešku, uredite kontrolnu tablu i uklonite upotrebu ovih nepostojećih entiteta.\n\nSpook 👻 Vaš ortak.", - "title": "Nepoznati entiteti korišćeni u: {dashboard}" + "description": "Spook je pronašao duha u vašim kontrolnim tablama 👻\n\nDok je lebdeo okolo, Spook je naišao na sledeću kontrolnu tablu:\n\n[{dashboard}]({edit})\n\nOva kontrolna tabla koristi sledeće entitete koji su nepoznati Home Assistant-u:\n\n{entities}\n\n\n\nDa biste ispravili ovu grešku, uredite kontrolnu tablu i uklonite upotrebu ovih nepostojećih entiteta.\n\nSpook 👻 Vaš ortak.", + "title": "Nepoznati entiteti u: {dashboard}" }, "proximity_unknown_ignored_zones": { "description": "Spook je pronašao duha u vašoj konfiguraciji blizine 👻\n\nDok je lutao okolo, Spook je naišao na sledeću konfiguraciju blizine:\n\n{name}\n\nOva konfiguracija ignoriše zone koje su nepoznate Home Assistant‑u:\n\n{zones}\n\n\n\nDa biste ispravili ovu grešku, izmenite konfiguraciju i uklonite ovu/ove zone.\n\nSpook 👻 Vaš ortak.", @@ -304,7 +304,7 @@ }, "scene_unknown_entity_references": { "description": "Spook je pronašao duha u vašim scenama 👻\n\nDok je lutao okolo, Spook je naišao na sledeću scenu:\n\n[{scene}]({edit})\n\nOva scena referencira sledeće entitete koji su nepoznati Home Assistant‑u:\n\n{entities}\n\n\n\nDa biste ispravili ovu grešku, [izmenite scenu]({edit}) i uklonite korišćenje ovih nepostojećih entiteta.\n\nSpook 👻 Vaš ortak.", - "title": "Nepoznati entiteti korišćeni u: {scene}" + "title": "Nepoznati entiteti u: {scene}" }, "script_unknown_area_references": { "description": "Spook je pronašao duha u vašim skriptama 👻\n\nDok je lutao okolo, Spook je naišao na sledeću skriptu:\n\n[{script}]({edit}) (`{entity_id}`)\n\nOva skripta referencira sledeće oblasti koje su nepoznate Home Assistant‑u:\n\n{areas}\n\n\n\nDa biste ispravili ovu grešku, [izmenite skriptu]({edit}) i uklonite korišćenje ovih nepostojećih oblasti.\n\nSpook 👻 Vaš ortak.", @@ -312,15 +312,15 @@ }, "script_unknown_device_references": { "description": "Spook je pronašao duha u vašim skriptama 👻\n\nDok je lutao okolo, Spook je naišao na sledeću skriptu:\n\n[{script}]({edit}) (`{entity_id}`)\n\nOva skripta referencira sledeće uređaje koji su nepoznati Home Assistant‑u:\n\n{devices}\n\n\n\nDa biste ispravili ovu grešku, [izmenite skriptu]({edit}) i uklonite korišćenje ovih nepostojećih uređaja.\n\nSpook 👻 Vaš ortak.", - "title": "Nepoznati uređaji korišćeni u: {script}" + "title": "Nepoznati uređaji u: {script}" }, "script_unknown_entity_references": { "description": "Spook je pronašao duha u vašim skriptama 👻\n\nDok je lutao okolo, Spook je naišao na sledeću skriptu:\n\n[{script}]({edit}) (`{entity_id}`)\n\nOva skripta referencira sledeće entitete koji su nepoznati Home Assistant‑u:\n\n{entities}\n\n\n\nDa biste ispravili ovu grešku, [izmenite skriptu]({edit}) i uklonite korišćenje ovih nepostojećih entiteta.\n\nSpook 👻 Vaš ortak.", - "title": "Nepoznati entiteti korišćeni u: {script}" + "title": "Nepoznati entiteti u: {script}" }, "script_unknown_floor_references": { "description": "Spook je pronašao duha u vašim skriptama 👻\n\nDok je lutao okolo, Spook je naišao na sledeću skriptu:\n\n[{script}]({edit}) (`{entity_id}`)\n\nOva skripta referencira sledeće spratove koji su nepoznati Home Assistant‑u:\n\n{floors}\n\n\n\nDa biste ispravili ovu grešku, [izmenite skriptu]({edit}) i uklonite korišćenje ovih nepostojećih spratova.\n\nSpook 👻 Vaš ortak.", - "title": "Nepoznati spratovi korišćeni u: {script}" + "title": "Nepoznati spratovi u: {script}" }, "script_unknown_label_references": { "description": "Spook je pronašao duha u vašim skriptama 👻\n\nDok je lutao okolo, Spook je naišao na sledeću skriptu:\n\n[{script}]({edit}) (`{entity_id}`)\n\nOva skripta referencira sledeće oznake koje su nepoznate Home Assistant‑u:\n\n{labels}\n\n\n\nDa biste ispravili ovu grešku, [izmenite skriptu]({edit}) i uklonite korišćenje ovih nepostojećih oznaka.\n\nSpook 👻 Vaš ortak.", @@ -362,18 +362,18 @@ }, "automation_unknown_condition_references": { "description": "Spook je pronašao duha u vašim automatizacijama 👻\n\nDok je lebdeo okolo, Spook je naišao na sledeću automatizaciju:\n\n[{automation}]({edit}) (`{entity_id}`)\n\nOva automatizacija koristi sledeće uslove koje ne može da obezbedi nijedna integracija dostupna Home Assistant-u:\n\n{conditions}\n\n\n\nOvo se često dešava kada se ukloni integracija koja obezbeđuje uslov. Da biste ispravili ovu grešku, uredite automatizaciju i uklonite upotrebu ovih nedostupnih uslova, ili vratite integraciju koja ih obezbeđuje.\n\nSpook 👻 Vaš ortak.", - "title": "Nepoznati uslovi korišćeni u: {automation}" + "title": "Nepoznati uslovi u: {automation}" }, "automation_unknown_trigger_references": { "description": "Spook je pronašao duha u vašim automatizacijama 👻\n\nDok je lebdeo okolo, Spook je naišao na sledeću automatizaciju:\n\n[{automation}]({edit}) (`{entity_id}`)\n\nOva automatizacija koristi sledeće pokretače koje ne može da obezbedi nijedna integracija dostupna Home Assistant-u:\n\n{triggers}\n\nOvo se često dešava kada se ukloni integracija koja obezbeđuje pokretač. Da biste ispravili ovu grešku, uredite automatizaciju i uklonite upotrebu ovih nedostupnih pokretača, ili vratite integraciju koja ih obezbeđuje.\n\nSpook 👻 Vaš ortak.", - "title": "Nepoznati pokretači korišćeni u: {automation}" + "title": "Nepoznati pokretači u: {automation}" }, "unknown_customized_entities": { "description": "Spook je pronašao duha u vašim prilagođavanjima 👻\n\nOdeljak customize: dodeljuje atribute sledećim entitetima koji su nepoznati Home Assistant-u:\n\n{entities}\n\n\n\nOvo se često dešava kada se entitet preimenuje ili ukloni, dok njegovo prilagođavanje ostane zaostalo. Da biste ispravili ovu grešku, uredite odeljak customize: u vašoj konfiguraciji i uklonite ove entitete.\n\nSpook 👻 Vaš ortak.", "title": "Nepoznati entiteti u vašim prilagođavanjima" }, "lovelace_missing_resources": { - "description": "Spook je pronašao duha u vašim kontrolnim tablama 👻\n\nSledeći resursi kontrolne table ukazuju na datoteke koje ne postoje:\n\n{resources}\n\n\n\nOvo se obično dešava kada se prilagođena kartica ili njene datoteke uklone, ali resurs ostane zaostao. Da biste ispravili ovu grešku, otvorite Podešavanja > Kontrolne table > Resursi i uklonite ili ispravite ove resurse.\n\nSpook 👻 Vaš ortak.", + "description": "Spook je pronašao duha u vašim kontrolnim tablama 👻\n\nSledeći resursi kontrolne table ukazuju na datoteke koje ne postoje:\n\n{resources}\n\n\n\nOvo se obično dešava kada se prilagođena kartica ili njene datoteke uklone, ali resurs ostane za njima. Da biste ispravili ovu grešku, otvorite stranicu [Resursi] (/config/lovelace/resources) i uklonite ili ispravite ove resurse. Ona nema sopstvenu karticu: na stranici Kontrolne table nalazi se iza tri tačke, gore desno..\n\nSpook 👻 Vaš ortak.", "title": "Resursi kontrolne table ukazuju na datoteke koje nedostaju" }, "lovelace_unknown_area_references": { @@ -394,7 +394,7 @@ "manage": "Dozvoli mi da sam popravim", "remove": "Ukloni ovog pomoćnika" }, - "title": "Nepoznati izvorni entiteti korišćeni u pomoćniku: {helper}" + "title": "Nepoznati izvorni entiteti u pomoćniku: {helper}" } }, "abort": { @@ -402,14 +402,14 @@ "manage": "Ovog pomoćnika možete sami upravljati na stranici [Pomoćnici](/config/helpers)." } }, - "title": "Nepoznati izvorni entiteti korišćeni u pomoćniku: {helper}" + "title": "Nepoznati izvorni entiteti u pomoćniku: {helper}" }, "min_max_unknown_sources": { "fix_flow": { "step": { "init": { "description": "Spook je pronašao duha u vašim pomoćnicima 👻\n\nMin/max pomoćnik {helper} kombinuje sledeće članove koji su nepoznati Home Assistant-u:\n\n{sources}\n\nUklonite ih kako bi pomoćnik nastavio sa radom pomoću preostalih članova, ili ih zadržite i Spook će prestati da ukazuje na njih.\n\nSpook 👻 Vaš ortak.", - "title": "Nepoznati članovi korišćeni u min/max pomoćniku: {helper}", + "title": "Nepoznati članovi u min/max pomoćniku: {helper}", "menu_options": { "remove": "Ukloni ove članove", "manage": "Dozvoli mi da sam popravim", @@ -423,7 +423,7 @@ "too_few_members": "Pomoćnik za minimum/maksimum zahteva najmanje dva člana, pa bi uklanjanje nedostajućih ostavilo premalo. Ponovo konfigurišite ili uklonite pomoćnika sami na stranici [Pomoćnici](/config/helpers)." } }, - "title": "Nepoznati članovi korišćeni u min/max pomoćniku: {helper}" + "title": "Nepoznati članovi u min/max pomoćniku: {helper}" }, "empty_areas": { "title": "Prazna prostorija: {area}", @@ -528,11 +528,11 @@ }, "script_unknown_condition_references": { "description": "Spook je pronašao duha u vašim skriptama 👻\n\nDok je lutao okolo, Spook je naišao na sledeću skriptu:\n\n[{script}]({edit}) (`{entity_id}`)\n\nOva skripta koristi sledeće uslove koje nijedna dostupna integracija u Home Assistant‑u ne može da obezbedi:\n\n{conditions}\n\n\n\nOvo se često dešava kada je integracija koja obezbeđuje uslov uklonjena. Da biste ispravili ovu grešku, [izmenite skriptu]({edit}) i uklonite korišćenje ovih nedostupnih uslova ili vratite integraciju koja ih obezbeđuje.\n\nSpook 👻 Vaš ortak.", - "title": "Nepoznati uslovi korišćeni u: {script}" + "title": "Nepoznati uslovi u: {script}" }, "script_unknown_trigger_references": { "description": "Spook je pronašao duha u vašim skriptama 👻\n\nDok je lutao okolo, Spook je naišao na sledeću skriptu:\n\n[{script}]({edit}) (`{entity_id}`)\n\nOva skripta koristi sledeće pokretače koje nijedna dostupna integracija u Home Assistant‑u ne može da obezbedi:\n\n{triggers}\n\n\n\nOvo se često dešava kada je integracija koja obezbeđuje pokretač uklonjena. Da biste ispravili ovu grešku, [izmenite skriptu]({edit}) i uklonite korišćenje ovih nedostupnih pokretača ili vratite integraciju koja ih obezbeđuje.\n\nSpook 👻 Vaš ortak.", - "title": "Nepoznati pokretači korišćeni u: {script}" + "title": "Nepoznati pokretači u: {script}" }, "template_unknown_service_references": { "description": "Spook je pronašao duha u vašim pomoćnicima za šablone 👻\n\nDok je lutao okolo, Spook je naišao na sledećeg pomoćnika za šablone:\n\n[{helper}]({edit})\n\nOn referencira sledeće akcije koje su nepoznate Home Assistant‑u:\n\n{services}\n\n\n\nOvo se često dešava kada je pružalac akcije uklonjen ili je skripta preimenovana ili obrisana. Da biste ispravili ovu grešku, ponovo konfigurišite pomoćnika za šablone da koristi postojeće akcije.\n\nSpook 👻 Vaš ortak.", @@ -570,12 +570,16 @@ } }, "title": "Resurs kontrolne table naveden više puta: {resource}" + }, + "lovelace_missing_resources_yaml": { + "title": "Resursi kontrolne table ukazuju na nepostojeće datoteke", + "description": "Spook je pronašao duha na Vašim kontrolnim tablama 👻\n\nSledeći resursi kontrolne table ukazuju na datoteke koje ne postoje:\n\n{resources}\n\n\n\nOvo se obično dešava kada se ukloni prilagođena kartica ili njene datoteke, ali resurs ostane konfigurisan.\n\nOvi resursi su navedeni u vašoj YAML konfiguraciji, pa ih stranica „Resursi“ ne može promeniti. Uredite odeljak `resources:` u svojoj Lovelace konfiguraciji i uklonite ili ispravite ove unose.\n\nSpook 👻 Vaš ortak." } }, "services": { "boo": { "name": "Bu!", - "description": "Pozivanje ove akcije zbunjuje Home Assistant. Izvršavanje ove akcije nikada neće uspeti." + "description": "Pozivanje ove akcije zbunjuje Home Assistant i njeno izvršavanje nikada neće uspeti." }, "blueprint_import": { "fields": { @@ -1387,7 +1391,7 @@ }, "random_fail": { "name": "Slučajni neuspeh", - "description": "Izvođenje ove radnje će slučajno neuspeti." + "description": "Izvršavanje ove akcije će nasumično otkazati." }, "homeassistant_delete_floor": { "fields": { @@ -1569,7 +1573,7 @@ } }, "name": "Čekanje uslova", - "description": "Čeka dok uslov ne postane tačan. Vraća se odmah ukoliko je uslov već ispunjen." + "description": "Čeka da uslov postane tačan. Odmah završava rad ako je uslov već ispunjen." }, "light_decrease_brightness": { "name": "Smanji osvetljenost", @@ -1608,12 +1612,54 @@ "description": "Koliko bi prelaz trebalo da traje, u sekundama." } } + }, + "group_add_members": { + "name": "Dodaj članove u grupu", + "description": "Dodaje entitete u grupu napravljenu preko interfejsa, dok Home Assistant radi. Entiteti koji su već u grupi ostaju nepromenjeni.", + "fields": { + "group": { + "name": "Grupa", + "description": "Grupa u koju ih treba dodati." + }, + "members": { + "name": "Članovi", + "description": "Entiteti koje treba dodati u grupu." + } + } + }, + "group_remove_members": { + "fields": { + "group": { + "name": "Grupa", + "description": "Grupa iz koje ih treba ukloniti." + }, + "members": { + "name": "Članovi", + "description": "Entiteti koje treba ukloniti iz grupe." + } + }, + "name": "Ukloni članove iz grupe", + "description": "Uklanja entitete iz grupe koja je napravljena kroz interfejs, dok Home Assistant radi. Navođenje nečega što nije u grupi ne radi ništa, pa je ovo ujedno i način da očistite člana koji više ne postoji." + }, + "group_set_members": { + "fields": { + "group": { + "name": "Grupa", + "description": "Grupa koju treba izmeniti." + }, + "members": { + "name": "Članovi", + "description": "Entiteti koje bi grupa od sada trebalo da sadrži." + } + }, + "description": "Zamenjuje članove grupe napravljene kroz interfejs navedenim članovima, dok Home Assistant radi.", + "name": "Postavi članove grupe" } }, "conditions": { "chance": { "name": "Verovatnoća", - "description": "Propušta u određenom procentu slučajeva, birajući slučajno pri svakoj proveri. Zgodno za dodavanje malo raznolikosti u vaše automatizacije.", + "description": "Uslov se ispunjava u određenom procentu slučajeva, koji se bira nasumično pri svakoj proveri. Korisno za dodavanje malo varijacije u vaše automatizacije.", "fields": { "percentage": { "name": "Procenat", @@ -1623,7 +1669,7 @@ }, "cooldown": { "name": "Period hlađenja", - "description": "Propušta samo ako se ova automatizacija ili skripta nisu pokrenuli u navedenom vremenu (ili se nikada nisu pokrenuli). Ugrađeni period hlađenja sprečava prečesta ponovna pokretanja.", + "description": "Uslov je ispunjen samo ako ova automatizacija ili skripta nisu pokrenute u navedenom vremenskom periodu (ili ako nikada nisu pokrenute). Ugrađeni period hlađenja koji sprečava prečesto ponovno aktiviranje.", "fields": { "duration": { "name": "Trajanje", @@ -1643,7 +1689,7 @@ }, "repair_issue_present": { "name": "Nerešen problem za popravku", - "description": "Prolazi ako je problem za popravku nerešen. Problemi koje je neko zanemario se ne računaju.", + "description": "Uslov je ispunjen ako postoji nerešen problem u odeljku Popravke. Zanemareni problemi se ne računaju.", "fields": { "domain": { "name": "Integracije", @@ -1657,7 +1703,7 @@ }, "quota": { "name": "Preostalo dozvoljenih pokretanja", - "description": "Prolazi ako je ova automatizacija pokrenuta manje od zadatog broja puta unutar određenog perioda. Skripte se ne računaju.", + "description": "Uslov je ispunjen ako je ova automatizacija pokrenuta manje od zadatog broja puta unutar određenog perioda. Skripte se ne računaju.", "fields": { "limit": { "name": "Ograničenje", @@ -1670,8 +1716,8 @@ } }, "triggered_by_user": { - "name": "Pokrenuto od strane korisnika", - "description": "Uslov je ispunjen kada osoba stoji iza pokretanja ove akcije: promena stanja ili događaj koji je sama izazvala, uključujući i situaciju koja je dovela do ispunjenja šablonskog pokretača. Raspored, sunce ili integracija koja deluje samostalno ne nose korisnički kontekst, a isto važi i za ručno pokretanje pomoću dugmeta „Pokreni“.", + "name": "Pokretač aktiviran od strane korisnika", + "description": "Uslov je ispunjen ako je pokretanje inicirala osoba: promenom stanja ili događajem koji je izazvala (uključujući i promenu koja je aktivirala šablonski okidač). Vremenski raspored, položaj sunca, automatske integracije ili ručno pokretanje dugmetom „Pokreni“ ne računaju se kao pokretanje od strane korisnika.", "fields": { "person": { "name": "Osobe", @@ -1680,8 +1726,8 @@ } }, "not_triggered_by_user": { - "name": "Nije pokrenuto od strane korisnika", - "description": "Uslov je ispunjen kada niko ne može biti odgovoran za ovo pokretanje: vremenski raspored, sunce, integracija koja deluje samostalno ili dugme Pokreni. Ovaj uslov s namerom ne prima dodatne opcije. Ako umesto toga želite da isključite određene osobe, postavite filter „Pokrenuto od strane korisnika“ unutar uslova Ne." + "name": "Pokretač aktiviran bez učešća korisnika", + "description": "Uslov je ispunjen kada niko nije odgovoran za ovo pokretanje: vremenski raspored, položaj sunca, automatska integracija ili pritisak na dugme „Pokreni“. Namerno nema dodatnih opcija. Ako umesto toga želiš da isključiš konkretne osobe, stavi uslov „Pokrenuto od strane korisnika“ unutar „Nije“ (Not) uslova." } }, "triggers": { @@ -1693,7 +1739,7 @@ } }, "name": "Cron raspored", - "description": "Aktivira se prema crontab rasporedu, za vreme koje sopstveni vremenski pokretači Home Assistant sistema ne mogu da izraze, kao što je svaki radni dan u nedelji ili poslednji petak u mesecu." + "description": "Aktivira se prema crontab rasporedu za vremena koja ugrađeni vremenski pokretači Home Assistant-a ne mogu da definišu, kao što je svakog radnog dana u sedam ili poslednjeg petka u mesecu." }, "watchdog": { "fields": { @@ -1724,7 +1770,7 @@ "description": "Vremenski period unutar kojeg te promene moraju da se dese. Prozor se pomera, tako da se ovo uvek odnosi na najnovije promene." } }, - "name": "Entitet se ne smiruje", + "name": "Entitet nestabilan i ne može da se smiri", "description": "Aktivira se kada entitet menja stanje češće nego što bi trebalo unutar određenog vremenskog perioda." }, "while": { @@ -1738,8 +1784,8 @@ "description": "Koliko se čeka između dva uzastopna aktiviranja, sve dok je uslov ispunjen." } }, - "name": "Dok je uslov ispunjen", - "description": "Aktivira se kada uslov postane ispunjen, a zatim nastavlja sa periodičnim aktiviranjem sve dok taj uslov ostaje tačan." + "name": "Uslov ispunjen", + "description": "Aktivira se kada se uslov ispuni, a zatim nastavlja sa periodičnim aktiviranjem sve dok je uslov tačan." }, "condition_met": { "fields": { @@ -1753,7 +1799,7 @@ }, "stale": { "name": "Entitet prestao da šalje podatke", - "description": "Aktivira se kada se u entitet ništa ne upiše već neko vreme, što omogućava prepoznavanje uređaja koji je tiho prestao sa radom umesto da prijavi status nedostupnosti.", + "description": "Aktivira se kada se stanje entiteta ne ažurira određeno vreme, što omogućava prepoznavanje uređaja koji su tiho prestali sa radom umesto da pređu u status nedostupnosti.", "fields": { "for": { "name": "U trajanju od", @@ -1790,11 +1836,11 @@ "description": "Ograničite ovo na probleme određene ozbiljnosti. Ostavite prazno za sve nivoe." } }, - "name": "Kreiran je problem za popravku", + "name": "Kreiran problem za popravku", "description": "Aktivira se kada se pojavi novi problem za popravku, tako da možete saznati za njega bez posete stranici „Popravke“." }, "integration_failed": { - "name": "Podešavanje integracije nije uspelo", + "name": "Podešavanje integracije neuspešno", "description": "Aktivira se kada podešavanje unosa konfiguracije ne uspeva već neko vreme, i to nakon što su iscrpljeni svi interni ponovni pokušaji kojima bi Home Assistant samostalno rešio problem.", "fields": { "for": { @@ -1808,7 +1854,7 @@ } }, "repair_issue_removed": { - "name": "Problem za popravku je rešen", + "name": "Problem za popravku rešen", "description": "Aktivira se kada problem za popravku nestane, bilo zato što je rešen ili zato što se više ne prijavljuje.", "fields": { "domain": { @@ -1816,6 +1862,44 @@ "description": "Ograničite ovo na probleme koje prijavljuju određene integracije, prema njihovom domenu. Ostavite prazno za sve integracije." } } + }, + "all_of": { + "name": "Sve ovo se dogodilo", + "description": "Aktivira se kada se svaki od nekoliko pokretača pokrene unutar istog vremenskog prozora, bilo kojim redosledom. Sopstveni pokretači Home Assistant-a su lista gde je dovoljno da se bilo koji od njih aktivira; ovo je ona druga opcija.", + "fields": { + "within": { + "description": "Koliko blizu jedno drugom moraju biti. Vremenski prozor se pomera, pa se pokretač koji se aktivirao ranije od ovog perioda zaboravlja, dok ostali nastavljaju da se računaju.", + "name": "Unutar" + }, + "triggers": { + "name": "Pokretači", + "description": "Pokretači koji svi moraju biti aktivirani. Redosled nije važan, a ponovna aktivacija pokretača samo osvežava njegovo stanje umesto da se računa dvaput." + } + } + }, + "recovered": { + "name": "Entitet se ponovo pojavio", + "description": "Aktivira se kada se entitet vrati nakon što je neko vreme bio nedostupan, kako se ponovno pokretanje rutera ne bi očitalo kao oporavak svega u kući.", + "fields": { + "for": { + "name": "U trajanju od", + "description": "Koliko dugo entitet mora biti odsutan da bi se povratak računao. Sve kraće od toga je samo treperenje: ponovno učitavanje integracije prebacuje svaki njen entitet u stanje nedostupnosti i vraća ga nazad u roku od jedne sekunde." + } + } + }, + "debounce": { + "description": "Aktivira se kada pokretač prestane da se pokreće na neko vreme, tako da čitav nalet signala stigne kao jedan. Senzor pokreta ne prijavljuje kretanje samo jednom, već ga prijavi dvadeset puta.", + "fields": { + "for": { + "name": "U trajanju od", + "description": "Koliko dugo mora da bude mirno pre nego što se ovo pokrene. Svaka nova aktivacija ponovo pokreće to čekanje, tako da se nešto što neprestano šalje signale nikada ne prijavljuje." + }, + "triggers": { + "name": "Pokretači", + "description": "Pokretači koje treba sačekati. Aktivacija bilo kog od njih započinje seriju akcija, a ponovna aktivacija je održava u toku, tako da se više pokretača spaja u jedno umesto da se izvršavaju jedan po jedan." + } + }, + "name": "Kada se stanje stabilizuje" } }, "selector": { diff --git a/custom_components/spook/translations/sv.json b/custom_components/spook/translations/sv.json index 5e065a99..0609bc34 100644 --- a/custom_components/spook/translations/sv.json +++ b/custom_components/spook/translations/sv.json @@ -551,12 +551,12 @@ "title": "Okända medlemmar i aviseringsgrupp: {group}" }, "lovelace_duplicate_resources": { - "title": "Instrumentpanelsresurs finns med mer än en gång: {resource}", + "title": "Kontrollpanelsresurs finns med mer än en gång: {resource}", "fix_flow": { "step": { "init": { - "title": "Instrumentpanelsresurs finns med mer än en gång: {resource}", - "description": "Spook har hittat ett spöke bland dina instrumentpaneler 👻\n\nDenna instrumentpanelsresurs förekommer {count} gånger:\n\n{resources}\n\nDet brukar hända när ett anpassat kort uppdaterats genom att lägga till en resurs för den nya versionen i stället för att redigera den som redan fanns. Webbläsaren laddar båda, kortet försöker registrera sig två gånger och andra försöket misslyckas, vilket ser ut som ett trasigt kort i stället för en dubblerad resurs.\n\nSpook kan städa bort de överflödiga kopiorna och behålla den som lades till senast.\n\nSpook 👻 Din polare.", + "title": "Kontrollpanelsresurs finns med mer än en gång: {resource}", + "description": "Spook har hittat ett spöke bland dina kontrollpanaler 👻\n\nDenna kontrollpanelsresurs förekommer {count} gånger:\n\n{resources}\n\nDet brukar hända när ett anpassat kort uppdaterats genom att lägga till en resurs för den nya versionen i stället för att redigera den som redan fanns. Webbläsaren laddar båda, kortet försöker registrera sig två gånger och andra försöket misslyckas, vilket ser ut som ett trasigt kort i stället för en dubblerad resurs.\n\nSpook kan städa bort de överflödiga kopiorna och behålla den som lades till senast.\n\nSpook 👻 Din polare.", "menu_options": { "remove": "Städa bort de överflödiga kopiorna och behåll den senaste", "ignore": "Låt dem vara, och säg inget mer om det", @@ -566,7 +566,7 @@ }, "abort": { "issue_ignored": "Spook kommer inte att säga något mer om denna resurs.", - "manage": "Du kan sköta dina instrumentpanelers resurser själv på [sidan Resurser](/config/lovelace/resources).", + "manage": "Du kan sköta dina kontrollpanelers resurser själv på [sidan för Resurser](/config/lovelace/resources).", "yaml": "Dessa resurser står i din YAML-konfiguration, så Spook kan inte ändra dem åt dig. Redigera avsnittet `resources:` i din Lovelace-konfiguration och ta bort de kopior av `{resource}` som du inte längre behöver." } } @@ -1471,7 +1471,7 @@ }, "wait_for_condition": { "name": "Vänta på ett villkor", - "description": "Väntar tills ett villkor är sant. Återvänder direkt om det redan är det.", + "description": "Väntar tills ett villkor är sant. Returnerar direkt om det redan är det.", "fields": { "condition": { "name": "Villkor", @@ -1585,7 +1585,7 @@ }, "homeassistant_update_label": { "name": "Uppdatera en etikett", - "description": "Uppdaterar en befintlig etikett i farten. Allt du utelämnar behåller det värde det redan hade. Beskrivningen, ikonen och färgen kan tömmas genom att sättas till null.", + "description": "Uppdaterar en befintlig etikett direkt. Allt du utelämnar behåller det värde det redan hade. Beskrivningen, ikonen och färgen kan tömmas genom att sättas till null.", "fields": { "label_id": { "name": "Etikett-ID", @@ -1655,7 +1655,7 @@ }, "period": { "name": "Period", - "description": "Fönstret som gränsen gäller för. Det glider framåt, så en dag betyder vilka tjugofyra timmar som helst och inte midnatt till midnatt." + "description": "Det tidsfönster som gränsen gäller för. Det glider framåt, så en dag betyder vilka tjugofyra timmar som helst och inte midnatt till midnatt." } } }, @@ -1709,7 +1709,7 @@ "fields": { "condition": { "name": "Villkor", - "description": "Villkoret som ska hållas ögonen på. Börjar utlösa när det blir sant och slutar när det inte längre är det." + "description": "Villkor att bevaka. Börjar utlösa när det blir sant och slutar när det inte längre är det." }, "every": { "name": "Varje", @@ -1723,15 +1723,15 @@ "fields": { "arm": { "name": "Aktivera", - "description": "Det som sätter vakten i beredskap. Väntan räknas därifrån, och att aktivera på nytt medan väntan redan pågår startar om den." + "description": "Det som startar bevakningen. Väntan räknas därifrån, och att aktivera på nytt medan väntan redan pågår startar om den." }, "expect": { "name": "Förväntat", - "description": "Det du väntar dig ska hända sedan. Kommer det i tid avbryts vakten och ingenting utlöses." + "description": "Det du väntar dig ska hända. Händer det i tid avbryts bevakningen och ingenting utlöses." }, "within": { "name": "Inom", - "description": "Hur lång tid det förväntade har på sig att komma. Detta utlöses när den tiden gått och ingenting kommit." + "description": "Hur lång tid det förväntade har på sig att hända. Detta utlöses när den tiden gått och ingenting hänt." } } }, @@ -1755,7 +1755,7 @@ "fields": { "condition": { "name": "Villkor", - "description": "Villkoret som ska hållas ögonen på." + "description": "Villkoret som ska bevkas." } } }, diff --git a/custom_components/spook/translations/zh-Hans.json b/custom_components/spook/translations/zh-Hans.json index 19be1b0d..c9a6642d 100644 --- a/custom_components/spook/translations/zh-Hans.json +++ b/custom_components/spook/translations/zh-Hans.json @@ -570,6 +570,10 @@ "yaml": "这些资源在 YAML 配置中列出,因此 Spook 无法为你修改。请编辑 Lovelace 配置中的 `resources:` 部分,移除不再需要的 `{resource}` 副本。" } } + }, + "lovelace_missing_resources_yaml": { + "description": "Spook 在你的仪表盘中发现了一个幽灵 👻\n\n以下仪表盘资源指向了不存在的文件:\n\n{resources}\n\n\n\n这通常发生在自定义卡片或其文件被移除,但资源条目仍保留在系统中的情况。\n\n这些资源列在你的 YAML 配置中,因此资源页面无法修改它们。请编辑 Lovelace 配置中的 `resources:` 部分,移除或修正这些条目。\n\nSpook 👻 你的好哥们。", + "title": "仪表盘资源指向缺失的文件" } }, "services": { @@ -1608,6 +1612,48 @@ "description": "标签使用的颜色。可以是列表中的颜色名称,也可以是十六进制颜色代码(如 #FF0000)。" } } + }, + "group_add_members": { + "name": "向群组添加成员 👻", + "description": "在 Home Assistant 运行期间,将通过界面创建的群组中添加实体。已在群组中的实体保持不变。", + "fields": { + "group": { + "name": "群组", + "description": "要添加到的群组。" + }, + "members": { + "name": "成员", + "description": "要添加到群组的实体。" + } + } + }, + "group_remove_members": { + "name": "从群组移除成员 👻", + "description": "在 Home Assistant 运行期间,从通过界面创建的群组中移除实体。指定不在群组中的东西什么也不会发生,因此这也是清除已不存在成员的方法。", + "fields": { + "group": { + "name": "群组", + "description": "要从中移除的群组。" + }, + "members": { + "name": "成员", + "description": "要从群组中移除的实体。" + } + } + }, + "group_set_members": { + "name": "设置群组的成员 👻", + "description": "在 Home Assistant 运行期间,将通过界面创建的群组的成员替换为指定的成员。", + "fields": { + "group": { + "name": "群组", + "description": "要更改的群组。" + }, + "members": { + "name": "成员", + "description": "群组从现在起应包含的实体。" + } + } } }, "conditions": { @@ -1816,6 +1862,44 @@ "description": "实体必须保持静默多长时间后才触发。持续报告相同值的实体不算静默。" } } + }, + "debounce": { + "name": "稳定后触发", + "description": "当触发条件停止触发一段时间后再触发,这样一连串触发会合并为一次。运动传感器不会只报告一次运动,它会报告二十次。", + "fields": { + "triggers": { + "name": "触发条件", + "description": "需要等待其稳定的触发条件。其中任何一个触发都会开始一轮等待,再次触发则继续等待,因此多个触发会被合并在一起,而不是逐个报告。" + }, + "for": { + "name": "持续时间", + "description": "必须保持安静多长时间后才触发。每次触发都会重新开始这段等待,因此持续不断触发的东西永远不会被报告。" + } + } + }, + "all_of": { + "name": "全部发生", + "description": "当多个触发条件都在同一个时间窗口内触发过时触发,顺序不限。Home Assistant 自身的触发条件是一个列表,其中任何一个都足够;这个是另一种。", + "fields": { + "triggers": { + "name": "触发条件", + "description": "必须全部触发过的触发条件。顺序无关紧要,同一个触发条件再次触发会替换它之前的那次,而不是重复计数。" + }, + "within": { + "name": "时间窗口", + "description": "它们之间必须靠得多近。这个窗口会滑动,因此比这更早触发的触发条件会被遗忘,而其他触发条件继续计数。" + } + } + }, + "recovered": { + "name": "实体已恢复", + "description": "当实体在不可用一段时间后重新恢复时触发,这样路由器重启不会被解读为全屋设备都在恢复。", + "fields": { + "for": { + "name": "持续时间", + "description": "实体必须离开多长时间后回来才算数。比这更短的只是闪一下:重新加载集成会在一秒内让它的所有实体经历不可用再恢复。" + } + } } }, "selector": { diff --git a/custom_components/spook/translations/zh-Hant.json b/custom_components/spook/translations/zh-Hant.json index 5d11cfe8..2737c89d 100644 --- a/custom_components/spook/translations/zh-Hant.json +++ b/custom_components/spook/translations/zh-Hant.json @@ -570,6 +570,10 @@ "yaml": "這些資源在 YAML 配置中列出,因此 Spook 無法為您修改。請編輯 Lovelace 配置中的 `resources:` 區段,移除不再需要的 `{resource}` 副本。" } } + }, + "lovelace_missing_resources_yaml": { + "description": "Spook 在您的儀表板中發現了一個幽靈 👻\n\n以下儀表板資源指向了不存在的檔案:\n\n{resources}\n\n\n\n這通常發生在自定義卡片或其檔案被移除,但資源條目仍保留在系統中的情況。\n\n這些資源列在您的 YAML 設定中,因此資源頁面無法修改它們。請編輯 Lovelace 設定中的 `resources:` 部分,移除或修正這些條目。\n\nSpook 👻 您的好夥伴。", + "title": "儀表板資源指向缺失的檔案" } }, "services": { @@ -1608,6 +1612,48 @@ "description": "標籤使用的顏色。可以是清單中的顏色名稱,也可以是十六進位顏色代碼(如 #FF0000)。" } } + }, + "group_add_members": { + "name": "向群組新增成員 👻", + "description": "在 Home Assistant 執行期間,將透過介面建立的群組中新增實體。已在群組中的實體保持不變。", + "fields": { + "group": { + "name": "群組", + "description": "要新增到的群組。" + }, + "members": { + "name": "成員", + "description": "要新增到群組的實體。" + } + } + }, + "group_remove_members": { + "name": "從群組移除成員 👻", + "description": "在 Home Assistant 執行期間,從透過介面建立的群組中移除實體。指定不在群組中的東西什麼也不會發生,因此這也是清除已不存在成員的方法。", + "fields": { + "group": { + "name": "群組", + "description": "要從中移除的群組。" + }, + "members": { + "name": "成員", + "description": "要從群組中移除的實體。" + } + } + }, + "group_set_members": { + "name": "設定群組的成員 👻", + "description": "在 Home Assistant 執行期間,將透過介面建立的群組的成員替換為指定的成員。", + "fields": { + "group": { + "name": "群組", + "description": "要變更的群組。" + }, + "members": { + "name": "成員", + "description": "群組從現在起應包含的實體。" + } + } } }, "conditions": { @@ -1816,6 +1862,44 @@ "description": "實體必須保持靜默多長時間後才觸發。持續回報相同值的實體不算靜默。" } } + }, + "debounce": { + "name": "穩定後觸發", + "description": "當觸發條件停止觸發一段時間後再觸發,這樣一連串觸發會合併為一次。運動感測器不會只回報一次運動,它會回報二十次。", + "fields": { + "triggers": { + "name": "觸發條件", + "description": "需要等待其穩定的觸發條件。其中任何一個觸發都會開始一輪等待,再次觸發則繼續等待,因此多個觸發會被合併在一起,而不是逐個回報。" + }, + "for": { + "name": "持續時間", + "description": "必須保持安靜多長時間後才觸發。每次觸發都會重新開始這段等待,因此持續不斷觸發的東西永遠不會被回報。" + } + } + }, + "all_of": { + "name": "全部發生", + "description": "當多個觸發條件都在同一個時間窗口內觸發過時觸發,順序不限。Home Assistant 自身的觸發條件是一個清單,其中任何一個都足夠;這個是另一種。", + "fields": { + "triggers": { + "name": "觸發條件", + "description": "必須全部觸發過的觸發條件。順序無關緊要,同一個觸發條件再次觸發會替換它之前的那次,而不是重複計數。" + }, + "within": { + "name": "時間窗口", + "description": "它們之間必須靠得多近。這個窗口會滑動,因此比這更早觸發的觸發條件會被遺忘,而其他觸發條件繼續計數。" + } + } + }, + "recovered": { + "name": "實體已恢復", + "description": "當實體在無法使用一段時間後重新恢復時觸發,這樣路由器重新啟動不會被解讀為全屋裝置都在恢復。", + "fields": { + "for": { + "name": "持續時間", + "description": "實體必須離開多長時間後回來才算數。比這更短的只是閃一下:重新載入整合會在一秒內讓它的所有實體經歷無法使用再恢復。" + } + } } }, "selector": { diff --git a/custom_components/spook/triggers.yaml b/custom_components/spook/triggers.yaml index 0641afe7..bc6044d0 100644 --- a/custom_components/spook/triggers.yaml +++ b/custom_components/spook/triggers.yaml @@ -16,6 +16,16 @@ stale: selector: duration: +recovered: + target: + entity: + fields: + for: + required: true + example: "00:15:00" + selector: + duration: + integration_failed: fields: for: @@ -59,6 +69,28 @@ condition_met: required: true selector: condition: +debounce: + fields: + triggers: + required: true + selector: + trigger: + for: + required: true + example: "00:00:30" + selector: + duration: +all_of: + fields: + triggers: + required: true + selector: + trigger: + within: + required: true + example: "00:05:00" + selector: + duration: sequence: fields: steps: diff --git a/custom_components/taskmate/__init__.py b/custom_components/taskmate/__init__.py index 6d172ab1..05ec3eeb 100644 --- a/custom_components/taskmate/__init__.py +++ b/custom_components/taskmate/__init__.py @@ -63,6 +63,7 @@ from .const import ( ATTR_REWARD_ID, ATTR_SOUND, BADGE_TIERS, + CHORE_SUGGESTED_POINTS_MAX, CONF_TASK_GROUP_CHORE_IDS, CONF_TASK_GROUP_ID, CONF_TASK_GROUP_NAME, @@ -527,6 +528,8 @@ async def _async_register_services(hass: HomeAssistant) -> None: child_id, as_parent=as_parent, photo_url=call.data.get("photo_url", ""), + note=call.data.get("note", ""), + suggested_points=call.data.get("suggested_points", 0), ) except ValueError as err: # Only genuinely bad input (unknown chore/child) raises now — expected @@ -581,7 +584,7 @@ async def _async_register_services(hass: HomeAssistant) -> None: _LOGGER.error("No TaskMate coordinator available") return completion_id = call.data["completion_id"] - await coordinator.async_approve_chore(completion_id) + await coordinator.async_approve_chore(completion_id, points=call.data.get("points")) async def handle_approve_all_chores(call: ServiceCall) -> None: """Handle the approve_all_chores service call.""" @@ -1127,6 +1130,10 @@ async def _async_register_services(hass: HomeAssistant) -> None: vol.Required(ATTR_CHILD_ID): cv.string, vol.Optional(ATTR_AS_PARENT, default=False): cv.boolean, vol.Optional("photo_url"): cv.string, + vol.Optional("note"): cv.string, + vol.Optional("suggested_points"): vol.All( + vol.Coerce(int), vol.Range(min=0, max=CHORE_SUGGESTED_POINTS_MAX) + ), } ), ) @@ -1187,6 +1194,7 @@ async def _async_register_services(hass: HomeAssistant) -> None: schema=vol.Schema( { vol.Required("completion_id"): cv.string, + vol.Optional("points"): vol.All(vol.Coerce(int), vol.Range(min=0)), } ), ) diff --git a/custom_components/taskmate/const.py b/custom_components/taskmate/const.py index 572a2d5e..e27ccafe 100644 --- a/custom_components/taskmate/const.py +++ b/custom_components/taskmate/const.py @@ -78,6 +78,11 @@ DEFAULT_TIME_PERIODS: Final = [ MAX_TIME_PERIODS: Final = 24 +# Open-ended chores (#832): the child describes the work and suggests what it +# was worth. Both are child-entered free input, so they're bounded before storage. +CHORE_NOTE_MAX_LENGTH: Final = 200 +CHORE_SUGGESTED_POINTS_MAX: Final = 999 + # Platforms PLATFORMS: Final = ["sensor", "button", "binary_sensor"] diff --git a/custom_components/taskmate/coord_chores.py b/custom_components/taskmate/coord_chores.py index c21a2938..4cada9cf 100644 --- a/custom_components/taskmate/coord_chores.py +++ b/custom_components/taskmate/coord_chores.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING from homeassistant.util import dt as dt_util from . import images, photos +from .const import CHORE_NOTE_MAX_LENGTH, CHORE_SUGGESTED_POINTS_MAX from .models import Chore, ChoreCompletion, PointsTransaction if TYPE_CHECKING: @@ -685,7 +686,13 @@ class ChoresMixin: return chore async def async_complete_chore( - self, chore_id: str, child_id: str, as_parent: bool = False, photo_url: str = "" + self, + chore_id: str, + child_id: str, + as_parent: bool = False, + photo_url: str = "", + note: str = "", + suggested_points: int = 0, ) -> ChoreCompletion | None: """Mark a chore as completed by a child. @@ -720,6 +727,18 @@ class ChoresMixin: ) photo_url = "" + # The note and the suggested points are typed by a child, so bound both + # before they reach storage: an unbounded note bloats the store and the + # sensor attribute slice, and the suggestion is only ever a hint for the + # parent. Over-long notes are truncated rather than refused — losing a + # child's tail end beats refusing their chore. + note = (note or "").strip()[:CHORE_NOTE_MAX_LENGTH] + try: + suggested_points = int(suggested_points or 0) + except (TypeError, ValueError): + suggested_points = 0 + suggested_points = min(max(0, suggested_points), CHORE_SUGGESTED_POINTS_MAX) + now = dt_util.now() today = dt_util.as_local(now).date() @@ -824,7 +843,16 @@ class ChoresMixin: # ServiceValidationError by the service layer. if requires_photo and not as_parent and not (photo_url or "").strip(): raise ValueError("This chore requires a photo as evidence.") - auto_approve = as_parent or (not chore.requires_approval and not requires_photo) + # An open-ended chore is a placeholder for unlisted work, so the note IS + # the chore — without it the parent has nothing to review. Same shape as + # the photo gate above: enforced here rather than only in the card, so + # the button entity, automations and Dev Tools can't bypass it. + is_open_ended = bool(getattr(chore, "open_ended", False)) + if is_open_ended and not as_parent and not note: + raise ValueError("Say what you did to submit this one.") + # Open-ended completions always go to a parent: the child suggested the + # point value, so self-awarding it would let them set their own pay. + auto_approve = as_parent or (not chore.requires_approval and not requires_photo and not is_open_ended) effective_points = self._apply_roulette_multiplier( chore, child_id, @@ -842,6 +870,8 @@ class ChoresMixin: approved=auto_approve, points_awarded=effective_points if auto_approve else 0, photo_url=photo_url or "", + note=note, + suggested_points=suggested_points, ) # Record the completion before awarding anything. Awarding can suspend @@ -888,7 +918,10 @@ class ChoresMixin: await self._async_notify_pending_approval( child.name, chore.name, - chore.points, + # An open-ended chore has no points of its own, so quote the + # child's own estimate — otherwise every one of these pushes + # announces "+0" (#832). + completion.suggested_points if is_open_ended else chore.points, completion_id=completion.id, photo_url=completion.photo_url, ) @@ -1049,12 +1082,19 @@ class ChoresMixin: await self.async_refresh() return completion - async def async_approve_chore(self, completion_id: str, refresh: bool = True) -> None: + async def async_approve_chore(self, completion_id: str, refresh: bool = True, points: int | None = None) -> None: """Approve a chore completion. ``refresh=False`` is used by ``async_approve_chores_bulk`` so a batch pays for one coordinator rebuild rather than one per completion (#794). The caller must refresh once it is done. + + ``points`` lets the approving parent set what the chore was actually + worth (#832) — needed for open-ended submissions, useful for any chore. + It replaces the chore's *base* points, so the streak and level + multipliers ``_award_points`` applies still ride on top exactly as they + would for an ordinary approval. ``None`` means "use the chore's value" + and leaves the existing behaviour untouched. """ completions = self.storage.get_completions() for completion in completions: @@ -1085,6 +1125,19 @@ class ChoresMixin: pts = self._apply_time_adjustment( chore, self.effective_chore_points(chore), completion.completed_at ) + if points is not None: + # An explicit award overrides every per-chore + # calculation above (bonus sub-task, timed rate, + # time-of-day adjustment) — the parent has looked at + # what was actually done and priced it themselves. + try: + pts = max(0, int(points)) + except (TypeError, ValueError): + _LOGGER.warning( + "Ignoring non-numeric points override %r for completion %s", + points, + completion_id, + ) # Claim the completion before awarding. The "already # approved" check above and the award are separated by an # await that can suspend, so two approvals landing together diff --git a/custom_components/taskmate/coord_rewards.py b/custom_components/taskmate/coord_rewards.py index b35455de..4fed772f 100644 --- a/custom_components/taskmate/coord_rewards.py +++ b/custom_components/taskmate/coord_rewards.py @@ -283,8 +283,18 @@ class RewardsMixin: # reward can never fail it, so without these two guards a child can # queue unlimited claims — each one a stored record plus a push to # every parent. - own_pending = [c for c in self.storage.get_pending_reward_claims() if c.child_id == child_id] - if any(c.reward_id == reward_id for c in own_pending): + pending = self.storage.get_pending_reward_claims() + own_pending = [c for c in pending if c.child_id == child_id] + # A jackpot is funded from one shared pool, so it is redeemed once per + # funding cycle: a queued claim owns that pool whoever made it. Without + # this, a second child's claim is approved after the pool is already + # spent, falls through to wallet mode, and charges them the full cost + # all over again (#873). + if reward.is_jackpot: + blocking = [c for c in pending if c.reward_id == reward_id] + else: + blocking = [c for c in own_pending if c.reward_id == reward_id] + if blocking: raise ValueError(f"A claim for '{reward.name}' is already waiting for approval") if len(own_pending) >= _MAX_PENDING_CLAIMS_PER_CHILD: raise ValueError("Too many reward claims are already waiting for approval") diff --git a/custom_components/taskmate/manifest.json b/custom_components/taskmate/manifest.json index 9be072ee..9f962979 100644 --- a/custom_components/taskmate/manifest.json +++ b/custom_components/taskmate/manifest.json @@ -17,5 +17,5 @@ "iot_class": "calculated", "issue_tracker": "https://github.com/tempus2016/taskmate/issues", "requirements": [], - "version": "5.6.1" + "version": "5.7.0" } diff --git a/custom_components/taskmate/models.py b/custom_components/taskmate/models.py index 86733216..76bb79e3 100644 --- a/custom_components/taskmate/models.py +++ b/custom_components/taskmate/models.py @@ -319,6 +319,11 @@ class Chore: mandatory: bool = False mandatory_penalty_points: int = 0 require_photo: bool = False # require an evidence photo; forces parent approval + # Open-ended "I did something extra" placeholder (#832): the card asks the + # child to describe the work and suggest a point value, and the parent sets + # the real points when approving. Forces parent approval — a child types + # the suggestion, so it must never self-award. + open_ended: bool = False # Dynamic assignment (sibling rotation) assignment_mode: str = "everyone" # everyone | alternating | random assignment_rotation_anchor: str = "" # ISO date; day-0 of the rotation for alternating @@ -401,6 +406,7 @@ class Chore: mandatory=bool(data.get("mandatory", False)), mandatory_penalty_points=max(0, int(data.get("mandatory_penalty_points", 0) or 0)), require_photo=data.get("require_photo", False), + open_ended=data.get("open_ended", False), assignment_mode=data.get("assignment_mode", "everyone"), assignment_rotation_anchor=data.get("assignment_rotation_anchor", ""), assignment_current_child_id=data.get("assignment_current_child_id", ""), @@ -467,6 +473,7 @@ class Chore: "mandatory": self.mandatory, "mandatory_penalty_points": self.mandatory_penalty_points, "require_photo": self.require_photo, + "open_ended": self.open_ended, "assignment_mode": self.assignment_mode, "assignment_rotation_anchor": self.assignment_rotation_anchor, "assignment_current_child_id": self.assignment_current_child_id, @@ -711,6 +718,8 @@ class ChoreCompletion: bonus_subtask_id: str = "" # Non-empty = this completion is for a bonus sub-task timed_duration_seconds: int = 0 photo_url: str = "" # optional evidence photo (URL/path) attached at completion + note: str = "" # child's own description of the work (open-ended chores, #832) + suggested_points: int = 0 # what the child reckons it was worth (#832) id: str = field(default_factory=generate_id) @classmethod @@ -729,6 +738,8 @@ class ChoreCompletion: bonus_subtask_id=data.get("bonus_subtask_id", ""), timed_duration_seconds=data.get("timed_duration_seconds", 0), photo_url=data.get("photo_url", ""), + note=data.get("note", ""), + suggested_points=int(data.get("suggested_points", 0) or 0), id=data.get("id") or generate_id(), ) @@ -744,6 +755,8 @@ class ChoreCompletion: "bonus_subtask_id": self.bonus_subtask_id, "timed_duration_seconds": self.timed_duration_seconds, "photo_url": self.photo_url, + "note": self.note, + "suggested_points": self.suggested_points, "id": self.id, } diff --git a/custom_components/taskmate/sensor.py b/custom_components/taskmate/sensor.py index e5700fc0..16dbce7d 100644 --- a/custom_components/taskmate/sensor.py +++ b/custom_components/taskmate/sensor.py @@ -261,6 +261,10 @@ def _build_chores_list(coordinator: TaskMateCoordinator, common: dict) -> list[d record["mandatory_penalty_points"] = penalty if getattr(c, "require_photo", False): record["require_photo"] = True + # Open-ended chores (#832): the child card asks for a description and a + # suggested point value instead of completing on a single tap. + if getattr(c, "open_ended", False): + record["open_ended"] = True recurrence = getattr(c, "recurrence", "weekly") if recurrence != "weekly": record["recurrence"] = recurrence @@ -1387,6 +1391,15 @@ class PendingApprovalsSensor(TaskMateBaseSensor): photo = getattr(comp, "photo_url", "") or "" if photo: detail["photo_url"] = photo + # The child's description and their own estimate (#832). Both + # are emitted only when set — an ordinary tap-to-complete + # carries neither, and this slice is capped at 16KB. + note = getattr(comp, "note", "") or "" + if note: + detail["note"] = note + suggested = getattr(comp, "suggested_points", 0) or 0 + if suggested: + detail["suggested_points"] = suggested completion_details.append(detail) reward_details = [] diff --git a/custom_components/taskmate/services.yaml b/custom_components/taskmate/services.yaml index 67349a83..a1508e46 100644 --- a/custom_components/taskmate/services.yaml +++ b/custom_components/taskmate/services.yaml @@ -27,6 +27,22 @@ complete_chore: required: false selector: text: + note: + name: Note + description: What the child did, in their own words. Required when the chore is open-ended, and shown to the parent during approval. + required: false + selector: + text: + multiline: true + suggested_points: + name: Suggested points + description: What the child reckons the work was worth. A hint for the approving parent — it awards nothing on its own. + required: false + selector: + number: + min: 0 + max: 999 + mode: box complete_bonus_subtask: name: Complete Bonus Sub-task @@ -61,6 +77,15 @@ approve_chore: required: true selector: text: + points: + name: Points + description: Award this many points instead of the chore's own value. Leave empty to use the chore's points. + required: false + selector: + number: + min: 0 + max: 9999 + mode: box approve_all_chores: name: Approve All Chores diff --git a/custom_components/taskmate/strings.json b/custom_components/taskmate/strings.json index c7b9b9b5..baca054f 100644 --- a/custom_components/taskmate/strings.json +++ b/custom_components/taskmate/strings.json @@ -139,6 +139,14 @@ "child_id": { "name": "Child ID", "description": "The ID of the child completing the chore" + }, + "note": { + "name": "Note", + "description": "What the child did, in their own words. Required when the chore is open-ended, and shown to the parent during approval." + }, + "suggested_points": { + "name": "Suggested points", + "description": "What the child reckons the work was worth. A hint for the approving parent — it awards nothing on its own." } } }, @@ -167,6 +175,10 @@ "completion_id": { "name": "Completion ID", "description": "The ID of the chore completion to approve" + }, + "points": { + "name": "Points", + "description": "Award this many points instead of the chore's own value. Leave empty to use the chore's points." } } }, diff --git a/custom_components/taskmate/translations/de.json b/custom_components/taskmate/translations/de.json index 9f5e6797..31b9985a 100644 --- a/custom_components/taskmate/translations/de.json +++ b/custom_components/taskmate/translations/de.json @@ -139,6 +139,14 @@ "child_id": { "name": "Kinder-ID", "description": "Die ID des Kindes, das die Aufgabe erledigt" + }, + "note": { + "name": "Notiz", + "description": "Was das Kind getan hat, in seinen eigenen Worten. Bei offenen Aufgaben erforderlich und den Eltern bei der Genehmigung angezeigt." + }, + "suggested_points": { + "name": "Vorgeschlagene Punkte", + "description": "Was das Kind für die Arbeit für angemessen hält. Nur ein Hinweis für die genehmigenden Eltern — es werden dadurch keine Punkte vergeben." } } }, @@ -167,6 +175,10 @@ "completion_id": { "name": "Abschluss-ID", "description": "Die ID des zu genehmigenden Aufgabenabschlusses" + }, + "points": { + "name": "Punkte", + "description": "Diese Punktzahl anstelle des Aufgabenwerts vergeben. Leer lassen, um die Punkte der Aufgabe zu verwenden." } } }, diff --git a/custom_components/taskmate/translations/en-GB.json b/custom_components/taskmate/translations/en-GB.json index c7b9b9b5..baca054f 100644 --- a/custom_components/taskmate/translations/en-GB.json +++ b/custom_components/taskmate/translations/en-GB.json @@ -139,6 +139,14 @@ "child_id": { "name": "Child ID", "description": "The ID of the child completing the chore" + }, + "note": { + "name": "Note", + "description": "What the child did, in their own words. Required when the chore is open-ended, and shown to the parent during approval." + }, + "suggested_points": { + "name": "Suggested points", + "description": "What the child reckons the work was worth. A hint for the approving parent — it awards nothing on its own." } } }, @@ -167,6 +175,10 @@ "completion_id": { "name": "Completion ID", "description": "The ID of the chore completion to approve" + }, + "points": { + "name": "Points", + "description": "Award this many points instead of the chore's own value. Leave empty to use the chore's points." } } }, diff --git a/custom_components/taskmate/translations/en.json b/custom_components/taskmate/translations/en.json index c7b9b9b5..baca054f 100644 --- a/custom_components/taskmate/translations/en.json +++ b/custom_components/taskmate/translations/en.json @@ -139,6 +139,14 @@ "child_id": { "name": "Child ID", "description": "The ID of the child completing the chore" + }, + "note": { + "name": "Note", + "description": "What the child did, in their own words. Required when the chore is open-ended, and shown to the parent during approval." + }, + "suggested_points": { + "name": "Suggested points", + "description": "What the child reckons the work was worth. A hint for the approving parent — it awards nothing on its own." } } }, @@ -167,6 +175,10 @@ "completion_id": { "name": "Completion ID", "description": "The ID of the chore completion to approve" + }, + "points": { + "name": "Points", + "description": "Award this many points instead of the chore's own value. Leave empty to use the chore's points." } } }, diff --git a/custom_components/taskmate/translations/fr.json b/custom_components/taskmate/translations/fr.json index 34f1c99a..f7fad11b 100644 --- a/custom_components/taskmate/translations/fr.json +++ b/custom_components/taskmate/translations/fr.json @@ -139,6 +139,14 @@ "child_id": { "name": "ID de l'enfant", "description": "L'identifiant de l'enfant effectuant la corvée" + }, + "note": { + "name": "Note", + "description": "Ce que l'enfant a fait, avec ses propres mots. Obligatoire pour les tâches ouvertes, et affiché au parent lors de l'approbation." + }, + "suggested_points": { + "name": "Points suggérés", + "description": "Ce que l'enfant estime que le travail valait. Une simple indication pour le parent qui approuve — cela n'attribue aucun point." } } }, @@ -167,6 +175,10 @@ "completion_id": { "name": "ID de complétion", "description": "L'identifiant de l'exécution à approuver" + }, + "points": { + "name": "Points", + "description": "Attribuer ce nombre de points au lieu de la valeur de la tâche. Laisser vide pour utiliser les points de la tâche." } } }, diff --git a/custom_components/taskmate/translations/nb.json b/custom_components/taskmate/translations/nb.json index af4a1713..bbe09df1 100644 --- a/custom_components/taskmate/translations/nb.json +++ b/custom_components/taskmate/translations/nb.json @@ -139,6 +139,14 @@ "child_id": { "name": "Barn-ID", "description": "ID-en til barnet som fullfører oppgaven" + }, + "note": { + "name": "Notat", + "description": "Hva barnet gjorde, med egne ord. Påkrevd for åpne oppgaver, og vises til forelderen ved godkjenning." + }, + "suggested_points": { + "name": "Foreslåtte poeng", + "description": "Hva barnet mener arbeidet var verdt. Bare et hint til forelderen som godkjenner — det gir ikke poeng i seg selv." } } }, @@ -167,6 +175,10 @@ "completion_id": { "name": "Fullførings-ID", "description": "ID-en til oppgavefullføringen som skal godkjennes" + }, + "points": { + "name": "Poeng", + "description": "Gi dette antallet poeng i stedet for oppgavens egen verdi. La stå tomt for å bruke oppgavens poeng." } } }, diff --git a/custom_components/taskmate/translations/nn.json b/custom_components/taskmate/translations/nn.json index fba4a15c..1f232345 100644 --- a/custom_components/taskmate/translations/nn.json +++ b/custom_components/taskmate/translations/nn.json @@ -139,6 +139,14 @@ "child_id": { "name": "Born-ID", "description": "ID-en til bornet som fullfører oppgåva" + }, + "note": { + "name": "Notat", + "description": "Kva barnet gjorde, med eigne ord. Påkravd for opne oppgåver, og vert vist til forelderen ved godkjenning." + }, + "suggested_points": { + "name": "Føreslåtte poeng", + "description": "Kva barnet meiner arbeidet var verdt. Berre eit hint til forelderen som godkjenner — det gjev ikkje poeng i seg sjølv." } } }, @@ -167,6 +175,10 @@ "completion_id": { "name": "Fullførings-ID", "description": "ID-en til oppgåvefullføringa som skal godkjennast" + }, + "points": { + "name": "Poeng", + "description": "Gje dette talet poeng i staden for oppgåva sin eigen verdi. Lat stå tomt for å bruke poenga til oppgåva." } } }, diff --git a/custom_components/taskmate/translations/pt-BR.json b/custom_components/taskmate/translations/pt-BR.json index 1f94490c..4e970fcb 100644 --- a/custom_components/taskmate/translations/pt-BR.json +++ b/custom_components/taskmate/translations/pt-BR.json @@ -139,6 +139,14 @@ "child_id": { "name": "ID da criança", "description": "O ID da criança que conclui a tarefa" + }, + "note": { + "name": "Observação", + "description": "O que a criança fez, com as próprias palavras. Obrigatório em tarefas abertas e mostrado ao responsável na aprovação." + }, + "suggested_points": { + "name": "Pontos sugeridos", + "description": "Quanto a criança acha que o trabalho valeu. Apenas uma sugestão para quem aprova — não concede pontos por si só." } } }, @@ -167,6 +175,10 @@ "completion_id": { "name": "ID de conclusão", "description": "O ID da conclusão da tarefa a aprovar" + }, + "points": { + "name": "Pontos", + "description": "Atribuir esta quantidade de pontos em vez do valor da própria tarefa. Deixe vazio para usar os pontos da tarefa." } } }, diff --git a/custom_components/taskmate/translations/pt.json b/custom_components/taskmate/translations/pt.json index a51f880c..462685ca 100644 --- a/custom_components/taskmate/translations/pt.json +++ b/custom_components/taskmate/translations/pt.json @@ -139,6 +139,14 @@ "child_id": { "name": "ID da criança", "description": "O ID da criança que conclui a tarefa" + }, + "note": { + "name": "Nota", + "description": "O que a criança fez, nas suas próprias palavras. Obrigatório em tarefas abertas e mostrado ao progenitor na aprovação." + }, + "suggested_points": { + "name": "Pontos sugeridos", + "description": "Quanto a criança acha que o trabalho valeu. Apenas uma sugestão para quem aprova — não atribui pontos por si só." } } }, @@ -167,6 +175,10 @@ "completion_id": { "name": "ID de conclusão", "description": "O ID da conclusão da tarefa a aprovar" + }, + "points": { + "name": "Pontos", + "description": "Atribuir este número de pontos em vez do valor da própria tarefa. Deixe vazio para usar os pontos da tarefa." } } }, diff --git a/custom_components/taskmate/websocket.py b/custom_components/taskmate/websocket.py index a2ebc743..639c2bc1 100644 --- a/custom_components/taskmate/websocket.py +++ b/custom_components/taskmate/websocket.py @@ -601,6 +601,7 @@ _CHORE_EDITABLE_FIELDS = { "early_bonus", "late_penalty", "require_photo", + "open_ended", "mandatory", "mandatory_penalty_points", "assignment_mode", @@ -657,6 +658,7 @@ def _chore_payload_schema(*, require_name: bool): vol.Optional("mandatory"): bool, vol.Optional("mandatory_penalty_points"): vol.All(int, vol.Range(min=0)), vol.Optional("require_photo"): bool, + vol.Optional("open_ended"): bool, vol.Optional("assignment_mode"): vol.In(ASSIGNMENT_MODES), vol.Optional("assignment_rotation_anchor"): str, vol.Optional("require_availability"): bool, @@ -1984,12 +1986,14 @@ async def _ws_complete_bonus_subtask(hass, connection, msg, coordinator): { vol.Required("type"): WS_APPROVE_CHORE, vol.Required("completion_id"): str, + # Optional per-approval award (#832) — replaces the chore's own points. + vol.Optional("points"): vol.All(vol.Coerce(int), vol.Range(min=0)), } ) @websocket_api.async_response @_admin_only async def _ws_approve_chore(hass, connection, msg, coordinator): - await coordinator.async_approve_chore(msg["completion_id"]) + await coordinator.async_approve_chore(msg["completion_id"], points=msg.get("points")) connection.send_result(msg["id"], {"completion_id": msg["completion_id"]}) diff --git a/custom_components/taskmate/www/locales/de.json b/custom_components/taskmate/www/locales/de.json index 055bdb44..6fcac97f 100644 --- a/custom_components/taskmate/www/locales/de.json +++ b/custom_components/taskmate/www/locales/de.json @@ -69,6 +69,9 @@ "approvals.all_caught_up": "Alles aufgeholt!", "approvals.approve": "Genehmigen", "approvals.approve_all": "Alle genehmigen", + "approvals.child_said": "Gesagt", + "approvals.suggested": "Vorschlag: {points}", + "approvals.award_label": "Vergeben", "approvals.approve_all_busy": "Wird genehmigt…", "approvals.approve_all_confirm": "{count} ausstehende Aufgaben genehmigen?", "approvals.card_description": "Eine Karte zum Verwalten ausstehender Aufgabengenehmigungen für TaskMate", @@ -219,6 +222,13 @@ "child.swap_requested": "Angefragt", "child.photo_needed": "Foto erforderlich", "child.photo_required_title": "Foto hinzufügen", + "child.extra_title": "Was hast du gemacht?", + "child.extra_hint": "Sag, was du gemacht hast und was es dir wert ist.", + "child.extra_desc_placeholder": "Ich habe die Veranda aufgeräumt", + "child.extra_points_label": "So viele Punkte ist es dir wert", + "child.extra_submit": "Senden", + "child.extra_needs_desc": "Schreib zuerst, was du gemacht hast.", + "child.open_ended_tag": "Beschreiben", "child.photo_take": "Foto aufnehmen", "child.photo_hint": "Zeig deine erledigte Aufgabe", "child.photo_retake": "Neu aufnehmen", @@ -1438,6 +1448,8 @@ "panel.chore_late_penalty_label": "Verspätungsabzug", "panel.chore_require_photo_label": "Fotonachweis verlangen", "panel.chore_require_photo_hint": "Erledigungen müssen von Eltern bestätigt werden; ein Beweisfoto (falls vorhanden) erscheint bei den Genehmigungen.", + "panel.chore_open_ended_label": "Offene Aufgabe (Kind beschreibt sie)", + "panel.chore_open_ended_hint": "Das Kind schreibt, was es gemacht hat, und schlägt Punkte vor. Erfordert immer Ihre Genehmigung — Sie legen die echten Punkte fest.", "panel.activity_view_photo": "Foto ansehen", "panel.adjust_add": "Hinzufügen", "panel.adjust_add_title": "{child} {amount} {points} hinzufügen", diff --git a/custom_components/taskmate/www/locales/en-GB.json b/custom_components/taskmate/www/locales/en-GB.json index dc4c9761..cfe5d675 100644 --- a/custom_components/taskmate/www/locales/en-GB.json +++ b/custom_components/taskmate/www/locales/en-GB.json @@ -69,6 +69,9 @@ "approvals.all_caught_up": "All caught up!", "approvals.approve": "Approve", "approvals.approve_all": "Approve all", + "approvals.child_said": "They said", + "approvals.suggested": "Suggested: {points}", + "approvals.award_label": "Award", "approvals.approve_all_busy": "Approving…", "approvals.approve_all_confirm": "Approve {count} pending chores?", "approvals.card_description": "A card to manage pending chore approvals for TaskMate", @@ -221,6 +224,13 @@ "child.swap_requested": "Requested", "child.photo_needed": "Photo needed", "child.photo_required_title": "Add a photo", + "child.extra_title": "What did you do?", + "child.extra_hint": "Tell them what you did, and what you think it's worth.", + "child.extra_desc_placeholder": "I tidied the porch", + "child.extra_points_label": "Points you think it's worth", + "child.extra_submit": "Send", + "child.extra_needs_desc": "Write what you did first.", + "child.open_ended_tag": "Describe it", "child.photo_take": "Take a photo", "child.photo_hint": "Show your finished chore", "child.photo_retake": "Retake", @@ -1438,6 +1448,8 @@ "panel.chore_late_penalty_label": "Late penalty", "panel.chore_require_photo_label": "Require photo proof", "panel.chore_require_photo_hint": "Completions must be parent-approved; an evidence photo (if provided) shows in approvals.", + "panel.chore_open_ended_label": "Open-ended (child describes it)", + "panel.chore_open_ended_hint": "The child writes what they did and suggests points. Always needs your approval — you set the real points.", "panel.activity_view_photo": "View photo", "panel.adjust_add": "Add", "panel.adjust_add_title": "Add {amount} {points} to {child}", diff --git a/custom_components/taskmate/www/locales/en.json b/custom_components/taskmate/www/locales/en.json index dc4c9761..cfe5d675 100644 --- a/custom_components/taskmate/www/locales/en.json +++ b/custom_components/taskmate/www/locales/en.json @@ -69,6 +69,9 @@ "approvals.all_caught_up": "All caught up!", "approvals.approve": "Approve", "approvals.approve_all": "Approve all", + "approvals.child_said": "They said", + "approvals.suggested": "Suggested: {points}", + "approvals.award_label": "Award", "approvals.approve_all_busy": "Approving…", "approvals.approve_all_confirm": "Approve {count} pending chores?", "approvals.card_description": "A card to manage pending chore approvals for TaskMate", @@ -221,6 +224,13 @@ "child.swap_requested": "Requested", "child.photo_needed": "Photo needed", "child.photo_required_title": "Add a photo", + "child.extra_title": "What did you do?", + "child.extra_hint": "Tell them what you did, and what you think it's worth.", + "child.extra_desc_placeholder": "I tidied the porch", + "child.extra_points_label": "Points you think it's worth", + "child.extra_submit": "Send", + "child.extra_needs_desc": "Write what you did first.", + "child.open_ended_tag": "Describe it", "child.photo_take": "Take a photo", "child.photo_hint": "Show your finished chore", "child.photo_retake": "Retake", @@ -1438,6 +1448,8 @@ "panel.chore_late_penalty_label": "Late penalty", "panel.chore_require_photo_label": "Require photo proof", "panel.chore_require_photo_hint": "Completions must be parent-approved; an evidence photo (if provided) shows in approvals.", + "panel.chore_open_ended_label": "Open-ended (child describes it)", + "panel.chore_open_ended_hint": "The child writes what they did and suggests points. Always needs your approval — you set the real points.", "panel.activity_view_photo": "View photo", "panel.adjust_add": "Add", "panel.adjust_add_title": "Add {amount} {points} to {child}", diff --git a/custom_components/taskmate/www/locales/fr.json b/custom_components/taskmate/www/locales/fr.json index f0ebf419..e4ac50cd 100644 --- a/custom_components/taskmate/www/locales/fr.json +++ b/custom_components/taskmate/www/locales/fr.json @@ -69,6 +69,9 @@ "approvals.all_caught_up": "Tout est à jour !", "approvals.approve": "Approuver", "approvals.approve_all": "Tout approuver", + "approvals.child_said": "A dit", + "approvals.suggested": "Suggéré : {points}", + "approvals.award_label": "Attribuer", "approvals.approve_all_busy": "Approbation…", "approvals.approve_all_confirm": "Approuver {count} tâches en attente ?", "approvals.card_description": "Une carte pour gérer les approbations de tâches en attente pour TaskMate", @@ -219,6 +222,13 @@ "child.swap_requested": "Demandé", "child.photo_needed": "Photo requise", "child.photo_required_title": "Ajouter une photo", + "child.extra_title": "Qu'as-tu fait ?", + "child.extra_hint": "Dis ce que tu as fait et ce que tu penses que ça vaut.", + "child.extra_desc_placeholder": "J'ai rangé le porche", + "child.extra_points_label": "Points que tu penses mériter", + "child.extra_submit": "Envoyer", + "child.extra_needs_desc": "Écris d'abord ce que tu as fait.", + "child.open_ended_tag": "À décrire", "child.photo_take": "Prendre une photo", "child.photo_hint": "Montre ta tâche terminée", "child.photo_retake": "Reprendre", @@ -1438,6 +1448,8 @@ "panel.chore_late_penalty_label": "Pénalité de retard", "panel.chore_require_photo_label": "Exiger une preuve photo", "panel.chore_require_photo_hint": "Les réalisations doivent être approuvées par un parent ; une photo de preuve (si fournie) s'affiche dans les approbations.", + "panel.chore_open_ended_label": "Tâche ouverte (l'enfant la décrit)", + "panel.chore_open_ended_hint": "L'enfant écrit ce qu'il a fait et propose des points. Nécessite toujours votre approbation — c'est vous qui fixez les points réels.", "panel.activity_view_photo": "Voir la photo", "panel.adjust_add": "Ajouter", "panel.adjust_add_title": "Ajouter {amount} {points} à {child}", diff --git a/custom_components/taskmate/www/locales/nb.json b/custom_components/taskmate/www/locales/nb.json index 0cd3bcbe..280d0092 100644 --- a/custom_components/taskmate/www/locales/nb.json +++ b/custom_components/taskmate/www/locales/nb.json @@ -69,6 +69,9 @@ "approvals.all_caught_up": "Alt er oppdatert!", "approvals.approve": "Godkjenn", "approvals.approve_all": "Godkjenn alle", + "approvals.child_said": "Sa", + "approvals.suggested": "Foreslått: {points}", + "approvals.award_label": "Gi", "approvals.approve_all_busy": "Godkjenner…", "approvals.approve_all_confirm": "Godkjenne {count} ventende gjøremål?", "approvals.card_description": "Et kort for å håndtere ventende oppgavegodkjenninger", @@ -219,6 +222,13 @@ "child.swap_requested": "Forespurt", "child.photo_needed": "Bilde kreves", "child.photo_required_title": "Legg til et bilde", + "child.extra_title": "Hva gjorde du?", + "child.extra_hint": "Si hva du gjorde, og hva du synes det er verdt.", + "child.extra_desc_placeholder": "Jeg ryddet verandaen", + "child.extra_points_label": "Poeng du synes det er verdt", + "child.extra_submit": "Send", + "child.extra_needs_desc": "Skriv først hva du gjorde.", + "child.open_ended_tag": "Beskriv", "child.photo_take": "Ta et bilde", "child.photo_hint": "Vis den ferdige oppgaven", "child.photo_retake": "Ta på nytt", @@ -1438,6 +1448,8 @@ "panel.chore_late_penalty_label": "Forsinkelsesstraff", "panel.chore_require_photo_label": "Krev bildebevis", "panel.chore_require_photo_hint": "Fullføringer må godkjennes av forelder; et bevisbilde (hvis lagt ved) vises i godkjenninger.", + "panel.chore_open_ended_label": "Åpen oppgave (barnet beskriver den)", + "panel.chore_open_ended_hint": "Barnet skriver hva det gjorde og foreslår poeng. Krever alltid din godkjenning — du setter de faktiske poengene.", "panel.activity_view_photo": "Vis bilde", "panel.adjust_add": "Legg til", "panel.adjust_add_title": "Legg til {amount} {points} til {child}", diff --git a/custom_components/taskmate/www/locales/nn.json b/custom_components/taskmate/www/locales/nn.json index 56942f1a..2f0845ad 100644 --- a/custom_components/taskmate/www/locales/nn.json +++ b/custom_components/taskmate/www/locales/nn.json @@ -69,6 +69,9 @@ "approvals.all_caught_up": "Alt er oppdatert!", "approvals.approve": "Godkjenn", "approvals.approve_all": "Godkjenn alle", + "approvals.child_said": "Sa", + "approvals.suggested": "Føreslått: {points}", + "approvals.award_label": "Gje", "approvals.approve_all_busy": "Godkjenner…", "approvals.approve_all_confirm": "Godkjenne {count} ventande gjeremål?", "approvals.card_description": "Eit kort for å handtere ventande oppgåvegodkjenningar", @@ -219,6 +222,13 @@ "child.swap_requested": "Førespurd", "child.photo_needed": "Bilete krevst", "child.photo_required_title": "Legg til eit bilete", + "child.extra_title": "Kva gjorde du?", + "child.extra_hint": "Sei kva du gjorde, og kva du meiner det er verdt.", + "child.extra_desc_placeholder": "Eg rydda verandaen", + "child.extra_points_label": "Poeng du meiner det er verdt", + "child.extra_submit": "Send", + "child.extra_needs_desc": "Skriv først kva du gjorde.", + "child.open_ended_tag": "Beskriv", "child.photo_take": "Ta eit bilete", "child.photo_hint": "Vis den ferdige oppgåva", "child.photo_retake": "Ta på nytt", @@ -1438,6 +1448,8 @@ "panel.chore_late_penalty_label": "Forseinkingsstraff", "panel.chore_require_photo_label": "Krev biletbevis", "panel.chore_require_photo_hint": "Fullføringar må godkjennast av forelder; eit bevisbilete (om lagt ved) vert vist i godkjenningar.", + "panel.chore_open_ended_label": "Open oppgåve (barnet skriv kva det er)", + "panel.chore_open_ended_hint": "Barnet skriv kva det gjorde og føreslår poeng. Krev alltid di godkjenning — du set dei faktiske poenga.", "panel.activity_view_photo": "Vis bilete", "panel.adjust_add": "Legg til", "panel.adjust_add_title": "Legg til {amount} {points} til {child}", diff --git a/custom_components/taskmate/www/locales/pt-BR.json b/custom_components/taskmate/www/locales/pt-BR.json index b53511dd..f5c740ae 100644 --- a/custom_components/taskmate/www/locales/pt-BR.json +++ b/custom_components/taskmate/www/locales/pt-BR.json @@ -69,6 +69,9 @@ "approvals.all_caught_up": "Está tudo em dia!", "approvals.approve": "Aprovar", "approvals.approve_all": "Aprovar tudo", + "approvals.child_said": "Disse", + "approvals.suggested": "Sugerido: {points}", + "approvals.award_label": "Conceder", "approvals.approve_all_busy": "Aprovando…", "approvals.approve_all_confirm": "Aprovar {count} tarefas pendentes?", "approvals.card_description": "Cartão para gerir aprovações de tarefas pendentes no TaskMate", @@ -219,6 +222,13 @@ "child.swap_requested": "Solicitado", "child.photo_needed": "Foto necessária", "child.photo_required_title": "Adicionar uma foto", + "child.extra_title": "O que você fez?", + "child.extra_hint": "Conte o que você fez e quanto acha que vale.", + "child.extra_desc_placeholder": "Arrumei a varanda", + "child.extra_points_label": "Pontos que você acha que vale", + "child.extra_submit": "Enviar", + "child.extra_needs_desc": "Escreva primeiro o que você fez.", + "child.open_ended_tag": "Descrever", "child.photo_take": "Tirar uma foto", "child.photo_hint": "Mostre sua tarefa concluída", "child.photo_retake": "Repetir", @@ -1438,6 +1448,8 @@ "panel.chore_late_penalty_label": "Penalidade por atraso", "panel.chore_require_photo_label": "Exigir prova fotográfica", "panel.chore_require_photo_hint": "As conclusões precisam ser aprovadas pelos pais; uma foto de prova (se fornecida) aparece nas aprovações.", + "panel.chore_open_ended_label": "Tarefa aberta (a criança descreve)", + "panel.chore_open_ended_hint": "A criança escreve o que fez e sugere pontos. Sempre precisa da sua aprovação — você define os pontos reais.", "panel.activity_view_photo": "Ver foto", "panel.adjust_add": "Adicionar", "panel.adjust_add_title": "Adicionar {amount} {points} para {child}", diff --git a/custom_components/taskmate/www/locales/pt.json b/custom_components/taskmate/www/locales/pt.json index 02b2463c..e9a9f37a 100644 --- a/custom_components/taskmate/www/locales/pt.json +++ b/custom_components/taskmate/www/locales/pt.json @@ -69,6 +69,9 @@ "approvals.all_caught_up": "Está tudo em dia!", "approvals.approve": "Aprovar", "approvals.approve_all": "Aprovar tudo", + "approvals.child_said": "Disse", + "approvals.suggested": "Sugerido: {points}", + "approvals.award_label": "Atribuir", "approvals.approve_all_busy": "A aprovar…", "approvals.approve_all_confirm": "Aprovar {count} tarefas pendentes?", "approvals.card_description": "Cartão para gerir aprovações de tarefas pendentes no TaskMate", @@ -219,6 +222,13 @@ "child.swap_requested": "Pedido", "child.photo_needed": "Foto necessária", "child.photo_required_title": "Adicionar uma foto", + "child.extra_title": "O que fizeste?", + "child.extra_hint": "Diz o que fizeste e quanto achas que vale.", + "child.extra_desc_placeholder": "Arrumei a varanda", + "child.extra_points_label": "Pontos que achas que vale", + "child.extra_submit": "Enviar", + "child.extra_needs_desc": "Escreve primeiro o que fizeste.", + "child.open_ended_tag": "Descrever", "child.photo_take": "Tirar uma foto", "child.photo_hint": "Mostra a tua tarefa terminada", "child.photo_retake": "Repetir", @@ -1438,6 +1448,8 @@ "panel.chore_late_penalty_label": "Penalização por atraso", "panel.chore_require_photo_label": "Exigir prova fotográfica", "panel.chore_require_photo_hint": "As conclusões têm de ser aprovadas pelos pais; uma foto de prova (se fornecida) aparece nas aprovações.", + "panel.chore_open_ended_label": "Tarefa aberta (a criança descreve-a)", + "panel.chore_open_ended_hint": "A criança escreve o que fez e sugere pontos. Requer sempre a tua aprovação — és tu que defines os pontos reais.", "panel.activity_view_photo": "Ver foto", "panel.adjust_add": "Adicionar", "panel.adjust_add_title": "Adicionar {amount} {points} a {child}", diff --git a/custom_components/taskmate/www/taskmate-approvals-card.js b/custom_components/taskmate/www/taskmate-approvals-card.js index db1e561b..2239eb67 100644 --- a/custom_components/taskmate/www/taskmate-approvals-card.js +++ b/custom_components/taskmate/www/taskmate-approvals-card.js @@ -33,6 +33,7 @@ class TaskMateApprovalsCard extends LitElement { config: { type: Object }, _loading: { type: Object }, _signed: { state: true }, + _review: { state: true }, }; } @@ -368,6 +369,106 @@ class TaskMateApprovalsCard extends LitElement { color: white; } + /* Review-and-award sheet (#832) */ + .action-button.adjust { + background: var(--secondary-background-color, #f1f1f1); + color: var(--primary-text-color, #33373d); + font-size: 1rem; + line-height: 1; + } + + /* Fixed, not absolute: ha-card sets overflow:hidden, which would clip an + absolutely-positioned overlay to the card's own box. */ + .tm-rv-overlay { + position: fixed; + inset: 0; + background: rgba(20, 20, 30, 0.72); + display: flex; + align-items: center; + justify-content: center; + padding: 18px; + z-index: 10000; + } + + .tm-rv-sheet { + width: 100%; + max-width: 340px; + box-sizing: border-box; + background: var(--card-background-color, #fff); + color: var(--primary-text-color, #33373d); + border-radius: 16px; + padding: 18px; + box-shadow: 0 12px 32px rgba(0, 0, 0, 0.3); + max-height: 88vh; + overflow-y: auto; + } + + .tm-rv-title { font-size: 1.05rem; font-weight: 800; } + .tm-rv-sub { + font-size: 0.82rem; + color: var(--secondary-text-color, #6b7280); + margin: 2px 0 12px; + } + + .tm-rv-quote { + border-left: 3px solid var(--accent-color, #ffc107); + padding: 6px 0 6px 10px; + margin-bottom: 12px; + font-size: 0.92rem; + white-space: pre-wrap; + overflow-wrap: anywhere; + } + + /* Capped: a portrait photo would otherwise push the award field and the + buttons off the bottom of the sheet. */ + .tm-rv-photo img { + width: 100%; + max-height: 34vh; + object-fit: cover; + border-radius: 12px; + display: block; + margin-bottom: 12px; + } + + .tm-rv-label { + display: block; + font-size: 0.8rem; + font-weight: 700; + color: var(--secondary-text-color, #6b7280); + margin-bottom: 6px; + } + + .tm-rv-points { + width: 100%; + box-sizing: border-box; + font: inherit; + font-size: 1.1rem; + font-weight: 800; + padding: 10px 12px; + border-radius: 12px; + border: 2px solid var(--divider-color, #e0e0e0); + background: var(--card-background-color, #fff); + color: var(--primary-text-color, #33373d); + } + + .tm-rv-points:focus { outline: none; border-color: #4caf50; } + + .tm-rv-row { display: flex; gap: 10px; margin-top: 16px; } + .tm-rv-btn { + flex: 1; + border: none; + border-radius: 12px; + padding: 11px 0; + font: inherit; + font-weight: 800; + cursor: pointer; + } + .tm-rv-btn.ghost { + background: var(--secondary-background-color, #f1f1f1); + color: var(--primary-text-color, #33373d); + } + .tm-rv-btn.primary { background: #4caf50; color: #fff; } + /* Mandatory-miss review actions (#532) */ .action-button.penalty { background: var(--fun-red, #e74c3c); @@ -628,6 +729,7 @@ class TaskMateApprovalsCard extends LitElement { ${filteredCompletions.length > 0 ? this._renderApprovals(groupedByDay) : ''} `} + ${this._renderReview()} `; } @@ -789,6 +891,7 @@ class TaskMateApprovalsCard extends LitElement { return html` ${this._designHeader(hd, items.length, completions)}
${body}
+ ${this._renderReview()}
`; } @@ -815,7 +918,7 @@ class TaskMateApprovalsCard extends LitElement { if (it.kind === "completion") { const approve = () => this._handleApprove(it.completion); const reject = () => this._handleReject(it.completion); - return this._apActionPair(approve, reject, isLoading, shape); + return this._apActionPair(approve, reject, isLoading, shape, it.completion); } if (it.kind === "claim") { const approve = () => this._handleApproveReward(it.id); @@ -845,9 +948,15 @@ class TaskMateApprovalsCard extends LitElement { @click="${() => this._handleDismiss(it.id)}">${this._t('approvals.dismiss')}`; } - _apActionPair(approve, reject, isLoading, shape) { + _apActionPair(approve, reject, isLoading, shape, completion = null) { + const adjust = completion + ? html`` + : ""; if (shape === "round") { return html` + ${adjust} `; } return html` + ${adjust} `; } @@ -1400,6 +1511,12 @@ class TaskMateApprovalsCard extends LitElement { ` : ''}
+ + +
+ + + `; + } + + async _callService(service, completionId, extra = null) { if (this._loading[completionId]) return; this._loading = { ...this._loading, [completionId]: true }; this.requestUpdate(); @@ -1453,6 +1647,7 @@ class TaskMateApprovalsCard extends LitElement { try { await this.hass.callService("taskmate", service, { completion_id: completionId, + ...(extra || {}), }); } catch (error) { console.error(`Failed to call ${service}:`, error); diff --git a/custom_components/taskmate/www/taskmate-child-card.js b/custom_components/taskmate/www/taskmate-child-card.js index f7c4c17b..2ee6c586 100644 --- a/custom_components/taskmate/www/taskmate-child-card.js +++ b/custom_components/taskmate/www/taskmate-child-card.js @@ -38,6 +38,7 @@ class TaskMateChildCard extends LitElement { _justEarnedBadge: { type: String }, _avatarPickerOpen: { type: Boolean }, _photoCapture: { type: Object }, + _extraCapture: { type: Object }, }; } @@ -1243,6 +1244,22 @@ class TaskMateChildCard extends LitElement { } @keyframes photo-spin { to { transform: rotate(360deg); } } + /* Open-ended submission sheet (#832) — shares the photo sheet's shell. */ + .extra-note, .extra-points { + width: 100%; box-sizing: border-box; font: inherit; + border-radius: 12px; padding: 10px 12px; + border: 2px solid var(--divider-color, #e0e0e0); + color: var(--primary-text-color, #33373d); + background: var(--card-background-color, #fff); + } + .extra-note { resize: vertical; font-size: 0.95rem; } + .extra-points { font-size: 1.05rem; font-weight: 800; } + .extra-note:focus, .extra-points:focus { outline: none; border-color: var(--fun-purple); } + .extra-points-label { + display: block; margin: 14px 0 6px; font-weight: 700; font-size: 0.85rem; + color: var(--secondary-text-color, #6b7280); + } + @keyframes fade-in { from { opacity: 0; } to { opacity: 1; } @@ -2157,6 +2174,7 @@ class TaskMateChildCard extends LitElement { ${this._celebrating ? this._renderCelebration() : ""} ${this._confetti.length > 0 ? this._renderConfetti() : ""} ${this._renderPhotoCapture()} + ${this._renderExtraCapture()} @@ -2401,6 +2419,7 @@ class TaskMateChildCard extends LitElement { timed: chore.task_type === "timed", mandatory: chore.mandatory === true, photo: chore.require_photo === true, + openEnded: chore.open_ended === true, pointsIcon, todaysCompletions, }; @@ -2485,6 +2504,7 @@ class TaskMateChildCard extends LitElement { ${this._celebrating ? this._renderCelebration() : ""} ${this._confetti.length > 0 ? this._renderConfetti() : ""} ${this._renderPhotoCapture()} + ${this._renderExtraCapture()} `; @@ -2540,10 +2560,11 @@ class TaskMateChildCard extends LitElement { : this._t("child.claimed_by_another_generic")) : ""; return html` - ${r.mandatory || r.photo || depNames.length || recLabel || firstComeLabel ? html` + ${r.mandatory || r.photo || r.openEnded || depNames.length || recLabel || firstComeLabel ? html`
${r.mandatory ? html`⚠ ${this._t("child.mandatory")}` : ""} ${r.photo ? html`📷 ${this._t("child.photo_needed")}` : ""} + ${r.openEnded ? html`✍️ ${this._t("child.open_ended_tag")}` : ""} ${depNames.length ? html`🔒 ${this._t("child.blocked_by_dependency", { chores: depNames.join(", ") })}` : ""} ${recLabel ? html`🕒 ${recLabel}` : ""} ${firstComeLabel ? html`✅ ${firstComeLabel}` : ""} @@ -3631,6 +3652,11 @@ class TaskMateChildCard extends LitElement { 📷 ${this._t('child.photo_needed')}
` : ''} + ${chore.open_ended && !isCompletedForToday ? html` +
+ ✍️ ${this._t('child.open_ended_tag')} +
+ ` : ''}
@@ -4007,7 +4033,7 @@ class TaskMateChildCard extends LitElement { `; } - async _handleComplete(chore, child, photoUrl = null) { + async _handleComplete(chore, child, photoUrl = null, extra = null) { const key = `${chore.id}_${child.id}`; const dailyLimit = chore.daily_limit || 1; @@ -4019,8 +4045,17 @@ class TaskMateChildCard extends LitElement { // Photo-evidence chores can't be completed with a plain tap — open the // capture overlay first. The overlay uploads the photo and then calls back // into this method with a photoUrl, which takes the service path below. + // Open-ended chores can't be completed with a plain tap either — the + // child's description IS the chore, so collect it first. Gating here + // rather than on the button covers every design's render path at once, + // and the sheet calls back in with `extra` filled. + if (chore.open_ended && !extra) { + this._openExtraCapture(chore, child); + return; + } + if (chore.require_photo && !photoUrl) { - this._openPhotoCapture(chore, child); + this._openPhotoCapture(chore, child, extra); return; } @@ -4071,7 +4106,9 @@ class TaskMateChildCard extends LitElement { // A photo-evidence completion MUST go through the service so it can carry // photo_url — a button-entity press cannot. Other chores prefer the button // entity so HA state-trigger automations fire. - const buttonEntityId = photoUrl ? null : (window.__taskmate_find_button + // A photo or an open-ended note can only travel on the service call, so + // either one rules out the button-entity shortcut. + const buttonEntityId = (photoUrl || extra) ? null : (window.__taskmate_find_button && window.__taskmate_find_button(this.hass, child.id, "complete", chore.id)); if (buttonEntityId) { await this.hass.callService("button", "press", { entity_id: buttonEntityId }); @@ -4080,6 +4117,8 @@ class TaskMateChildCard extends LitElement { chore_id: chore.id, child_id: child.id, ...(photoUrl ? { photo_url: photoUrl } : {}), + ...(extra && extra.note ? { note: extra.note } : {}), + ...(extra && extra.suggested_points ? { suggested_points: extra.suggested_points } : {}), }); } @@ -4149,9 +4188,9 @@ class TaskMateChildCard extends LitElement { // ── Photo-evidence capture ──────────────────────────────────────────────── - _openPhotoCapture(chore, child) { + _openPhotoCapture(chore, child, extra = null) { this._photoCapture = { - chore, child, step: "pick", previewUrl: "", blob: null, + chore, child, extra, step: "pick", previewUrl: "", blob: null, sizeKb: 0, error: "", }; this.requestUpdate(); @@ -4254,9 +4293,9 @@ class TaskMateChildCard extends LitElement { const { photo_url: photoUrl } = await resp.json(); if (!photoUrl) throw new Error("no photo_url in response"); - const { chore, child } = cap; + const { chore, child, extra } = cap; this._closePhotoCapture(); - await this._handleComplete(chore, child, photoUrl); + await this._handleComplete(chore, child, photoUrl, extra); } catch (err) { // Keep the overlay open on the preview so the child can retry. if (this._photoCapture) { @@ -4284,6 +4323,81 @@ class TaskMateChildCard extends LitElement { this.requestUpdate(); } + // ── Open-ended submission ("I did something extra", #832) ──────────────── + // + // The two inputs are deliberately uncontrolled and read from the DOM on + // submit: binding .value would re-render on every keystroke and fight the + // caret. Lit reuses the same elements across re-renders, so the typed text + // survives the error-state update below. + + _openExtraCapture(chore, child) { + this._extraCapture = { chore, child, error: "" }; + this.requestUpdate(); + this.updateComplete.then(() => { + const note = this.renderRoot && this.renderRoot.querySelector("#tm-extra-note"); + if (note) note.focus(); + }); + } + + _closeExtraCapture() { + this._extraCapture = null; + this.requestUpdate(); + } + + async _submitExtraCapture() { + const cap = this._extraCapture; + if (!cap) return; + const root = this.renderRoot; + const note = ((root && root.querySelector("#tm-extra-note")?.value) || "").trim(); + if (!note) { + this._extraCapture = { ...cap, error: this._t("child.extra_needs_desc") }; + this.requestUpdate(); + return; + } + const raw = Number((root && root.querySelector("#tm-extra-points")?.value) || 0); + const suggested = Math.min(Math.max(0, Math.round(raw) || 0), 999); + const { chore, child } = cap; + this._closeExtraCapture(); + await this._handleComplete(chore, child, null, { note, suggested_points: suggested }); + } + + _renderExtraCapture() { + const cap = this._extraCapture; + if (!cap) return ""; + const chore = cap.chore || {}; + const stop = (e) => e.stopPropagation(); + return html` +
+
+
✍️ ${this._t("child.extra_title")}
+
${chore.name || ""}
+
${this._t("child.extra_hint")}
+ + + + + + + ${cap.error ? html`
${cap.error}
` : ""} + +
+ + +
+
+
+ `; + } + _renderPhotoCapture() { const cap = this._photoCapture; if (!cap) return ""; diff --git a/custom_components/taskmate/www/taskmate-panel.js b/custom_components/taskmate/www/taskmate-panel.js index 93e0f801..ad89954a 100644 --- a/custom_components/taskmate/www/taskmate-panel.js +++ b/custom_components/taskmate/www/taskmate-panel.js @@ -1434,6 +1434,7 @@ class TaskMatePanel extends HTMLElement { due_time: "", early_bonus: 0, late_penalty: 0, mandatory: false, mandatory_penalty_points: 0, require_photo: false, + open_ended: false, publish_calendar_entities: [], depends_on: [], bonus_subtasks: [], @@ -1681,6 +1682,7 @@ class TaskMatePanel extends HTMLElement { mandatory: !!d.mandatory, mandatory_penalty_points: Math.max(0, Number(d.mandatory_penalty_points) || 0), require_photo: !!d.require_photo, + open_ended: !!d.open_ended, publish_calendar_entities: d.publish_calendar_entities || [], bonus_subtasks: (d.bonus_subtasks || []).filter(b => b.name && b.name.trim()).map(b => ({ name: b.name.trim(), points: Number(b.points) || 5, @@ -5457,6 +5459,8 @@ class TaskMatePanel extends HTMLElement { this._switch(this._t("panel.chore_approval_label"), "requires_approval", d.requires_approval), this._switch(this._t("panel.chore_require_photo_label"), "require_photo", d.require_photo, this._t("panel.chore_require_photo_hint")), + this._switch(this._t("panel.chore_open_ended_label"), "open_ended", d.open_ended, + this._t("panel.chore_open_ended_hint")), this._switch(this._t("panel.chore_require_availability"), "require_availability", d.require_availability, this._t("panel.chore_require_availability_hint")), this._switch(this._t("panel.chore_mandatory_label"), "mandatory", d.mandatory, diff --git a/custom_components/taskmate/www/taskmate-rewards-card.js b/custom_components/taskmate/www/taskmate-rewards-card.js index 79036f9e..5492b5c6 100644 --- a/custom_components/taskmate/www/taskmate-rewards-card.js +++ b/custom_components/taskmate/www/taskmate-rewards-card.js @@ -1339,25 +1339,17 @@ class TaskMateRewardsCard extends LitElement { let childContributions = []; if (isJackpot) { - const sharePerChild = relevantChildren.length > 0 - ? Math.round(displayCost / relevantChildren.length) - : displayCost; relevantChildren.forEach((child, index) => { // In pool mode, show allocated points only; in wallet mode show wallet points const points = enablePoolMode ? (poolAllocations[child.id] || 0) : (child.points || 0); - const shareOfGoal = relevantChildren.length > 0 ? (100 / relevantChildren.length) : 100; - const weightedProgress = sharePerChild > 0 ? Math.min((points / sharePerChild) * 100, 100) : 0; currentStars += points; childContributions.push({ name: child.name, points: points, colorIndex: index % 6, - expectedContribution: sharePerChild, - weightedProgress: weightedProgress, - shareOfGoal: shareOfGoal, }); }); } else { @@ -1378,8 +1370,11 @@ class TaskMateRewardsCard extends LitElement { const pcAttrs = (window.__taskmate_attrs && window.__taskmate_attrs(this.hass, this.config?.entity)) || this.hass?.states?.[this.config?.entity]?.attributes || {}; // Always a list, even if the attribute arrives as something else (#834). const pendingClaims = tmClaimList(pcAttrs.pending_reward_claims); + // A jackpot is one shared pool redeemed once per funding cycle, so a claim + // from any contributor puts the reward into "awaiting approval" for every + // child — not just the one who tapped Redeem (#873). const hasPendingClaim = pendingClaims.some(c => - c.reward_id === reward.id && (!childId || c.child_id === childId) + c.reward_id === reward.id && (isJackpot || !childId || c.child_id === childId) ); // Pool mode affordability / redeem state @@ -1746,25 +1741,16 @@ class TaskMateRewardsCard extends LitElement { _renderJackpotProgress(reward, childContributions, totalStars, pointsIcon, displayCost) { const cost = displayCost || reward.cost; - // For weighted display: each child's segment shows their progress toward their expected share - // The meter shows how much of their "responsibility" each child has fulfilled - const hasWeightedData = childContributions.some(c => c.expectedContribution > 0); - - // Calculate weighted segments - each segment width = (child's share of goal) * (their progress %) - // This way, if a child has 50% share and is at 100% progress, they fill 50% of the bar + // Every segment is measured against the shared goal (#874): a child who + // puts in 40 of a 50-point jackpot fills 80% of the bar. Sizing segments + // against an equal per-child share instead capped the over-contributor at + // their own slice, so a fully funded jackpot drew a part-empty bar. const segments = childContributions.map((contrib) => { - let width; - if (hasWeightedData && contrib.shareOfGoal > 0) { - // Weighted: segment width = share of goal * progress percentage - // e.g., 40% share at 50% progress = 20% of bar filled - width = (contrib.shareOfGoal / 100) * (contrib.weightedProgress / 100) * 100; - } else { - // Fallback: raw contribution relative to cost - width = cost > 0 ? Math.min((contrib.points / cost) * 100, 100) : 0; - } + const sharePct = cost > 0 ? Math.min((contrib.points / cost) * 100, 100) : 0; return { ...contrib, - width: width + sharePct: sharePct, + width: sharePct, }; }); @@ -1780,14 +1766,14 @@ class TaskMateRewardsCard extends LitElement { ${totalStars}/${cost}
- ${childContributions.map((contrib) => html` + ${segments.map((contrib) => html` ${contrib.name}: ${contrib.points} - ${hasWeightedData && contrib.expectedContribution > 0 ? html` - (${Math.round(contrib.weightedProgress)}%) + ${cost > 0 ? html` + (${Math.round(contrib.sharePct)}%) ` : ''} `)} @@ -1873,8 +1859,11 @@ class TaskMateRewardsCard extends LitElement { || this.hass?.states?.[this.config?.entity]?.attributes || {}; // Always a list, even if the attribute arrives as something else (#834). const pendingClaims = tmClaimList(pcAttrs.pending_reward_claims); + // A jackpot is one shared pool redeemed once per funding cycle, so a claim + // from any contributor puts the reward into "awaiting approval" for every + // child — not just the one who tapped Redeem (#873). const hasPendingClaim = pendingClaims.some(c => - c.reward_id === reward.id && (!childId || c.child_id === childId) + c.reward_id === reward.id && (isJackpot || !childId || c.child_id === childId) ); const spendable = relevantChild diff --git a/www/community/lovelace-wallpanel/wallpanel.js b/www/community/lovelace-wallpanel/wallpanel.js index 75289b39..18ec62a7 100644 --- a/www/community/lovelace-wallpanel/wallpanel.js +++ b/www/community/lovelace-wallpanel/wallpanel.js @@ -1 +1 @@ -!function(){"use strict";function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function n(n){for(var r=1;r0&&e[0]<4?1:+(e[0]+e[1])),!t&&r&&(!(e=r.match(/Edge\/(\d+)/))||e[1]>=74)&&(e=r.match(/Chrome\/(\d+)/))&&(t=+e[1]),Y=t}function Ee(){if($)return X;$=1;var e=we(),t=v(),n=s().String;return X=!!Object.getOwnPropertySymbols&&!t(function(){var t=Symbol("symbol detection");return!n(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&e&&e<41})}function xe(){if(Q)return J;Q=1;var e=Ee();return J=e&&!Symbol.sham&&"symbol"==typeof Symbol.iterator}function Se(){if(K)return Z;K=1;var e=Ae(),t=ve(),n=_e(),r=xe(),i=Object;return Z=r?function(e){return"symbol"==typeof e}:function(r){var o=e("Symbol");return t(o)&&n(o.prototype,i(r))}}function Ce(){if(te)return ee;te=1;var e=String;return ee=function(t){try{return e(t)}catch(e){return"Object"}}}function Ie(){if(re)return ne;re=1;var e=ve(),t=Ce(),n=TypeError;return ne=function(r){if(e(r))return r;throw new n(t(r)+" is not a function")}}function Te(){if(oe)return ie;oe=1;var e=Ie(),t=me();return ie=function(n,r){var i=n[r];return t(i)?void 0:e(i)}}function Re(){if(se)return ae;se=1;var e=_(),t=ve(),n=ye(),r=TypeError;return ae=function(i,o){var a,s;if("string"===o&&t(a=i.toString)&&!n(s=e(a,i)))return s;if(t(a=i.valueOf)&&!n(s=e(a,i)))return s;if("string"!==o&&t(a=i.toString)&&!n(s=e(a,i)))return s;throw new r("Can't convert object to primitive value")}}var ke,Oe,Pe,Me,Le,Be,De,Ue,Fe,Ne,je,We,ze,He,Ge,qe,Ye,Ve,Xe,$e,Je,Qe,Ze,Ke,et={exports:{}};function tt(){return Oe?ke:(Oe=1,ke=!1)}function nt(){if(Me)return Pe;Me=1;var e=s(),t=Object.defineProperty;return Pe=function(n,r){try{t(e,n,{value:r,configurable:!0,writable:!0})}catch(t){e[n]=r}return r}}function rt(){if(Le)return et.exports;Le=1;var e=tt(),t=s(),n=nt(),r="__core-js_shared__",i=et.exports=t[r]||n(r,{});return(i.versions||(i.versions=[])).push({version:"3.43.0",mode:e?"pure":"global",copyright:"© 2014-2025 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.43.0/LICENSE",source:"https://github.com/zloirock/core-js"}),et.exports}function it(){if(De)return Be;De=1;var e=rt();return Be=function(t,n){return e[t]||(e[t]=n||{})}}function ot(){if(Fe)return Ue;Fe=1;var e=ge(),t=Object;return Ue=function(n){return t(e(n))}}function at(){if(je)return Ne;je=1;var e=he(),t=ot(),n=e({}.hasOwnProperty);return Ne=Object.hasOwn||function(e,r){return n(t(e),r)}}function st(){if(ze)return We;ze=1;var e=he(),t=0,n=Math.random(),r=e(1.1.toString);return We=function(e){return"Symbol("+(void 0===e?"":e)+")_"+r(++t+n,36)}}function ct(){if(Ge)return He;Ge=1;var e=s(),t=it(),n=at(),r=st(),i=Ee(),o=xe(),a=e.Symbol,c=t("wks"),l=o?a.for||a:a&&a.withoutSetter||r;return He=function(e){return n(c,e)||(c[e]=i&&n(a,e)?a[e]:l("Symbol."+e)),c[e]}}function lt(){if(Ye)return qe;Ye=1;var e=_(),t=ye(),n=Se(),r=Te(),i=Re(),o=ct(),a=TypeError,s=o("toPrimitive");return qe=function(o,c){if(!t(o)||n(o))return o;var l,u=r(o,s);if(u){if(void 0===c&&(c="default"),l=e(u,o,c),!t(l)||n(l))return l;throw new a("Can't convert object to primitive value")}return void 0===c&&(c="number"),i(o,c)}}function ut(){if(Xe)return Ve;Xe=1;var e=lt(),t=Se();return Ve=function(n){var r=e(n,"string");return t(r)?r:r+""}}function ht(){if(Je)return $e;Je=1;var e=s(),t=ye(),n=e.document,r=t(n)&&t(n.createElement);return $e=function(e){return r?n.createElement(e):{}}}function dt(){if(Ze)return Qe;Ze=1;var e=y(),t=v(),n=ht();return Qe=!e&&!t(function(){return 7!==Object.defineProperty(n("div"),"a",{get:function(){return 7}}).a})}function ft(){if(Ke)return p;Ke=1;var e=y(),t=_(),n=le(),r=ue(),i=pe(),o=ut(),a=at(),s=dt(),c=Object.getOwnPropertyDescriptor;return p.f=e?c:function(e,l){if(e=i(e),l=o(l),s)try{return c(e,l)}catch(e){}if(a(e,l))return r(!t(n.f,e,l),e[l])},p}var mt,gt,pt,vt,yt,At,_t,bt={};function wt(){if(gt)return mt;gt=1;var e=y(),t=v();return mt=e&&t(function(){return 42!==Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype})}function Et(){if(vt)return pt;vt=1;var e=ye(),t=String,n=TypeError;return pt=function(r){if(e(r))return r;throw new n(t(r)+" is not an object")}}function xt(){if(yt)return bt;yt=1;var e=y(),t=dt(),n=wt(),r=Et(),i=ut(),o=TypeError,a=Object.defineProperty,s=Object.getOwnPropertyDescriptor,c="enumerable",l="configurable",u="writable";return bt.f=e?n?function(e,t,n){if(r(e),t=i(t),r(n),"function"==typeof e&&"prototype"===t&&"value"in n&&u in n&&!n[u]){var o=s(e,t);o&&o[u]&&(e[t]=n.value,n={configurable:l in n?n[l]:o[l],enumerable:c in n?n[c]:o[c],writable:!1})}return a(e,t,n)}:a:function(e,n,s){if(r(e),n=i(n),r(s),t)try{return a(e,n,s)}catch(e){}if("get"in s||"set"in s)throw new o("Accessors not supported");return"value"in s&&(e[n]=s.value),e},bt}function St(){if(_t)return At;_t=1;var e=y(),t=xt(),n=ue();return At=e?function(e,r,i){return t.f(e,r,n(1,i))}:function(e,t,n){return e[t]=n,e}}var Ct,It,Tt,Rt,kt,Ot,Pt,Mt,Lt,Bt,Dt,Ut,Ft,Nt,jt,Wt={exports:{}};function zt(){if(It)return Ct;It=1;var e=y(),t=at(),n=Function.prototype,r=e&&Object.getOwnPropertyDescriptor,i=t(n,"name"),o=i&&"something"===function(){}.name,a=i&&(!e||e&&r(n,"name").configurable);return Ct={EXISTS:i,PROPER:o,CONFIGURABLE:a}}function Ht(){if(Rt)return Tt;Rt=1;var e=he(),t=ve(),n=rt(),r=e(Function.toString);return t(n.inspectSource)||(n.inspectSource=function(e){return r(e)}),Tt=n.inspectSource}function Gt(){if(Mt)return Pt;Mt=1;var e=it(),t=st(),n=e("keys");return Pt=function(e){return n[e]||(n[e]=t(e))}}function qt(){return Bt?Lt:(Bt=1,Lt={})}function Yt(){if(Ut)return Dt;Ut=1;var e,t,n,r=function(){if(Ot)return kt;Ot=1;var e=s(),t=ve(),n=e.WeakMap;return kt=t(n)&&/native code/.test(String(n))}(),i=s(),o=ye(),a=St(),c=at(),l=rt(),u=Gt(),h=qt(),d="Object already initialized",f=i.TypeError,m=i.WeakMap;if(r||l.state){var g=l.state||(l.state=new m);g.get=g.get,g.has=g.has,g.set=g.set,e=function(e,t){if(g.has(e))throw new f(d);return t.facade=e,g.set(e,t),t},t=function(e){return g.get(e)||{}},n=function(e){return g.has(e)}}else{var p=u("state");h[p]=!0,e=function(e,t){if(c(e,p))throw new f(d);return t.facade=e,a(e,p,t),t},t=function(e){return c(e,p)?e[p]:{}},n=function(e){return c(e,p)}}return Dt={set:e,get:t,has:n,enforce:function(r){return n(r)?t(r):e(r,{})},getterFor:function(e){return function(n){var r;if(!o(n)||(r=t(n)).type!==e)throw new f("Incompatible receiver, "+e+" required");return r}}}}function Vt(){if(Ft)return Wt.exports;Ft=1;var e=he(),t=v(),n=ve(),r=at(),i=y(),o=zt().CONFIGURABLE,a=Ht(),s=Yt(),c=s.enforce,l=s.get,u=String,h=Object.defineProperty,d=e("".slice),f=e("".replace),m=e([].join),g=i&&!t(function(){return 8!==h(function(){},"length",{value:8}).length}),p=String(String).split("String"),A=Wt.exports=function(e,t,n){"Symbol("===d(u(t),0,7)&&(t="["+f(u(t),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),n&&n.getter&&(t="get "+t),n&&n.setter&&(t="set "+t),(!r(e,"name")||o&&e.name!==t)&&(i?h(e,"name",{value:t,configurable:!0}):e.name=t),g&&n&&r(n,"arity")&&e.length!==n.arity&&h(e,"length",{value:n.arity});try{n&&r(n,"constructor")&&n.constructor?i&&h(e,"prototype",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(e){}var a=c(e);return r(a,"source")||(a.source=m(p,"string"==typeof t?t:"")),e};return Function.prototype.toString=A(function(){return n(this)&&l(this).source||a(this)},"toString"),Wt.exports}function Xt(){if(jt)return Nt;jt=1;var e=ve(),t=xt(),n=Vt(),r=nt();return Nt=function(i,o,a,s){s||(s={});var c=s.enumerable,l=void 0!==s.name?s.name:o;if(e(a)&&n(a,l,s),s.global)c?i[o]=a:r(o,a);else{try{s.unsafe?i[o]&&(c=!0):delete i[o]}catch(e){}c?i[o]=a:t.f(i,o,{value:a,enumerable:!1,configurable:!s.nonConfigurable,writable:!s.nonWritable})}return i}}var $t,Jt,Qt,Zt,Kt,en,tn,nn,rn,on,an,sn,cn,ln,un,hn,dn,fn={};function mn(){if(Zt)return Qt;Zt=1;var e=function(){if(Jt)return $t;Jt=1;var e=Math.ceil,t=Math.floor;return $t=Math.trunc||function(n){var r=+n;return(r>0?t:e)(r)}}();return Qt=function(t){var n=+t;return n!=n||0===n?0:e(n)}}function gn(){if(en)return Kt;en=1;var e=mn(),t=Math.max,n=Math.min;return Kt=function(r,i){var o=e(r);return o<0?t(o+i,0):n(o,i)}}function pn(){if(nn)return tn;nn=1;var e=mn(),t=Math.min;return tn=function(n){var r=e(n);return r>0?t(r,9007199254740991):0}}function vn(){if(on)return rn;on=1;var e=pn();return rn=function(t){return e(t.length)}}function yn(){if(ln)return cn;ln=1;var e=he(),t=at(),n=pe(),r=function(){if(sn)return an;sn=1;var e=pe(),t=gn(),n=vn(),r=function(r){return function(i,o,a){var s=e(i),c=n(s);if(0===c)return!r&&-1;var l,u=t(a,c);if(r&&o!=o){for(;c>u;)if((l=s[u++])!=l)return!0}else for(;c>u;u++)if((r||u in s)&&s[u]===o)return r||u||0;return!r&&-1}};return an={includes:r(!0),indexOf:r(!1)}}().indexOf,i=qt(),o=e([].push);return cn=function(e,a){var s,c=n(e),l=0,u=[];for(s in c)!t(i,s)&&t(c,s)&&o(u,s);for(;a.length>l;)t(c,s=a[l++])&&(~r(u,s)||o(u,s));return u}}function An(){return hn?un:(hn=1,un=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"])}function _n(){if(dn)return fn;dn=1;var e=yn(),t=An().concat("length","prototype");return fn.f=Object.getOwnPropertyNames||function(n){return e(n,t)},fn}var bn,wn,En,xn,Sn,Cn,In,Tn,Rn,kn,On,Pn,Mn,Ln,Bn,Dn,Un,Fn,Nn,jn,Wn,zn,Hn,Gn,qn,Yn,Vn,Xn,$n,Jn,Qn,Zn,Kn,er,tr,nr,rr,ir,or,ar,sr,cr,lr={};function ur(){return bn||(bn=1,lr.f=Object.getOwnPropertySymbols),lr}function hr(){if(En)return wn;En=1;var e=Ae(),t=he(),n=_n(),r=ur(),i=Et(),o=t([].concat);return wn=e("Reflect","ownKeys")||function(e){var t=n.f(i(e)),a=r.f;return a?o(t,a(e)):t}}function dr(){if(Sn)return xn;Sn=1;var e=at(),t=hr(),n=ft(),r=xt();return xn=function(i,o,a){for(var s=t(o),c=r.f,l=n.f,u=0;uy&&l(o,arguments[y]),o});if(x.prototype=w,"Error"!==_?i?i(x,E):o(x,E,{name:!0}):h&&v in b&&(a(x,b,v),a(x,b,"prepareStackTrace")),o(x,b),!d)try{w.name!==_&&n(w,"name",_),w.constructor=x}catch(e){}return x}},ar}!function(){if(cr)return a;cr=1;var e=mr(),t=s(),n=gr(),r=Tr(),i="WebAssembly",o=t[i],c=7!==new Error("e",{cause:7}).cause,l=function(t,n){var i={};i[t]=r(t,n,c),e({global:!0,constructor:!0,arity:1,forced:c},i)},u=function(t,n){if(o&&o[t]){var a={};a[t]=r(i+"."+t,n,c),e({target:i,stat:!0,constructor:!0,arity:1,forced:c},a)}};l("Error",function(e){return function(t){return n(e,this,arguments)}}),l("EvalError",function(e){return function(t){return n(e,this,arguments)}}),l("RangeError",function(e){return function(t){return n(e,this,arguments)}}),l("ReferenceError",function(e){return function(t){return n(e,this,arguments)}}),l("SyntaxError",function(e){return function(t){return n(e,this,arguments)}}),l("TypeError",function(e){return function(t){return n(e,this,arguments)}}),l("URIError",function(e){return function(t){return n(e,this,arguments)}}),u("CompileError",function(e){return function(t){return n(e,this,arguments)}}),u("LinkError",function(e){return function(t){return n(e,this,arguments)}}),u("RuntimeError",function(e){return function(t){return n(e,this,arguments)}})}();var Rr,kr,Or,Pr,Mr,Lr,Br,Dr,Ur,Fr,Nr,jr,Wr,zr,Hr,Gr,qr,Yr={};function Vr(){if(kr)return Rr;kr=1;var e=de();return Rr=Array.isArray||function(t){return"Array"===e(t)}}function Xr(){if(Pr)return Or;Pr=1;var e=TypeError;return Or=function(t){if(t>9007199254740991)throw e("Maximum allowed index exceeded");return t}}function $r(){if(Lr)return Mr;Lr=1;var e=de(),t=he();return Mr=function(n){if("Function"===e(n))return t(n)}}function Jr(){if(Dr)return Br;Dr=1;var e=$r(),t=Ie(),n=A(),r=e(e.bind);return Br=function(e,i){return t(e),void 0===i?e:n?r(e,i):function(){return e.apply(i,arguments)}},Br}function Qr(){if(jr)return Nr;jr=1;var e=he(),t=v(),n=ve(),r=wr(),i=Ae(),o=Ht(),a=function(){},s=i("Reflect","construct"),c=/^\s*(?:class|function)\b/,l=e(c.exec),u=!c.test(a),h=function(e){if(!n(e))return!1;try{return s(a,[],e),!0}catch(e){return!1}},d=function(e){if(!n(e))return!1;switch(r(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return u||!!l(c,o(e))}catch(e){return!0}};return d.sham=!0,Nr=!s||t(function(){var e;return h(h.call)||!h(Object)||!h(function(){e=!0})||e})?d:h}function Zr(){if(zr)return Wr;zr=1;var e=Vr(),t=Qr(),n=ye(),r=ct()("species"),i=Array;return Wr=function(o){var a;return e(o)&&(a=o.constructor,(t(a)&&(a===i||e(a.prototype))||n(a)&&null===(a=a[r]))&&(a=void 0)),void 0===a?i:a}}function Kr(){if(Gr)return Hr;Gr=1;var e=Zr();return Hr=function(t,n){return new(e(t))(0===n?0:n)}}!function(){if(qr)return Yr;qr=1;var e=mr(),t=function(){if(Fr)return Ur;Fr=1;var e=Vr(),t=vn(),n=Xr(),r=Jr(),i=function(o,a,s,c,l,u,h,d){for(var f,m,g=l,p=0,v=!!h&&r(h,d);p0&&e(f)?(m=t(f),g=i(o,a,f,m,g,u-1)-1):(n(g+1),o[g]=f),g++),p++;return g};return Ur=i}(),n=ot(),r=vn(),i=mn(),o=Kr();e({target:"Array",proto:!0},{flat:function(){var e=arguments.length?arguments[0]:void 0,a=n(this),s=r(a),c=o(a,0);return c.length=t(c,a,a,s,0,void 0===e?1:i(e)),c}})}();var ei,ti,ni,ri={};!function(){if(ni)return ri;ni=1;var e=mr(),t=ot(),n=vn(),r=function(){if(ti)return ei;ti=1;var e=y(),t=Vr(),n=TypeError,r=Object.getOwnPropertyDescriptor,i=e&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(e){return e instanceof TypeError}}();return ei=i?function(e,i){if(t(e)&&!r(e,"length").writable)throw new n("Cannot set read only .length");return e.length=i}:function(e,t){return e.length=t}}(),i=Xr();e({target:"Array",proto:!0,arity:1,forced:v()(function(){return 4294967297!==[].push.call({length:4294967296},1)})||!function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(e){return e instanceof TypeError}}()},{push:function(e){var o=t(this),a=n(o),s=arguments.length;i(a+s);for(var c=0;c0;)r[s]=r[--s];s!==c++&&(r[s]=a)}else for(var l=t(o/2),u=n(e(r,0,l),i),h=n(e(r,l),i),d=u.length,f=h.length,m=0,g=0;m3)){if(h)return!0;if(f)return f<603;var e,t,n,r,i="";for(e=65;e<76;e++){switch(t=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(r=0;r<47;r++)m.push({k:t+r,v:n})}for(m.sort(function(e,t){return t.v-e.v}),r=0;ra(n)?1:-1}}(e)),s=i(u),l=0;lu;)n.f(e,a=c[u++],s[a]);return e},Ui}(),r=An(),i=qt(),o=Ni(),a=ht(),s=Gt(),c="prototype",l="script",u=s("IE_PROTO"),h=function(){},d=function(e){return"<"+l+">"+e+""},f=function(e){e.write(d("")),e.close();var t=e.parentWindow.Object;return e=null,t},m=function(){try{e=new ActiveXObject("htmlfile")}catch(e){}var t,n,i;m="undefined"!=typeof document?document.domain&&e?f(e):(n=a("iframe"),i="java"+l+":",n.style.display="none",o.appendChild(n),n.src=String(i),(t=n.contentWindow.document).open(),t.write(d("document.F=Object")),t.close(),t.F):f(e);for(var s=r.length;s--;)delete m[c][r[s]];return m()};return i[u]=!0,Pi=Object.create||function(e,r){var i;return null!==e?(h[c]=t(e),i=new h,h[c]=null,i[u]=e):i=m(),void 0===r?i:n.f(i,r)}}function Wi(){if(Bi)return Li;Bi=1;var e=ct(),t=ji(),n=xt().f,r=e("unscopables"),i=Array.prototype;return void 0===i[r]&&n(i,r,{configurable:!0,value:t(null)}),Li=function(e){i[r][e]=!0}}Di||(Di=1,Wi()("flat"));var zi,Hi,Gi,qi,Yi,Vi,Xi,$i,Ji,Qi,Zi,Ki,eo,to,no,ro,io,oo,ao,so,co,lo,uo,ho,fo,mo,go,po,vo,yo,Ao,_o,bo,wo={};function Eo(){return Hi?zi:(Hi=1,zi="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView)}function xo(){if(qi)return Gi;qi=1;var e=Vt(),t=xt();return Gi=function(n,r,i){return i.get&&e(i.get,r,{getter:!0}),i.set&&e(i.set,r,{setter:!0}),t.f(n,r,i)}}function So(){if(Vi)return Yi;Vi=1;var e=Xt();return Yi=function(t,n,r){for(var i in n)e(t,i,n[i],r);return t}}function Co(){if($i)return Xi;$i=1;var e=_e(),t=TypeError;return Xi=function(n,r){if(e(r,n))return n;throw new t("Incorrect invocation")}}function Io(){if(Qi)return Ji;Qi=1;var e=mn(),t=pn(),n=RangeError;return Ji=function(r){if(void 0===r)return 0;var i=e(r),o=t(i);if(i!==o)throw new n("Wrong length or index");return o}}function To(){if(ro)return no;ro=1;var e=Ki?Zi:(Ki=1,Zi=Math.sign||function(e){var t=+e;return 0===t||t!=t?t:t<0?-1:1}),t=function(){if(to)return eo;to=1;var e=4503599627370496;return eo=function(t){return t+e-e}}(),n=Math.abs;return no=function(r,i,o,a){var s=+r,c=n(s),l=e(s);if(co||h!=h?l*(1/0):l*h}}function Ro(){if(so)return ao;so=1;var e=Array,t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,o=Math.LN2;return ao={pack:function(a,s,c){var l,u,h,d=e(c),f=8*c-s-1,m=(1<>1,p=23===s?n(2,-24)-n(2,-77):0,v=a<0||0===a&&1/a<0?1:0,y=0;for((a=t(a))!=a||a===1/0?(u=a!=a?1:0,l=m):(l=r(i(a)/o),a*(h=n(2,-l))<1&&(l--,h*=2),(a+=l+g>=1?p/h:p*n(2,1-g))*h>=2&&(l++,h/=2),l+g>=m?(u=0,l=m):l+g>=1?(u=(a*h-1)*n(2,s),l+=g):(u=a*n(2,g-1)*n(2,s),l=0));s>=8;)d[y++]=255&u,u/=256,s-=8;for(l=l<0;)d[y++]=255&l,l/=256,f-=8;return d[y-1]|=128*v,d},unpack:function(e,t){var r,i=e.length,o=8*i-t-1,a=(1<>1,c=o-7,l=i-1,u=e[l--],h=127&u;for(u>>=7;c>0;)h=256*h+e[l--],c-=8;for(r=h&(1<<-c)-1,h>>=-c,c+=t;c>0;)r=256*r+e[l--],c-=8;if(0===h)h=1-s;else{if(h===a)return r?NaN:u?-1/0:1/0;r+=n(2,t),h-=s}return(u?-1:1)*r*n(2,h-t)}}}function ko(){if(ho)return uo;ho=1;var e=at(),t=ve(),n=ot(),r=Gt(),i=function(){if(lo)return co;lo=1;var e=v();return co=!e(function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})}(),o=r("IE_PROTO"),a=Object,s=a.prototype;return uo=i?a.getPrototypeOf:function(r){var i=n(r);if(e(i,o))return i[o];var c=i.constructor;return t(c)&&i instanceof c?c.prototype:i instanceof a?s:null}}function Oo(){if(mo)return fo;mo=1;var e=ot(),t=gn(),n=vn();return fo=function(r){for(var i=e(this),o=n(i),a=arguments.length,s=t(a>1?arguments[1]:void 0,o),c=a>2?arguments[2]:void 0,l=void 0===c?o:t(c,o);l>s;)i[s++]=r;return i},fo}function Po(){if(po)return go;po=1;var e=xt().f,t=at(),n=ct()("toStringTag");return go=function(r,i,o){r&&!o&&(r=r.prototype),r&&!t(r,n)&&e(r,n,{configurable:!0,value:i})}}function Mo(){if(yo)return vo;yo=1;var e=s(),t=he(),n=y(),r=Eo(),i=zt(),o=St(),a=xo(),c=So(),l=v(),u=Co(),h=mn(),d=pn(),f=Io(),m=function(){if(oo)return io;oo=1;var e=To();return io=Math.fround||function(t){return e(t,1.1920928955078125e-7,34028234663852886e22,11754943508222875e-54)}}(),g=Ro(),p=ko(),A=Ar(),_=Oo(),b=bi(),w=br(),E=dr(),x=Po(),S=Yt(),C=i.PROPER,I=i.CONFIGURABLE,T="ArrayBuffer",R="DataView",k="prototype",O="Wrong index",P=S.getterFor(T),M=S.getterFor(R),L=S.set,B=e[T],D=B,U=D&&D[k],F=e[R],N=F&&F[k],j=Object.prototype,W=e.Array,z=e.RangeError,H=t(_),G=t([].reverse),q=g.pack,Y=g.unpack,V=function(e){return[255&e]},X=function(e){return[255&e,e>>8&255]},$=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},J=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},Q=function(e){return q(m(e),23,4)},Z=function(e){return q(e,52,8)},K=function(e,t,n){a(e[k],t,{configurable:!0,get:function(){return n(this)[t]}})},ee=function(e,t,n,r){var i=M(e),o=f(n),a=!!r;if(o+t>i.byteLength)throw new z(O);var s=i.bytes,c=o+i.byteOffset,l=b(s,c,c+t);return a?l:G(l)},te=function(e,t,n,r,i,o){var a=M(e),s=f(n),c=r(+i),l=!!o;if(s+t>a.byteLength)throw new z(O);for(var u=a.bytes,h=s+a.byteOffset,d=0;d>24)},setUint8:function(e,t){ie(this,e,t<<24>>24)}},{unsafe:!0})}else U=(D=function(e){u(this,U);var t=f(e);L(this,{type:T,bytes:H(W(t),0),byteLength:t}),n||(this.byteLength=t,this.detached=!1)})[k],N=(F=function(e,t,r){u(this,N),u(e,U);var i=P(e),o=i.byteLength,a=h(t);if(a<0||a>o)throw new z("Wrong offset");if(a+(r=void 0===r?o-a:d(r))>o)throw new z("Wrong length");L(this,{type:R,buffer:e,byteLength:r,byteOffset:a,bytes:i.bytes}),n||(this.buffer=e,this.byteLength=r,this.byteOffset=a)})[k],n&&(K(D,"byteLength",P),K(F,"buffer",M),K(F,"byteLength",M),K(F,"byteOffset",M)),c(N,{getInt8:function(e){return ee(this,1,e)[0]<<24>>24},getUint8:function(e){return ee(this,1,e)[0]},getInt16:function(e){var t=ee(this,2,e,arguments.length>1&&arguments[1]);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=ee(this,2,e,arguments.length>1&&arguments[1]);return t[1]<<8|t[0]},getInt32:function(e){return J(ee(this,4,e,arguments.length>1&&arguments[1]))},getUint32:function(e){return J(ee(this,4,e,arguments.length>1&&arguments[1]))>>>0},getFloat32:function(e){return Y(ee(this,4,e,arguments.length>1&&arguments[1]),23)},getFloat64:function(e){return Y(ee(this,8,e,arguments.length>1&&arguments[1]),52)},setInt8:function(e,t){te(this,1,e,V,t)},setUint8:function(e,t){te(this,1,e,V,t)},setInt16:function(e,t){te(this,2,e,X,t,arguments.length>2&&arguments[2])},setUint16:function(e,t){te(this,2,e,X,t,arguments.length>2&&arguments[2])},setInt32:function(e,t){te(this,4,e,$,t,arguments.length>2&&arguments[2])},setUint32:function(e,t){te(this,4,e,$,t,arguments.length>2&&arguments[2])},setFloat32:function(e,t){te(this,4,e,Q,t,arguments.length>2&&arguments[2])},setFloat64:function(e,t){te(this,8,e,Z,t,arguments.length>2&&arguments[2])}});return x(D,T),x(F,R),vo={ArrayBuffer:D,DataView:F}}function Lo(){if(_o)return Ao;_o=1;var e=Ae(),t=xo(),n=ct(),r=y(),i=n("species");return Ao=function(n){var o=e(n);r&&o&&!o[i]&&t(o,i,{configurable:!0,get:function(){return this}})}}!function(){if(bo)return wo;bo=1;var e=mr(),t=s(),n=Mo(),r=Lo(),i="ArrayBuffer",o=n[i];e({global:!0,constructor:!0,forced:t[i]!==o},{ArrayBuffer:o}),r(i)}();var Bo,Do={};!function(){if(Bo)return Do;Bo=1;var e=mr(),t=$r(),n=v(),r=Mo(),i=Et(),o=gn(),a=pn(),s=r.ArrayBuffer,c=r.DataView,l=c.prototype,u=t(s.prototype.slice),h=t(l.getUint8),d=t(l.setUint8);e({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:n(function(){return!new s(2).slice(1,void 0).byteLength})},{slice:function(e,t){if(u&&void 0===t)return u(i(this),e);for(var n=i(this).byteLength,r=o(e,n),l=o(void 0===t?n:t,n),f=new s(a(l-r)),m=new c(this),g=new c(f),p=0;r92||"NODE"===r&&n>94||"BROWSER"===r&&n>97)return!1;var e=new ArrayBuffer(8),t=i(e,{transfer:[e]});return 0!==e.byteLength||8!==t.byteLength})}function ua(){if(na)return ta;na=1;var e,t,n,r,i=s(),o=ca(),a=la(),c=i.structuredClone,l=i.ArrayBuffer,u=i.MessageChannel,h=!1;if(a)h=function(e){c(e,{transfer:[e]})};else if(l)try{u||(e=o("worker_threads"))&&(u=e.MessageChannel),u&&(t=new u,n=new l(2),r=function(e){t.port1.postMessage(null,[e])},2===n.byteLength&&(r(n),0===n.byteLength&&(h=r)))}catch(e){}return ta=h}function ha(){if(ia)return ra;ia=1;var e=s(),t=he(),n=pr(),r=Io(),i=function(){if(Yo)return qo;Yo=1;var e=Go(),t=TypeError;return qo=function(n){if(e(n))throw new t("ArrayBuffer is detached");return n}}(),o=Ho(),a=ua(),c=la(),l=e.structuredClone,u=e.ArrayBuffer,h=e.DataView,d=Math.min,f=u.prototype,m=h.prototype,g=t(f.slice),p=n(f,"resizable","get"),v=n(f,"maxByteLength","get"),y=t(m.getInt8),A=t(m.setInt8);return ra=(c||a)&&function(e,t,n){var s,f=o(e),m=void 0===t?f:r(t),_=!p||!p(e);if(i(e),c&&(e=l(e,{transfer:[e]}),f===m&&(n||_)))return e;if(f>=m&&(!n||_))s=g(e,0,m);else{var b=n&&!_&&v?{maxByteLength:v(e)}:void 0;s=new u(m,b);for(var w=new h(e),E=new h(s),x=d(m,f),S=0;S=0;i--)if(void 0!==t[i])try{r=e(t[i].iterator,n,r)}catch(e){n="throw",r=e}if("throw"===n)throw r;return r}}function Ga(){if(Oa)return ka;Oa=1;var e=_(),t=ji(),n=St(),r=So(),i=ct(),o=Yt(),a=Te(),s=ba().IteratorPrototype,c=Wa(),l=za(),u=Ha(),h=i("toStringTag"),d="IteratorHelper",f="WrapForValidIterator",m="normal",g="throw",p=o.set,v=function(n){var i=o.getterFor(n?f:d);return r(t(s),{next:function(){var e=i(this);if(n)return e.nextHandler();if(e.done)return c(void 0,!0);try{var t=e.nextHandler();return e.returnHandlerResult?t:c(t,e.done)}catch(t){throw e.done=!0,t}},return:function(){var t=i(this),r=t.iterator;if(t.done=!0,n){var o=a(r,"return");return o?e(o,r):c(void 0,!0)}if(t.inner)try{l(t.inner.iterator,m)}catch(e){return l(r,g,e)}if(t.openIters)try{u(t.openIters,m)}catch(e){return l(r,g,e)}return r&&l(r,m),c(void 0,!0)}})},y=v(!0),A=v(!1);return n(A,h,"Iterator Helper"),ka=function(e,t,n){var r=function(r,i){i?(i.iterator=r.iterator,i.next=r.next):i=r,i.type=t?f:d,i.returnHandlerResult=!!n,i.nextHandler=e,i.counter=0,i.done=!1,p(this,i)};return r.prototype=t?y:A,r}}function qa(){if(Ma)return Pa;Ma=1;var e=Et(),t=za();return Pa=function(n,r,i,o){try{return o?r(e(i)[0],i[1]):r(i)}catch(e){t(n,"throw",e)}}}function Ya(){return Ba?La:(Ba=1,La=function(e,t){var n="function"==typeof Iterator&&Iterator.prototype[e];if(n)try{n.call({next:null},t).next()}catch(e){return!0}})}function Va(){if(Ua)return Da;Ua=1;var e=s();return Da=function(t,n){var r=e.Iterator,i=r&&r.prototype,o=i&&i[t],a=!1;if(o)try{o.call({next:function(){return{done:!0}},return:function(){a=!0}},-1)}catch(e){e instanceof n||(a=!1)}if(!a)return o}}!function(){if(Fa)return Na;Fa=1;var e=mr(),t=_(),n=Ie(),r=Et(),i=ja(),o=Ga(),a=qa(),s=tt(),c=za(),l=Ya(),u=Va(),h=!s&&!l("filter",function(){}),d=!s&&!h&&u("filter",TypeError),f=s||h||d,m=o(function(){for(var e,n,i=this.iterator,o=this.predicate,s=this.next;;){if(e=r(t(s,i)),this.done=!!e.done)return;if(n=e.value,a(i,o,[n,this.counter++],!0))return n}});e({target:"Iterator",proto:!0,real:!0,forced:f},{filter:function(e){r(this);try{n(e)}catch(e){c(this,"throw",e)}return d?t(d,this,e):new m(i(this),{predicate:e})}})}();var Xa,$a,Ja,Qa,Za,Ka,es,ts,ns,rs,is,os={};function as(){return $a?Xa:($a=1,Xa={})}function ss(){if(Qa)return Ja;Qa=1;var e=ct(),t=as(),n=e("iterator"),r=Array.prototype;return Ja=function(e){return void 0!==e&&(t.Array===e||r[n]===e)}}function cs(){if(Ka)return Za;Ka=1;var e=wr(),t=Te(),n=me(),r=as(),i=ct()("iterator");return Za=function(o){if(!n(o))return t(o,i)||t(o,"@@iterator")||r[e(o)]}}function ls(){if(ts)return es;ts=1;var e=_(),t=Ie(),n=Et(),r=Ce(),i=cs(),o=TypeError;return es=function(a,s){var c=arguments.length<2?i(a):s;if(t(c))return n(e(c,a));throw new o(r(a)+" is not iterable")},es}function us(){if(rs)return ns;rs=1;var e=Jr(),t=_(),n=Et(),r=Ce(),i=ss(),o=vn(),a=_e(),s=ls(),c=cs(),l=za(),u=TypeError,h=function(e,t){this.stopped=e,this.result=t},d=h.prototype;return ns=function(f,m,g){var p,v,y,A,_,b,w,E=g&&g.that,x=!(!g||!g.AS_ENTRIES),S=!(!g||!g.IS_RECORD),C=!(!g||!g.IS_ITERATOR),I=!(!g||!g.INTERRUPTED),T=e(m,E),R=function(e){return p&&l(p,"normal"),new h(!0,e)},k=function(e){return x?(n(e),I?T(e[0],e[1],R):T(e[0],e[1])):I?T(e,R):T(e)};if(S)p=f.iterator;else if(C)p=f;else{if(!(v=c(f)))throw new u(r(f)+" is not iterable");if(i(v)){for(y=0,A=o(f);A>y;y++)if((_=k(f[y]))&&a(d,_))return _;return new h(!1)}p=s(f,v)}for(b=S?f.next:p.next;!(w=t(b,p)).done;){try{_=k(w.value)}catch(e){l(p,"throw",e)}if("object"==typeof _&&_&&a(d,_))return _}return new h(!1)}}!function(){if(is)return os;is=1;var e=mr(),t=_(),n=us(),r=Ie(),i=Et(),o=ja(),a=za(),s=Va()("forEach",TypeError);e({target:"Iterator",proto:!0,real:!0,forced:s},{forEach:function(e){i(this);try{r(e)}catch(e){a(this,"throw",e)}if(s)return t(s,this,e);var c=o(this),l=0;n(c,function(t){e(t,l++)},{IS_RECORD:!0})}})}();var hs,ds={};!function(){if(hs)return ds;hs=1;var e=mr(),t=_(),n=Ie(),r=Et(),i=ja(),o=Ga(),a=qa(),s=za(),c=Ya(),l=Va(),u=tt(),h=!u&&!c("map",function(){}),d=!u&&!h&&l("map",TypeError),f=u||h||d,m=o(function(){var e=this.iterator,n=r(t(this.next,e));if(!(this.done=!!n.done))return a(e,this.mapper,[n.value,this.counter++],!0)});e({target:"Iterator",proto:!0,real:!0,forced:f},{map:function(e){r(this);try{n(e)}catch(e){s(this,"throw",e)}return d?t(d,this,e):new m(i(this),{mapper:e})}})}();var fs,ms,gs,ps={};!function(){if(gs)return ps;gs=1;var e=mr(),t=Ae(),n=gr(),r=_(),i=he(),o=v(),a=ve(),s=Se(),c=bi(),l=function(){if(ms)return fs;ms=1;var e=he(),t=Vr(),n=ve(),r=de(),i=Er(),o=e([].push);return fs=function(e){if(n(e))return e;if(t(e)){for(var a=e.length,s=[],c=0;cb)","g");return"b"!==e.exec("b").groups.a||"bc"!=="b".replace(e,"$c")})}!function(){if(Ms)return Ls;Ms=1;var e=y(),t=s(),n=he(),r=fr(),i=br(),o=St(),a=ji(),c=_n().f,l=_e(),u=function(){if(_s)return As;_s=1;var e=ye(),t=de(),n=ct()("match");return As=function(r){var i;return e(r)&&(void 0!==(i=r[n])?!!i:"RegExp"===t(r))}}(),h=Er(),d=Ds(),f=Us(),m=_r(),g=Xt(),p=v(),A=at(),_=Yt().enforce,b=Lo(),w=ct(),E=Fs(),x=Ns(),S=w("match"),C=t.RegExp,I=C.prototype,T=t.SyntaxError,R=n(I.exec),k=n("".charAt),O=n("".replace),P=n("".indexOf),M=n("".slice),L=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,B=/a/g,D=/a/g,U=new C(B)!==B,F=f.MISSED_STICKY,N=f.UNSUPPORTED_Y,j=e&&(!U||F||E||x||p(function(){return D[S]=!1,C(B)!==B||C(D)===D||"/a/i"!==String(C(B,"i"))}));if(r("RegExp",j)){for(var W=function(e,t){var n,r,s,c,f,m,g=l(I,this),p=u(e),v=void 0===t,y=[],b=e;if(!g&&p&&v&&e.constructor===W)return e;if((p||l(I,e))&&(e=e.source,v&&(t=d(b))),e=void 0===e?"":h(e),t=void 0===t?"":h(t),b=e,E&&"dotAll"in B&&(r=!!t&&P(t,"s")>-1)&&(t=O(t,/s/g,"")),n=t,F&&"sticky"in B&&(s=!!t&&P(t,"y")>-1)&&N&&(t=O(t,/y/g,"")),x&&(c=function(e){for(var t,n=e.length,r=0,i="",o=[],s=a(null),c=!1,l=!1,u=0,h="";r<=n;r++){if("\\"===(t=k(e,r)))t+=k(e,++r);else if("]"===t)c=!1;else if(!c)switch(!0){case"["===t:c=!0;break;case"("===t:if(i+=t,"?:"===M(e,r+1,r+3))continue;R(L,M(e,r+1))&&(r+=2,l=!0),u++;continue;case">"===t&&l:if(""===h||A(s,h))throw new T("Invalid capture group name");s[h]=!0,o[o.length]=[h,u],l=!1,h="";continue}l?h+=t:i+=t}return[i,o]}(e),e=c[0],y=c[1]),f=i(C(e,t),g?this:I,W),(r||s||y.length)&&(m=_(f),r&&(m.dotAll=!0,m.raw=W(function(e){for(var t,n=e.length,r=0,i="",o=!1;r<=n;r++)"\\"!==(t=k(e,r))?o||"."!==t?("["===t?o=!0:"]"===t&&(o=!1),i+=t):i+="[\\s\\S]":i+=t+k(e,++r);return i}(e),n)),s&&(m.sticky=!0),y.length&&(m.groups=y)),e!==b)try{o(f,"source",""===b?"(?:)":b)}catch(e){}return f},z=c(C),H=0;z.length>H;)m(W,C,z[H++]);I.constructor=W,W.prototype=I,g(t,"RegExp",W,{constructor:!0})}b("RegExp")}();var js,Ws={};!function(){if(js)return Ws;js=1;var e=y(),t=Fs(),n=de(),r=xo(),i=Yt().get,o=RegExp.prototype,a=TypeError;e&&t&&r(o,"dotAll",{configurable:!0,get:function(){if(this!==o){if("RegExp"===n(this))return!!i(this).dotAll;throw new a("Incompatible receiver, RegExp required")}}})}();var zs,Hs,Gs,qs={};function Ys(){if(Hs)return zs;Hs=1;var e,t,n=_(),r=he(),i=Er(),o=Bs(),a=Us(),s=it(),c=ji(),l=Yt().get,u=Fs(),h=Ns(),d=s("native-string-replace",String.prototype.replace),f=RegExp.prototype.exec,m=f,g=r("".charAt),p=r("".indexOf),v=r("".replace),y=r("".slice),A=(t=/b*/g,n(f,e=/a/,"a"),n(f,t,"a"),0!==e.lastIndex||0!==t.lastIndex),b=a.BROKEN_CARET,w=void 0!==/()??/.exec("")[1];return(A||w||b||u||h)&&(m=function(e){var t,r,a,s,u,h,_,E=this,x=l(E),S=i(e),C=x.raw;if(C)return C.lastIndex=E.lastIndex,t=n(m,C,S),E.lastIndex=C.lastIndex,t;var I=x.groups,T=b&&E.sticky,R=n(o,E),k=E.source,O=0,P=S;if(T&&(R=v(R,"y",""),-1===p(R,"g")&&(R+="g"),P=y(S,E.lastIndex),E.lastIndex>0&&(!E.multiline||E.multiline&&"\n"!==g(S,E.lastIndex-1))&&(k="(?: "+k+")",P=" "+P,O++),r=new RegExp("^(?:"+k+")",R)),w&&(r=new RegExp("^"+k+"$(?!\\s)",R)),A&&(a=E.lastIndex),s=n(f,T?r:E,P),T?s?(s.input=y(s.input,O),s[0]=y(s[0],O),s.index=E.lastIndex,E.lastIndex+=s[0].length):E.lastIndex=0:A&&s&&(E.lastIndex=E.global?s.index+s[0].length:a),w&&s&&s.length>1&&n(d,s[0],r,function(){for(u=1;u=f?e?"":void 0:(l=o(h,d))<55296||l>56319||d+1===f||(u=o(h,d+1))<56320||u>57343?e?i(h,d):l:e?a(h,d,d+2):u-56320+(l-55296<<10)+65536}};return Js={codeAt:s(!1),charAt:s(!0)}}function sc(){if(Ks)return Zs;Ks=1;var e=ac().charAt;return Zs=function(t,n,r){return n+(r?e(t,n).length:1)}}function cc(){if(tc)return ec;tc=1;var e=he(),t=ot(),n=Math.floor,r=e("".charAt),i=e("".replace),o=e("".slice),a=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,s=/\$([$&'`]|\d{1,2})/g;return ec=function(e,c,l,u,h,d){var f=l+e.length,m=u.length,g=s;return void 0!==h&&(h=t(h),g=a),i(d,g,function(t,i){var a;switch(r(i,0)){case"$":return"$";case"&":return e;case"`":return o(c,0,l);case"'":return o(c,f);case"<":a=h[o(i,1,-1)];break;default:var s=+i;if(0===s)return t;if(s>m){var d=n(s/10);return 0===d?t:d<=m?void 0===u[d-1]?r(i,1):u[d-1]+r(i,1):t}a=u[s-1]}return void 0===a?"":a})}}!function(){if(ic)return oc;ic=1;var e=gr(),t=_(),n=he(),r=function(){if($s)return Xs;$s=1,Vs();var e=_(),t=Xt(),n=Ys(),r=v(),i=ct(),o=St(),a=i("species"),s=RegExp.prototype;return Xs=function(c,l,u,h){var d=i(c),f=!r(function(){var e={};return e[d]=function(){return 7},7!==""[c](e)}),m=f&&!r(function(){var e=!1,t=/a/;return"split"===c&&((t={}).constructor={},t.constructor[a]=function(){return t},t.flags="",t[d]=/./[d]),t.exec=function(){return e=!0,null},t[d](""),!e});if(!f||!m||u){var g=/./[d],p=l(d,""[c],function(t,r,i,o,a){var c=r.exec;return c===n||c===s.exec?f&&!a?{done:!0,value:e(g,r,i,o)}:{done:!0,value:e(t,i,r,o)}:{done:!1}});t(String.prototype,c,p[0]),t(s,d,p[1])}h&&o(s[d],"sham",!0)}}(),i=v(),o=Et(),a=ve(),s=ye(),c=mn(),l=pn(),u=Er(),h=ge(),d=sc(),f=Te(),m=cc(),g=Ds(),p=function(){if(rc)return nc;rc=1;var e=_(),t=Et(),n=ve(),r=de(),i=Ys(),o=TypeError;return nc=function(a,s){var c=a.exec;if(n(c)){var l=e(c,a,s);return null!==l&&t(l),l}if("RegExp"===r(a))return e(i,a,s);throw new o("RegExp#exec called on incompatible receiver")}}(),y=ct()("replace"),A=Math.max,b=Math.min,w=n([].concat),E=n([].push),x=n("".indexOf),S=n("".slice),C=function(e){return void 0===e?e:String(e)},I="$0"==="a".replace(/./,"$0"),T=!!/./[y]&&""===/./[y]("a","$0");r("replace",function(n,r,i){var v=T?"$":"$0";return[function(e,n){var i=h(this),o=s(e)?f(e,y):void 0;return o?t(o,e,i,n):t(r,u(i),e,n)},function(t,n){var s=o(this),h=u(t);if("string"==typeof n&&-1===x(n,v)&&-1===x(n,"$<")){var f=i(r,s,h,n);if(f.done)return f.value}var y=a(n);y||(n=u(n));var _,I=u(g(s)),T=-1!==x(I,"g");T&&(_=-1!==x(I,"u"),s.lastIndex=0);for(var R,k=[];null!==(R=p(s,h))&&(E(k,R),T);){""===u(R[0])&&(s.lastIndex=d(h,l(s.lastIndex),_))}for(var O="",P=0,M=0;M=P&&(O+=S(h,P,D)+L,P=D+B.length)}return O+S(h,P)}]},!!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})||!I||T)}();var lc,uc,hc,dc,fc,mc,gc,pc={};function vc(){return uc?lc:(uc=1,lc="\t\n\v\f\r                 \u2028\u2029\ufeff")}!function(){if(gc)return pc;gc=1;var e=mr(),t=function(){if(dc)return hc;dc=1;var e=he(),t=ge(),n=Er(),r=vc(),i=e("".replace),o=RegExp("^["+r+"]+"),a=RegExp("(^|[^"+r+"])["+r+"]+$"),s=function(e){return function(r){var s=n(t(r));return 1&e&&(s=i(s,o,"")),2&e&&(s=i(s,a,"$1")),s}};return hc={start:s(1),end:s(2),trim:s(3)}}().trim,n=function(){if(mc)return fc;mc=1;var e=zt().PROPER,t=v(),n=vc();return fc=function(r){return t(function(){return!!n[r]()||"​…᠎"!=="​…᠎"[r]()||e&&n[r].name!==r})}}();e({target:"String",proto:!0,forced:n("trim")},{trim:function(){return t(this)}})}();var yc,Ac,_c,bc,wc,Ec,xc,Sc,Cc,Ic,Tc,Rc,kc,Oc,Pc,Mc,Lc,Bc,Dc,Uc,Fc,Nc,jc,Wc,zc,Hc,Gc,qc,Yc={exports:{}};function Vc(){if(Ac)return yc;Ac=1;var e=ct()("iterator"),t=!1;try{var n=0,r={next:function(){return{done:!!n++}},return:function(){t=!0}};r[e]=function(){return this},Array.from(r,function(){throw 2})}catch(e){}return yc=function(n,r){try{if(!r&&!t)return!1}catch(e){return!1}var i=!1;try{var o={};o[e]=function(){return{next:function(){return{done:i=!0}}}},n(o)}catch(e){}return i}}function Xc(){if(bc)return _c;bc=1;var e,t,n,r=Eo(),i=y(),o=s(),a=ve(),c=ye(),l=at(),u=wr(),h=Ce(),d=St(),f=Xt(),m=xo(),g=_e(),p=ko(),v=Ar(),A=ct(),_=st(),b=Yt(),w=b.enforce,E=b.get,x=o.Int8Array,S=x&&x.prototype,C=o.Uint8ClampedArray,I=C&&C.prototype,T=x&&p(x),R=S&&p(S),k=Object.prototype,O=o.TypeError,P=A("toStringTag"),M=_("TYPED_ARRAY_TAG"),L="TypedArrayConstructor",B=r&&!!v&&"Opera"!==u(o.opera),D=!1,U={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},F={BigInt64Array:8,BigUint64Array:8},N=function(e){var t=p(e);if(c(t)){var n=E(t);return n&&l(n,L)?n[L]:N(t)}},j=function(e){if(!c(e))return!1;var t=u(e);return l(U,t)||l(F,t)};for(e in U)(n=(t=o[e])&&t.prototype)?w(n)[L]=t:B=!1;for(e in F)(n=(t=o[e])&&t.prototype)&&(w(n)[L]=t);if((!B||!a(T)||T===Function.prototype)&&(T=function(){throw new O("Incorrect invocation")},B))for(e in U)o[e]&&v(o[e],T);if((!B||!R||R===k)&&(R=T.prototype,B))for(e in U)o[e]&&v(o[e].prototype,R);if(B&&p(I)!==R&&v(I,R),i&&!l(R,P))for(e in D=!0,m(R,P,{configurable:!0,get:function(){return c(this)?this[M]:void 0}}),U)o[e]&&d(o[e],M,e);return _c={NATIVE_ARRAY_BUFFER_VIEWS:B,TYPED_ARRAY_TAG:D&&M,aTypedArray:function(e){if(j(e))return e;throw new O("Target is not a typed array")},aTypedArrayConstructor:function(e){if(a(e)&&(!v||g(T,e)))return e;throw new O(h(e)+" is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n,r){if(i){if(n)for(var a in U){var s=o[a];if(s&&l(s.prototype,e))try{delete s.prototype[e]}catch(n){try{s.prototype[e]=t}catch(e){}}}R[e]&&!n||f(R,e,n?t:B&&S[e]||t,r)}},exportTypedArrayStaticMethod:function(e,t,n){var r,a;if(i){if(v){if(n)for(r in U)if((a=o[r])&&l(a,e))try{delete a[e]}catch(e){}if(T[e]&&!n)return;try{return f(T,e,n?t:B&&T[e]||t)}catch(e){}}for(r in U)!(a=o[r])||a[e]&&!n||f(a,e,t)}},getTypedArrayConstructor:N,isView:function(e){if(!c(e))return!1;var t=u(e);return"DataView"===t||l(U,t)||l(F,t)},isTypedArray:j,TypedArray:T,TypedArrayPrototype:R}}function $c(){if(Sc)return xc;Sc=1;var e=ye(),t=Math.floor;return xc=Number.isInteger||function(n){return!e(n)&&isFinite(n)&&t(n)===n}}function Jc(){if(Ic)return Cc;Ic=1;var e=mn(),t=RangeError;return Cc=function(n){var r=e(n);if(r<0)throw new t("The argument can't be less than 0");return r}}function Qc(){if(Rc)return Tc;Rc=1;var e=Jc(),t=RangeError;return Tc=function(n,r){var i=e(n);if(i%r)throw new t("Wrong offset");return i}}function Zc(){if(Oc)return kc;Oc=1;var e=Math.round;return kc=function(t){var n=e(t);return n<0?0:n>255?255:255&n}}function Kc(){if(Mc)return Pc;Mc=1;var e=Qr(),t=Ce(),n=TypeError;return Pc=function(r){if(e(r))return r;throw new n(t(r)+" is not a constructor")}}function el(){if(Bc)return Lc;Bc=1;var e=wr();return Lc=function(t){var n=e(t);return"BigInt64Array"===n||"BigUint64Array"===n}}function tl(){if(Uc)return Dc;Uc=1;var e=lt(),t=TypeError;return Dc=function(n){var r=e(n,"number");if("number"==typeof r)throw new t("Can't convert number to bigint");return BigInt(r)}}function nl(){if(Nc)return Fc;Nc=1;var e=Jr(),t=_(),n=Kc(),r=ot(),i=vn(),o=ls(),a=cs(),s=ss(),c=el(),l=Xc().aTypedArrayConstructor,u=tl();return Fc=function(h){var d,f,m,g,p,v,y,A,_=n(this),b=r(h),w=arguments.length,E=w>1?arguments[1]:void 0,x=void 0!==E,S=a(b);if(S&&!s(S))for(A=(y=o(b,S)).next,b=[];!(v=t(A,y)).done;)b.push(v.value);for(x&&w>2&&(E=e(E,arguments[2])),f=i(b),m=new(l(_))(f),g=c(m),d=0;f>d;d++)p=x?E(b[d],d):b[d],m[d]=g?u(p):+p;return m},Fc}function rl(){if(Hc)return zc;Hc=1;var e=vn();return zc=function(t,n,r){for(var i=0,o=arguments.length>2?r:e(n),a=new t(o);o>i;)a[i]=n[i++];return a},zc}function il(){if(Gc)return Yc.exports;Gc=1;var e=mr(),t=s(),n=_(),r=y(),i=function(){if(Ec)return wc;Ec=1;var e=s(),t=v(),n=Vc(),r=Xc().NATIVE_ARRAY_BUFFER_VIEWS,i=e.ArrayBuffer,o=e.Int8Array;return wc=!r||!t(function(){o(1)})||!t(function(){new o(-1)})||!n(function(e){new o,new o(null),new o(1.5),new o(e)},!0)||t(function(){return 1!==new o(new i(2),1,void 0).length})}(),o=Xc(),a=Mo(),c=Co(),l=ue(),u=St(),h=$c(),d=pn(),f=Io(),m=Qc(),g=Zc(),p=ut(),A=at(),b=wr(),w=ye(),E=Se(),x=ji(),S=_e(),C=Ar(),I=_n().f,T=nl(),R=function(){if(Wc)return jc;Wc=1;var e=Jr(),t=he(),n=fe(),r=ot(),i=vn(),o=Kr(),a=t([].push),s=function(t){var s=1===t,c=2===t,l=3===t,u=4===t,h=6===t,d=7===t,f=5===t||h;return function(m,g,p,v){for(var y,A,_=r(m),b=n(_),w=i(b),E=e(g,p),x=0,S=v||o,C=s?S(m,w):c||d?S(m,0):void 0;w>x;x++)if((f||x in b)&&(A=E(y=b[x],x,_),t))if(s)C[x]=A;else if(A)switch(t){case 3:return!0;case 5:return y;case 6:return x;case 2:a(C,y)}else switch(t){case 4:return!1;case 7:a(C,y)}return h?-1:l||u?u:C}};return jc={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6),filterReject:s(7)}}().forEach,k=Lo(),O=xo(),P=xt(),M=ft(),L=rl(),B=Yt(),D=br(),U=B.get,F=B.set,N=B.enforce,j=P.f,W=M.f,z=t.RangeError,H=a.ArrayBuffer,G=H.prototype,q=a.DataView,Y=o.NATIVE_ARRAY_BUFFER_VIEWS,V=o.TYPED_ARRAY_TAG,X=o.TypedArray,$=o.TypedArrayPrototype,J=o.isTypedArray,Q="BYTES_PER_ELEMENT",Z="Wrong length",K=function(e,t){O(e,t,{configurable:!0,get:function(){return U(this)[t]}})},ee=function(e){var t;return S(G,e)||"ArrayBuffer"===(t=b(e))||"SharedArrayBuffer"===t},te=function(e,t){return J(e)&&!E(t)&&t in e&&h(+t)&&t>=0},ne=function(e,t){return t=p(t),te(e,t)?l(2,e[t]):W(e,t)},re=function(e,t,n){return t=p(t),!(te(e,t)&&w(n)&&A(n,"value"))||A(n,"get")||A(n,"set")||n.configurable||A(n,"writable")&&!n.writable||A(n,"enumerable")&&!n.enumerable?j(e,t,n):(e[t]=n.value,e)};return r?(Y||(M.f=ne,P.f=re,K($,"buffer"),K($,"byteOffset"),K($,"byteLength"),K($,"length")),e({target:"Object",stat:!0,forced:!Y},{getOwnPropertyDescriptor:ne,defineProperty:re}),Yc.exports=function(r,o,a){var s=r.match(/\d+/)[0]/8,l=r+(a?"Clamped":"")+"Array",h="get"+r,p="set"+r,v=t[l],y=v,A=y&&y.prototype,_={},b=function(e,t){j(e,t,{get:function(){return function(e,t){var n=U(e);return n.view[h](t*s+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,n){var r=U(e);r.view[p](t*s+r.byteOffset,a?g(n):n,!0)}(this,t,e)},enumerable:!0})};Y?i&&(y=o(function(e,t,r,i){return c(e,A),D(w(t)?ee(t)?void 0!==i?new v(t,m(r,s),i):void 0!==r?new v(t,m(r,s)):new v(t):J(t)?L(y,t):n(T,y,t):new v(f(t)),e,y)}),C&&C(y,X),R(I(v),function(e){e in y||u(y,e,v[e])}),y.prototype=A):(y=o(function(e,t,r,i){c(e,A);var o,a,l,u=0,h=0;if(w(t)){if(!ee(t))return J(t)?L(y,t):n(T,y,t);o=t,h=m(r,s);var g=t.byteLength;if(void 0===i){if(g%s)throw new z(Z);if((a=g-h)<0)throw new z(Z)}else if((a=d(i)*s)+h>g)throw new z(Z);l=a/s}else l=f(t),o=new H(a=l*s);for(F(e,{buffer:o,byteOffset:h,byteLength:a,length:l,view:new q(o)});u=0?a:o+a;return s<0||s>=o?void 0:i[s]})}();var sl,cl={};!function(){if(sl)return cl;sl=1;var e=Xc(),t=Oo(),n=tl(),r=wr(),i=_(),o=he(),a=v(),s=e.aTypedArray,c=e.exportTypedArrayMethod,l=o("".slice);c("fill",function(e){var o=arguments.length;s(this);var a="Big"===l(r(this),0,3)?n(e):+e;return i(t,this,a,o>1?arguments[1]:void 0,o>2?arguments[2]:void 0)},a(function(){var e=0;return new Int8Array(2).fill({valueOf:function(){return e++}}),1!==e}))}();var ll,ul,hl,dl={};function fl(){if(ul)return ll;ul=1;var e=Jr(),t=fe(),n=ot(),r=vn(),i=function(i){var o=1===i;return function(a,s,c){for(var l,u=n(a),h=t(u),d=r(h),f=e(s,c);d-- >0;)if(f(l=h[d],d,u))switch(i){case 0:return l;case 1:return d}return o?-1:void 0}};return ll={findLast:i(0),findLastIndex:i(1)}}!function(){if(hl)return dl;hl=1;var e=Xc(),t=fl().findLast,n=e.aTypedArray;(0,e.exportTypedArrayMethod)("findLast",function(e){return t(n(this),e,arguments.length>1?arguments[1]:void 0)})}();var ml,gl={};!function(){if(ml)return gl;ml=1;var e=Xc(),t=fl().findLastIndex,n=e.aTypedArray;(0,e.exportTypedArrayMethod)("findLastIndex",function(e){return t(n(this),e,arguments.length>1?arguments[1]:void 0)})}();var pl,vl={};!function(){if(pl)return vl;pl=1;var e=s(),t=_(),n=Xc(),r=vn(),i=Qc(),o=ot(),a=v(),c=e.RangeError,l=e.Int8Array,u=l&&l.prototype,h=u&&u.set,d=n.aTypedArray,f=n.exportTypedArrayMethod,m=!a(function(){var e=new Uint8ClampedArray(2);return t(h,e,{length:1,0:3},1),3!==e[1]}),g=m&&n.NATIVE_ARRAY_BUFFER_VIEWS&&a(function(){var e=new l(2);return e.set(1),e.set("2",1),0!==e[0]||2!==e[1]});f("set",function(e){d(this);var n=i(arguments.length>1?arguments[1]:void 0,1),a=o(e);if(m)return t(h,this,a,n);var s=this.length,l=r(a),u=0;if(l+n>s)throw new c("Wrong length");for(;u0&&1/n<0?1:-1:t>n}}(e))},!p||g)}();var _l,bl,wl,El={};function xl(){if(bl)return _l;bl=1;var e=vn();return _l=function(t,n){for(var r=e(t),i=new n(r),o=0;o=s||l<0)throw new n("Incorrect index");for(var u=new i(s),h=0;h=t.length)return e.target=null,a(void 0,!0);switch(e.kind){case"keys":return a(n,!1);case"values":return a(t[n],!1)}return a([n,t[n]],!1)},"values");var d=n.Arguments=n.Array;if(t("keys"),t("values"),t("entries"),!s&&c&&"values"!==d.name)try{i(d,"name",{value:"values"})}catch(e){}return jl}!function(){if(zl)return Hl;zl=1;var e=s(),t=Ml?Pl:(Ml=1,Pl={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}),n=function(){if(Bl)return Ll;Bl=1;var e=ht()("span").classList,t=e&&e.constructor&&e.constructor.prototype;return Ll=t===Object.prototype?void 0:t}(),r=Yl(),i=St(),o=Po(),a=ct()("iterator"),c=r.values,l=function(e,n){if(e){if(e[a]!==c)try{i(e,a,c)}catch(t){e[a]=c}if(o(e,n,!0),t[n])for(var s in r)if(e[s]!==r[s])try{i(e,s,r[s])}catch(t){e[s]=r[s]}}};for(var u in t)l(e[u]&&e[u].prototype,u);l(n,"DOMTokenList")}();var Vl,Xl,$l,Jl,Ql,Zl={};function Kl(){if(Xl)return Vl;Xl=1;var e=y(),t=v(),n=Et(),r=xr(),i=Error.prototype.toString,o=t(function(){if(e){var t=Object.create(Object.defineProperty({},"name",{get:function(){return this===t}}));if("true"!==i.call(t))return!0}return"2: 1"!==i.call({message:1,name:2})||"Error"!==i.call({})});return Vl=o?function(){var e=n(this),t=r(e.name,"Error"),i=r(e.message);return t?i?t+": "+i:t:i}:i}function eu(){return Jl?$l:(Jl=1,$l={IndexSizeError:{s:"INDEX_SIZE_ERR",c:1,m:1},DOMStringSizeError:{s:"DOMSTRING_SIZE_ERR",c:2,m:0},HierarchyRequestError:{s:"HIERARCHY_REQUEST_ERR",c:3,m:1},WrongDocumentError:{s:"WRONG_DOCUMENT_ERR",c:4,m:1},InvalidCharacterError:{s:"INVALID_CHARACTER_ERR",c:5,m:1},NoDataAllowedError:{s:"NO_DATA_ALLOWED_ERR",c:6,m:0},NoModificationAllowedError:{s:"NO_MODIFICATION_ALLOWED_ERR",c:7,m:1},NotFoundError:{s:"NOT_FOUND_ERR",c:8,m:1},NotSupportedError:{s:"NOT_SUPPORTED_ERR",c:9,m:1},InUseAttributeError:{s:"INUSE_ATTRIBUTE_ERR",c:10,m:1},InvalidStateError:{s:"INVALID_STATE_ERR",c:11,m:1},SyntaxError:{s:"SYNTAX_ERR",c:12,m:1},InvalidModificationError:{s:"INVALID_MODIFICATION_ERR",c:13,m:1},NamespaceError:{s:"NAMESPACE_ERR",c:14,m:1},InvalidAccessError:{s:"INVALID_ACCESS_ERR",c:15,m:1},ValidationError:{s:"VALIDATION_ERR",c:16,m:0},TypeMismatchError:{s:"TYPE_MISMATCH_ERR",c:17,m:1},SecurityError:{s:"SECURITY_ERR",c:18,m:1},NetworkError:{s:"NETWORK_ERR",c:19,m:1},AbortError:{s:"ABORT_ERR",c:20,m:1},URLMismatchError:{s:"URL_MISMATCH_ERR",c:21,m:1},QuotaExceededError:{s:"QUOTA_EXCEEDED_ERR",c:22,m:1},TimeoutError:{s:"TIMEOUT_ERR",c:23,m:1},InvalidNodeTypeError:{s:"INVALID_NODE_TYPE_ERR",c:24,m:1},DataCloneError:{s:"DATA_CLONE_ERR",c:25,m:1}})}!function(){if(Ql)return Zl;Ql=1;var e=mr(),t=Ae(),n=ca(),r=v(),i=ji(),o=ue(),a=xt().f,s=Xt(),c=xo(),l=at(),u=Co(),h=Et(),d=Kl(),f=xr(),m=eu(),g=Cr(),p=Yt(),A=y(),_=tt(),b="DOMException",w="DATA_CLONE_ERR",E=t("Error"),x=t(b)||function(){try{(new(t("MessageChannel")||n("worker_threads").MessageChannel)).port1.postMessage(new WeakMap)}catch(e){if(e.name===w&&25===e.code)return e.constructor}}(),S=x&&x.prototype,C=E.prototype,I=p.set,T=p.getterFor(b),R="stack"in new E(b),k=function(e){return l(m,e)&&m[e].m?m[e].c:0},O=function(){u(this,P);var e=arguments.length,t=f(e<1?void 0:arguments[0]),n=f(e<2?void 0:arguments[1],"Error"),r=k(n);if(I(this,{type:b,name:n,message:t,code:r}),A||(this.name=n,this.message=t,this.code=r),R){var i=new E(t);i.name=b,a(this,"stack",o(1,g(i.stack,1)))}},P=O.prototype=i(C),M=function(e){return{enumerable:!0,configurable:!0,get:e}},L=function(e){return M(function(){return T(this)[e]})};A&&(c(P,"code",L("code")),c(P,"message",L("message")),c(P,"name",L("name"))),a(P,"constructor",o(1,O));var B=r(function(){return!(new x instanceof E)}),D=B||r(function(){return C.toString!==d||"2: 1"!==String(new x(1,2))}),U=B||r(function(){return 25!==new x(1,"DataCloneError").code}),F=B||25!==x[w]||25!==S[w],N=_?D||U||F:B;e({global:!0,constructor:!0,forced:N},{DOMException:N?O:x});var j=t(b),W=j.prototype;for(var z in D&&(_||x===j)&&s(W,"toString",d),U&&A&&x===j&&c(W,"code",M(function(){return k(h(this).name)})),m)if(l(m,z)){var H=m[z],G=H.s,q=o(6,H.c);l(j,G)||a(j,G,q),l(W,G)||a(W,G,q)}}();var tu,nu={};!function(){if(tu)return nu;tu=1;var e=mr(),t=s(),n=Ae(),r=ue(),i=xt().f,o=at(),a=Co(),c=br(),l=xr(),u=eu(),h=Cr(),d=y(),f=tt(),m="DOMException",g=n("Error"),p=n(m),v=function(){a(this,A);var e=arguments.length,t=l(e<1?void 0:arguments[0]),n=l(e<2?void 0:arguments[1],"Error"),o=new p(t,n),s=new g(t);return s.name=m,i(o,"stack",r(1,h(s.stack,1))),c(o,this,v),o},A=v.prototype=p.prototype,_="stack"in new g(m),b="stack"in new p(1,2),w=p&&d&&Object.getOwnPropertyDescriptor(t,m),E=!(!w||w.writable&&w.configurable),x=_&&!E&&!b;e({global:!0,constructor:!0,forced:f||x},{DOMException:x?v:p});var S=n(m),C=S.prototype;if(C.constructor!==S)for(var I in f||i(C,"constructor",r(1,S)),u)if(o(u,I)){var T=u[I],R=T.s;o(S,R)||i(S,R,r(6,T.c))}}();var ru,iu={};!function(){if(ru)return iu;ru=1;var e=Ae(),t="DOMException";Po()(e(t),t)}();var ou,au={};!function(){if(ou)return au;ou=1;var e=mr(),t=s(),n=xo(),r=y(),i=TypeError,o=Object.defineProperty,a=t.self!==t;try{if(r){var c=Object.getOwnPropertyDescriptor(t,"self");!a&&c&&c.get&&c.enumerable||n(t,"self",{get:function(){return t},set:function(e){if(this!==t)throw new i("Illegal invocation");o(t,"self",{value:e,writable:!0,configurable:!0,enumerable:!0})},configurable:!0,enumerable:!0})}else e({global:!0,simple:!0,forced:a},{self:t})}catch(e){}}();var su,cu,lu,uu,hu,du,fu,mu,gu,pu,vu,yu={},Au={};function _u(){if(lu)return cu;lu=1;var e=v(),t=ct(),n=y(),r=tt(),i=t("iterator");return cu=!e(function(){var e=new URL("b?a=1&b=2&c=3","https://a"),t=e.searchParams,o=new URLSearchParams("a=1&a=2&b=3"),a="";return e.pathname="c%20d",t.forEach(function(e,n){t.delete("b"),a+=n+e}),o.delete("a",2),o.delete("b",void 0),r&&(!e.toJSON||!o.has("a",1)||o.has("a",2)||!o.has("a",void 0)||o.has("b"))||!t.size&&(r||!n)||!t.sort||"https://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[i]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("https://тест").host||"#%D0%B1"!==new URL("https://a#б").hash||"a1c3"!==a||"x"!==new URL("https://x",void 0).host})}function bu(){if(fu)return du;fu=1;var e=Jr(),t=_(),n=ot(),r=qa(),i=ss(),o=Qr(),a=vn(),s=_a(),c=ls(),l=cs(),u=Array;return du=function(h){var d=n(h),f=o(this),m=arguments.length,g=m>1?arguments[1]:void 0,p=void 0!==g;p&&(g=e(g,m>2?arguments[2]:void 0));var v,y,A,_,b,w,E=l(d),x=0;if(!E||this===u&&i(E))for(v=a(d),y=f?new this(v):u(v);v>x;x++)w=p?g(d[x],x):d[x],s(y,x,w);else for(y=f?new this:[],b=(_=c(d,E)).next;!(A=t(b,_)).done;x++)w=p?r(_,g,[A.value,x],!0):A.value,s(y,x,w);return y.length=x,y},du}function wu(){if(gu)return mu;gu=1;var e=he(),t=2147483647,n=/[^\0-\u007E]/,r=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",o=RangeError,a=e(r.exec),s=Math.floor,c=String.fromCharCode,l=e("".charCodeAt),u=e([].join),h=e([].push),d=e("".replace),f=e("".split),m=e("".toLowerCase),g=function(e){return e+22+75*(e<26)},p=function(e,t,n){var r=0;for(e=n?s(e/700):e>>1,e+=s(e/t);e>455;)e=s(e/35),r+=36;return s(r+36*e/(e+38))},v=function(e){var n=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&i<=56319&&n=f&&a<_&&(_=a);var b=A+1;if(_-f>s((t-m)/b))throw new o(i);for(m+=(_-f)*b,f=_,r=0;rt)throw new o(i);if(a===f){for(var w=m,E=36;;){var x=E<=v?1:E>=v+26?26:E-v;if(wc;){if(t=+arguments[c++],n(t,1114111)!==t)throw new r(t+" is not a valid code point");o[c]=t<65536?i(t):i(55296+((t-=65536)>>10),t%1024+56320)}return a(o,"")}})}();var e=mr(),t=s(),n=Pu(),r=Ae(),i=_(),o=he(),a=y(),c=_u(),l=Xt(),u=xo(),h=So(),d=Po(),f=Gl(),m=Yt(),g=Co(),p=ve(),v=at(),A=Jr(),b=wr(),w=Et(),E=ye(),x=Er(),S=ji(),C=ue(),I=ls(),T=cs(),R=Wa(),k=Eu(),O=ct(),P=wi(),M=O("iterator"),L="URLSearchParams",B=L+"Iterator",D=m.set,U=m.getterFor(L),F=m.getterFor(B),N=n("fetch"),j=n("Request"),W=n("Headers"),z=j&&j.prototype,H=W&&W.prototype,G=t.TypeError,q=t.encodeURIComponent,Y=String.fromCharCode,V=r("String","fromCodePoint"),X=parseInt,$=o("".charAt),J=o([].join),Q=o([].push),Z=o("".replace),K=o([].shift),ee=o([].splice),te=o("".split),ne=o("".slice),re=o(/./.exec),ie=/\+/g,oe=/^[0-9a-f]+$/i,ae=function(e,t){var n=ne(e,t,t+2);return re(oe,n)?X(n,16):NaN},se=function(e){for(var t=0,n=128;n>0&&0!==(e&n);n>>=1)t++;return t},ce=function(e){var t=null;switch(e.length){case 1:t=e[0];break;case 2:t=(31&e[0])<<6|63&e[1];break;case 3:t=(15&e[0])<<12|(63&e[1])<<6|63&e[2];break;case 4:t=(7&e[0])<<18|(63&e[1])<<12|(63&e[2])<<6|63&e[3]}return t>1114111?null:t},le=function(e){for(var t=(e=Z(e,ie," ")).length,n="",r=0;rt){n+="%",r++;continue}var o=ae(e,r+1);if(o!=o){n+=i,r++;continue}r+=2;var a=se(o);if(0===a)i=Y(o);else{if(1===a||a>4){n+="�",r++;continue}for(var s=[o],c=1;ct||"%"!==$(e,r));){var l=ae(e,r+1);if(l!=l){r+=3;break}if(l>191||l<128)break;Q(s,l),r+=2,c++}if(s.length!==a){n+="�";continue}var u=ce(s);null===u?n+="�":i=V(u)}}n+=i,r++}return n},de=/[!'()~]|%20/g,fe={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},me=function(e){return fe[e]},ge=function(e){return Z(q(e),de,me)},pe=f(function(e,t){D(this,{type:B,target:U(e).entries,index:0,kind:t})},L,function(){var e=F(this),t=e.target,n=e.index++;if(!t||n>=t.length)return e.target=null,R(void 0,!0);var r=t[n];switch(e.kind){case"keys":return R(r.key,!1);case"values":return R(r.value,!1)}return R([r.key,r.value],!1)},!0),_e=function(e){this.entries=[],this.url=null,void 0!==e&&(E(e)?this.parseObject(e):this.parseQuery("string"==typeof e?"?"===$(e,0)?ne(e,1):e:x(e)))};_e.prototype={type:L,bindURL:function(e){this.url=e,this.update()},parseObject:function(e){var t,n,r,o,a,s,c,l=this.entries,u=T(e);if(u)for(n=(t=I(e,u)).next;!(r=i(n,t)).done;){if(a=(o=I(w(r.value))).next,(s=i(a,o)).done||(c=i(a,o)).done||!i(a,o).done)throw new G("Expected sequence with length 2");Q(l,{key:x(s.value),value:x(c.value)})}else for(var h in e)v(e,h)&&Q(l,{key:h,value:x(e[h])})},parseQuery:function(e){if(e)for(var t,n,r=this.entries,i=te(e,"&"),o=0;o0?arguments[0]:void 0));a||(this.size=e.entries.length)},we=be.prototype;if(h(we,{append:function(e,t){var n=U(this);k(arguments.length,2),Q(n.entries,{key:x(e),value:x(t)}),a||this.length++,n.updateURL()},delete:function(e){for(var t=U(this),n=k(arguments.length,1),r=t.entries,i=x(e),o=n<2?void 0:arguments[1],s=void 0===o?o:x(o),c=0;ct.key?1:-1}),e.updateURL()},forEach:function(e){for(var t,n=U(this).entries,r=A(e,arguments.length>1?arguments[1]:void 0),i=0;i1?Se(arguments[1]):{})}}),p(j)){var Ce=function(e){return g(this,z),new j(e,arguments.length>1?Se(arguments[1]):{})};z.constructor=Ce,Ce.prototype=z,e({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:Ce})}}return Iu={URLSearchParams:be,getState:U}}function Lu(){if(Ru)return yu;Ru=1,function(){if(su)return Au;su=1;var e=ac().charAt,t=Er(),n=Yt(),r=ql(),i=Wa(),o="String Iterator",a=n.set,s=n.getterFor(o);r(String,"String",function(e){a(this,{type:o,string:t(e),index:0})},function(){var t,n=s(this),r=n.string,o=n.index;return o>=r.length?i(void 0,!0):(t=e(r,o),n.index+=t.length,i(t,!1))})}();var e,t=mr(),n=y(),r=_u(),i=s(),o=Jr(),a=he(),c=Xt(),l=xo(),u=Co(),h=at(),d=function(){if(hu)return uu;hu=1;var e=y(),t=he(),n=_(),r=v(),i=Fi(),o=ur(),a=le(),s=ot(),c=fe(),l=Object.assign,u=Object.defineProperty,h=t([].concat);return uu=!l||r(function(){if(e&&1!==l({b:1},l(u({},"a",{enumerable:!0,get:function(){u(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},n={},r=Symbol("assign detection"),o="abcdefghijklmnopqrst";return t[r]=7,o.split("").forEach(function(e){n[e]=e}),7!==l({},t)[r]||i(l({},n)).join("")!==o})?function(t,r){for(var l=s(t),u=arguments.length,d=1,f=o.f,m=a.f;u>d;)for(var g,p=c(arguments[d++]),v=f?h(i(p),f(p)):i(p),y=v.length,A=0;y>A;)g=v[A++],e&&!n(m,p,g)||(l[g]=p[g]);return l}:l,uu}(),f=bu(),m=bi(),g=ac().codeAt,p=wu(),A=Er(),b=Po(),w=Eu(),E=Mu(),x=Yt(),S=x.set,C=x.getterFor("URL"),I=E.URLSearchParams,T=E.getState,R=i.URL,k=i.TypeError,O=i.parseInt,P=Math.floor,M=Math.pow,L=a("".charAt),B=a(/./.exec),D=a([].join),U=a(1.1.toString),F=a([].pop),N=a([].push),j=a("".replace),W=a([].shift),z=a("".split),H=a("".slice),G=a("".toLowerCase),q=a([].unshift),Y="Invalid scheme",V="Invalid host",X="Invalid port",$=/[a-z]/i,J=/[\d+-.a-z]/i,Q=/\d/,Z=/^0x/i,K=/^[0-7]+$/,ee=/^\d+$/,te=/^[\da-f]+$/i,ne=/[\0\t\n\r #%/:<>?@[\\\]^|]/,re=/[\0\t\n\r #/:<>?@[\\\]^|]/,ie=/^[\u0000-\u0020]+/,oe=/(^|[^\u0000-\u0020])[\u0000-\u0020]+$/,ae=/[\t\n\r]/g,se=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)q(t,e%256),e=P(e/256);return D(t,".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n?r:t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=U(e[n],16),n<7&&(t+=":")));return"["+t+"]"}return e},ce={},ue=d({},ce,{" ":1,'"':1,"<":1,">":1,"`":1}),de=d({},ue,{"#":1,"?":1,"{":1,"}":1}),me=d({},de,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),ge=function(e,t){var n=g(e,0);return n>32&&n<127&&!h(t,e)?e:encodeURIComponent(e)},pe={ftp:21,file:null,http:80,https:443,ws:80,wss:443},ve=function(e,t){var n;return 2===e.length&&B($,L(e,0))&&(":"===(n=L(e,1))||!t&&"|"===n)},ye=function(e){var t;return e.length>1&&ve(H(e,0,2))&&(2===e.length||"/"===(t=L(e,2))||"\\"===t||"?"===t||"#"===t)},Ae=function(e){return"."===e||"%2e"===G(e)},_e=function(e){return".."===(e=G(e))||"%2e."===e||".%2e"===e||"%2e%2e"===e},be={},we={},Ee={},xe={},Se={},Ce={},Ie={},Te={},Re={},ke={},Oe={},Pe={},Me={},Le={},Be={},De={},Ue={},Fe={},Ne={},je={},We={},ze=function(e,t,n){var r,i,o,a=A(e);if(t){if(i=this.parse(a))throw new k(i);this.searchParams=null}else{if(void 0!==n&&(r=new ze(n,!0)),i=this.parse(a,null,r))throw new k(i);(o=T(new I)).bindURL(this),this.searchParams=o}};ze.prototype={type:"URL",parse:function(t,n,r){var i,o,a,s,c=this,l=n||be,u=0,d="",g=!1,p=!1,v=!1;for(t=A(t),n||(c.scheme="",c.username="",c.password="",c.host=null,c.port=null,c.path=[],c.query=null,c.fragment=null,c.cannotBeABaseURL=!1,t=j(t,ie,""),t=j(t,oe,"$1")),t=j(t,ae,""),i=f(t);u<=i.length;){switch(o=i[u],l){case be:if(!o||!B($,o)){if(n)return Y;l=Ee;continue}d+=G(o),l=we;break;case we:if(o&&(B(J,o)||"+"===o||"-"===o||"."===o))d+=G(o);else{if(":"!==o){if(n)return Y;d="",l=Ee,u=0;continue}if(n&&(c.isSpecial()!==h(pe,d)||"file"===d&&(c.includesCredentials()||null!==c.port)||"file"===c.scheme&&!c.host))return;if(c.scheme=d,n)return void(c.isSpecial()&&pe[c.scheme]===c.port&&(c.port=null));d="","file"===c.scheme?l=Le:c.isSpecial()&&r&&r.scheme===c.scheme?l=xe:c.isSpecial()?l=Te:"/"===i[u+1]?(l=Se,u++):(c.cannotBeABaseURL=!0,N(c.path,""),l=Ne)}break;case Ee:if(!r||r.cannotBeABaseURL&&"#"!==o)return Y;if(r.cannotBeABaseURL&&"#"===o){c.scheme=r.scheme,c.path=m(r.path),c.query=r.query,c.fragment="",c.cannotBeABaseURL=!0,l=We;break}l="file"===r.scheme?Le:Ce;continue;case xe:if("/"!==o||"/"!==i[u+1]){l=Ce;continue}l=Re,u++;break;case Se:if("/"===o){l=ke;break}l=Fe;continue;case Ce:if(c.scheme=r.scheme,o===e)c.username=r.username,c.password=r.password,c.host=r.host,c.port=r.port,c.path=m(r.path),c.query=r.query;else if("/"===o||"\\"===o&&c.isSpecial())l=Ie;else if("?"===o)c.username=r.username,c.password=r.password,c.host=r.host,c.port=r.port,c.path=m(r.path),c.query="",l=je;else{if("#"!==o){c.username=r.username,c.password=r.password,c.host=r.host,c.port=r.port,c.path=m(r.path),c.path.length--,l=Fe;continue}c.username=r.username,c.password=r.password,c.host=r.host,c.port=r.port,c.path=m(r.path),c.query=r.query,c.fragment="",l=We}break;case Ie:if(!c.isSpecial()||"/"!==o&&"\\"!==o){if("/"!==o){c.username=r.username,c.password=r.password,c.host=r.host,c.port=r.port,l=Fe;continue}l=ke}else l=Re;break;case Te:if(l=Re,"/"!==o||"/"!==L(d,u+1))continue;u++;break;case Re:if("/"!==o&&"\\"!==o){l=ke;continue}break;case ke:if("@"===o){g&&(d="%40"+d),g=!0,a=f(d);for(var y=0;y65535)return X;c.port=c.isSpecial()&&w===pe[c.scheme]?null:w,d=""}if(n)return;l=Ue;continue}return X}d+=o;break;case Le:if(c.scheme="file","/"===o||"\\"===o)l=Be;else{if(!r||"file"!==r.scheme){l=Fe;continue}switch(o){case e:c.host=r.host,c.path=m(r.path),c.query=r.query;break;case"?":c.host=r.host,c.path=m(r.path),c.query="",l=je;break;case"#":c.host=r.host,c.path=m(r.path),c.query=r.query,c.fragment="",l=We;break;default:ye(D(m(i,u),""))||(c.host=r.host,c.path=m(r.path),c.shortenPath()),l=Fe;continue}}break;case Be:if("/"===o||"\\"===o){l=De;break}r&&"file"===r.scheme&&!ye(D(m(i,u),""))&&(ve(r.path[0],!0)?N(c.path,r.path[0]):c.host=r.host),l=Fe;continue;case De:if(o===e||"/"===o||"\\"===o||"?"===o||"#"===o){if(!n&&ve(d))l=Fe;else if(""===d){if(c.host="",n)return;l=Ue}else{if(s=c.parseHost(d))return s;if("localhost"===c.host&&(c.host=""),n)return;d="",l=Ue}continue}d+=o;break;case Ue:if(c.isSpecial()){if(l=Fe,"/"!==o&&"\\"!==o)continue}else if(n||"?"!==o)if(n||"#"!==o){if(o!==e&&(l=Fe,"/"!==o))continue}else c.fragment="",l=We;else c.query="",l=je;break;case Fe:if(o===e||"/"===o||"\\"===o&&c.isSpecial()||!n&&("?"===o||"#"===o)){if(_e(d)?(c.shortenPath(),"/"===o||"\\"===o&&c.isSpecial()||N(c.path,"")):Ae(d)?"/"===o||"\\"===o&&c.isSpecial()||N(c.path,""):("file"===c.scheme&&!c.path.length&&ve(d)&&(c.host&&(c.host=""),d=L(d,0)+":"),N(c.path,d)),d="","file"===c.scheme&&(o===e||"?"===o||"#"===o))for(;c.path.length>1&&""===c.path[0];)W(c.path);"?"===o?(c.query="",l=je):"#"===o&&(c.fragment="",l=We)}else d+=ge(o,de);break;case Ne:"?"===o?(c.query="",l=je):"#"===o?(c.fragment="",l=We):o!==e&&(c.path[0]+=ge(o,ce));break;case je:n||"#"!==o?o!==e&&("'"===o&&c.isSpecial()?c.query+="%27":c.query+="#"===o?"%23":ge(o,ce)):(c.fragment="",l=We);break;case We:o!==e&&(c.fragment+=ge(o,ue))}u++}},parseHost:function(e){var t,n,r;if("["===L(e,0)){if("]"!==L(e,e.length-1))return V;if(t=function(e){var t,n,r,i,o,a,s,c=[0,0,0,0,0,0,0,0],l=0,u=null,h=0,d=function(){return L(e,h)};if(":"===d()){if(":"!==L(e,1))return;h+=2,u=++l}for(;d();){if(8===l)return;if(":"!==d()){for(t=n=0;n<4&&B(te,d());)t=16*t+O(d(),16),h++,n++;if("."===d()){if(0===n)return;if(h-=n,l>6)return;for(r=0;d();){if(i=null,r>0){if(!("."===d()&&r<4))return;h++}if(!B(Q,d()))return;for(;B(Q,d());){if(o=O(d(),10),null===i)i=o;else{if(0===i)return;i=10*i+o}if(i>255)return;h++}c[l]=256*c[l]+i,2!==++r&&4!==r||l++}if(4!==r)return;break}if(":"===d()){if(h++,!d())return}else if(d())return;c[l++]=t}else{if(null!==u)return;h++,u=++l}}if(null!==u)for(a=l-u,l=7;0!==l&&a>0;)s=c[l],c[l--]=c[u+a-1],c[u+--a]=s;else if(8!==l)return;return c}(H(e,1,-1)),!t)return V;this.host=t}else if(this.isSpecial()){if(e=p(e),B(ne,e))return V;if(t=function(e){var t,n,r,i,o,a,s,c=z(e,".");if(c.length&&""===c[c.length-1]&&c.length--,(t=c.length)>4)return e;for(n=[],r=0;r1&&"0"===L(i,0)&&(o=B(Z,i)?16:8,i=H(i,8===o?1:2)),""===i)a=0;else{if(!B(10===o?ee:8===o?K:te,i))return e;a=O(i,o)}N(n,a)}for(r=0;r=M(256,5-t))return null}else if(a>255)return null;for(s=F(n),r=0;r1?arguments[1]:void 0,i=S(t,new ze(e,!1,r));n||(t.href=i.serialize(),t.origin=i.getOrigin(),t.protocol=i.getProtocol(),t.username=i.getUsername(),t.password=i.getPassword(),t.host=i.getHost(),t.hostname=i.getHostname(),t.port=i.getPort(),t.pathname=i.getPathname(),t.search=i.getSearch(),t.searchParams=i.getSearchParams(),t.hash=i.getHash())},Ge=He.prototype,qe=function(e,t){return{get:function(){return C(this)[e]()},set:t&&function(e){return C(this)[t](e)},configurable:!0,enumerable:!0}};if(n&&(l(Ge,"href",qe("serialize","setHref")),l(Ge,"origin",qe("getOrigin")),l(Ge,"protocol",qe("getProtocol","setProtocol")),l(Ge,"username",qe("getUsername","setUsername")),l(Ge,"password",qe("getPassword","setPassword")),l(Ge,"host",qe("getHost","setHost")),l(Ge,"hostname",qe("getHostname","setHostname")),l(Ge,"port",qe("getPort","setPort")),l(Ge,"pathname",qe("getPathname","setPathname")),l(Ge,"search",qe("getSearch","setSearch")),l(Ge,"searchParams",qe("getSearchParams")),l(Ge,"hash",qe("getHash","setHash"))),c(Ge,"toJSON",function(){return C(this).serialize()},{enumerable:!0}),c(Ge,"toString",function(){return C(this).serialize()},{enumerable:!0}),R){var Ye=R.createObjectURL,Ve=R.revokeObjectURL;Ye&&c(He,"createObjectURL",o(Ye,R)),Ve&&c(He,"revokeObjectURL",o(Ve,R))}return b(He,"URL"),t({global:!0,constructor:!0,forced:!r,sham:!n},{URL:He}),yu}ku||(ku=1,Lu());var Bu,Du={};!function(){if(Bu)return Du;Bu=1;var e=mr(),t=_();e({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return t(URL.prototype.toString,this)}})}();var Uu;Uu||(Uu=1,Mu());var Fu,Nu={};!function(){if(Fu)return Nu;Fu=1;var e=Xt(),t=he(),n=Er(),r=Eu(),i=URLSearchParams,o=i.prototype,a=t(o.append),s=t(o.delete),c=t(o.forEach),l=t([].push),u=new i("a=1&a=2&b=3");u.delete("a",1),u.delete("b",void 0),u+""!="a=2"&&e(o,"delete",function(e){var t=arguments.length,i=t<2?void 0:arguments[1];if(t&&void 0===i)return s(this,e);var o=[];c(this,function(e,t){l(o,{key:t,value:e})}),r(t,1);for(var u,h=n(e),d=n(i),f=0,m=0,g=!1,p=o.length;f=n;){const e=nh.keys().next().value;nh.delete(e)}nh.set(e,t)}}const ih={};let oh=null,ah=null,sh=null,ch=null,lh=null,uh=null,hh=null;function dh(e){return e&&"object"==typeof e&&!Array.isArray(e)}function fh(e){const t=[];return JSON.stringify(e,function(e,n){if("object"==typeof n&&null!==n){if(-1!==t.indexOf(n))return;t.push(n)}if(n instanceof Error||"undefined"!=typeof DOMException&&n instanceof DOMException){const e={name:n.name,message:n.message,stack:n.stack};return"cause"in n&&(e.cause=n.cause),Object.keys(n).forEach(t=>{e[t]=n[t]}),e}return n})}const mh={messages:[],logLevelConsole:"warning",logLevelSystem:"error",systemTargetLogLevel:"",addMessage:function(e,t){if(!Xu.debug)return;const n={level:e,date:(new Date).toISOString(),text:"",objs:[],stack:""},r=new Error;r.stack&&(n.stack=r.stack.toString().replace(/^Error\r?\n/,""));for(let e=0;e1e3&&mh.messages.shift()},systemLog(e,t){ah&&ah.hass&&ah.hass.callService("system_log","write",{logger:"frontend.wallpanel".concat(ch?"."+ch:""),message:t,level:mh.systemTargetLogLevel||e},void 0,!1).catch(()=>{})},downloadMessages:function(){const e=new Blob([fh(mh.messages)],{type:"text/plain"}),t=URL.createObjectURL(e),n=document.createElement("a");n.href=t,n.target="_blank",n.download="wallpanel_log.txt",document.body.appendChild(n),n.click(),n.remove(),setTimeout(()=>URL.revokeObjectURL(t),0)},purgeMessages:function(){mh.messages=[]},debug:function(){["debug"].includes(mh.logLevelConsole)&&console.debug.apply(this,arguments),["debug"].includes(mh.logLevelSystem)&&mh.systemLog("debug",fh(arguments)),mh.addMessage("debug",arguments)},info:function(){["debug","info"].includes(mh.logLevelConsole)&&console.info.apply(this,arguments),["debug","info"].includes(mh.logLevelSystem)&&mh.systemLog("info",fh(arguments)),mh.addMessage("info",arguments)},log:function(){mh.info.apply(this,arguments)},warning:function(){["debug","info","warning"].includes(mh.logLevelConsole)&&console.warn.apply(this,arguments),["debug","info","warning"].includes(mh.logLevelSystem)&&mh.systemLog("warning",fh(arguments)),mh.addMessage("warning",arguments)},warn:function(){mh.warning.apply(this,arguments)},error:function(){if(["debug","info","warning","error"].includes(mh.logLevelConsole)&&console.error.apply(this,arguments),["debug","info","warning","error"].includes(mh.logLevelSystem)&&mh.systemLog("error",fh(arguments)),mh.addMessage("error",arguments),Xu.alert_errors){const e="Wallpanel error: ".concat(fh(arguments));Ku?Ku.showMessage("error","Error",e,1e4):alert(e)}},err:function(){mh.error.apply(this,arguments)}};class gh{constructor(){this.enabled=!1,this.error=null,this.nativeWakeLockSupported="wakeLock"in navigator,this._lock=null,this._player=null,this._isPlaying=!1,this._onWakeLockRelease=null;const e=()=>{mh.debug("handleVisibilityChange"),this.enabled&&!document.hidden&&this.enable()};if(document.addEventListener("visibilitychange",e),document.addEventListener("fullscreenchange",e),!this.nativeWakeLockSupported){const e="data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAA1NtZGF0AAACrwYF//+r3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2NCByMzA5NSBiYWVlNDAwIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAyMiAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOi0zOi0zIGFuYWx5c2U9MHgzOjB4MTEzIG1lPWhleCBzdWJtZT03IHBzeT0xIHBzeV9yZD0yLjAwOjAuNzAgbWl4ZWRfcmVmPTEgbWVfcmFuZ2U9MTYgY2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6b25lPTIxLDExIGZhc3RfcHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS00IHRocmVhZHM9MSBsb29rYWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdlaWdodHA9MiBrZXlpbnQ9MjUwIGtleWludF9taW49MSBzY2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9MSBjcmY9MjMuMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMjAAgAAAABFliIQAF85//vfUt8yy7VNwgQAAAAlBmiRsQXzn/vAAAAAJQZ5CeIL5z4aBAAAACQGeYXRBfOeGgAAAAAkBnmNqQXznhoEAAAAPQZpoSahBaJlMCC+c//7xAAAAC0GehkURLBfOf4aBAAAACQGepXRBfOeGgQAAAAkBnqdqQXznhoAAAAAPQZqpSahBbJlMCC+c//7wAAADs21vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAA+gAACcQAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAALddHJhawAAAFx0a2hkAAAAAwAAAAAAAAAAAAAAAQAAAAAAACcQAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAIAAAACAAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAAAnEAAAgAAAAQAAAAACVW1kaWEAAAAgbWRoZAAAAAAAAAAAAAAAAAAAQAAAAoAAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAAAgBtaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAHAc3RibAAAAMBzdHNkAAAAAAAAAAEAAACwYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAIAAgASAAAAEgAAAAAAAAAARVMYXZjNTkuMzcuMTAwIGxpYngyNjQAAAAAAAAAAAAAABj//wAAADZhdmNDAWQACv/hABlnZAAKrNlfllwEQAAAAwBAAAADAIPEiWWAAQAGaOvjxMhM/fj4AAAAABBwYXNwAAAAAQAAAAEAAAAUYnRydAAAAAAAAAKiAAACogAAABhzdHRzAAAAAAAAAAEAAAAKAABAAAAAABRzdHNzAAAAAAAAAAEAAAABAAAAYGN0dHMAAAAAAAAACgAAAAEAAIAAAAAAAQABQAAAAAABAACAAAAAAAEAAAAAAAAAAQAAQAAAAAABAAFAAAAAAAEAAIAAAAAAAQAAAAAAAAABAABAAAAAAAEAAIAAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAAKAAAAAQAAADxzdHN6AAAAAAAAAAAAAAAKAAACyAAAAA0AAAANAAAADQAAAA0AAAATAAAADwAAAA0AAAANAAAAEwAAABRzdGNvAAAAAAAAAAEAAAAwAAAAYnVkdGEAAABabWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAtaWxzdAAAACWpdG9vAAAAHWRhdGEAAAABAAAAAExhdmY1OS4yNy4xMDA=";this._player=document.createElement("video"),this._player.setAttribute("id","ScreenWakeLockVideo"),this._player.setAttribute("src",e),this._player.setAttribute("playsinline",""),this._player.setAttribute("muted",""),this._player.style.display="none",document.getElementById("ScreenWakeLockVideo")||document.body.appendChild(this._player),this._player.addEventListener("ended",()=>{mh.debug("Video ended"),this.enabled&&this.enable()}),this._player.addEventListener("playing",()=>{mh.debug("Video playing"),this._isPlaying=!0}),this._player.addEventListener("pause",()=>{mh.debug("Video pause"),this._isPlaying=!1})}}enable(){if(this.nativeWakeLockSupported){if(mh.debug("Requesting native screen wakelock"),this._lock)return void mh.debug("Screen wakelock already active");navigator.wakeLock.request("screen").then(e=>{mh.debug("Request screen wakelock successful"),this._lock=e,this._onWakeLockRelease=()=>{mh.debug("Screen wakelock released"),this.enabled=!1,this._lock=null},e.addEventListener("release",this._onWakeLockRelease),this.enabled=!0,this.error=null}).catch(e=>{this.enabled=!1,this.error=e,mh.warning("Failed to request screen wakeLock: ".concat(e))})}else{mh.debug("Starting video player"),!this._player.paused&&this._isPlaying&&this._player.pause();const e=this._player.play();e&&e.then(()=>{this.enabled=!0,this.error=null,mh.debug("Video play successful")}).catch(e=>{this.enabled=!1,this.error=e,mh.warning("Failed to play video: ".concat(e))})}}disable(){this.nativeWakeLockSupported?(mh.debug("Releasing native screen wakelock"),this._lock&&(this._onWakeLockRelease&&(this._lock.removeEventListener("release",this._onWakeLockRelease),this._onWakeLockRelease=null),this._lock.release()),this._lock=null):(mh.debug("Stopping video player"),!this._player.paused&&this._isPlaying&&this._player.pause()),this.enabled=!1}}class ph{constructor(){this.enabled=!1,this.error=!1,this.width=64,this.height=48,this.thresholdRatio=.05,this.threshold=this.width*this.height*this.thresholdRatio,this.captureInterval=300,this.motionActive=!1,this.motionStartDelay=0,this.motionStopDelay=2e3,this.motionDetectionRequiredRatio=.8,this.roomSettledRequiredRatio=1,this.motionStopTimeout=null,this.captureTimer=null,this.referenceImageData=null,this.previousImageData=null,this.referenceChangeRatios=[],this.previousChangeRatios=[],this.maxRatioHistorySize=Math.ceil(6e4/this.captureInterval),this.videoElement=document.createElement("video"),this.videoElement.setAttribute("id","wallpanelMotionDetectionVideo"),this.videoElement.style.display="none",document.body.appendChild(this.videoElement),this.canvasElement=document.createElement("canvas"),this.canvasElement.setAttribute("id","wallpanelMotionDetectionCanvas"),this.canvasElement.style.display="none",document.body.appendChild(this.canvasElement),this.context=this.canvasElement.getContext("2d",{willReadFrequently:!0}),this._elementsAppended=!0}compareImageData(e,t){if(!e||!t)return 0;let n=0;const r=e.data,i=t.data;for(let e=0;e=256&&n++}return n/(this.width*this.height)}storeRatio(e,t){for(e.push(t);e.length>this.maxRatioHistorySize;)e.shift()}getRatiosForInterval(e,t){const n=Math.max(1,Math.ceil(t/this.captureInterval));return e.length0&&e.filter(e=>e>=this.thresholdRatio).length/e.length>=t}hasRequiredRatioBelowThreshold(e,t){return e.length>0&&e.filter(e=>e=t}resetMotionState(){this.motionActive=!1,this.motionStopTimeout&&(clearTimeout(this.motionStopTimeout),this.motionStopTimeout=null),this.referenceImageData=null,this.previousImageData=null,this.referenceChangeRatios=[],this.previousChangeRatios=[]}capture(){this.context.globalCompositeOperation="source-over",this.context.drawImage(this.videoElement,0,0,this.width,this.height);const e=this.context.getImageData(0,0,this.width,this.height);if(!this.referenceImageData)return this.referenceImageData=e,void(this.previousImageData=e);const t=this.compareImageData(e,this.referenceImageData),n=this.compareImageData(e,this.previousImageData);this.previousImageData=e,this.storeRatio(this.referenceChangeRatios,t),this.storeRatio(this.previousChangeRatios,n);const r=this.getRatiosForInterval(this.referenceChangeRatios,this.motionStartDelay),i=this.hasRequiredRatioAboveThreshold(r,this.motionDetectionRequiredRatio),o=this.previousChangeRatios.length>=this.maxRatioHistorySize&&this.hasRequiredRatioBelowThreshold(this.previousChangeRatios,this.roomSettledRequiredRatio);i?(this.motionActive||(mh.debug("Motion started"),this.motionActive=!0,Ku.motionDetected()),this.motionStopTimeout&&(clearTimeout(this.motionStopTimeout),this.motionStopTimeout=null)):this.motionActive&&!this.motionStopTimeout&&(this.motionStopTimeout=setTimeout(()=>{mh.debug("Motion stopped"),this.motionActive=!1,this.motionStopTimeout=null,Ku.motionStopped()},this.motionStopDelay)),o&&(mh.info("Room settled, new reference image stored"),this.referenceImageData=e,this.referenceChangeRatios=[])}start(){if(!this.enabled&&!this.error){if(!navigator.mediaDevices)return this.error=!0,void mh.error("No media devices found");this._elementsAppended||(document.body.appendChild(this.videoElement),document.body.appendChild(this.canvasElement),this._elementsAppended=!0),this.enabled=!0,this.width=Xu.camera_motion_detection_capture_width,this.height=Xu.camera_motion_detection_capture_height,this.thresholdRatio=.01*Xu.camera_motion_detection_threshold,this.threshold=this.width*this.height*this.thresholdRatio,this.captureInterval=1e3*Xu.camera_motion_detection_capture_interval,this.motionStartDelay=1e3*Xu.camera_motion_detection_motion_start_delay,this.motionStopDelay=1e3*Xu.camera_motion_detection_motion_stop_delay,this.maxRatioHistorySize=Math.ceil(6e4/this.captureInterval),this.resetMotionState(),this.videoElement.width=this.width,this.videoElement.height=this.height,this.canvasElement.width=this.width,this.canvasElement.height=this.height,Xu.camera_motion_detection_capture_visible?(this.canvasElement.style.position="fixed",this.canvasElement.style.top=0,this.canvasElement.style.left=0,this.canvasElement.style.zIndex=1e4,this.canvasElement.style.border="1px solid black",this.canvasElement.style.display="block"):this.canvasElement.style.display="none",navigator.mediaDevices.getUserMedia({audio:!1,video:{facingMode:{ideal:Xu.camera_motion_detection_facing_mode},width:this.width,height:this.height}}).then(e=>{this.videoElement.srcObject=e;const t=this.videoElement.play();t&&t.catch(e=>{mh.warning("Camera motion detection video play failed: ".concat(e))}),this.enabled&&(this.captureTimer=setInterval(this.capture.bind(this),this.captureInterval))}).catch(e=>{this.enabled=!1,mh.error("Camera motion detection error:",e),this._elementsAppended&&(this.videoElement.remove(),this.canvasElement.remove(),this._elementsAppended=!1)})}}stop(){if(!this.enabled)return;this.enabled=!1,this.resetMotionState(),this.captureTimer&&(clearInterval(this.captureTimer),this.captureTimer=null),this.videoElement.pause();const e=this.videoElement.srcObject;e&&"function"==typeof e.getTracks&&e.getTracks().forEach(e=>{e.stop()}),this.videoElement.srcObject=null,this._elementsAppended&&(this.videoElement.remove(),this.canvasElement.remove(),this._elementsAppended=!1)}}const vh=1592614637;function yh(e){return function(){e=e+1831565813|0;let t=Math.imul(e^e>>>15,1|e);return t=t+Math.imul(t^t>>>7,61|t)^t,((t^t>>>14)>>>0)/4294967296}}function Ah(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Math.random;const n=e.slice();for(let e=n.length-1;e>0;e--){const r=Math.floor(t()*(e+1));[n[e],n[r]]=[n[r],n[e]]}return n}function _h(e){if(!e.shadowRoot)return[null,null];const t=e.shadowRoot.querySelector("ha-web-rtc-player")||e.shadowRoot.querySelector("ha-hls-player");if(!t||!t.shadowRoot)return[t,null];const n=t.shadowRoot.querySelector("video");return[t,n]}function bh(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;rc(e)):dh(t)&&(t=Object.fromEntries(Object.entries(t).map(e=>{let[t,n]=e;return[t,c(n)]}))),"boolean"==typeof e[o]&&(t=null!=t&&["true","on","yes","1"].includes(String(t).toLowerCase())),t}a=c(a),Array.isArray(e[o])&&"string"==typeof a&&(a=a.split(",").map(e=>e.trim())),Object.assign(e,{[o]:a})}}return bh(e,...n)}function wh(){const e=new URLSearchParams(window.location.search),t=Xu;Xu={},bh(Xu,qu),0===Object.keys(Vu).length&&(Vu=Th(),0===Object.keys(Vu).length&&mh.debug("No wallpanel config found in dashboard config")),bh(Xu,Vu);const n={};for(let[t,r]of e)if(t.startsWith("wp_")&&(t=t.substring(3),Yu[t]&&(mh.warn("The configuration option '".concat(t,"' has been renamed to '").concat(Yu[t],"'. Please update your wallpanel configuration accordingly.")),t=Yu[t]),t in qu&&r)){try{r=JSON.parse(r)}catch(e){}const e=qu[t];if(Array.isArray(e))Array.isArray(r)?n[t]=r:n[t]="string"==typeof r?r.split(",").map(e=>e.trim()):[r];else if("boolean"==typeof e)n[t]=["true","on","yes","1"].includes(String(r));else if("number"==typeof e){const e=Number(r);Number.isFinite(e)?n[t]=e:mh.warn("Invalid numeric wp_ param '".concat(t,"': ").concat(r))}else n[t]=r}Xu=bh(Xu,n);const r=Xu.profile;if(Xu.profiles&&r&&Xu.profiles[r]&&(Xu=bh(Xu,Xu.profiles[r]),mh.debug("Profile set from config: ".concat(r))),Xu.profiles&&ch&&Xu.profiles["device.".concat(ch)]){const e="device.".concat(ch);Xu=bh(Xu,Xu.profiles[e]),mh.debug("Profile set from device: ".concat(e))}if(Xu.profiles){const e=[lh,uh,hh];for(let t=0;t{t.tagName.toLowerCase().startsWith("browser-mod-popup")&&t.shadowRoot&&t.shadowRoot.querySelector("ha-dialog")&&e.push(t)}),e):e}function xh(){const e=Eh();return e&&0!=e.length?e[0]:null}function Sh(){if("1"==new URLSearchParams(window.location.search).get("edit"))return mh.debug("Edit mode active"),!1;if(!Xu.enabled)return mh.debug("Wallpanel not enabled in config"),!1;if(Xu.enabled_on_views&&Xu.enabled_on_views.length>0&&Qu&&!Xu.enabled_on_views.includes(Qu))return mh.debug("Wallpanel not enabled on current tab ".concat(Qu)),!1;if(Xu.disable_screensaver_when_assist_active){const e=ah.shadowRoot.querySelector("ha-voice-command-dialog");if(e&&e.shadowRoot&&e.shadowRoot.querySelector("ha-dialog"))return mh.debug("Assist is active, wallpanel disabled"),!1}return Ku&&Ku.disable_screensaver_on_browser_mod_popup_function&&xh()&&Ku.disable_screensaver_on_browser_mod_popup_function(xh())?(mh.debug("Browser mod popup function returned true, wallpanel disabled"),!1):!Xu.disable_screensaver_on_browser_mod_popup||!xh()||(mh.debug("Browser mod popup active, wallpanel disabled"),!1)}function Ch(){return Xu.show_images&&Xu.image_url?Xu.image_url.startsWith("media-entity-video://")?"media-entity-video":Xu.image_url.startsWith("media-entity-image://")?"media-entity-image":Xu.image_url.startsWith("media-source://")?"media-source":Xu.image_url.startsWith("https://api.unsplash")?"unsplash-api":Xu.image_url.startsWith("immich+")?"immich-api":Xu.image_url.startsWith("iframe+")?"iframe":Xu.image_url.startsWith("embed+")?"embed":"url":""}function Ih(){try{return sh.shadowRoot.querySelector("ha-panel-lovelace")}catch(e){mh.error("Failed to get ha-panel-lovelace:",e)}}function Th(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const t=Ih(),n={};if(t&&t.lovelace){let r;t.lovelace.config&&t.lovelace.config.wallpanel?r=t.lovelace.config.wallpanel:t.lovelace.rawConfig&&t.lovelace.rawConfig.wallpanel&&(r=t.lovelace.rawConfig.wallpanel),r&&(0===e.length&&(e=Object.keys(r)),e.forEach(e=>{(e in qu||e in Yu)&&(n[e]=r[e])}))}return n}function Rh(e){mh.debug("setSidebarVisibility: hidden=".concat(e));try{const t=sh.shadowRoot.querySelector("ha-panel-lovelace");if(t){const n=t.shadowRoot.querySelector("hui-root");if(n){const t=n.shadowRoot.querySelector("ha-menu-button");t&&(e?t.style.display="none":t.style.removeProperty("display"))}}}catch(e){mh.warn(e)}try{const t=sh.shadowRoot.querySelector("ha-drawer");if(t){const n=t.shadowRoot.querySelector(".sidebar-shell")||t.shadowRoot.querySelector("aside"),r=n&&n.classList.contains("sidebar-shell")?"--ha-sidebar-width":"--mdc-drawer-width";n&&(e?(n.style.opacity=0,n.style.maxWidth="0px",sh.style.setProperty(r,"env(safe-area-inset-left)")):(n.style.opacity=1,n.style.maxWidth="",sh.style.removeProperty(r)),window.dispatchEvent(new Event("resize")))}}catch(e){mh.warn(e)}}function kh(e,t){mh.debug("setToolbarVisibility: hideToolbar=".concat(e,", hideActionItems=").concat(t));try{const n=sh.shadowRoot.querySelector("ha-panel-lovelace");if(!n)return;let r=n.shadowRoot.querySelector("hui-root");if(!r)return;r=r.shadowRoot;const i=r.querySelector("#view");let o=r.querySelector("app-toolbar");if(o||(o=r.querySelector("div.toolbar")),e)o.style.setProperty("display","none"),Xu.keep_toolbar_space||(i.style.minHeight="100vh",i.style.marginTop="0",i.style.paddingTop="0");else{o.style.removeProperty("display"),i.style.removeProperty("min-height"),i.style.removeProperty("margin-top"),i.style.removeProperty("padding-top");const e=o.querySelector("div.action-items");t?e.style.setProperty("display","none"):e.style.setProperty("display","flex")}window.dispatchEvent(new Event("resize"))}catch(e){mh.warn(e)}}function Oh(){return void 0!==document.fullscreenElement?Boolean(document.fullscreenElement):void 0!==document.webkitCurrentFullScreenElement&&Boolean(document.webkitCurrentFullScreenElement)}function Ph(){mh.debug("Enter fullscreen");const e=document.documentElement;e.requestFullscreen?e.requestFullscreen().then(()=>{mh.debug("Successfully requested fullscreen")},e=>{mh.debug("Failed to enter fullscreen:",e)}):e.mozRequestFullScreen?e.mozRequestFullScreen():e.msRequestFullscreen?e.msRequestFullscreen():e.webkitRequestFullscreen&&e.webkitRequestFullscreen()}function Mh(){const e=customElements.get("hui-view-container"),t=customElements.get("hui-view");if(!e||!t){throw new Error("Failed to get hui-view-container / hui-view from customElements")}class r extends e{}class i extends t{constructor(){super(),this.mediaList=[],this.mediaIndex=-1,this.mediaListDirection="forwards",this.lastMediaListUpdate,this.updatingMediaList=!1,this.mediaListRetryAt=0,this.mediaListRetryTimer=null,this.updatingMedia=!1,this.mediaLoadRetryAt=0,this.lastMediaUpdate=0,this.isPaused=!1,this.displayTime=null,this.mediaTimeElapsedBeforePause=0,this.lastImageUrlEntityValue=null,this.blockEventsUntil=0,this.screensaverStartedAt,this.screensaverStoppedAt=new Date,this.infoBoxContentCreatedDate,this.idleSince=Date.now(),this.lastProfileSet=Xu.profile,this.lastMove=null,this.lastCorner=0,this.translateTimeout=null,this.afterFadeoutTimer=null,this.lastClickTime=0,this.clickCount=0,this.touchStartX=-1,this.touchStartY=-1,this.currentWidth=0,this.currentHeight=0,this.energyCollectionUpdateEnabled=!1,this.energyCollectionUpdateInterval=60,this.lastEnergyCollectionUpdate=0,this.screensaverStopNavigationPathTimeout=null,this.disable_screensaver_on_browser_mod_popup_function=null,this.moreInfoDialogOpenedAt=0,this.timerInterval=null,this.windowEventHandlers=[],this.infoBoxResizeObserver=null,this.screenWakeLock=new gh,this.cameraMotionDetection=new ph,this.lovelace=null,this.__hass=ah.hass||ah.__hass,this.__cards=[],this.__badges=[],this.__views=[],ah.provideHass(this),this.timerInterval=setInterval(this.timer.bind(this),1e3),Zu.hass=this.__hass}set hass(e){mh.debug("Update hass"),this.__hass=e;let t=!1;for(const e in ih){const n=this.__hass.states[e];n&&n.state!=ih[e]&&(ih[e]=n.state,t=!0)}if(!this.updateProfile()&&t&&wh(),!Sh())return;const n=Xu.screensaver_entity;if(n&&this.__hass.states[n]){const e=new Date(this.__hass.states[n].last_changed),t=this.__hass.states[n].state;"off"==t&&this.screensaverStartedAt&&e.getTime()-this.screensaverStartedAt>0?this.stopScreensaver(Xu.fade_out_time_screensaver_entity):"on"==t&&this.screensaverStoppedAt&&e.getTime()-this.screensaverStoppedAt>0&&this.startScreensaver()}this.screensaverRunning()&&(this.__cards.forEach(e=>{e.hass=this.hass}),this.__badges.forEach(e=>{e.hass=this.hass}),this.__views.forEach(e=>{e.hass=this.hass}),"media-entity-image"==Ch()&&this.switchActiveMedia("entity_update"))}get hass(){return this.__hass}setScreensaverEntityState(){const e=Xu.screensaver_entity;if(!e||!this.__hass.states[e])return;if(this.screensaverRunning()&&"on"==this.__hass.states[e].state)return;if(!this.screensaverRunning()&&"off"==this.__hass.states[e].state)return;const t=this.screensaverRunning()?"turn_on":"turn_off";mh.debug("Updating screensaver_entity",e,t),this.__hass.callService("input_boolean",t,{entity_id:e}).then(e=>{mh.debug(e)},e=>{mh.error("Failed to set screensaver entity state:",e)})}setImageURLEntityState(){const e=Xu.image_url_entity;if(!e||!this.__hass.states[e])return;const t=this.getActiveMediaElement();if(!t||!t.mediaUrl)return;const n=t.mediaUrl.substring(0,255);this.lastImageUrlEntityValue!==n&&(mh.debug("Updating image_url_entity",e,n),this.__hass.callService("input_text","set_value",{entity_id:e,value:n}).then(e=>{mh.debug(e),this.lastImageUrlEntityValue=n},e=>{mh.error("Failed to set image url entity state:",e)}))}updateProfile(){const e=Xu.profile_entity;if(e&&this.__hass.states[e]){const t=this.__hass.states[e].state;if(t&&t!=this.lastProfileSet||!t&&this.lastProfileSet)return mh.debug("Set profile to ".concat(t)),this.lastProfileSet=t,wh(),!0}return!1}timer(){Xu.enabled&&Ju&&(this.screensaverRunning()?Xu.disable_screensaver_on_browser_mod_popup&&xh()?this.stopScreensaver(Xu.fade_out_time_browser_mod_popup):this.updateScreensaver():Sh()&&Xu.idle_time>0&&Date.now()-this.idleSince>=1e3*Xu.idle_time&&(Xu.camera_motion_detection_stop_screensaver&&this.cameraMotionDetection&&this.cameraMotionDetection.motionActive||this.startScreensaver()))}setDefaultStyle(){this.messageContainer.removeAttribute("style"),this.messageContainer.style.position="fixed",this.messageContainer.style.top="1rem",this.messageContainer.style.left="1rem",this.messageContainer.style.bottom="1rem",this.messageContainer.style.right="1rem",this.messageContainer.style.alignItems="flex-end",this.messageContainer.style.display="flex",this.messageContainer.style.flexDirection="column",this.messageContainer.style.gap="0.5rem",this.messageContainer.style.zIndex=this.style.zIndex+1,this.messageContainer.style.pointerEvents="none",this.messageContainer.style.visibility="hidden",this.debugBox.removeAttribute("style"),this.debugBox.style.position="fixed",this.debugBox.style.pointerEvents="none",this.debugBox.style.top="0%",this.debugBox.style.left="0%",this.debugBox.style.width="100%",this.debugBox.style.height="100%",this.debugBox.style.background="#00000099",this.debugBox.style.color="#ffffff",this.debugBox.style.zIndex=this.style.zIndex+2,this.debugBox.style.fontFamily="monospace",this.debugBox.style.fontSize="12px",this.debugBox.style.overflowWrap="break-word",this.debugBox.style.overflowY="auto",this.debugBox.style.visibility="hidden",this.screensaverContainer.removeAttribute("style"),this.screensaverContainer.style.position="fixed",this.screensaverContainer.style.pointerEvents="auto",this.screensaverContainer.style.top=0,this.screensaverContainer.style.right=0,this.screensaverContainer.style.bottom=0,this.screensaverContainer.style.left=0,this.screensaverContainer.style.background="#000000",this.screensaverContainer.style.overflow="hidden",this.imageOneContainer.removeAttribute("style"),this.imageOneContainer.style.opacity=0,this.imageOneContainer.style.position="absolute",this.imageOneContainer.style.pointerEvents="none",this.imageOneContainer.style.top=0,this.imageOneContainer.style.left=0,this.imageOneContainer.style.width="100%",this.imageOneContainer.style.height="100%",this.imageOneContainer.style.border="none",this.imageOneBackground.style.position="absolute",this.imageOneBackground.style.pointerEvents="none",this.imageOneBackground.style.top=0,this.imageOneBackground.style.left=0,this.imageOneBackground.style.width="100%",this.imageOneBackground.style.height="100%",this.imageOneBackground.style.border="none",this.imageOne.removeAttribute("style"),this.imageOne.style.position="relative",this.imageOne.style.pointerEvents="none",this.imageOne.style.width="100%",this.imageOne.style.height="100%",this.imageOne.style.border="none",this.imageOneInfoContainer.removeAttribute("style"),this.imageOneInfoContainer.style.position="absolute",this.imageOneInfoContainer.style.pointerEvents="none",this.imageOneInfoContainer.style.top=0,this.imageOneInfoContainer.style.left=0,this.imageOneInfoContainer.style.width="100%",this.imageOneInfoContainer.style.height="100%",this.imageOneInfoContainer.style.border="none",this.imageOneInfo.style.overflowY="auto",this.imageTwoContainer.removeAttribute("style"),this.imageTwoContainer.style.opacity=0,this.imageTwoContainer.style.position="absolute",this.imageTwoContainer.style.pointerEvents="none",this.imageTwoContainer.style.top=0,this.imageTwoContainer.style.left=0,this.imageTwoContainer.style.width="100%",this.imageTwoContainer.style.height="100%",this.imageTwoContainer.style.border="none",this.imageTwoBackground.style.position="absolute",this.imageTwoBackground.style.pointerEvents="none",this.imageTwoBackground.style.top=0,this.imageTwoBackground.style.left=0,this.imageTwoBackground.style.width="100%",this.imageTwoBackground.style.height="100%",this.imageTwoBackground.style.border="none",this.imageTwo.removeAttribute("style"),this.imageTwo.style.position="relative",this.imageTwo.style.pointerEvents="none",this.imageTwo.style.width="100%",this.imageTwo.style.height="100%",this.imageTwo.style.border="none",this.imageTwoInfoContainer.removeAttribute("style"),this.imageTwoInfoContainer.style.position="absolute",this.imageTwoInfoContainer.style.pointerEvents="none",this.imageTwoInfoContainer.style.top=0,this.imageTwoInfoContainer.style.left=0,this.imageTwoInfoContainer.style.width="100%",this.imageTwoInfoContainer.style.height="100%",this.imageTwoInfoContainer.style.border="none",this.imageTwoInfo.style.overflowY="auto",this.screensaverImageOverlay.removeAttribute("style"),this.screensaverImageOverlay.style.position="absolute",this.screensaverImageOverlay.style.top=0,this.screensaverImageOverlay.style.left=0,this.screensaverImageOverlay.style.width="100%",this.screensaverImageOverlay.style.height="100%",this.screensaverImageOverlay.style.background="#00000000",this.infoContainer.removeAttribute("style"),this.infoContainer.style.position="absolute",this.infoContainer.style.pointerEvents="none",this.infoContainer.style.top=0,this.infoContainer.style.left=0,this.infoContainer.style.width="100%",this.infoContainer.style.height="100%",this.infoContainer.style.transition="opacity 2000ms ease-in-out",this.infoContainer.style.padding="25px",this.infoContainer.style.boxSizing="border-box",this.infoBox.removeAttribute("style"),this.infoBox.style.pointerEvents="none",this.infoBox.style.width="fit-content",this.infoBox.style.maxHeight="100%",this.infoBox.style.borderRadius="10px",this.infoBox.style.overflowY="auto",this.infoBox.style.scrollbarWidth="none",this.infoBox.style.setProperty("--wp-card-width","500px"),this.infoBox.style.setProperty("--wp-card-padding","0"),this.infoBox.style.setProperty("--wp-card-margin","5px"),this.infoBox.style.setProperty("--wp-card-backdrop-filter","none"),this.infoBox.style.setProperty("--wp-badges-minwidth","200px"),this.infoBoxPosX.style.pointerEvents="none",this.infoBoxPosX.style.height="100%",this.infoBoxPosX.style.width="100%",this.infoBoxPosY.style.pointerEvents="none",this.infoBoxPosY.style.height="100%",this.infoBoxPosY.style.width="100%",this.infoBoxContent.style.pointerEvents="none",this.infoBoxContent.style.width="fit-content",this.infoBoxContent.style.height="100%",this.infoBoxContent.style.display="grid",this.fixedInfoContainer.removeAttribute("style"),this.fixedInfoContainer.style.position="fixed",this.fixedInfoContainer.style.pointerEvents="none",this.fixedInfoContainer.style.top=0,this.fixedInfoContainer.style.left=0,this.fixedInfoContainer.style.width="100%",this.fixedInfoContainer.style.height="100%",this.fixedInfoBox.style.pointerEvents="none",this.fixedInfoBox.style.cssText=this.infoBox.style.cssText,this.screensaverOverlay.removeAttribute("style"),this.screensaverOverlay.style.position="absolute",this.screensaverOverlay.style.pointerEvents="none",this.screensaverOverlay.style.top=0,this.screensaverOverlay.style.left=0,this.screensaverOverlay.style.width="100%",this.screensaverOverlay.style.height="100%",this.screensaverOverlay.style.background="#00000000"}updateStyle(){this.screensaverOverlay.style.background="#00000000",this.debugBox.style.visibility=Xu.debug?"visible":"hidden",this.debugBox.style.pointerEvents=Xu.debug?"auto":"none",this.style.transition=Xu.fade_in_time>0?"opacity ".concat(Math.round(1e3*Xu.fade_in_time),"ms ease-in-out"):"",this.imageOneContainer.style.transition=Xu.crossfade_time>0?"opacity ".concat(Math.round(1e3*Xu.crossfade_time),"ms ease-in-out"):"",this.imageTwoContainer.style.transition=Xu.crossfade_time>0?"opacity ".concat(Math.round(1e3*Xu.crossfade_time),"ms ease-in-out"):"",this.messageContainer.style.visibility=this.screensaverRunning()?"visible":"hidden",this.screensaverImageOverlay.style.pointerEvents=Xu.content_interaction?"none":"auto";const e=Xu.show_image_info&&Boolean(Xu.image_info_template);if(this.imageOneInfoContainer.style.display=e?"block":"none",this.imageTwoInfoContainer.style.display=e?"block":"none",Xu.info_animation_duration_x?this.infoBoxPosX.style.animation="moveX ".concat(Xu.info_animation_duration_x,"s ").concat(Xu.info_animation_timing_function_x," infinite alternate"):this.infoBoxPosX.style.animation="",Xu.info_animation_duration_y?this.infoBoxPosY.style.animation="moveY ".concat(Xu.info_animation_duration_y,"s ").concat(Xu.info_animation_timing_function_y," infinite alternate"):this.infoBoxPosY.style.animation="",Xu.style)for(const e in Xu.style)if(e.startsWith("wallpanel-")&&"wallpanel-shadow-host"!=e&&"wallpanel-screensaver-info-box-badges"!=e&&"wallpanel-screensaver-info-box-views"!=e&&!th[e]){const t=this.shadowRoot.getElementById(e);if(t){mh.debug("Setting style attributes for element #".concat(e));for(const n in Xu.style[e])mh.debug("Setting style attribute ".concat(n," to ").concat(Xu.style[e][n])),t.style.setProperty(n,Xu.style[e][n]);t==this.infoBox?this.fixedInfoBox.style.cssText=this.infoBox.style.cssText:t==this.infoBoxContent&&(this.fixedInfoBoxContent.style.cssText=this.infoBoxContent.style.cssText)}else mh.error("Element #".concat(e," not found"))}}updateShadowStyle(){const e=getComputedStyle(this.infoContainer),t=this.infoContainer.offsetWidth-parseInt(e.paddingLeft)-parseInt(e.paddingRight)-this.infoBox.offsetWidth,n=this.infoContainer.offsetHeight-parseInt(e.paddingTop)-parseInt(e.paddingBottom)-this.infoBox.offsetHeight;let r="";if(Xu.style){if(Xu.style["wallpanel-shadow-host"])for(const e in Xu.style["wallpanel-shadow-host"])r+="".concat(e,": ").concat(Xu.style["wallpanel-shadow-host"][e],";\n");for(const e in th)Xu.style[e]&&bh(th[e],Xu.style[e])}let i="";for(const e in th){i+=".".concat(e," {\n");for(const t in th[e])i+="".concat(t,": ").concat(th[e][t],";\n");i+="}\n"}this.shadowStyle.innerHTML="\n\t\t\t\t:host {\n\t\t\t\t\t".concat(r,"\n\t\t\t\t}\n\t\t\t\t@keyframes moveX {\n\t\t\t\t\t100% {\n\t\t\t\t\t\ttransform: translate3d(").concat(t,"px, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t@keyframes moveY {\n\t\t\t\t\t100% {\n\t\t\t\t\t\ttransform: translate3d(0, ").concat(n,"px, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t@keyframes horizontalProgress {\n\t\t\t\t\t0% {\n\t\t\t\t\t\twidth: 0%;\n\t\t\t\t\t}\n\t\t\t\t\t100% {\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t@keyframes kenBurnsEffect-experimental {\n\t\t\t\t\t0% {\n\t\t\t\t\t\ttransform: scale(1.0) translateX(calc(var(--hidden-width) / -2 * 1px)) translateY(calc(var(--hidden-height) / -2 * 1px));\n\t\t\t\t\t}\n\t\t\t\t\t50% {\n\t\t\t\t\t\ttransform: scale(var(--ken-burns-zoom));\n\t\t\t\t\t}\n\t\t\t\t\t90% {\n\t\t\t\t\t\ttransform: scale(calc(1.0 + ((var(--ken-burns-zoom) - 1.0)/2))) translateX(calc(var(--hidden-width) / 2 * 1px)) translateY(calc(var(--hidden-height) / 2 * 1px));\n\t\t\t\t\t}\n\t\t\t\t\t100% {\n\t\t\t\t\t\ttransform: scale(1.0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t@keyframes kenBurnsEffect-experimental2 {\n\t\t\t\t\t0% {\n\t\t\t\t\t\ttransform: scale(1.0);\n\t\t\t\t\t}\n\t\t\t\t\t25% {\n\t\t\t\t\t\ttransform: scale(calc(1.0 + ((var(--ken-burns-zoom) - 1.0)/2))) translateX(calc(var(--hidden-width) / 2 * 1px)) translateY(calc(var(--hidden-height) / 2 * 1px));\n\t\t\t\t\t}\n\t\t\t\t\t50% {\n\t\t\t\t\t\ttransform: scale(var(--ken-burns-zoom));\n\t\t\t\t\t}\n\t\t\t\t\t75% {\n\t\t\t\t\t\ttransform: scale(calc(1.0 + ((var(--ken-burns-zoom) - 1.0)/2))) translateX(calc(var(--hidden-width) / -2 * 1px)) translateY(calc(var(--hidden-height) / -2 * 1px));\n\t\t\t\t\t}\n\t\t\t\t\t100% {\n\t\t\t\t\t\ttransform: scale(1.0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t@keyframes kenBurnsEffect-simple {\n\t\t\t\t\t0% {\n\t\t\t\t\t\ttransform-origin: bottom left;\n\t\t\t\t\t\ttransform: scale(1.0);\n\t\t\t\t\t}\n\t\t\t\t\t100% {\n\t\t\t\t\t\ttransform: scale(var(--ken-burns-zoom));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t").concat(i,"\n\t\t\t\t").concat(Xu.custom_css,"\n\t\t\t")}randomMove(){const e=getComputedStyle(this.infoContainer),t=this.infoContainer.offsetWidth-parseInt(e.paddingLeft)-parseInt(e.paddingRight)-this.infoBox.offsetWidth,n=this.infoContainer.offsetHeight-parseInt(e.paddingTop)-parseInt(e.paddingBottom)-this.infoBox.offsetHeight,r=Math.floor(Math.random()*t),i=Math.floor(Math.random()*n);this.moveInfoBox(r,i)}moveAroundCorners(){let e=null;arguments.length>0&&void 0!==arguments[0]&&arguments[0]?e=0:this.lastCorner=(this.lastCorner+1)%4;const t=getComputedStyle(this.infoContainer),n=[2,3].includes(this.lastCorner)?this.infoContainer.offsetWidth-parseInt(t.paddingLeft)-parseInt(t.paddingRight)-this.infoBox.offsetWidth:0,r=[1,2].includes(this.lastCorner)?this.infoContainer.offsetHeight-parseInt(t.paddingTop)-parseInt(t.paddingBottom)-this.infoBox.offsetHeight:0;this.moveInfoBox(n,r,e)}moveInfoBox(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(this.lastMove=Date.now(),null===n&&(n=Xu.info_move_fade_duration),n>0)if(this.infoBox.animate){const e=[{opacity:1},{opacity:0,offset:.5},{opacity:1}];this.infoBox.animate(e,{duration:Math.round(1e3*n),iterations:1})}else mh.warn("This browser does not support the animate() method, please set info_move_fade_duration to 0");const r=this;let i=Math.round(500*n);i<0&&(i=0),r.translateTimeout&&clearTimeout(r.translateTimeout),r.translateTimeout=setTimeout(function(){r.infoBoxPosX.style.transform="translate3d(".concat(e,"px, 0, 0)"),r.infoBoxPosY.style.transform="translate3d(0, ".concat(t,"px, 0)")},i)}createInfoBoxContent(){mh.debug("Creating info box content");const e=Ih();if(e){if(this.lovelace=e.lovelace||e.__lovelace,this.infoBoxContentCreatedDate=new Date,this.infoBoxContent.innerHTML="",this.__badges=[],this.__cards=[],this.__views=[],this.energyCollectionUpdateEnabled=!1,this.shadowRoot.querySelectorAll(".wp-card").forEach(e=>{e.parentElement.removeChild(e)}),Xu.badges&&Xu.badges.length>0){const e=document.createElement("div");if(e.id="wallpanel-screensaver-info-box-badges",e.classList.add("wp-badges"),e.style.padding="var(--wp-card-padding)",e.style.margin="var(--wp-card-margin)",e.style.textAlign="center",e.style.display="flex",e.style.alignItems="flex-start",e.style.flexWrap="wrap",e.style.justifyContent="center",e.style.gap="8px",e.style.margin="0px",e.style.minWidth="var(--wp-badges-minwidth)",Xu.style[e.id])for(const t in Xu.style[e.id])mh.debug("Setting style attribute ".concat(t," to ").concat(Xu.style[e.id][t])),e.style.setProperty(t,Xu.style[e.id][t]);Xu.badges.forEach(t=>{const n=JSON.parse(JSON.stringify(t));mh.debug("Creating badge:",n);let r={};n.wp_style&&(r=n.wp_style,delete n.wp_style);const i=(this._createBadgeElement?this._createBadgeElement:this.createBadgeElement).bind(this)(n);i.hass=this.hass;for(const e in r)i.style.setProperty(e,r[e]);this.__badges.push(i),e.append(i)}),this.infoBoxContent.appendChild(e)}if(Xu.views&&Xu.views.length>0){const e=document.createElement("div");if(e.id="wallpanel-screensaver-info-box-views",e.classList.add("wp-views"),Xu.style[e.id])for(const t in Xu.style[e.id])mh.debug("Setting style attribute ".concat(t," to ").concat(Xu.style[e.id][t])),e.style.setProperty(t,Xu.style[e.id][t]);const t=this.lovelace.config.views;Xu.views.forEach(n=>{let r=-1;const i=JSON.parse(JSON.stringify(n));for(var o=0;o0&&Xu.cards.forEach(e=>{const t=JSON.parse(JSON.stringify(e));mh.debug("Creating card:",t);let n={};t.wp_style&&(n=t.wp_style,delete t.wp_style),t.type&&t.type.includes("energy")&&(t.collection_key="energy_wallpanel",this.energyCollectionUpdateEnabled=!0);const r=(this._createCardElement?this._createCardElement:this.createCardElement).bind(this)(t);r.hass=this.hass,this.__cards.push(r);let i=this.infoBoxContent;const o=document.createElement("div");o.classList.add("wp-card"),o.style.width="var(--wp-card-width)",o.style.padding="var(--wp-card-padding)",o.style.margin="var(--wp-card-margin)",o.style.backdropFilter="var(--wp-card-backdrop-filter)",Xu.content_interaction?o.style.pointerEvents="auto":o.style.pointerEvents="none";for(const e in n)if("parent"==e){const t=this.shadowRoot.getElementById(n[e]);t&&(i=t)}else o.style.setProperty(e,n[e]);o.append(r),i.appendChild(o)}),setTimeout(this.updateShadowStyle.bind(this),500)}}setDisplayTime(){const e=Xu.display_time,t=this.getActiveMediaElement(!0);t.play_to_end&&!t.loop?this.displayTime=t.duration:this.displayTime=e}getDisplayTime(){return this.displayTime}restartProgressBarAnimation(){if(!this.progressBarContainer)return;if(this.progressBar.style.animation="none",!Xu.show_progress_bar)return;const e=this;setTimeout(function(){e.progressBar.style.animation="horizontalProgress ".concat(e.getDisplayTime(),"s linear"),e.progressBar.style.animationPlayState=e.isPaused?"paused":"running"},25)}restartKenBurnsEffect(){if(!Xu.image_animation_ken_burns||!Xu.image_animation_ken_burns_animations.length)return;const e=this.getActiveMediaElement();e.style.animation="none",e.style.setProperty("--ken-burns-zoom",Xu.image_animation_ken_burns_zoom);let t=Math.floor(1e3*Xu.image_animation_ken_burns_delay);t<50&&(t=50);const n=Math.ceil(Xu.image_animation_ken_burns_duration||1.2*(this.getDisplayTime()+2*Xu.crossfade_time)),r=Xu.image_animation_ken_burns_animations[Math.floor(Math.random()*Xu.image_animation_ken_burns_animations.length)];this.kenburnsDelayStartTimer&&clearTimeout(this.kenburnsDelayStartTimer),e.animationIterationCount=1,this.kenburnsDelayStartTimer=setTimeout(function(){e.style.animation="kenBurnsEffect-".concat(r," ").concat(n,"s linear forwards")},t)}getMediaElement(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.imageOneContainer.style.opacity==(e?1:0)?this.imageOne:this.imageTwo;if(t&&"ha-camera-stream"==n.tagName.toLowerCase()){const e=_h(n)[1];e&&(n=e)}return n}getActiveMediaElement(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return this.getMediaElement(!0,e)}getInactiveMediaElement(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return this.getMediaElement(!1,e)}releaseMediaElement(e){if(!e)return;e.style.animation="none";const t=e===this.imageOne?this.imageOneBackground:e===this.imageTwo?this.imageTwoBackground:null;t&&(t.style.backgroundImage="");const n=e.tagName.toLowerCase();if("ha-camera-stream"===n)try{const[t,n]=_h(e);n&&n.pause(),t&&"function"==typeof t.stop&&t.stop()}catch(e){mh.debug(e)}else{if("function"==typeof e.pause)try{e.pause()}catch(e){mh.debug(e)}const t=e.getAttribute("src")||"";t.startsWith("blob:")&&URL.revokeObjectURL(t),e.removeAttribute("src"),"video"===n&&"function"==typeof e.load&&e.load()}e.mediaUrl=null,e.infoCacheUrl=null}releaseAllMedia(){this.releaseMediaElement(this.imageOne),this.releaseMediaElement(this.imageTwo)}replaceMediaElement(e,t){if("string"==typeof e.src&&e.src.startsWith("blob:")&&URL.revokeObjectURL(e.src),"function"==typeof e.pause&&e.pause(),"ha-camera-stream"==e.tagName.toLowerCase()){const[t,n]=_h(e);n&&n.pause(),t&&"function"==typeof t.stop&&t.stop()}t=t.toLowerCase();const n=document.createElement(t);return[...e.attributes].filter(e=>"src"!=e.name).forEach(e=>n.setAttribute(e.name,e.value)),n.mediaUrl=e.mediaUrl,n.infoCacheUrl=e.infoCacheUrl,"video"===t&&Object.assign(n,{preload:"auto",muted:!1,volume:Xu.video_volume}),e.replaceWith(n),e===this.imageOne?this.imageOne=n:this.imageTwo=n,e.remove(),n}loadBackgroundImage(e){let t=e.src;const n=e.tagName.toLowerCase();if("ha-camera-stream"===n){const n=_h(e)[1];if(!n||!n.poster)return;t=n.poster}else if("video"===n){const n=document.createElement("canvas");n.width=e.videoWidth,n.height=e.videoHeight;n.getContext("2d").drawImage(e,0,0,n.width,n.height);try{t=n.toDataURL("image/png")}catch(e){t=null,mh.error("Error extracting canvas image:",e)}}let r=this.imageOneBackground;e==this.imageTwo&&(r=this.imageTwoBackground),r.style.backgroundImage=t?"url('".concat(t.replace(/'/g,"%27"),"')"):""}connectedCallback(){this.style.zIndex=Xu.z_index,this.style.visibility="hidden",this.style.opacity=0,this.style.position="fixed",this.timerInterval||(this.timerInterval=setInterval(this.timer.bind(this),1e3)),this.messageContainer=document.createElement("div"),this.messageContainer.id="wallpanel-message-container",this.debugBox=document.createElement("div"),this.debugBox.id="wallpanel-debug-box",this.screensaverContainer=document.createElement("div"),this.screensaverContainer.id="wallpanel-screensaver-container",this.imageOneContainer=document.createElement("div"),this.imageOneContainer.id="wallpanel-screensaver-image-one-container",this.imageOneBackground=document.createElement("div"),this.imageOneBackground.className="wallpanel-screensaver-image-background",this.imageOneBackground.id="wallpanel-screensaver-image-one-background",this.imageOne=document.createElement("img"),this.imageOne.id="wallpanel-screensaver-image-one",this.imageOneInfoContainer=document.createElement("div"),this.imageOneInfoContainer.className="wallpanel-screensaver-image-info-container",this.imageOneInfoContainer.id="wallpanel-screensaver-image-one-info-container",this.imageOneInfo=document.createElement("div"),this.imageOneInfo.className="wallpanel-screensaver-image-info",this.imageOneInfo.id="wallpanel-screensaver-image-one-info",this.imageOneInfoContainer.appendChild(this.imageOneInfo),this.imageOneContainer.appendChild(this.imageOneBackground),this.imageOneContainer.appendChild(this.imageOne),this.imageOneContainer.appendChild(this.imageOneInfoContainer),this.screensaverContainer.appendChild(this.imageOneContainer),this.imageTwoContainer=document.createElement("div"),this.imageTwoContainer.id="wallpanel-screensaver-image-two-container",this.imageTwoBackground=document.createElement("div"),this.imageTwoBackground.className="wallpanel-screensaver-image-background",this.imageTwoBackground.id="wallpanel-screensaver-image-two-background",this.imageTwo=document.createElement("img"),this.imageTwo.id="wallpanel-screensaver-image-two",this.imageTwoInfoContainer=document.createElement("div"),this.imageTwoInfoContainer.className="wallpanel-screensaver-image-info-container",this.imageTwoInfoContainer.id="wallpanel-screensaver-image-two-info-container",this.imageTwoInfo=document.createElement("div"),this.imageTwoInfo.className="wallpanel-screensaver-image-info",this.imageTwoInfo.id="wallpanel-screensaver-image-two-info",this.imageTwoInfoContainer.appendChild(this.imageTwoInfo),this.imageTwoContainer.appendChild(this.imageTwoBackground),this.imageTwoContainer.appendChild(this.imageTwo),this.imageTwoContainer.appendChild(this.imageTwoInfoContainer),this.screensaverContainer.appendChild(this.imageTwoContainer),this.screensaverImageOverlay=document.createElement("div"),this.screensaverImageOverlay.id="wallpanel-screensaver-image-overlay",this.screensaverContainer.appendChild(this.screensaverImageOverlay),this.progressBarContainer=document.createElement("div"),this.progressBarContainer.className="wallpanel-progress",this.progressBar=document.createElement("div"),this.progressBar.className="wallpanel-progress-inner",this.progressBar.id="wallpanel-progress-inner",this.progressBarContainer.appendChild(this.progressBar),Xu.show_progress_bar&&this.screensaverContainer.appendChild(this.progressBarContainer),this.pauseIndicator=document.createElement("div"),this.pauseIndicator.id="wp-pause-indicator",this.pauseIndicator.innerHTML="⏸️",this.pauseIndicator.style.position="absolute",this.pauseIndicator.style.top="1rem",this.pauseIndicator.style.left="1rem",this.pauseIndicator.style.fontSize="4rem",this.pauseIndicator.style.lineHeight="1",this.pauseIndicator.style.color="white",this.pauseIndicator.style.filter="drop-shadow(0 0 8px rgba(0,0,0,0.8))",this.pauseIndicator.style.zIndex="9999",this.pauseIndicator.style.pointerEvents="none",this.pauseIndicator.style.display="none",this.screensaverContainer.appendChild(this.pauseIndicator),this.infoContainer=document.createElement("div"),this.infoContainer.id="wallpanel-screensaver-info-container",this.fixedInfoContainer=document.createElement("div"),this.fixedInfoContainer.id="wallpanel-screensaver-fixed-info-container",this.fixedInfoBox=document.createElement("div"),this.fixedInfoBox.id="wallpanel-screensaver-fixed-info-box",this.fixedInfoBoxContent=document.createElement("div"),this.fixedInfoBoxContent.id="wallpanel-screensaver-fixed-info-box-content",this.screensaverContainer.appendChild(this.infoContainer),this.infoBoxPosX=document.createElement("div"),this.infoBoxPosX.id="wallpanel-screensaver-info-box-pos-x",this.infoBoxPosX.x="0",this.infoBoxPosY=document.createElement("div"),this.infoBoxPosY.id="wallpanel-screensaver-info-box-pos-y",this.infoBoxPosY.y="0",this.infoBox=document.createElement("div"),this.infoBox.id="wallpanel-screensaver-info-box",this.infoBoxContent=document.createElement("div"),this.infoBoxContent.id="wallpanel-screensaver-info-box-content",this.infoBoxContent.style.display="grid",this.infoBox.appendChild(this.infoBoxContent),this.infoBoxPosX.appendChild(this.infoBox),this.infoBoxPosY.appendChild(this.infoBoxPosX),this.infoContainer.appendChild(this.infoBoxPosY),this.fixedInfoBox.appendChild(this.fixedInfoBoxContent),this.fixedInfoContainer.appendChild(this.fixedInfoBox),this.infoContainer.appendChild(this.fixedInfoContainer),this.screensaverOverlay=document.createElement("div"),this.screensaverOverlay.id="wallpanel-screensaver-overlay",this.screensaverContainer.appendChild(this.screensaverOverlay),this.shadowStyle=document.createElement("style");const e=this.attachShadow({mode:"open"});e.appendChild(this.shadowStyle),e.appendChild(this.screensaverContainer),e.appendChild(this.messageContainer),e.appendChild(this.debugBox);const t=this,n=["click","touchstart","touchend","wheel"];Xu.stop_screensaver_on_key_down&&n.push("keydown"),Xu.stop_screensaver_on_mouse_move&&n.push("mousemove");const r=e=>{try{t.handleInteractionEvent(e)}catch(e){mh.error(e.stack)}};n.forEach(function(e){window.addEventListener(e,r,!0),t.windowEventHandlers.push({eventName:e,handler:r,options:!0})});const i=e=>{Xu.disable_context_menu&&t.screensaverRunning()&&e.preventDefault()};window.addEventListener("contextmenu",i),this.windowEventHandlers.push({eventName:"contextmenu",handler:i});const o=()=>{try{const e=this.screensaverContainer.clientWidth,n=this.screensaverContainer.clientHeight;!t.screensaverRunning()||t.currentWidth==e&&t.currentHeight==n||(mh.debug("Size changed from ".concat(t.currentWidth,"x").concat(t.currentHeight," to ").concat(e,"x").concat(n)),t.currentWidth=e,t.currentHeight=n,t.updateShadowStyle(),t.setMediaDimensions())}catch(e){mh.error(e.stack)}};window.addEventListener("resize",o),this.windowEventHandlers.push({eventName:"resize",handler:o});const a=()=>{try{t.screensaverRunning()&&t.moreInfoDialogToForeground()}catch(e){mh.error(e.stack)}};window.addEventListener("hass-more-info",a),this.windowEventHandlers.push({eventName:"hass-more-info",handler:a}),this.infoBoxResizeObserver=new ResizeObserver(()=>{"corners"===Xu.info_move_pattern&&this.moveAroundCorners(!0)}),this.infoBoxResizeObserver.observe(this.infoBoxContent),this.setScreensaverEntityState()}disconnectedCallback(){this.afterFadeoutTimer&&(clearTimeout(this.afterFadeoutTimer),this.afterFadeoutTimer=null),this.releaseAllMedia(),this.clearMediaListRetry(),this.timerInterval&&(clearInterval(this.timerInterval),this.timerInterval=null),this.translateTimeout&&(clearTimeout(this.translateTimeout),this.translateTimeout=null),this.windowEventHandlers.length&&(this.windowEventHandlers.forEach(e=>{let{eventName:t,handler:n,options:r}=e;window.removeEventListener(t,n,r)}),this.windowEventHandlers=[]),this.infoBoxResizeObserver&&(this.infoBoxResizeObserver.disconnect(),this.infoBoxResizeObserver=null)}reconfigure(e){const t=e&&Object.keys(e).length>0;!t||e.hide_toolbar==Xu.hide_toolbar&&e.hide_toolbar_action_icons==Xu.hide_toolbar_action_icons&&e.hide_toolbar_on_subviews==Xu.hide_toolbar_on_subviews&&e.hide_sidebar==Xu.hide_sidebar&&e.fullscreen==Xu.fullscreen||Lh(),Xu.theme&&(mh.info("Apply theme",Xu.theme),Zu.theme=Xu.theme,Zu._applyTheme()),this.updateStyle(),this.screensaverRunning()&&this.createInfoBoxContent(),!Xu.info_move_interval&&t&&e.info_move_interval&&Ku.moveInfoBox(0,0);const n=e.image_url!=Xu.image_url||"immich-api"==Ch()&&(Xu.immich_shared_albums!=e.immich_shared_albums||Xu.immich_memories!=e.immich_memories||Xu.immich_favorites!=e.immich_favorites||JSON.stringify(Xu.immich_album_names)!=JSON.stringify(e.immich_album_names)||JSON.stringify(Xu.immich_tag_names)!=JSON.stringify(e.immich_tag_names)||JSON.stringify(Xu.immich_persons)!=JSON.stringify(e.immich_persons));if(Xu.show_images&&(!this.mediaList||!this.mediaList.length||!t||!e.show_images||n)){const e=this,r=this.screensaverRunning()&&t;n&&(this.clearMediaListRetry(),this.mediaList=[],this.mediaIndex=-1),this.updateMediaList(function(){r&&e.switchActiveMedia("reconfigure")},n)}if(Xu.disable_screensaver_on_browser_mod_popup_func)try{this.disable_screensaver_on_browser_mod_popup_function=new Function("bmp",Xu.disable_screensaver_on_browser_mod_popup_func)}catch(e){this.disable_screensaver_on_browser_mod_popup_function=null,mh.error("Invalid disable_screensaver_on_browser_mod_popup_func:",e)}Sh()&&Xu.camera_motion_detection_enabled?this.cameraMotionDetection.start():this.cameraMotionDetection.stop()}getMoreInfoDialog(){const e=ah.shadowRoot.querySelector("ha-more-info-dialog");if(!e)return;const t=e.shadowRoot.querySelector("ha-dialog");return t||void 0}moreInfoDialogToForeground(){const e=this;!function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;const r=e.getMoreInfoDialog();if(r)return r.style.position="absolute",void(r.style.zIndex=e.style.zIndex+1);n<10&&setTimeout(t,50,n+1)}()}fetchEXIFInfo(e){const t=this;if(nh.get(e.infoCacheUrl))return;const n=document.createElement("img");n.src=e.src,n.mediaUrl=e.mediaUrl,n.infoCacheUrl=e.infoCacheUrl,Vh(n,function(){mh.debug("EXIF data:",n.exifdata),rh(n.infoCacheUrl,n.exifdata),t.setMediaDataInfo(n);const e=n.exifdata.GPSLongitude,r=n.exifdata.GPSLatitude;if(Xu.fetch_address_data&&e&&!isNaN(e[0])&&r&&!isNaN(r[0])){let i="S"==n.exifdata.GPSLatitudeRef?-1:1;const o=r[0]*i+(r[1]*i*60+r[2]*i)/3600;i="W"==n.exifdata.GPSLongitudeRef?-1:1;const a=e[0]*i+(e[1]*i*60+e[2]*i)/3600;mh.debug("Fetching nominatim data for lat=".concat(o," lon=").concat(a));const s=new XMLHttpRequest;s.onload=function(){if(200==this.status||0===this.status){const e=JSON.parse(s.responseText);if(mh.debug("nominatim data:",e),e&&e.address){const r=nh.get(n.infoCacheUrl);r?(r.address=e.address,t.setMediaDataInfo(n)):mh.warn("URL not in cache:",n.infoCacheUrl)}}else mh.error("nominatim error:",this.status,s.status,s.responseText)},s.onerror=function(e){mh.error("nominatim error:",e)},s.ontimeout=function(e){mh.error("nominatim timeout:",e)},s.open("GET","https://nominatim.openstreetmap.org/reverse?lat=".concat(o,"&lon=").concat(a,"&format=json")),s.timeout=15e3,s.send()}})}setMediaDataInfo(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;const t=Xu.show_image_info&&Boolean(Xu.image_info_template);if(this.imageOneInfoContainer.style.display=t?"block":"none",this.imageTwoInfoContainer.style.display=t?"block":"none",!t)return this.imageOneInfo.innerHTML="",void(this.imageTwoInfo.innerHTML="");e||(e=this.getActiveMediaElement());const n=e.infoCacheUrl;let r=e.mediaUrl;if(!n)return void mh.debug("infoCacheUrl missing:",e);if(!r)return void mh.debug("mediaUrl missing:",e);r=decodeURI(r);const i=[];if(this.imageOne.infoCacheUrl==n&&i.push(this.imageOneInfo),this.imageTwo.infoCacheUrl==n&&i.push(this.imageTwoInfo),0==i.length)return;let o=nh.get(n);o||(o={}),o.image||(o.image={}),void 0===o.image.url&&(o.image.url=r);const a=r.replace(/\?[^?]*$/,"").replace(/\/+$/,"");if(void 0===o.image.path&&(o.image.path=a.replace(/^[^:]+:\/\/[^/]+/,"")),void 0===o.image.relativePath){const c="media-source"===Ch()?n.replace(/\?[^?]*$/,"").replace(/\/+$/,""):a;o.image.relativePath=c.replace(Xu.image_url,"").replace(/^\/+/,"")}if(void 0===o.image.filename&&(o.image.filename=a.replace(/^.*[\\/]/,"")),void 0===o.image.folderName){o.image.folderName="";const l=a.split("/");l.length>=2&&(o.image.folderName=l[l.length-2])}o.mediaPosition=this.mediaIndex+1,o.mediaCount=this.mediaList.length,mh.debug("Media info:",o);let s=Xu.image_info_template||"";if("analyze"==s){function u(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const n=Object.keys(e);n.sort(),n.forEach(n=>{const r=e[n];"object"==typeof r&&null!==r?u(r,n+"."):s+="".concat(t).concat(n,": ").concat(fh(r),"
")})}s="",u(o),this.imageOneInfo.style.pointerEvents="none",this.imageTwoInfo.style.pointerEvents="none",i.forEach(e=>{e.style.pointerEvents="auto"})}else s=s.replace(/\${([^}]+)}/g,(e,t)=>{const n=t.split("||");for(let e=0;e{const t=e.split(":",2);t[0]&&t[1]&&(a[t[0].replace(/\s/g,"")]=t[1].replace(/\s/g,""))}))}}let s="";const c=t.split("|");let l="";for(let e=0;e{s&&(s=s[e])}),s)break}if(s){if(/DateTime/i.test(l)){const e=new Date(s.replace(/(\d\d\d\d):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)/,"$1-$2-$3T$4:$5:$6"));if(isNaN(e))continue;a||(a={year:"numeric",month:"2-digit",day:"2-digit"}),s=e.toLocaleDateString((ah.hass||ah.__hass).locale.language,a)}return"object"==typeof s&&(s=JSON.stringify(s)),r+s+i}}return""});i.forEach(e=>{e.innerHTML=s,e.style.display="block"})}clearMediaListRetry(){this.mediaListRetryTimer&&(clearTimeout(this.mediaListRetryTimer),this.mediaListRetryTimer=null),this.mediaListRetryAt=0}async updateMediaList(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(!Xu.image_url)return;if(this.updatingMediaList)return;if(this.mediaListRetryAt>Date.now())return;if(!t&&(new Date).getTime()-this.lastMediaListUpdate<1e3*Xu.media_list_update_interval)return;this.clearMediaListRetry();const r=this;let i=null;const o=Ch();if("unsplash-api"==o)i=r.updateMediaListFromUnsplashAPI;else if("immich-api"==o)i=r.updateMediaListFromImmichAPI;else{if("media-source"!=o){let t=Xu.image_url;return"iframe"==o?t=t.replace(/^iframe\+/,""):"embed"==o&&(t=t.replace(/^embed\+/,"")),this.mediaList=[t],void(e&&e())}i=r.updateMediaListFromMediaSource}this.updatingMediaList=!0,this.lastMediaListUpdate=Date.now();try{await i.bind(r)(),this.clearMediaListRetry(),mh.debug("Media list from ".concat(o," is now:"),r.mediaList),e&&e()}catch(t){const i=3;let a=3e3;if(429===t.httpStatus&&(a=Number.isFinite(t.retryAfterDelay)?Math.max(t.retryAfterDelay,3e3):Math.min(6e4*2**n,36e5)),mh.warn("Failed to update media list from ".concat(o,":"),t),n{r.mediaListRetryTimer=null,r.mediaListRetryAt=0,r.updateMediaList(e,!0,n+1)},a);else{const e="Failed to update media list from ".concat(Xu.image_url," after ").concat(i," retries: ").concat(t.message||fh(t));mh.error(e)}}this.updatingMediaList=!1}async findMedias(e){const t=this;mh.debug("findMedias: ".concat(e));const n=[];if(Xu.exclude_filenames)for(const e of Xu.exclude_filenames)n.push(new RegExp(e));try{const r=await t.hass.callWS({type:"media_source/browse_media",media_content_id:e});mh.debug("Found media entry",r);const i=r.children.map(async e=>{const r=e.media_content_id.replace(/^media-source:\/\/[^/]+/,"");for(const e of n)if(e.test(r))return null;return["image","video"].includes(e.media_class)?Xu.exclude_media_types&&Xu.exclude_media_types.includes(e.media_class)?null:e.media_content_id:"directory"==e.media_class?await t.findMedias(e.media_content_id):null});return(await Promise.all(i)).flat().filter(e=>null!==e)}catch(t){throw mh.warn("Error browsing media ".concat(e,":"),t),t}}async updateMediaListFromMediaSource(){const e=Xu.image_url,t=this;try{let n=await t.findMedias(e);n="random"==Xu.media_order?Ah(n):"random_but_synced"==Xu.media_order?Ah(n.slice().sort(),yh(vh)):n.sort(),n.length>Xu.media_list_max_size&&(mh.info("Using only ".concat(Xu.media_list_max_size," of ").concat(n.length," media items")),n=n.slice(0,Xu.media_list_max_size)),t.mediaList=n}catch(e){throw new Error("Failed to update image list from ".concat(Xu.image_url,": ").concat(e.message||fh(e)))}}async updateMediaListFromUnsplashAPI(){const e=[],t="".concat(Xu.image_url,"&count=30");mh.debug("Unsplash API request: ".concat(t));try{const n={method:"GET",headers:{Accept:"application/json"}};"undefined"!=typeof AbortSignal&&void 0!==AbortSignal.timeout&&(mh.debug("Using AbortSignal"),n.signal=AbortSignal.timeout(1e3*Xu.immich_api_request_timeout));const r=await fetch(t,n);if(!r.ok){const e=await r.text(),t=new Error("Unsplash API request failed: ".concat(r.status," ").concat(r.statusText," - ").concat(e));throw t.httpStatus=r.status,429===r.status&&(t.retryAfterDelay=function(e){const t=e.headers.get("Retry-After");if(t){const e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.round(1e3*e);const n=Date.parse(t);if(Number.isFinite(n))return Math.max(0,n-Date.now())}const n=Number(e.headers.get("X-Ratelimit-Reset"));if(Number.isFinite(n)&&n>0){const e=n>1e12?n:1e3*n;return Math.max(0,e-Date.now())}return null}(r)),t}const i=await r.json();mh.debug("Got Unsplash API response"),i.forEach(t=>{mh.debug(t);const n="".concat(t.urls.raw,"&w=${width}&h=${height}&auto=format");e.push(n),rh(n,t)}),this.mediaList=e}catch(e){if("AbortError"===e.name)throw new Error("Unsplash API request timed out: ".concat(t));throw e}}async _immichFetch(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const i={headers:{"x-api-key":t,"Content-Type":"application/json",Accept:"application/json"}},o=n(n({},i),r);o.headers=n(n({},i.headers),r.headers),"undefined"!=typeof AbortSignal&&void 0!==AbortSignal.timeout&&(mh.debug("Using AbortSignal"),o.signal=AbortSignal.timeout(1e4)),mh.debug("Immich API request: ".concat(e));try{const t=await fetch(e,o);if(!t.ok){const e=await t.text();throw new Error("Immich API request failed: ".concat(t.status," ").concat(t.statusText," - ").concat(e))}return await t.json()}catch(t){if("AbortError"===t.name)throw new Error("Immich API request timed out: ".concat(e));throw t}}async updateMediaListFromImmichAPI(){if(!Xu.immich_api_keys||!Xu.immich_api_keys.length)throw new Error("No immich_api_key configured");const e=this,t=this.screensaverContainer.clientWidth>=this.screensaverContainer.clientHeight?"landscape":"portrait";let n=Xu.exclude_media_orientation;"auto"==n&&(n="landscape"==t?"portrait":"landscape"),mh.debug("config.exclude_media_orientation=".concat(Xu.exclude_media_orientation,", screenOrientation=").concat(t,", exclude_media_orientation=").concat(n));let r=[];const i={},o=Xu.image_url.replace(/^immich\+/,""),a=[];if(Xu.exclude_filenames)for(const e of Xu.exclude_filenames)a.push(new RegExp(e));function s(e){return null!=e.width&&null!=e.height?{width:e.width,height:e.height}:function(e){if(null==e||!e.exifImageWidth||null==e||!e.exifImageHeight)return null;let t=e.exifImageWidth,n=e.exifImageHeight;if(e.orientation){const r=Number(e.orientation);[5,6,7,8,90,-90].includes(r)&&([t,n]=[n,t])}return{width:t,height:n}}(e.exifInfo)}function c(e){const t=s(e);return t?t.width>=t.height?"landscape":"portrait":null}async function l(t,s){let l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;await async function(t,r){const i=Xu.immich_exclude_tag_names&&Xu.immich_exclude_tag_names.length,a=!!n;for(let n=0;n{var n;const s="image"===(null===(n=t.type)||void 0===n?void 0:n.toLowerCase()),c=s&&!0!==t.isEdited&&(null==t.width||null==t.height||void 0===t.isEdited),l=s&&a&&(null==t.width||null==t.height);if(!t.exifInfo||i&&!t.tags||l||c){mh.debug("Fetching asset info for ".concat(t.id));const n=await e._immichFetch("".concat(o,"/assets/").concat(t.id),r);t.exifInfo=n.exifInfo,t.tags=(n.tags||[]).map(e=>e.value),t.width=n.width,t.height=n.height,t.isEdited=n.isEdited}}))}}(t,s);for(const e of t){mh.debug("Processing immich asset",e);const t=e.type.toLowerCase();if(!["image","video"].includes(t)){mh.debug("Neither image nor video, skipping");continue}if(Xu.exclude_media_types&&Xu.exclude_media_types.includes(t)){mh.debug('Media type "'.concat(t,'" excluded'));continue}let u=!1;for(const t of a)t.test(e.originalFileName)&&(mh.debug('Media item excluded by regex "'.concat(t,'"')),u=!0);if(u)continue;if(Xu.immich_exclude_tag_names&&Xu.immich_exclude_tag_names.length){const t=e.tags.filter(e=>Xu.immich_exclude_tag_names.includes(e));if(t.length>0){mh.debug("Media item excluded due to tag(s): ".concat(t.join(", ")));continue}}if(n){const t=c(e);if(t===n){mh.debug('Media item with orientation "'.concat(t,'" excluded'));continue}}let h="original";"preview"==Xu.immich_resolution&&(h="video"==t?"video/playback":"thumbnail?size=preview");let d="".concat(o,"/assets/").concat(e.id,"/").concat(h);if("image"==t&&(d+=d.includes("?")?"&edited=true":"?edited=true"),r.indexOf(d)>=0)continue;r.push(d);const f=e.exifInfo||{};f.immichApiKey=s,f.mediaType=t,f.image={filename:e.originalFileName,folderName:l},i[d]=f}}try{for(const t of Xu.immich_api_keys)if(mh.debug("Using immich API key ".concat(t)),Xu.immich_persons&&Xu.immich_persons.length){mh.debug("Searching for assets based on persons");const n=Xu.immich_persons.map(e=>(Array.isArray(e)?e:[e]).map(e=>e.toLowerCase())),r={};let i=[],a=1,s=!0;for(;s;){const n=await e._immichFetch("".concat(o,"/people?size=1000&page=").concat(a),t);i=i.concat(n.people),s=n.hasNextPage,a++}i.forEach(e=>{e.name&&e.id&&(r[e.name.toLowerCase()]=e.id)});for(const i of n){const n=[];if(i.forEach(e=>{const t=r[e.toLowerCase()];t?n.push(t):mh.error("Person not found in immich: ".concat(e))}),n.length>0){mh.debug("Searching asset metadata for persons: ",n);let r=1;for(;;){mh.debug("Fetching asset metadata page ".concat(r));const a=await e._immichFetch("".concat(o,"/search/metadata"),t,{method:"POST",body:JSON.stringify({personIds:n,withExif:!0,page:r,size:1e3})});if(mh.debug("Got immich API response",a),!a.assets.count){if(1==r){const e="No media items found in immich that contain all these people: ".concat(i);mh.error(e)}break}if(await l(a.assets.items,t),!a.assets.nextPage)break;r=parseInt(a.assets.nextPage,10)}}}}else if(Xu.immich_memories){mh.debug("Fetching immich memories (on_this_day)");const n=await e._immichFetch("".concat(o,"/memories?type=on_this_day"),t);mh.debug("Got immich API response",n);const r=new Date,i=n.filter(e=>{const t=new Date(e.showAt),n=new Date(e.hideAt);return r>=t&&r<=n});mh.debug("Found ".concat(i.length," visible memories")),await Promise.all(i.map(async e=>{mh.debug("Processing memory:",e),await l(e.assets,t)}))}else if(Xu.immich_favorites){mh.debug("Search for favorites in asset metadata");let n=1;for(;;){mh.debug("Fetching asset metadata page ".concat(n));const r=await e._immichFetch("".concat(o,"/search/metadata"),t,{method:"POST",body:JSON.stringify({isFavorite:!0,withExif:!0,page:n,size:1e3})});if(mh.debug("Got immich API response",r),!r.assets.count){if(1==n){const e="No favorite media items found in immich";mh.error(e)}break}if(await l(r.assets.items,t),!r.assets.nextPage)break;n=parseInt(r.assets.nextPage,10)}}else if(Xu.immich_tag_names&&Xu.immich_tag_names.length){mh.debug("Searching for assets based on tag names");const n=Xu.immich_tag_names.map(e=>e.toLowerCase());mh.debug("Fetching immich tags");const r=await e._immichFetch("".concat(o,"/tags"),t);mh.debug("Got immich API response",r);const i=r.filter(e=>{const t=n.includes(e.name.toLowerCase());return mh.debug("".concat(t?"Adding":"Skipping"," tag: ").concat(e.name)),t}).map(e=>e.id);if(i.length>0){mh.debug("Searching asset metadata for tags: ",i);let r=1;for(;;){mh.debug("Fetching asset metadata page ".concat(r));const a=await e._immichFetch("".concat(o,"/search/metadata"),t,{method:"POST",body:JSON.stringify({tagIds:i,withExif:!0,page:r,size:1e3})});if(mh.debug("Got immich API response",a),!a.assets.count){if(1==r){const e="No media items found in immich that contain these tags: ".concat(n);mh.error(e)}break}if(await l(a.assets.items,t),!a.assets.nextPage)break;r=parseInt(a.assets.nextPage,10)}}else{const e="No matching immich tags found or selected.";mh.error(e)}}else{mh.debug("Searching for assets based on albums");const n=(Xu.immich_album_names||[]).map(e=>e.toLowerCase());mh.debug("Fetching immich albums (shared=".concat(Xu.immich_shared_albums,")"));const r=await e._immichFetch("".concat(o,"/server/version"),t);mh.debug("Immich server version:",r);const i=r.major<3?"shared":"isShared",a=await e._immichFetch("".concat(o,"/albums?").concat(i,"=").concat(Xu.immich_shared_albums),t);mh.debug("Got immich API response",a);const s=a.filter(e=>{const t=!n.length||n.includes(e.albumName.toLowerCase());return mh.debug("".concat(t?"Adding":"Skipping"," album: ").concat(e.albumName)),t});if(s.length>0)for(const n of s){mh.debug("Fetching assets for album: ",n.albumName);let r=1;for(;;){const i=await e._immichFetch("".concat(o,"/search/metadata"),t,{method:"POST",body:JSON.stringify({albumIds:[n.id],withExif:!0,page:r})});if(mh.debug("Got immich album assets (page ".concat(r,")"),i),await l(i.assets.items,t,n.albumName),!i.assets.nextPage)break;r=parseInt(i.assets.nextPage,10)}}else mh.debug("No matching immich albums found or selected.")}!function(){if(0==r.length){const e="No matching media assets found";mh.error(e)}r="random"==Xu.media_order?Ah(r):"random_but_synced"==Xu.media_order?Ah(r.slice().sort(),yh(vh)):r.sort(),r.length>Xu.media_list_max_size&&(mh.info("Using only ".concat(Xu.media_list_max_size," of ").concat(r.length," media items")),r=r.slice(0,Xu.media_list_max_size)),r.forEach(e=>{rh(e,i[e])}),e.mediaList=r}()}catch(e){throw mh.error("Immich API processing failed:",e),e}}fillPlaceholders(e){const t=this.screensaverContainer.clientWidth,n=this.screensaverContainer.clientHeight,r=Date.now(),i=Math.floor(r/1e3);return e=(e=(e=(e=e.replace(/\${width}/g,t)).replace(/\${height}/g,n)).replace(/\${timestamp_ms}/g,r)).replace(/\${timestamp}/g,i)}async updateMediaFromUrl(e,t){var n=this;let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Xu.force_load_media_with_fetch&&(o=!0);const a=(e,n)=>{const r=new Error("Failed to load ".concat(e.tagName,' "').concat(t,'": HTTP ').concat(n.status," ").concat(n.statusText).trim());return r.response={url:n.url,status:n.status,statusText:n.statusText,type:n.type},r},s=async e=>{const n=e.tagName.toLowerCase(),r={img:"load",video:"loadeddata",iframe:"load",embed:"load"}[n];if(!r)throw new Error('Unsupported element tag "'.concat(e.tagName,'"'));const s=new Promise((i,o)=>{const a=()=>{e.onerror=null,e.removeEventListener(r,s)},s=async()=>{if(a(),"img"===n&&"function"==typeof e.decode)try{await e.decode()}catch(e){mh.debug('Failed to pre-decode loaded image "'.concat(t,'":'),e)}i()};e.addEventListener(r,s),e.onerror=()=>{a();const n=new Error("Failed to load ".concat(e.tagName,' "').concat(t,'"'));n.mediaElement={tagName:e.tagName,currentSrc:e.currentSrc||e.src||"",complete:e.complete,naturalWidth:e.naturalWidth,naturalHeight:e.naturalHeight,readyState:e.readyState,networkState:e.networkState},e.error&&(n.mediaElement.error={code:e.error.code,message:e.error.message}),o(n)}});if(o)if(i=i||{},Xu.stream_load_media){const n=await fetch(t,{headers:i});if(!n.ok)throw a(e,n);if(!n.body)throw new Error("Failed to load ".concat(e.tagName,' "').concat(t,'": empty body'));const r=n.body.getReader(),o=new ReadableStream({start:e=>function t(){return r.read().then(n=>{let{done:r,value:i}=n;if(!r)return e.enqueue(i),t();e.close()})}()}),s=await new Response(o).blob();"string"==typeof e.src&&e.src.startsWith("blob:")&&URL.revokeObjectURL(e.src),e.src=URL.createObjectURL(s)}else{const n=await fetch(t,{headers:i});if(mh.debug("Got respone",n),!n.ok)throw a(e,n);"string"==typeof e.src&&e.src.startsWith("blob:")&&URL.revokeObjectURL(e.src);const r=await n.blob();e.src=URL.createObjectURL(r)}else e.src=t;return s},c=async function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;t||(t="img"===e.tagName.toLowerCase()?"video":"img");const i=n.replaceMediaElement(e,t);try{return await s(i),i}catch(e){throw r||e}},l=async(e,t)=>{try{return await s(e),e}catch(n){if(t)return await c(e,null,n);throw n}};return r?r===e.tagName.toLowerCase()?await l(e,!1):await c(e,r):await l(e,!0)}getNextMediaURL(){let e,t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this.mediaList.length?("random_but_synced"==Xu.media_order?e=Math.floor(Date.now()/(1e3*Xu.display_time))%this.mediaList.length:(e=this.mediaIndex,"forwards"==this.mediaListDirection?e++:e--,e>=this.mediaList.length?e=0:e<0&&(e=this.mediaList.length-1)),t&&(this.mediaIndex=e),this.mediaList[e]):null}async updateMediaFromMediaSource(e){var t;const n=await this.hass.callWS({type:"media_source/resolve_media",media_content_id:e.mediaUrl}),r=null===(t=n.mime_type)||void 0===t?void 0:t.match(/^(image|video)\//),i={image:"img",video:"video"}[null==r?void 0:r[1]]||null;let o=n.url;return o.startsWith("http://")||o.startsWith("https://")||(o="".concat(document.location.origin).concat(o)),mh.debug("Setting image src: ".concat(o)),e.mediaUrl=o,await this.updateMediaFromUrl(e,e.mediaUrl,i)}async updateMediaFromImmichAPI(e){const t=nh.get(e.mediaUrl)||{},n="video"==t.mediaType?"video":"img";return await this.updateMediaFromUrl(e,e.mediaUrl,n,{"x-api-key":t.immichApiKey},!0)}async updateMediaFromMediaEntity(e){const t=e.mediaUrl.match(/^media-entity-(image|video):\/\/(.*)/);if(!t)throw new Error('Invalid URL "'.concat(e.mediaUrl,'"'));const n=t[1],r=t[2],i=this.hass.states[r];if(!i)throw new Error('Entity "'.concat(r,'" not available'));function o(){"media_exif"in i.attributes?rh(e.infoCacheUrl,i.attributes.media_exif):rh(e.infoCacheUrl,i.attributes)}if(oh=i.state,"video"==n)return e.infoCacheUrl=e.mediaUrl,o(),(e=this.replaceMediaElement(e,"ha-camera-stream")).style.visibility="hidden",Object.assign(e,{hass:this.__hass,stateObj:this.__hass.states[r],"allow-exoplayer":!1,controls:!1}),new Promise((t,n)=>{let r=0;e.addEventListener("load",async function e(i){const o=i.currentTarget;o.removeEventListener("load",e),await o.updateComplete;const[a,s]=_h(o);if(!a||!s)return r++,r<=20?void setTimeout(()=>e(i),100):void n(new Error("Failed to initialize camera stream player"));if(a.style.height="100%",s.autoplay=!1,s.muted=!1,s.volume=Xu.video_volume,s.style.maxHeight="100%",s.style.height="100%",s.readyState>=s.HAVE_ENOUGH_DATA)t(o);else{const e=()=>{s.removeEventListener("canplay",e),t(o)};s.addEventListener("canplay",e)}})});{if(!i.attributes||!i.attributes.entity_picture)throw new Error('Entity "'.concat(r,'" has no entity_picture attribute'));const t=i.attributes.entity_picture;let n=t.indexOf("?")>0?"&":"?";return n+=this.fillPlaceholders("width=${width}&height=${height}&ts=${timestamp_ms}"),e.mediaUrl=t+n,e.infoCacheUrl=e.mediaUrl,o(),await this.updateMediaFromUrl(e,e.mediaUrl,"img",null,!0)}}async updateMediaFromUnsplashAPI(e){const t=nh.get(e.mediaUrl);return e.mediaUrl=this.fillPlaceholders(e.mediaUrl),t&&rh(e.mediaUrl,t),await this.updateMediaFromUrl(e,e.mediaUrl,"img")}async updateMediaFromMediaIframe(e){return await this.updateMediaFromUrl(e,e.mediaUrl,"iframe")}async updateMediaFromMediaEmbed(e){return await this.updateMediaFromUrl(e,e.mediaUrl,"embed")}async updateMediaFromOtherSrc(e){return e.mediaUrl=this.fillPlaceholders(e.mediaUrl),await this.updateMediaFromUrl(e,e.mediaUrl)}async updateMedia(e){if(Xu.show_images){this.updatingMedia=!0,e.style.visibility="hidden";try{if(e==this.getActiveMediaElement()){const e=this.getInactiveMediaElement();if("video"===e.tagName.toLowerCase())try{e.pause()}catch(e){mh.debug(e)}else if("ha-camera-stream"===e.tagName.toLowerCase())try{const[t,n]=_h(e);n&&n.pause(),t&&"function"==typeof t.stop&&t.stop()}catch(e){mh.debug(e)}}if(e.mediaUrl=this.getNextMediaURL(),!e.mediaUrl)return;if(e.infoCacheUrl=e.mediaUrl,e="media-source"==Ch()?await this.updateMediaFromMediaSource(e):"unsplash-api"==Ch()?await this.updateMediaFromUnsplashAPI(e):"immich-api"==Ch()?await this.updateMediaFromImmichAPI(e):Ch().startsWith("media-entity")?await this.updateMediaFromMediaEntity(e):"iframe"==Ch()?await this.updateMediaFromMediaIframe(e):"embed"==Ch()?await this.updateMediaFromMediaEmbed(e):await this.updateMediaFromOtherSrc(e)){e.style.visibility="visible";const t="video"===e.tagName.toLowerCase();t&&await new Promise((t,n)=>{if(e.readyState>=e.HAVE_ENOUGH_DATA)t();else{const r=()=>{e.removeEventListener("canplay",r),e.removeEventListener("error",i),t()},i=()=>{e.removeEventListener("canplay",r),e.removeEventListener("error",i),n(new Error("Video failed to load"))};e.addEventListener("canplay",r),e.addEventListener("error",i)}}),"image"===Xu.image_background&&this.loadBackgroundImage(e),!t&&Xu.show_image_info&&/.*\.jpe?g$/i.test(e.mediaUrl.split("?")[0].replace(/\/*$/,""))&&this.fetchEXIFInfo(e)}}catch(t){return mh.error("Failed to update media from ".concat(e.mediaUrl,":"),t),null}finally{this.updatingMedia=!1}return e}}setMediaDimensions(){if(!Xu.calculate_media_size)return;const e=this.getActiveMediaElement(),t=this.getActiveMediaElement(!0);if(mh.debug("Setting dimensions for media element",e),!e.mediaUrl)return;const n=t.tagName.toLowerCase();let r=0,i=0;"video"===n?(r=t.videoWidth,i=t.videoHeight):"img"===n&&(r=t.naturalWidth,i=t.naturalHeight);const o=!r||!i||r>=i?Xu.image_fit_landscape:Xu.image_fit_portrait;e.style.position="absolute",e.style.left="0px",e.style.top="0px",e.style.objectFit=o;const a=this.screensaverContainer.clientWidth,s=this.screensaverContainer.clientHeight;let c=s,l=a,u=0,h=0,d=0,f=0;if(mh.debug("Available size is ".concat(a,"x").concat(s,", media size is ").concat(r,"x").concat(i)),r&&i){const e=a/r,t=s/i,n=a-r*t,m=s-i*e;mh.debug("Diff is ".concat(n,"x").concat(m)),"contain"==o&&n=m?(mh.debug("Using available width"),l=a,c=Math.floor(i*e),d="top"==Xu.media_vertical_align?0:"bottom"==Xu.media_vertical_align?s-c:Math.floor((c-s)/-2),u=Math.max(c-s,0)):(mh.debug("Using available height"),c=s,l=Math.floor(r*t),f="left"==Xu.media_horizontal_align?0:"right"==Xu.media_horizontal_align?a-l:Math.floor((l-a)/-2),h=Math.max(l-a,0))}else"iframe"!==n&&"embed"!==n&&mh.warn("Size not available for media element",t);mh.debug("Setting dimensions: size=".concat(l,"x").concat(c," - position=").concat(f,"x").concat(d," - hidden=").concat(h,"x").concat(u)),e.style.width="".concat(l,"px"),e.style.height="".concat(c,"px"),e.style.top="".concat(d,"px"),e.style.left="".concat(f,"px"),e.style.setProperty("--hidden-width",h),e.style.setProperty("--hidden-height",u)}startPlayingActiveMedia(){const e=this.getActiveMediaElement(),t=this.getActiveMediaElement(!0);if("function"!=typeof t.play)return void this.setDisplayTime();const n=()=>{t._wp_video_playback_listeners&&(Object.entries(t._wp_video_playback_listeners).forEach(e=>{let[n,r]=e;t.removeEventListener(n,r)}),t._wp_video_playback_listeners=null)};if(t.loop=Xu.video_loop&&t.duration{if(this.getActiveMediaElement()===t){if(t.currentTime>Xu.crossfade_time){t.duration-t.currentTime<=Xu.crossfade_time&&(this.switchActiveMedia("display_time_elapsed"),n())}}else n()},r=()=>{this.getActiveMediaElement()===t&&this.switchActiveMedia("media_end"),n()},i=()=>{n()};t._wp_video_playback_listeners={timeupdate:e,ended:r,pause:i},Object.entries(t._wp_video_playback_listeners).forEach(e=>{let[n,r]=e;t.addEventListener(n,r)})}t.play().catch(r=>{n(),e===this.getActiveMediaElement()&&mh.error('Failed to play media "'.concat(e.mediaUrl,'" (src=').concat(t.src,"):"),r)})}async switchActiveMedia(e){if(this.updatingMedia)return void mh.debug("Already switching media");this.afterFadeoutTimer&&(clearTimeout(this.afterFadeoutTimer),this.afterFadeoutTimer=null);const t=Ch();if(t.startsWith("media-entity")){const t=Xu.image_url.replace(/^media-entity-(image|video):\/\//,""),n=this.hass.states[t];if(!n)return void mh.error('Media entity "'.concat(t,'" not available'));if(oh!=n.state)mh.debug("Media entity ".concat(t," state has changed"));else{if("entity_update"==e)return;if("start"==e||"user_action"==e)mh.debug("Media entity ".concat(t," state unchanged, but eventType = ").concat(e));else{if(!Xu.media_entity_load_unchanged)return this.lastMediaUpdate=Date.now(),this.isPaused&&(this.mediaTimeElapsedBeforePause=0),void this.restartProgressBarAnimation();mh.debug("Media entity ".concat(t," state unchanged, but media_entity_load_unchanged = true"))}}oh=n.state}this.lastMediaUpdate=Date.now(),this.isPaused&&(this.mediaTimeElapsedBeforePause=0);const n=this.getActiveMediaElement();if(("iframe"===t||"embed"===t)&&!Xu.iframe_load_unchanged&&this.getNextMediaURL(!1)==n.mediaUrl)return;let r=0;"start"!=e&&(Xu.crossfade_time>0&&(r=Math.round(1e3*Xu.crossfade_time)),"user_action"==e&&r>250&&(r=250));const i=this.getInactiveMediaElement(),o=await this.updateMedia(i);o?(this.mediaLoadRetryAt=0,this._switchActiveMedia(o,r)):this.mediaLoadRetryAt=Date.now()+1e3}_switchActiveMedia(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.lastMediaUpdate=Date.now(),this.isPaused&&(this.mediaTimeElapsedBeforePause=0),this.imageOneContainer.style.transition="opacity ".concat(t,"ms ease-in-out"),this.imageTwoContainer.style.transition="opacity ".concat(t,"ms ease-in-out");let n=this.imageOneContainer,r=this.imageTwoContainer,i=this.imageOne,o=this.imageTwo;e==this.imageOne&&(n=this.imageTwoContainer,r=this.imageOneContainer,i=this.imageTwo,o=this.imageOne),mh.debug("Switching active media to '".concat(r.id,"'")),1!=r.style.opacity&&(r.style.opacity=1),0!=n.style.opacity&&(n.style.opacity=0),"iframe"==o.tagName.toLowerCase()&&Xu.iframe_interaction?o.style.pointerEvents="auto":o.style.pointerEvents="none",this.setMediaDataInfo(),this.setMediaDimensions(),this.setImageURLEntityState(),this.startPlayingActiveMedia(),this.restartProgressBarAnimation(),this.restartKenBurnsEffect();const a=this;this.afterFadeoutTimer=setTimeout(function(){a.afterFadeoutTimer=null,i===a.getInactiveMediaElement()&&a.releaseMediaElement(i)},t)}showMessage(e,t,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;if(!this.messageContainer)return;const i=document.createElement("div");i.className="wallpanel-message ".concat(e);const o=document.createElement("div");o.className="wallpanel-message-title",o.textContent=t,i.appendChild(o);const a=document.createElement("div");a.className="wallpanel-message-text",a.textContent=n,i.appendChild(a),this.messageContainer.appendChild(i),requestAnimationFrame(()=>i.classList.add("show"));const s=this;setTimeout(()=>s.hideMessage(i),r)}hideMessage(e){e.classList.remove("show"),e.addEventListener("transitionend",()=>e.remove())}hideAllMessages(){const e=this.messageContainer.querySelectorAll(".wallpanel-message");if(!e.length)return!1;const t=this;return e.forEach(e=>t.hideMessage(e)),!0}setupScreensaver(){mh.debug("Setup screensaver"),Xu.keep_screen_on_time>0&&!this.screenWakeLock.enabled&&this.screenWakeLock.enable(),Xu.fullscreen&&!Oh()&&Ph()}async startScreensaver(){if(mh.debug("Start screensaver"),this.afterFadeoutTimer&&(clearTimeout(this.afterFadeoutTimer),this.afterFadeoutTimer=null),this.mediaLoadRetryAt=0,this.screensaverStartedAt=Date.now(),this.screensaverStoppedAt=null,this.currentWidth=this.screensaverContainer.clientWidth,this.currentHeight=this.screensaverContainer.clientHeight,this.setDefaultStyle(),wh(),!Sh())return mh.debug("Wallpanel not active, not starting screensaver"),this.screensaverStartedAt=null,void(this.screensaverStoppedAt=Date.now());if(this.getActiveMediaElement()==this.imageOne?(this.imageOneContainer.style.opacity=1,this.imageTwoContainer.style.opacity=0):(this.imageOneContainer.style.opacity=0,this.imageTwoContainer.style.opacity=1),this.setDisplayTime(),await this.switchActiveMedia("start"),this.setupScreensaver(),Xu.keep_screen_on_time>0){const e=this;setTimeout(function(){e.screensaverRunning()&&!e.screenWakeLock.enabled&&(mh.warning("Keep screen on will not work because the user didn't interact with the document first. https://goo.gl/xX8pDD"),e.showMessage("info","Keep screen on","Please tap the screen for a moment to keep it awake and prevent it from turning off.",15e3))},2e3)}this.lastMove=Date.now(),this.lastMediaUpdate=Date.now(),document.documentElement.style.overflow="hidden",this.isPaused=!1,this.mediaTimeElapsedBeforePause=0,this.pauseIndicator.style.display="none",this.createInfoBoxContent(),this.style.visibility="visible",this.style.opacity=1,this.style.pointerEvents="auto",this.setScreensaverEntityState(),(Xu.screensaver_start_navigation_path||Xu.screensaver_stop_close_browser_mod_popup)&&(this.screensaverStopNavigationPathTimeout=setTimeout(()=>{Xu.screensaver_start_navigation_path&&(eh=!0,function(e){(!(arguments.length>1&&void 0!==arguments[1])||arguments[1])&&!e.includes("?")&&(e+=window.location.search),history.pushState(null,"",e),ah.dispatchEvent(new Event("location-changed",{bubbles:!0,cancelable:!1,composed:!0}))}(Xu.screensaver_start_navigation_path),setTimeout(()=>{eh=!1},5e3)),Xu.screensaver_stop_close_browser_mod_popup&&Eh().forEach(e=>{e.closeDialog()})},1e3*(Xu.fade_in_time+1)))}screensaverRunning(){return Boolean(this.screensaverStartedAt)&&this.screensaverStartedAt>0}stopScreensaver(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;mh.debug("Stop screensaver"),this.afterFadeoutTimer&&(clearTimeout(this.afterFadeoutTimer),this.afterFadeoutTimer=null),this.mediaLoadRetryAt=0,this.screensaverStartedAt=null,this.screensaverStoppedAt=Date.now(),document.documentElement.style.removeProperty("overflow"),this.screensaverStopNavigationPathTimeout&&clearTimeout(this.screensaverStopNavigationPathTimeout),this.hideAllMessages(),this.debugBox.style.pointerEvents="none",this.style.transition=e>0?"opacity ".concat(Math.round(1e3*e),"ms ease-in-out"):"",this.style.opacity=0,this.style.visibility="hidden",this.style.pointerEvents="none",this.imageOneInfo.style.pointerEvents="none",this.imageTwoInfo.style.pointerEvents="none",this.infoBoxPosX.style.animation="",this.infoBoxPosY.style.animation="",this.idleSince=Date.now(),this.screenWakeLock.enabled&&this.screenWakeLock.disable();const t=this;this.afterFadeoutTimer=setTimeout(function(){t.afterFadeoutTimer=null,t.screensaverRunning()||t.releaseAllMedia()},Math.round(1e3*e)),setTimeout(this.setScreensaverEntityState.bind(this),25)}updateScreensaver(){const e=new Date,t=e.getTime();if(this.energyCollectionUpdateEnabled&&t-this.lastEnergyCollectionUpdate>=1e3*this.energyCollectionUpdateInterval&&(this.hass.connection._energy_wallpanel&&this.hass.connection._energy_wallpanel.refresh(),this.lastEnergyCollectionUpdate=t),this.infoBoxContentCreatedDate&&this.infoBoxContentCreatedDate.getDate()!=e.getDate()&&this.createInfoBoxContent(),Xu.info_move_interval>0&&t-this.lastMove>=1e3*Xu.info_move_interval&&("random"===Xu.info_move_pattern?this.randomMove():"corners"===Xu.info_move_pattern?this.moveAroundCorners():mh.error("Unknown info move type ".concat(Xu.info_move_pattern))),Xu.black_screen_after_time>0&&t-this.screensaverStartedAt>=1e3*Xu.black_screen_after_time)mh.debug("Setting screen to black"),this.screensaverOverlay.style.background="#000000";else if(Xu.show_images){let e;e="random_but_synced"==Xu.media_order?Math.floor(t/(1e3*Xu.display_time))!=Math.floor(this.lastMediaUpdate/(1e3*Xu.display_time)):t-this.lastMediaUpdate>=1e3*this.getDisplayTime();const n=this.mediaLoadRetryAt>0?t>=this.mediaLoadRetryAt:e;this.isPaused||this.updatingMedia||!n||this.switchActiveMedia("display_time_elapsed"),t-this.lastMediaListUpdate>=1e3*Xu.media_list_update_interval&&this.updateMediaList(null,!0),"visible"!=this.imageOneContainer.style.visibility&&(this.imageOneContainer.style.visibility="visible"),"visible"!=this.imageOne.style.visibility&&(this.imageOne.style.visibility="visible"),"visible"!=this.imageTwoContainer.style.visibility&&(this.imageTwoContainer.style.visibility="visible"),"visible"!=this.imageTwo.style.visibility&&(this.imageTwo.style.visibility="visible")}else"hidden"!=this.imageOneContainer.style.visibility&&(this.imageOneContainer.style.visibility="hidden"),"hidden"!=this.imageOne.style.visibility&&(this.imageOne.style.visibility="hidden"),"hidden"!=this.imageTwoContainer.style.visibility&&(this.imageTwoContainer.style.visibility="hidden"),"hidden"!=this.imageTwo.style.visibility&&(this.imageTwo.style.visibility="hidden");if(Xu.close_more_info_dialog_time>0){const e=this.getMoreInfoDialog();if(e){const t=new Date;this.moreInfoDialogOpenedAt?t-this.moreInfoDialogOpenedAt>=1e3*Xu.close_more_info_dialog_time&&e.close():this.moreInfoDialogOpenedAt=t}else this.moreInfoDialogOpenedAt=0}if(Xu.debug){let e="";const t={};for(const e in Xu)["profiles"].includes(e)?t[e]="...":t[e]=Xu[e];if(e+='
Download log
',e+="Version: ".concat(Gu,"
"),e+="User-Agent: ".concat(navigator.userAgent,"
"),e+="Config: ".concat(JSON.stringify(t),"
"),e+="Fullscreen: ".concat(Oh(),"
"),e+="Screensaver started at: ".concat(Ku.screensaverStartedAt,"
"),e+="Screen wake lock: enabled=".concat(this.screenWakeLock.enabled," native=").concat(this.screenWakeLock.nativeWakeLockSupported," lock=").concat(this.screenWakeLock._lock," player=").concat(this.screenWakeLock._player," error=").concat(this.screenWakeLock.error,"
"),this.screenWakeLock._player){const t=this.screenWakeLock._player;e+="Screen wake lock video: readyState=".concat(t.readyState," currentTime=").concat(t.currentTime," paused=").concat(t.paused," ended=").concat(t.ended,"
")}e+="Media list size: ".concat(this.mediaList.length,"
");const n=this.getActiveMediaElement();if(n){e+="Current media: ".concat(n.mediaUrl,"
");const t=nh.get(n.infoCacheUrl);t&&(e+="Media info: ".concat(JSON.stringify(t),"
"))}this.debugBox.innerHTML!==e&&(this.debugBox.innerHTML=e,this.debugBox.querySelector("#download_log").addEventListener("click",function(e){mh.downloadMessages(),e.preventDefault()})),this.debugBox.scrollTop=this.debugBox.scrollHeight}this.screenWakeLock.enabled&&Xu.keep_screen_on_time>0&&t-this.screensaverStartedAt>=1e3*Xu.keep_screen_on_time&&(mh.info("Disable wake lock after ".concat(Xu.keep_screen_on_time," seconds")),this.screenWakeLock.disable())}switchMediaDirection(e){this.mediaListDirection=e,this.switchActiveMedia("user_action")}async nextImage(){if(this.updatingMedia)return void mh.debug("Already switching media");mh.debug("Next image");const e=this.mediaListDirection;this.mediaListDirection="forwards";try{await this.switchActiveMedia("user_action")}finally{this.mediaListDirection=e}}async previousImage(){if(this.updatingMedia)return void mh.debug("Already switching media");mh.debug("Previous image");const e=this.mediaListDirection;this.mediaListDirection="backwards";try{await this.switchActiveMedia("user_action")}finally{this.mediaListDirection=e}}togglePlayPause(){if(mh.debug("Toggle play/pause"),this.screensaverRunning())if(this.isPaused)this.isPaused=!1,this.lastMediaUpdate=Date.now()-(this.mediaTimeElapsedBeforePause||0),this.pauseIndicator.style.display="none",this.progressBar.style.animationPlayState="running",this.startPlayingActiveMedia();else{this.isPaused=!0,this.mediaTimeElapsedBeforePause=Date.now()-this.lastMediaUpdate,this.lastMediaUpdate=Date.now(),this.pauseIndicator.style.display="block",this.progressBar.style.animationPlayState="paused";const e=this.getActiveMediaElement(!0);e&&"function"==typeof e.pause&&e.pause()}}setCameraMotionDetectionEntityState(e){const t=Xu.camera_motion_detection_set_entity;t&&this.__hass.states[t]&&(mh.debug("Updating camera motion detection entity",t,e),this.__hass.callService("input_boolean",e?"turn_on":"turn_off",{entity_id:t}).then(e=>{mh.debug(e)},e=>{mh.error("Failed to set camera motion detection entity state:",e)}))}motionDetected(){Xu.camera_motion_detection_stop_screensaver&&this.screensaverRunning()&&this.stopScreensaver(Xu.fade_out_time_motion_detected),this.setCameraMotionDetectionEntityState(!0)}motionStopped(){this.setCameraMotionDetectionEntityState(!1)}handleInteractionEvent(e){const t=["click","touchend"].includes(e.type),n=Date.now();this.idleSince=n;let r="";if("touchstart"==e.type)return void(e.touches&&e.touches[0]&&(this.touchStartX=e.touches[0].clientX,this.touchStartY=e.touches[0].clientY));if("touchend"==e.type&&this.touchStartX>=0&&e.changedTouches&&e.changedTouches[0]){const t=e.changedTouches[0].clientX-this.touchStartX,n=e.changedTouches[0].clientY-this.touchStartY,i=Math.max(20,.03*window.innerWidth);t>=i&&Math.abs(t)>Math.abs(n)?r="right":t<=-i&&Math.abs(t)>Math.abs(n)&&(r="left"),this.touchStartX=-1,this.touchStartY=-1}if(!this.screensaverRunning())return this.blockEventsUntil>n&&(t&&e.preventDefault(),e.stopImmediatePropagation()),void(t&&this.setupScreensaver());if(t&&this.hideAllMessages())return void(this.blockEventsUntil=n+1e3);let i=e.clientX,o=e.clientY;if(!i&&e.changedTouches&&e.changedTouches[0]&&(i=e.changedTouches[0].clientX),!o&&e.changedTouches&&e.changedTouches[0]&&(o=e.changedTouches[0].clientY),Xu.debug&&i&&i<100&&o&&o<100)return;const a=xh();if(a){const e=[a.shadowRoot.querySelector(".content"),a.shadowRoot.querySelector("ha-dialog-header")];for(let t=0;t=n.left&&i<=n.right&&o>=n.top&&o<=n.bottom)return void mh.debug("Event on browser mod popup:",e[t])}}if(Xu.iframe_interaction&&"iframe"==Ch())return;if(Xu.content_interaction){if(this.getMoreInfoDialog())return;let e=[];e=e.concat(this.__cards||[]),e=e.concat(this.__badges||[]),e=e.concat(this.__views||[]),e.push(this.shadowRoot.getElementById("wallpanel-screensaver-info-box-content")),e.push(this.shadowRoot.getElementById("wallpanel-screensaver-fixed-info-box-content")),"analyze"==Xu.image_info_template&&(e.push(this.imageOneInfo),e.push(this.imageTwoInfo));for(let t=0;t=n.left&&i<=n.right&&o>=n.top&&o<=n.bottom)return void mh.debug("Event on:",e[t])}}let s="";if(r)s="left"==r?"forwards":"backwards",e.stopImmediatePropagation();else if(e instanceof MouseEvent||"TouchEvent"in window&&e instanceof TouchEvent){let n=0,r=0;const a=this.screensaverContainer.getBoundingClientRect();if(i&&(n=(a.right-i)/this.screensaverContainer.clientWidth),o&&(r=(a.bottom-o)/this.screensaverContainer.clientHeight),mh.debug("Event position screensaver:",i,o,a.left,a.right,a.top,a.bottom),r>1||r<0||n>1||n<0)return;if(t&&e.preventDefault(),e.stopImmediatePropagation(),Xu.touch_zone_size_next_image>0&&n<=Xu.touch_zone_size_next_image/100){if(!t)return;s="forwards"}else if(Xu.touch_zone_size_previous_image>0&&n>=(100-Xu.touch_zone_size_previous_image)/100){if(!t)return;s="backwards"}else if(n>=.4&&n<=.6&&r<=.1){const e=new Date;return t&&e-this.lastClickTime<500?(this.clickCount+=1,3==this.clickCount&&(mh.purgeMessages(),Xu.debug=!Xu.debug,this.debugBox.style.visibility=Xu.debug?"visible":"hidden",this.debugBox.style.pointerEvents=Xu.debug?"auto":"none")):this.clickCount=1,void(this.lastClickTime=e)}}s?this.updatingMedia?mh.debug("Already switching media"):(mh.debug("Switching media, direction ".concat(s)),this.mediaListDirection!=s?this.switchMediaDirection(s):this.switchActiveMedia("user_action")):t&&!Xu.stop_screensaver_on_mouse_click||(this.blockEventsUntil=n+1e3*Xu.control_reactivation_time,this.stopScreensaver(Xu.fade_out_time_interaction))}}customElements.get("wallpanel-view-container")||customElements.define("wallpanel-view-container",r),customElements.get("wallpanel-view")||customElements.define("wallpanel-view",i),Zu=document.createElement("wallpanel-view-container"),Ku=document.createElement("wallpanel-view"),Zu.appendChild(Ku),sh.shadowRoot.appendChild(Zu)}function Lh(){mh.debug("activateWallpanel");let e=Xu.hide_toolbar,t=Xu.hide_toolbar_action_icons;if(e&&!Xu.hide_toolbar_on_subviews&&Qu){const n=Ih();if(n&&n.lovelace&&n.lovelace.rawConfig&&n.lovelace.rawConfig.views)for(let r=0;r{mh.debug("Successfully exited fullscreen")},e=>{mh.debug("Failed to exit fullscreen:",e)}):document.mozCancelFullScreen?document.mozCancelFullScreen():document.msRequestFullscreen?document.msRequestFullscreen():document.webkitExitFullscreen&&document.webkitExitFullscreen())}function Dh(){Ju&&Qu?(wh(),Sh()?Lh():Bh()):Bh()}function Uh(){if(mh.debug("Location changed from '".concat($u,"' to '").concat(window.location.href,"'")),window.location.href==$u)return;$u=window.location.href,Ku&&Ku.screensaverRunning&&Ku.screensaverRunning()&&Xu.stop_screensaver_on_location_change&&(eh?(eh=!1,Ku.screensaverStopNavigationPathTimeout&&clearTimeout(Ku.screensaverStopNavigationPathTimeout)):Ku.stopScreensaver());let e=null,t=null;const n=window.location.pathname.split("/");n.length>1&&(e=n[1],n.length>2&&(t=n[2]));const r=Ju&&e!=Ju;Ju=e,Qu=t,r?(mh.debug("Reset dashboard config"),Vu={},Fh(Dh)):Dh()}function Fh(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;const n=Date.now();null===t&&(t=n);const r=(n-t)/1e3;if(ah=document.querySelector("body > home-assistant"),ah&&ah.shadowRoot&&(sh=ah.shadowRoot.querySelector("home-assistant-main")),!ah||!ah.shadowRoot||!sh)return r>=5?void mh.error("Wallpanel startup failed after ".concat(r," seconds, element home-assistant / home-assistant-main not found.")):void setTimeout(Fh,100,e,t);const i=Ih();if(!(i&&i.lovelace&&i.lovelace.config&&i.lovelace.config))return r>=5?void mh.info("No lovelace config found after ".concat(r," seconds")):void setTimeout(Fh,100,e,t);if(!customElements.get("hui-view"))return r>=5?void mh.error("Wallpanel startup failed after ".concat(r," seconds, hui-view not found.")):void setTimeout(Fh,100,e,t);if(!window.browser_mod){let n=Th(["wait_for_browser_mod_time"]).wait_for_browser_mod_time;if(void 0===n&&(n=qu.wait_for_browser_mod_time),r{let t=null;try{t=e.target.location.href}catch(e){mh.debug(e)}mh.debug("location-changed",t,e),setTimeout(Uh,20)}),window.navigation&&window.navigation.addEventListener("navigate",e=>{let t=null;try{t=e.destination.url}catch(e){mh.debug(e)}mh.debug("navigate",t,e),setTimeout(Uh,30)}),(ah.hass||ah.__hass).connection.subscribeEvents(function(e){mh.debug("lovelace_updated",e),(e.data.url_path?e.data.url_path:"lovelace")==Ju&&(ah.hass||ah.__hass).connection.sendMessagePromise({type:"lovelace/config",url_path:e.data.url_path}).then(e=>{if(Vu={},e.wallpanel)for(const t in e.wallpanel)(t in qu||t in Yu)&&(Vu[t]=e.wallpanel[t]);Dh()})},"lovelace_updated"),setTimeout(Uh,0)})}catch(e){mh.error(e.stack)}var Nh=!1,jh=function(e){return e instanceof jh?e:this instanceof jh?void(this.EXIFwrapped=e):new jh(e)},Wh=jh.Tags={36864:"ExifVersion",40960:"FlashpixVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",37121:"ComponentsConfiguration",37122:"CompressedBitsPerPixel",37500:"MakerNote",37510:"UserComment",40964:"RelatedSoundFile",36867:"DateTimeOriginal",36868:"DateTimeDigitized",37520:"SubsecTime",37521:"SubsecTimeOriginal",37522:"SubsecTimeDigitized",33434:"ExposureTime",33437:"FNumber",34850:"ExposureProgram",34852:"SpectralSensitivity",34855:"ISOSpeedRatings",34856:"OECF",37377:"ShutterSpeedValue",37378:"ApertureValue",37379:"BrightnessValue",37380:"ExposureBias",37381:"MaxApertureValue",37382:"SubjectDistance",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37396:"SubjectArea",37386:"FocalLength",41483:"FlashEnergy",41484:"SpatialFrequencyResponse",41486:"FocalPlaneXResolution",41487:"FocalPlaneYResolution",41488:"FocalPlaneResolutionUnit",41492:"SubjectLocation",41493:"ExposureIndex",41495:"SensingMethod",41728:"FileSource",41729:"SceneType",41730:"CFAPattern",41985:"CustomRendered",41986:"ExposureMode",41987:"WhiteBalance",41988:"DigitalZoomRation",41989:"FocalLengthIn35mmFilm",41990:"SceneCaptureType",41991:"GainControl",41992:"Contrast",41993:"Saturation",41994:"Sharpness",41995:"DeviceSettingDescription",41996:"SubjectDistanceRange",40965:"InteroperabilityIFDPointer",42016:"ImageUniqueID"},zh=jh.TiffTags={256:"ImageWidth",257:"ImageHeight",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer",40965:"InteroperabilityIFDPointer",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",274:"Orientation",277:"SamplesPerPixel",284:"PlanarConfiguration",530:"YCbCrSubSampling",531:"YCbCrPositioning",282:"XResolution",283:"YResolution",296:"ResolutionUnit",273:"StripOffsets",278:"RowsPerStrip",279:"StripByteCounts",513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",301:"TransferFunction",318:"WhitePoint",319:"PrimaryChromaticities",529:"YCbCrCoefficients",532:"ReferenceBlackWhite",306:"DateTime",270:"ImageDescription",271:"Make",272:"Model",305:"Software",315:"Artist",33432:"Copyright"},Hh=jh.GPSTags={0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude",5:"GPSAltitudeRef",6:"GPSAltitude",7:"GPSTimeStamp",8:"GPSSatellites",9:"GPSStatus",10:"GPSMeasureMode",11:"GPSDOP",12:"GPSSpeedRef",13:"GPSSpeed",14:"GPSTrackRef",15:"GPSTrack",16:"GPSImgDirectionRef",17:"GPSImgDirection",18:"GPSMapDatum",19:"GPSDestLatitudeRef",20:"GPSDestLatitude",21:"GPSDestLongitudeRef",22:"GPSDestLongitude",23:"GPSDestBearingRef",24:"GPSDestBearing",25:"GPSDestDistanceRef",26:"GPSDestDistance",27:"GPSProcessingMethod",28:"GPSAreaInformation",29:"GPSDateStamp",30:"GPSDifferential"},Gh=jh.IFD1Tags={256:"ImageWidth",257:"ImageHeight",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",273:"StripOffsets",274:"Orientation",277:"SamplesPerPixel",278:"RowsPerStrip",279:"StripByteCounts",282:"XResolution",283:"YResolution",284:"PlanarConfiguration",296:"ResolutionUnit",513:"JpegIFOffset",514:"JpegIFByteCount",529:"YCbCrCoefficients",530:"YCbCrSubSampling",531:"YCbCrPositioning",532:"ReferenceBlackWhite"},qh=jh.StringValues={ExposureProgram:{0:"Not defined",1:"Manual",2:"Normal program",3:"Aperture priority",4:"Shutter priority",5:"Creative program",6:"Action program",7:"Portrait mode",8:"Landscape mode"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{0:"Unknown",1:"Daylight",2:"Fluorescent",3:"Tungsten (incandescent light)",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 - 5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},SensingMethod:{1:"Not defined",2:"One-chip color area sensor",3:"Two-chip color area sensor",4:"Three-chip color area sensor",5:"Color sequential area sensor",7:"Trilinear sensor",8:"Color sequential linear sensor"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},SceneType:{1:"Directly photographed"},CustomRendered:{0:"Normal process",1:"Custom process"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},GainControl:{0:"None",1:"Low gain up",2:"High gain up",3:"Low gain down",4:"High gain down"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},SubjectDistanceRange:{0:"Unknown",1:"Macro",2:"Close view",3:"Distant view"},FileSource:{3:"DSC"},Components:{0:"",1:"Y",2:"Cb",3:"Cr",4:"R",5:"G",6:"B"}};function Yh(e){return!!e.exifdata}function Vh(e,t){function n(n){var r=Xh(n);e.exifdata=r||{};var i=function(e){var t=new DataView(e);if(255!=t.getUint8(0)||216!=t.getUint8(1))return!1;var n=2,r=e.byteLength,i=function(e,t){return 56===e.getUint8(t)&&66===e.getUint8(t+1)&&73===e.getUint8(t+2)&&77===e.getUint8(t+3)&&4===e.getUint8(t+4)&&4===e.getUint8(t+5)};for(;n")+8,l=(s=s.substring(s.indexOf("4?f:t+8,a=[],c=0;c4?f:t+8,d-1);case 3:if(1==d)return e.getUint16(t+8,!i);for(o=d>2?f:t+8,a=[],c=0;c>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:t+=String.fromCharCode(i);break;case 12:case 13:o=e[n++],t+=String.fromCharCode((31&i)<<6|63&o);break;case 14:o=e[n++],a=e[n++],t+=String.fromCharCode((15&i)<<12|(63&o)<<6|63&a)}return t}(r)}function ed(e,t){if("Exif"!=Kh(e,t,4))return!1;var n,r,i,o,a,s=t+6;if(18761==e.getUint16(s))n=!1;else{if(19789!=e.getUint16(s))return!1;n=!0}if(42!=e.getUint16(s+2,!n))return!1;var c=e.getUint32(s+4,!n);if(c<8)return!1;if((r=Qh(e,s,s+c,zh,n)).ExifIFDPointer)for(i in o=Qh(e,s,s+r.ExifIFDPointer,Wh,n)){switch(i){case"LightSource":case"Flash":case"MeteringMode":case"ExposureProgram":case"SensingMethod":case"SceneCaptureType":case"SceneType":case"CustomRendered":case"WhiteBalance":case"GainControl":case"Contrast":case"Saturation":case"Sharpness":case"SubjectDistanceRange":case"FileSource":o[i]=qh[i][o[i]];break;case"ExifVersion":case"FlashpixVersion":o[i]=String.fromCharCode(o[i][0],o[i][1],o[i][2],o[i][3]);break;case"ComponentsConfiguration":o[i]=qh.Components[o[i][0]]+qh.Components[o[i][1]]+qh.Components[o[i][2]]+qh.Components[o[i][3]]}r[i]=o[i]}if(r.GPSInfoIFDPointer)for(i in a=Qh(e,s,s+r.GPSInfoIFDPointer,Hh,n)){if("GPSVersionID"==i)try{a[i]=a[i][0]+"."+a[i][1]+"."+a[i][2]+"."+a[i][3]}catch(e){}r[i]=a[i]}return r.thumbnail=function(e,t,n,r){var i=function(e,t,n){var r=e.getUint16(t,!n);return e.getUint32(t+2+12*r,!n)}(e,t+n,r);if(!i)return{};if(i>e.byteLength)return{};var o=Qh(e,t,t+i,Gh,r);if(o.Compression)switch(o.Compression){case 6:if(o.JpegIFOffset&&o.JpegIFByteCount){var a=t+o.JpegIFOffset,s=o.JpegIFByteCount;o.blob=new Blob([new Uint8Array(e.buffer,a,s)],{type:"image/jpeg"})}break;case 1:mh.log("Thumbnail image format is TIFF, which is not implemented.");break;default:mh.log("Unknown thumbnail image format '%s'",o.Compression)}else 2==o.PhotometricInterpretation&&mh.log("Thumbnail image format is RGB, which is not implemented.");return o}(e,s,c,n),r}function td(e){var t={};if(1==e.nodeType){if(e.attributes.length>0){t["@attributes"]={};for(var n=0;n0)for(var n=0;n0&&e[0]<4?1:+(e[0]+e[1])),!t&&r&&(!(e=r.match(/Edge\/(\d+)/))||e[1]>=74)&&(e=r.match(/Chrome\/(\d+)/))&&(t=+e[1]),Y=t}function Ee(){if(Q)return X;Q=1;var e=we(),t=v(),n=s().String;return X=!!Object.getOwnPropertySymbols&&!t(function(){var t=Symbol("symbol detection");return!n(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&e&&e<41})}function xe(){if($)return J;$=1;var e=Ee();return J=e&&!Symbol.sham&&"symbol"==typeof Symbol.iterator}function Se(){if(K)return Z;K=1;var e=Ae(),t=ve(),n=_e(),r=xe(),i=Object;return Z=r?function(e){return"symbol"==typeof e}:function(r){var a=e("Symbol");return t(a)&&n(a.prototype,i(r))}}function Ce(){if(te)return ee;te=1;var e=String;return ee=function(t){try{return e(t)}catch(e){return"Object"}}}function Ie(){if(re)return ne;re=1;var e=ve(),t=Ce(),n=TypeError;return ne=function(r){if(e(r))return r;throw new n(t(r)+" is not a function")}}function Te(){if(ae)return ie;ae=1;var e=Ie(),t=me();return ie=function(n,r){var i=n[r];return t(i)?void 0:e(i)}}function Re(){if(se)return oe;se=1;var e=_(),t=ve(),n=ye(),r=TypeError;return oe=function(i,a){var o,s;if("string"===a&&t(o=i.toString)&&!n(s=e(o,i)))return s;if(t(o=i.valueOf)&&!n(s=e(o,i)))return s;if("string"!==a&&t(o=i.toString)&&!n(s=e(o,i)))return s;throw new r("Can't convert object to primitive value")}}var Pe,ke,Me,Oe,Le,Be,De,Ue,Fe,Ne,je,We,ze,He,Ge,qe,Ye,Ve,Xe,Qe,Je,$e,Ze,Ke,et={exports:{}};function tt(){return ke?Pe:(ke=1,Pe=!1)}function nt(){if(Oe)return Me;Oe=1;var e=s(),t=Object.defineProperty;return Me=function(n,r){try{t(e,n,{value:r,configurable:!0,writable:!0})}catch(t){e[n]=r}return r}}function rt(){if(Le)return et.exports;Le=1;var e=tt(),t=s(),n=nt(),r="__core-js_shared__",i=et.exports=t[r]||n(r,{});return(i.versions||(i.versions=[])).push({version:"3.43.0",mode:e?"pure":"global",copyright:"© 2014-2025 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.43.0/LICENSE",source:"https://github.com/zloirock/core-js"}),et.exports}function it(){if(De)return Be;De=1;var e=rt();return Be=function(t,n){return e[t]||(e[t]=n||{})}}function at(){if(Fe)return Ue;Fe=1;var e=ge(),t=Object;return Ue=function(n){return t(e(n))}}function ot(){if(je)return Ne;je=1;var e=he(),t=at(),n=e({}.hasOwnProperty);return Ne=Object.hasOwn||function(e,r){return n(t(e),r)}}function st(){if(ze)return We;ze=1;var e=he(),t=0,n=Math.random(),r=e(1.1.toString);return We=function(e){return"Symbol("+(void 0===e?"":e)+")_"+r(++t+n,36)}}function ct(){if(Ge)return He;Ge=1;var e=s(),t=it(),n=ot(),r=st(),i=Ee(),a=xe(),o=e.Symbol,c=t("wks"),u=a?o.for||o:o&&o.withoutSetter||r;return He=function(e){return n(c,e)||(c[e]=i&&n(o,e)?o[e]:u("Symbol."+e)),c[e]}}function ut(){if(Ye)return qe;Ye=1;var e=_(),t=ye(),n=Se(),r=Te(),i=Re(),a=ct(),o=TypeError,s=a("toPrimitive");return qe=function(a,c){if(!t(a)||n(a))return a;var u,l=r(a,s);if(l){if(void 0===c&&(c="default"),u=e(l,a,c),!t(u)||n(u))return u;throw new o("Can't convert object to primitive value")}return void 0===c&&(c="number"),i(a,c)}}function lt(){if(Xe)return Ve;Xe=1;var e=ut(),t=Se();return Ve=function(n){var r=e(n,"string");return t(r)?r:r+""}}function ht(){if(Je)return Qe;Je=1;var e=s(),t=ye(),n=e.document,r=t(n)&&t(n.createElement);return Qe=function(e){return r?n.createElement(e):{}}}function dt(){if(Ze)return $e;Ze=1;var e=y(),t=v(),n=ht();return $e=!e&&!t(function(){return 7!==Object.defineProperty(n("div"),"a",{get:function(){return 7}}).a})}function ft(){if(Ke)return p;Ke=1;var e=y(),t=_(),n=ue(),r=le(),i=pe(),a=lt(),o=ot(),s=dt(),c=Object.getOwnPropertyDescriptor;return p.f=e?c:function(e,u){if(e=i(e),u=a(u),s)try{return c(e,u)}catch(e){}if(o(e,u))return r(!t(n.f,e,u),e[u])},p}var mt,gt,pt,vt,yt,At,_t,bt={};function wt(){if(gt)return mt;gt=1;var e=y(),t=v();return mt=e&&t(function(){return 42!==Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype})}function Et(){if(vt)return pt;vt=1;var e=ye(),t=String,n=TypeError;return pt=function(r){if(e(r))return r;throw new n(t(r)+" is not an object")}}function xt(){if(yt)return bt;yt=1;var e=y(),t=dt(),n=wt(),r=Et(),i=lt(),a=TypeError,o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,c="enumerable",u="configurable",l="writable";return bt.f=e?n?function(e,t,n){if(r(e),t=i(t),r(n),"function"==typeof e&&"prototype"===t&&"value"in n&&l in n&&!n[l]){var a=s(e,t);a&&a[l]&&(e[t]=n.value,n={configurable:u in n?n[u]:a[u],enumerable:c in n?n[c]:a[c],writable:!1})}return o(e,t,n)}:o:function(e,n,s){if(r(e),n=i(n),r(s),t)try{return o(e,n,s)}catch(e){}if("get"in s||"set"in s)throw new a("Accessors not supported");return"value"in s&&(e[n]=s.value),e},bt}function St(){if(_t)return At;_t=1;var e=y(),t=xt(),n=le();return At=e?function(e,r,i){return t.f(e,r,n(1,i))}:function(e,t,n){return e[t]=n,e}}var Ct,It,Tt,Rt,Pt,kt,Mt,Ot,Lt,Bt,Dt,Ut,Ft,Nt,jt,Wt={exports:{}};function zt(){if(It)return Ct;It=1;var e=y(),t=ot(),n=Function.prototype,r=e&&Object.getOwnPropertyDescriptor,i=t(n,"name"),a=i&&"something"===function(){}.name,o=i&&(!e||e&&r(n,"name").configurable);return Ct={EXISTS:i,PROPER:a,CONFIGURABLE:o}}function Ht(){if(Rt)return Tt;Rt=1;var e=he(),t=ve(),n=rt(),r=e(Function.toString);return t(n.inspectSource)||(n.inspectSource=function(e){return r(e)}),Tt=n.inspectSource}function Gt(){if(Ot)return Mt;Ot=1;var e=it(),t=st(),n=e("keys");return Mt=function(e){return n[e]||(n[e]=t(e))}}function qt(){return Bt?Lt:(Bt=1,Lt={})}function Yt(){if(Ut)return Dt;Ut=1;var e,t,n,r=function(){if(kt)return Pt;kt=1;var e=s(),t=ve(),n=e.WeakMap;return Pt=t(n)&&/native code/.test(String(n))}(),i=s(),a=ye(),o=St(),c=ot(),u=rt(),l=Gt(),h=qt(),d="Object already initialized",f=i.TypeError,m=i.WeakMap;if(r||u.state){var g=u.state||(u.state=new m);g.get=g.get,g.has=g.has,g.set=g.set,e=function(e,t){if(g.has(e))throw new f(d);return t.facade=e,g.set(e,t),t},t=function(e){return g.get(e)||{}},n=function(e){return g.has(e)}}else{var p=l("state");h[p]=!0,e=function(e,t){if(c(e,p))throw new f(d);return t.facade=e,o(e,p,t),t},t=function(e){return c(e,p)?e[p]:{}},n=function(e){return c(e,p)}}return Dt={set:e,get:t,has:n,enforce:function(r){return n(r)?t(r):e(r,{})},getterFor:function(e){return function(n){var r;if(!a(n)||(r=t(n)).type!==e)throw new f("Incompatible receiver, "+e+" required");return r}}}}function Vt(){if(Ft)return Wt.exports;Ft=1;var e=he(),t=v(),n=ve(),r=ot(),i=y(),a=zt().CONFIGURABLE,o=Ht(),s=Yt(),c=s.enforce,u=s.get,l=String,h=Object.defineProperty,d=e("".slice),f=e("".replace),m=e([].join),g=i&&!t(function(){return 8!==h(function(){},"length",{value:8}).length}),p=String(String).split("String"),A=Wt.exports=function(e,t,n){"Symbol("===d(l(t),0,7)&&(t="["+f(l(t),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),n&&n.getter&&(t="get "+t),n&&n.setter&&(t="set "+t),(!r(e,"name")||a&&e.name!==t)&&(i?h(e,"name",{value:t,configurable:!0}):e.name=t),g&&n&&r(n,"arity")&&e.length!==n.arity&&h(e,"length",{value:n.arity});try{n&&r(n,"constructor")&&n.constructor?i&&h(e,"prototype",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(e){}var o=c(e);return r(o,"source")||(o.source=m(p,"string"==typeof t?t:"")),e};return Function.prototype.toString=A(function(){return n(this)&&u(this).source||o(this)},"toString"),Wt.exports}function Xt(){if(jt)return Nt;jt=1;var e=ve(),t=xt(),n=Vt(),r=nt();return Nt=function(i,a,o,s){s||(s={});var c=s.enumerable,u=void 0!==s.name?s.name:a;if(e(o)&&n(o,u,s),s.global)c?i[a]=o:r(a,o);else{try{s.unsafe?i[a]&&(c=!0):delete i[a]}catch(e){}c?i[a]=o:t.f(i,a,{value:o,enumerable:!1,configurable:!s.nonConfigurable,writable:!s.nonWritable})}return i}}var Qt,Jt,$t,Zt,Kt,en,tn,nn,rn,an,on,sn,cn,un,ln,hn,dn,fn={};function mn(){if(Zt)return $t;Zt=1;var e=function(){if(Jt)return Qt;Jt=1;var e=Math.ceil,t=Math.floor;return Qt=Math.trunc||function(n){var r=+n;return(r>0?t:e)(r)}}();return $t=function(t){var n=+t;return n!=n||0===n?0:e(n)}}function gn(){if(en)return Kt;en=1;var e=mn(),t=Math.max,n=Math.min;return Kt=function(r,i){var a=e(r);return a<0?t(a+i,0):n(a,i)}}function pn(){if(nn)return tn;nn=1;var e=mn(),t=Math.min;return tn=function(n){var r=e(n);return r>0?t(r,9007199254740991):0}}function vn(){if(an)return rn;an=1;var e=pn();return rn=function(t){return e(t.length)}}function yn(){if(un)return cn;un=1;var e=he(),t=ot(),n=pe(),r=function(){if(sn)return on;sn=1;var e=pe(),t=gn(),n=vn(),r=function(r){return function(i,a,o){var s=e(i),c=n(s);if(0===c)return!r&&-1;var u,l=t(o,c);if(r&&a!=a){for(;c>l;)if((u=s[l++])!=u)return!0}else for(;c>l;l++)if((r||l in s)&&s[l]===a)return r||l||0;return!r&&-1}};return on={includes:r(!0),indexOf:r(!1)}}().indexOf,i=qt(),a=e([].push);return cn=function(e,o){var s,c=n(e),u=0,l=[];for(s in c)!t(i,s)&&t(c,s)&&a(l,s);for(;o.length>u;)t(c,s=o[u++])&&(~r(l,s)||a(l,s));return l}}function An(){return hn?ln:(hn=1,ln=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"])}function _n(){if(dn)return fn;dn=1;var e=yn(),t=An().concat("length","prototype");return fn.f=Object.getOwnPropertyNames||function(n){return e(n,t)},fn}var bn,wn,En,xn,Sn,Cn,In,Tn,Rn,Pn,kn,Mn,On,Ln,Bn,Dn,Un,Fn,Nn,jn,Wn,zn,Hn,Gn,qn,Yn,Vn,Xn,Qn,Jn,$n,Zn,Kn,er,tr,nr,rr,ir,ar,or,sr,cr,ur={};function lr(){return bn||(bn=1,ur.f=Object.getOwnPropertySymbols),ur}function hr(){if(En)return wn;En=1;var e=Ae(),t=he(),n=_n(),r=lr(),i=Et(),a=t([].concat);return wn=e("Reflect","ownKeys")||function(e){var t=n.f(i(e)),o=r.f;return o?a(t,o(e)):t}}function dr(){if(Sn)return xn;Sn=1;var e=ot(),t=hr(),n=ft(),r=xt();return xn=function(i,a,o){for(var s=t(a),c=r.f,u=n.f,l=0;ly&&u(a,arguments[y]),a});if(x.prototype=w,"Error"!==_?i?i(x,E):a(x,E,{name:!0}):h&&v in b&&(o(x,b,v),o(x,b,"prepareStackTrace")),a(x,b),!d)try{w.name!==_&&n(w,"name",_),w.constructor=x}catch(e){}return x}},or}!function(){if(cr)return o;cr=1;var e=mr(),t=s(),n=gr(),r=Tr(),i="WebAssembly",a=t[i],c=7!==new Error("e",{cause:7}).cause,u=function(t,n){var i={};i[t]=r(t,n,c),e({global:!0,constructor:!0,arity:1,forced:c},i)},l=function(t,n){if(a&&a[t]){var o={};o[t]=r(i+"."+t,n,c),e({target:i,stat:!0,constructor:!0,arity:1,forced:c},o)}};u("Error",function(e){return function(t){return n(e,this,arguments)}}),u("EvalError",function(e){return function(t){return n(e,this,arguments)}}),u("RangeError",function(e){return function(t){return n(e,this,arguments)}}),u("ReferenceError",function(e){return function(t){return n(e,this,arguments)}}),u("SyntaxError",function(e){return function(t){return n(e,this,arguments)}}),u("TypeError",function(e){return function(t){return n(e,this,arguments)}}),u("URIError",function(e){return function(t){return n(e,this,arguments)}}),l("CompileError",function(e){return function(t){return n(e,this,arguments)}}),l("LinkError",function(e){return function(t){return n(e,this,arguments)}}),l("RuntimeError",function(e){return function(t){return n(e,this,arguments)}})}();var Rr,Pr,kr,Mr,Or,Lr,Br,Dr,Ur,Fr,Nr,jr,Wr,zr,Hr,Gr,qr,Yr={};function Vr(){if(Pr)return Rr;Pr=1;var e=de();return Rr=Array.isArray||function(t){return"Array"===e(t)}}function Xr(){if(Mr)return kr;Mr=1;var e=TypeError;return kr=function(t){if(t>9007199254740991)throw e("Maximum allowed index exceeded");return t}}function Qr(){if(Lr)return Or;Lr=1;var e=de(),t=he();return Or=function(n){if("Function"===e(n))return t(n)}}function Jr(){if(Dr)return Br;Dr=1;var e=Qr(),t=Ie(),n=A(),r=e(e.bind);return Br=function(e,i){return t(e),void 0===i?e:n?r(e,i):function(){return e.apply(i,arguments)}},Br}function $r(){if(Fr)return Ur;Fr=1;var e=Vr(),t=vn(),n=Xr(),r=Jr(),i=function(a,o,s,c,u,l,h,d){for(var f,m,g=u,p=0,v=!!h&&r(h,d);p0&&e(f)?(m=t(f),g=i(a,o,f,m,g,l-1)-1):(n(g+1),a[g]=f),g++),p++;return g};return Ur=i}function Zr(){if(jr)return Nr;jr=1;var e=he(),t=v(),n=ve(),r=wr(),i=Ae(),a=Ht(),o=function(){},s=i("Reflect","construct"),c=/^\s*(?:class|function)\b/,u=e(c.exec),l=!c.test(o),h=function(e){if(!n(e))return!1;try{return s(o,[],e),!0}catch(e){return!1}},d=function(e){if(!n(e))return!1;switch(r(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return l||!!u(c,a(e))}catch(e){return!0}};return d.sham=!0,Nr=!s||t(function(){var e;return h(h.call)||!h(Object)||!h(function(){e=!0})||e})?d:h}function Kr(){if(zr)return Wr;zr=1;var e=Vr(),t=Zr(),n=ye(),r=ct()("species"),i=Array;return Wr=function(a){var o;return e(a)&&(o=a.constructor,(t(o)&&(o===i||e(o.prototype))||n(o)&&null===(o=o[r]))&&(o=void 0)),void 0===o?i:o}}function ei(){if(Gr)return Hr;Gr=1;var e=Kr();return Hr=function(t,n){return new(e(t))(0===n?0:n)}}!function(){if(qr)return Yr;qr=1;var e=mr(),t=$r(),n=at(),r=vn(),i=mn(),a=ei();e({target:"Array",proto:!0},{flat:function(){var e=arguments.length?arguments[0]:void 0,o=n(this),s=r(o),c=a(o,0);return c.length=t(c,o,o,s,0,void 0===e?1:i(e)),c}})}();var ti,ni={};!function(){if(ti)return ni;ti=1;var e=mr(),t=$r(),n=Ie(),r=at(),i=vn(),a=ei();e({target:"Array",proto:!0},{flatMap:function(e){var o,s=r(this),c=i(s);return n(e),(o=a(s,0)).length=t(o,s,s,c,0,1,e,arguments.length>1?arguments[1]:void 0),o}})}();var ri,ii,ai,oi={};!function(){if(ai)return oi;ai=1;var e=mr(),t=at(),n=vn(),r=function(){if(ii)return ri;ii=1;var e=y(),t=Vr(),n=TypeError,r=Object.getOwnPropertyDescriptor,i=e&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(e){return e instanceof TypeError}}();return ri=i?function(e,i){if(t(e)&&!r(e,"length").writable)throw new n("Cannot set read only .length");return e.length=i}:function(e,t){return e.length=t}}(),i=Xr();e({target:"Array",proto:!0,arity:1,forced:v()(function(){return 4294967297!==[].push.call({length:4294967296},1)})||!function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(e){return e instanceof TypeError}}()},{push:function(e){var a=t(this),o=n(a),s=arguments.length;i(o+s);for(var c=0;c0;)r[s]=r[--s];s!==c++&&(r[s]=o)}else for(var u=t(a/2),l=n(e(r,0,u),i),h=n(e(r,u),i),d=l.length,f=h.length,m=0,g=0;m3)){if(h)return!0;if(f)return f<603;var e,t,n,r,i="";for(e=65;e<76;e++){switch(t=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(r=0;r<47;r++)m.push({k:t+r,v:n})}for(m.sort(function(e,t){return t.v-e.v}),r=0;ro(n)?1:-1}}(e)),s=i(l),u=0;ul;)n.f(e,o=c[l++],s[o]);return e},ji}(),r=An(),i=qt(),a=zi(),o=ht(),s=Gt(),c="prototype",u="script",l=s("IE_PROTO"),h=function(){},d=function(e){return"<"+u+">"+e+""},f=function(e){e.write(d("")),e.close();var t=e.parentWindow.Object;return e=null,t},m=function(){try{e=new ActiveXObject("htmlfile")}catch(e){}var t,n,i;m="undefined"!=typeof document?document.domain&&e?f(e):(n=o("iframe"),i="java"+u+":",n.style.display="none",a.appendChild(n),n.src=String(i),(t=n.contentWindow.document).open(),t.write(d("document.F=Object")),t.close(),t.F):f(e);for(var s=r.length;s--;)delete m[c][r[s]];return m()};return i[l]=!0,Bi=Object.create||function(e,r){var i;return null!==e?(h[c]=t(e),i=new h,h[c]=null,i[l]=e):i=m(),void 0===r?i:n.f(i,r)}}function Gi(){if(Fi)return Ui;Fi=1;var e=ct(),t=Hi(),n=xt().f,r=e("unscopables"),i=Array.prototype;return void 0===i[r]&&n(i,r,{configurable:!0,value:t(null)}),Ui=function(e){i[r][e]=!0}}Ni||(Ni=1,Gi()("flat"));var qi;qi||(qi=1,Gi()("flatMap"));var Yi,Vi,Xi,Qi,Ji,$i,Zi,Ki,ea,ta,na,ra,ia,aa,oa,sa,ca,ua,la,ha,da,fa,ma,ga,pa,va,ya,Aa,_a,ba,wa,Ea,xa,Sa={};function Ca(){return Vi?Yi:(Vi=1,Yi="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView)}function Ia(){if(Qi)return Xi;Qi=1;var e=Vt(),t=xt();return Xi=function(n,r,i){return i.get&&e(i.get,r,{getter:!0}),i.set&&e(i.set,r,{setter:!0}),t.f(n,r,i)}}function Ta(){if($i)return Ji;$i=1;var e=Xt();return Ji=function(t,n,r){for(var i in n)e(t,i,n[i],r);return t}}function Ra(){if(Ki)return Zi;Ki=1;var e=_e(),t=TypeError;return Zi=function(n,r){if(e(r,n))return n;throw new t("Incorrect invocation")}}function Pa(){if(ta)return ea;ta=1;var e=mn(),t=pn(),n=RangeError;return ea=function(r){if(void 0===r)return 0;var i=e(r),a=t(i);if(i!==a)throw new n("Wrong length or index");return a}}function ka(){if(sa)return oa;sa=1;var e=ra?na:(ra=1,na=Math.sign||function(e){var t=+e;return 0===t||t!=t?t:t<0?-1:1}),t=function(){if(aa)return ia;aa=1;var e=4503599627370496;return ia=function(t){return t+e-e}}(),n=Math.abs;return oa=function(r,i,a,o){var s=+r,c=n(s),u=e(s);if(ca||h!=h?u*(1/0):u*h}}function Ma(){if(ha)return la;ha=1;var e=Array,t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,a=Math.LN2;return la={pack:function(o,s,c){var u,l,h,d=e(c),f=8*c-s-1,m=(1<>1,p=23===s?n(2,-24)-n(2,-77):0,v=o<0||0===o&&1/o<0?1:0,y=0;for((o=t(o))!=o||o===1/0?(l=o!=o?1:0,u=m):(u=r(i(o)/a),o*(h=n(2,-u))<1&&(u--,h*=2),(o+=u+g>=1?p/h:p*n(2,1-g))*h>=2&&(u++,h/=2),u+g>=m?(l=0,u=m):u+g>=1?(l=(o*h-1)*n(2,s),u+=g):(l=o*n(2,g-1)*n(2,s),u=0));s>=8;)d[y++]=255&l,l/=256,s-=8;for(u=u<0;)d[y++]=255&u,u/=256,f-=8;return d[y-1]|=128*v,d},unpack:function(e,t){var r,i=e.length,a=8*i-t-1,o=(1<>1,c=a-7,u=i-1,l=e[u--],h=127&l;for(l>>=7;c>0;)h=256*h+e[u--],c-=8;for(r=h&(1<<-c)-1,h>>=-c,c+=t;c>0;)r=256*r+e[u--],c-=8;if(0===h)h=1-s;else{if(h===o)return r?NaN:l?-1/0:1/0;r+=n(2,t),h-=s}return(l?-1:1)*r*n(2,h-t)}}}function Oa(){if(ga)return ma;ga=1;var e=ot(),t=ve(),n=at(),r=Gt(),i=function(){if(fa)return da;fa=1;var e=v();return da=!e(function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})}(),a=r("IE_PROTO"),o=Object,s=o.prototype;return ma=i?o.getPrototypeOf:function(r){var i=n(r);if(e(i,a))return i[a];var c=i.constructor;return t(c)&&i instanceof c?c.prototype:i instanceof o?s:null}}function La(){if(va)return pa;va=1;var e=at(),t=gn(),n=vn();return pa=function(r){for(var i=e(this),a=n(i),o=arguments.length,s=t(o>1?arguments[1]:void 0,a),c=o>2?arguments[2]:void 0,u=void 0===c?a:t(c,a);u>s;)i[s++]=r;return i},pa}function Ba(){if(Aa)return ya;Aa=1;var e=xt().f,t=ot(),n=ct()("toStringTag");return ya=function(r,i,a){r&&!a&&(r=r.prototype),r&&!t(r,n)&&e(r,n,{configurable:!0,value:i})}}function Da(){if(ba)return _a;ba=1;var e=s(),t=he(),n=y(),r=Ca(),i=zt(),a=St(),o=Ia(),c=Ta(),u=v(),l=Ra(),h=mn(),d=pn(),f=Pa(),m=function(){if(ua)return ca;ua=1;var e=ka();return ca=Math.fround||function(t){return e(t,1.1920928955078125e-7,34028234663852886e22,11754943508222875e-54)}}(),g=Ma(),p=Oa(),A=Ar(),_=La(),b=xi(),w=br(),E=dr(),x=Ba(),S=Yt(),C=i.PROPER,I=i.CONFIGURABLE,T="ArrayBuffer",R="DataView",P="prototype",k="Wrong index",M=S.getterFor(T),O=S.getterFor(R),L=S.set,B=e[T],D=B,U=D&&D[P],F=e[R],N=F&&F[P],j=Object.prototype,W=e.Array,z=e.RangeError,H=t(_),G=t([].reverse),q=g.pack,Y=g.unpack,V=function(e){return[255&e]},X=function(e){return[255&e,e>>8&255]},Q=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},J=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},$=function(e){return q(m(e),23,4)},Z=function(e){return q(e,52,8)},K=function(e,t,n){o(e[P],t,{configurable:!0,get:function(){return n(this)[t]}})},ee=function(e,t,n,r){var i=O(e),a=f(n),o=!!r;if(a+t>i.byteLength)throw new z(k);var s=i.bytes,c=a+i.byteOffset,u=b(s,c,c+t);return o?u:G(u)},te=function(e,t,n,r,i,a){var o=O(e),s=f(n),c=r(+i),u=!!a;if(s+t>o.byteLength)throw new z(k);for(var l=o.bytes,h=s+o.byteOffset,d=0;d>24)},setUint8:function(e,t){ie(this,e,t<<24>>24)}},{unsafe:!0})}else U=(D=function(e){l(this,U);var t=f(e);L(this,{type:T,bytes:H(W(t),0),byteLength:t}),n||(this.byteLength=t,this.detached=!1)})[P],N=(F=function(e,t,r){l(this,N),l(e,U);var i=M(e),a=i.byteLength,o=h(t);if(o<0||o>a)throw new z("Wrong offset");if(o+(r=void 0===r?a-o:d(r))>a)throw new z("Wrong length");L(this,{type:R,buffer:e,byteLength:r,byteOffset:o,bytes:i.bytes}),n||(this.buffer=e,this.byteLength=r,this.byteOffset=o)})[P],n&&(K(D,"byteLength",M),K(F,"buffer",O),K(F,"byteLength",O),K(F,"byteOffset",O)),c(N,{getInt8:function(e){return ee(this,1,e)[0]<<24>>24},getUint8:function(e){return ee(this,1,e)[0]},getInt16:function(e){var t=ee(this,2,e,arguments.length>1&&arguments[1]);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=ee(this,2,e,arguments.length>1&&arguments[1]);return t[1]<<8|t[0]},getInt32:function(e){return J(ee(this,4,e,arguments.length>1&&arguments[1]))},getUint32:function(e){return J(ee(this,4,e,arguments.length>1&&arguments[1]))>>>0},getFloat32:function(e){return Y(ee(this,4,e,arguments.length>1&&arguments[1]),23)},getFloat64:function(e){return Y(ee(this,8,e,arguments.length>1&&arguments[1]),52)},setInt8:function(e,t){te(this,1,e,V,t)},setUint8:function(e,t){te(this,1,e,V,t)},setInt16:function(e,t){te(this,2,e,X,t,arguments.length>2&&arguments[2])},setUint16:function(e,t){te(this,2,e,X,t,arguments.length>2&&arguments[2])},setInt32:function(e,t){te(this,4,e,Q,t,arguments.length>2&&arguments[2])},setUint32:function(e,t){te(this,4,e,Q,t,arguments.length>2&&arguments[2])},setFloat32:function(e,t){te(this,4,e,$,t,arguments.length>2&&arguments[2])},setFloat64:function(e,t){te(this,8,e,Z,t,arguments.length>2&&arguments[2])}});return x(D,T),x(F,R),_a={ArrayBuffer:D,DataView:F}}function Ua(){if(Ea)return wa;Ea=1;var e=Ae(),t=Ia(),n=ct(),r=y(),i=n("species");return wa=function(n){var a=e(n);r&&a&&!a[i]&&t(a,i,{configurable:!0,get:function(){return this}})}}!function(){if(xa)return Sa;xa=1;var e=mr(),t=s(),n=Da(),r=Ua(),i="ArrayBuffer",a=n[i];e({global:!0,constructor:!0,forced:t[i]!==a},{ArrayBuffer:a}),r(i)}();var Fa,Na={};!function(){if(Fa)return Na;Fa=1;var e=mr(),t=Qr(),n=v(),r=Da(),i=Et(),a=gn(),o=pn(),s=r.ArrayBuffer,c=r.DataView,u=c.prototype,l=t(s.prototype.slice),h=t(u.getUint8),d=t(u.setUint8);e({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:n(function(){return!new s(2).slice(1,void 0).byteLength})},{slice:function(e,t){if(l&&void 0===t)return l(i(this),e);for(var n=i(this).byteLength,r=a(e,n),u=a(void 0===t?n:t,n),f=new s(o(u-r)),m=new c(this),g=new c(f),p=0;r92||"NODE"===r&&n>94||"BROWSER"===r&&n>97)return!1;var e=new ArrayBuffer(8),t=i(e,{transfer:[e]});return 0!==e.byteLength||8!==t.byteLength})}function mo(){if(ao)return io;ao=1;var e,t,n,r,i=s(),a=ho(),o=fo(),c=i.structuredClone,u=i.ArrayBuffer,l=i.MessageChannel,h=!1;if(o)h=function(e){c(e,{transfer:[e]})};else if(u)try{l||(e=a("worker_threads"))&&(l=e.MessageChannel),l&&(t=new l,n=new u(2),r=function(e){t.port1.postMessage(null,[e])},2===n.byteLength&&(r(n),0===n.byteLength&&(h=r)))}catch(e){}return io=h}function go(){if(so)return oo;so=1;var e=s(),t=he(),n=pr(),r=Pa(),i=function(){if(Qa)return Xa;Qa=1;var e=Va(),t=TypeError;return Xa=function(n){if(e(n))throw new t("ArrayBuffer is detached");return n}}(),a=Ya(),o=mo(),c=fo(),u=e.structuredClone,l=e.ArrayBuffer,h=e.DataView,d=Math.min,f=l.prototype,m=h.prototype,g=t(f.slice),p=n(f,"resizable","get"),v=n(f,"maxByteLength","get"),y=t(m.getInt8),A=t(m.setInt8);return oo=(c||o)&&function(e,t,n){var s,f=a(e),m=void 0===t?f:r(t),_=!p||!p(e);if(i(e),c&&(e=u(e,{transfer:[e]}),f===m&&(n||_)))return e;if(f>=m&&(!n||_))s=g(e,0,m);else{var b=n&&!_&&v?{maxByteLength:v(e)}:void 0;s=new l(m,b);for(var w=new h(e),E=new h(s),x=d(m,f),S=0;S=0;i--)if(void 0!==t[i])try{r=e(t[i].iterator,n,r)}catch(e){n="throw",r=e}if("throw"===n)throw r;return r}}function Xo(){if(Bo)return Lo;Bo=1;var e=_(),t=Hi(),n=St(),r=Ta(),i=ct(),a=Yt(),o=Te(),s=So().IteratorPrototype,c=qo(),u=Yo(),l=Vo(),h=i("toStringTag"),d="IteratorHelper",f="WrapForValidIterator",m="normal",g="throw",p=a.set,v=function(n){var i=a.getterFor(n?f:d);return r(t(s),{next:function(){var e=i(this);if(n)return e.nextHandler();if(e.done)return c(void 0,!0);try{var t=e.nextHandler();return e.returnHandlerResult?t:c(t,e.done)}catch(t){throw e.done=!0,t}},return:function(){var t=i(this),r=t.iterator;if(t.done=!0,n){var a=o(r,"return");return a?e(a,r):c(void 0,!0)}if(t.inner)try{u(t.inner.iterator,m)}catch(e){return u(r,g,e)}if(t.openIters)try{l(t.openIters,m)}catch(e){return u(r,g,e)}return r&&u(r,m),c(void 0,!0)}})},y=v(!0),A=v(!1);return n(A,h,"Iterator Helper"),Lo=function(e,t,n){var r=function(r,i){i?(i.iterator=r.iterator,i.next=r.next):i=r,i.type=t?f:d,i.returnHandlerResult=!!n,i.nextHandler=e,i.counter=0,i.done=!1,p(this,i)};return r.prototype=t?y:A,r}}function Qo(){if(Uo)return Do;Uo=1;var e=Et(),t=Yo();return Do=function(n,r,i,a){try{return a?r(e(i)[0],i[1]):r(i)}catch(e){t(n,"throw",e)}}}function Jo(){return No?Fo:(No=1,Fo=function(e,t){var n="function"==typeof Iterator&&Iterator.prototype[e];if(n)try{n.call({next:null},t).next()}catch(e){return!0}})}function $o(){if(Wo)return jo;Wo=1;var e=s();return jo=function(t,n){var r=e.Iterator,i=r&&r.prototype,a=i&&i[t],o=!1;if(a)try{a.call({next:function(){return{done:!0}},return:function(){o=!0}},-1)}catch(e){e instanceof n||(o=!1)}if(!o)return a}}!function(){if(zo)return Ho;zo=1;var e=mr(),t=_(),n=Ie(),r=Et(),i=Go(),a=Xo(),o=Qo(),s=tt(),c=Yo(),u=Jo(),l=$o(),h=!s&&!u("filter",function(){}),d=!s&&!h&&l("filter",TypeError),f=s||h||d,m=a(function(){for(var e,n,i=this.iterator,a=this.predicate,s=this.next;;){if(e=r(t(s,i)),this.done=!!e.done)return;if(n=e.value,o(i,a,[n,this.counter++],!0))return n}});e({target:"Iterator",proto:!0,real:!0,forced:f},{filter:function(e){r(this);try{n(e)}catch(e){c(this,"throw",e)}return d?t(d,this,e):new m(i(this),{predicate:e})}})}();var Zo,Ko,es,ts,ns,rs,is,as,os,ss,cs,us={};function ls(){return Ko?Zo:(Ko=1,Zo={})}function hs(){if(ts)return es;ts=1;var e=ct(),t=ls(),n=e("iterator"),r=Array.prototype;return es=function(e){return void 0!==e&&(t.Array===e||r[n]===e)}}function ds(){if(rs)return ns;rs=1;var e=wr(),t=Te(),n=me(),r=ls(),i=ct()("iterator");return ns=function(a){if(!n(a))return t(a,i)||t(a,"@@iterator")||r[e(a)]}}function fs(){if(as)return is;as=1;var e=_(),t=Ie(),n=Et(),r=Ce(),i=ds(),a=TypeError;return is=function(o,s){var c=arguments.length<2?i(o):s;if(t(c))return n(e(c,o));throw new a(r(o)+" is not iterable")},is}function ms(){if(ss)return os;ss=1;var e=Jr(),t=_(),n=Et(),r=Ce(),i=hs(),a=vn(),o=_e(),s=fs(),c=ds(),u=Yo(),l=TypeError,h=function(e,t){this.stopped=e,this.result=t},d=h.prototype;return os=function(f,m,g){var p,v,y,A,_,b,w,E=g&&g.that,x=!(!g||!g.AS_ENTRIES),S=!(!g||!g.IS_RECORD),C=!(!g||!g.IS_ITERATOR),I=!(!g||!g.INTERRUPTED),T=e(m,E),R=function(e){return p&&u(p,"normal"),new h(!0,e)},P=function(e){return x?(n(e),I?T(e[0],e[1],R):T(e[0],e[1])):I?T(e,R):T(e)};if(S)p=f.iterator;else if(C)p=f;else{if(!(v=c(f)))throw new l(r(f)+" is not iterable");if(i(v)){for(y=0,A=a(f);A>y;y++)if((_=P(f[y]))&&o(d,_))return _;return new h(!1)}p=s(f,v)}for(b=S?f.next:p.next;!(w=t(b,p)).done;){try{_=P(w.value)}catch(e){u(p,"throw",e)}if("object"==typeof _&&_&&o(d,_))return _}return new h(!1)}}!function(){if(cs)return us;cs=1;var e=mr(),t=_(),n=ms(),r=Ie(),i=Et(),a=Go(),o=Yo(),s=$o()("find",TypeError);e({target:"Iterator",proto:!0,real:!0,forced:s},{find:function(e){i(this);try{r(e)}catch(e){o(this,"throw",e)}if(s)return t(s,this,e);var c=a(this),u=0;return n(c,function(t,n){if(e(t,u++))return n(t)},{IS_RECORD:!0,INTERRUPTED:!0}).result}})}();var gs,ps,vs,ys={};function As(){if(ps)return gs;ps=1;var e=_(),t=Et(),n=Go(),r=ds();return gs=function(i,a){a&&"string"==typeof i||t(i);var o=r(i);return n(t(void 0!==o?e(o,i):i))}}!function(){if(vs)return ys;vs=1;var e=mr(),t=_(),n=Ie(),r=Et(),i=Go(),a=As(),o=Xo(),s=Yo(),c=tt(),u=Jo(),l=$o(),h=!c&&!u("flatMap",function(){}),d=!c&&!h&&l("flatMap",TypeError),f=c||h||d,m=o(function(){for(var e,n,i=this.iterator,o=this.mapper;;){if(n=this.inner)try{if(!(e=r(t(n.next,n.iterator))).done)return e.value;this.inner=null}catch(e){s(i,"throw",e)}if(e=r(t(this.next,i)),this.done=!!e.done)return;try{this.inner=a(o(e.value,this.counter++),!1)}catch(e){s(i,"throw",e)}}});e({target:"Iterator",proto:!0,real:!0,forced:f},{flatMap:function(e){r(this);try{n(e)}catch(e){s(this,"throw",e)}return d?t(d,this,e):new m(i(this),{mapper:e,inner:null})}})}();var _s,bs={};!function(){if(_s)return bs;_s=1;var e=mr(),t=_(),n=ms(),r=Ie(),i=Et(),a=Go(),o=Yo(),s=$o()("forEach",TypeError);e({target:"Iterator",proto:!0,real:!0,forced:s},{forEach:function(e){i(this);try{r(e)}catch(e){o(this,"throw",e)}if(s)return t(s,this,e);var c=a(this),u=0;n(c,function(t){e(t,u++)},{IS_RECORD:!0})}})}();var ws,Es={};!function(){if(ws)return Es;ws=1;var e=mr(),t=_(),n=Ie(),r=Et(),i=Go(),a=Xo(),o=Qo(),s=Yo(),c=Jo(),u=$o(),l=tt(),h=!l&&!c("map",function(){}),d=!l&&!h&&u("map",TypeError),f=l||h||d,m=a(function(){var e=this.iterator,n=r(t(this.next,e));if(!(this.done=!!n.done))return o(e,this.mapper,[n.value,this.counter++],!0)});e({target:"Iterator",proto:!0,real:!0,forced:f},{map:function(e){r(this);try{n(e)}catch(e){s(this,"throw",e)}return d?t(d,this,e):new m(i(this),{mapper:e})}})}();var xs,Ss,Cs,Is={};!function(){if(Cs)return Is;Cs=1;var e=mr(),t=Ae(),n=gr(),r=_(),i=he(),a=v(),o=ve(),s=Se(),c=xi(),u=function(){if(Ss)return xs;Ss=1;var e=he(),t=Vr(),n=ve(),r=de(),i=Er(),a=e([].push);return xs=function(e){if(n(e))return e;if(t(e)){for(var o=e.length,s=[],c=0;cb)","g");return"b"!==e.exec("b").groups.a||"bc"!=="b".replace(e,"$c")})}!function(){if(Gs)return qs;Gs=1;var e=y(),t=s(),n=he(),r=fr(),i=br(),a=St(),o=Hi(),c=_n().f,u=_e(),l=function(){if(ks)return Ps;ks=1;var e=ye(),t=de(),n=ct()("match");return Ps=function(r){var i;return e(r)&&(void 0!==(i=r[n])?!!i:"RegExp"===t(r))}}(),h=Er(),d=Vs(),f=Xs(),m=_r(),g=Xt(),p=v(),A=ot(),_=Yt().enforce,b=Ua(),w=ct(),E=Qs(),x=Js(),S=w("match"),C=t.RegExp,I=C.prototype,T=t.SyntaxError,R=n(I.exec),P=n("".charAt),k=n("".replace),M=n("".indexOf),O=n("".slice),L=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,B=/a/g,D=/a/g,U=new C(B)!==B,F=f.MISSED_STICKY,N=f.UNSUPPORTED_Y,j=e&&(!U||F||E||x||p(function(){return D[S]=!1,C(B)!==B||C(D)===D||"/a/i"!==String(C(B,"i"))}));if(r("RegExp",j)){for(var W=function(e,t){var n,r,s,c,f,m,g=u(I,this),p=l(e),v=void 0===t,y=[],b=e;if(!g&&p&&v&&e.constructor===W)return e;if((p||u(I,e))&&(e=e.source,v&&(t=d(b))),e=void 0===e?"":h(e),t=void 0===t?"":h(t),b=e,E&&"dotAll"in B&&(r=!!t&&M(t,"s")>-1)&&(t=k(t,/s/g,"")),n=t,F&&"sticky"in B&&(s=!!t&&M(t,"y")>-1)&&N&&(t=k(t,/y/g,"")),x&&(c=function(e){for(var t,n=e.length,r=0,i="",a=[],s=o(null),c=!1,u=!1,l=0,h="";r<=n;r++){if("\\"===(t=P(e,r)))t+=P(e,++r);else if("]"===t)c=!1;else if(!c)switch(!0){case"["===t:c=!0;break;case"("===t:if(i+=t,"?:"===O(e,r+1,r+3))continue;R(L,O(e,r+1))&&(r+=2,u=!0),l++;continue;case">"===t&&u:if(""===h||A(s,h))throw new T("Invalid capture group name");s[h]=!0,a[a.length]=[h,l],u=!1,h="";continue}u?h+=t:i+=t}return[i,a]}(e),e=c[0],y=c[1]),f=i(C(e,t),g?this:I,W),(r||s||y.length)&&(m=_(f),r&&(m.dotAll=!0,m.raw=W(function(e){for(var t,n=e.length,r=0,i="",a=!1;r<=n;r++)"\\"!==(t=P(e,r))?a||"."!==t?("["===t?a=!0:"]"===t&&(a=!1),i+=t):i+="[\\s\\S]":i+=t+P(e,++r);return i}(e),n)),s&&(m.sticky=!0),y.length&&(m.groups=y)),e!==b)try{a(f,"source",""===b?"(?:)":b)}catch(e){}return f},z=c(C),H=0;z.length>H;)m(W,C,z[H++]);I.constructor=W,W.prototype=I,g(t,"RegExp",W,{constructor:!0})}b("RegExp")}();var $s,Zs={};!function(){if($s)return Zs;$s=1;var e=y(),t=Qs(),n=de(),r=Ia(),i=Yt().get,a=RegExp.prototype,o=TypeError;e&&t&&r(a,"dotAll",{configurable:!0,get:function(){if(this!==a){if("RegExp"===n(this))return!!i(this).dotAll;throw new o("Incompatible receiver, RegExp required")}}})}();var Ks,ec,tc,nc={};function rc(){if(ec)return Ks;ec=1;var e,t,n=_(),r=he(),i=Er(),a=Ys(),o=Xs(),s=it(),c=Hi(),u=Yt().get,l=Qs(),h=Js(),d=s("native-string-replace",String.prototype.replace),f=RegExp.prototype.exec,m=f,g=r("".charAt),p=r("".indexOf),v=r("".replace),y=r("".slice),A=(t=/b*/g,n(f,e=/a/,"a"),n(f,t,"a"),0!==e.lastIndex||0!==t.lastIndex),b=o.BROKEN_CARET,w=void 0!==/()??/.exec("")[1];return(A||w||b||l||h)&&(m=function(e){var t,r,o,s,l,h,_,E=this,x=u(E),S=i(e),C=x.raw;if(C)return C.lastIndex=E.lastIndex,t=n(m,C,S),E.lastIndex=C.lastIndex,t;var I=x.groups,T=b&&E.sticky,R=n(a,E),P=E.source,k=0,M=S;if(T&&(R=v(R,"y",""),-1===p(R,"g")&&(R+="g"),M=y(S,E.lastIndex),E.lastIndex>0&&(!E.multiline||E.multiline&&"\n"!==g(S,E.lastIndex-1))&&(P="(?: "+P+")",M=" "+M,k++),r=new RegExp("^(?:"+P+")",R)),w&&(r=new RegExp("^"+P+"$(?!\\s)",R)),A&&(o=E.lastIndex),s=n(f,T?r:E,M),T?s?(s.input=y(s.input,k),s[0]=y(s[0],k),s.index=E.lastIndex,E.lastIndex+=s[0].length):E.lastIndex=0:A&&s&&(E.lastIndex=E.global?s.index+s[0].length:o),w&&s&&s.length>1&&n(d,s[0],r,function(){for(l=1;l=f?e?"":void 0:(u=a(h,d))<55296||u>56319||d+1===f||(l=a(h,d+1))<56320||l>57343?e?i(h,d):u:e?o(h,d,d+2):l-56320+(u-55296<<10)+65536}};return sc={codeAt:s(!1),charAt:s(!0)}}function yc(){if(lc)return uc;lc=1;var e=vc().charAt;return uc=function(t,n,r){return n+(r?e(t,n).length:1)}}function Ac(){if(dc)return hc;dc=1;var e=he(),t=at(),n=Math.floor,r=e("".charAt),i=e("".replace),a=e("".slice),o=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,s=/\$([$&'`]|\d{1,2})/g;return hc=function(e,c,u,l,h,d){var f=u+e.length,m=l.length,g=s;return void 0!==h&&(h=t(h),g=o),i(d,g,function(t,i){var o;switch(r(i,0)){case"$":return"$";case"&":return e;case"`":return a(c,0,u);case"'":return a(c,f);case"<":o=h[a(i,1,-1)];break;default:var s=+i;if(0===s)return t;if(s>m){var d=n(s/10);return 0===d?t:d<=m?void 0===l[d-1]?r(i,1):l[d-1]+r(i,1):t}o=l[s-1]}return void 0===o?"":o})}}!function(){if(gc)return pc;gc=1;var e=gr(),t=_(),n=he(),r=function(){if(oc)return ac;oc=1,ic();var e=_(),t=Xt(),n=rc(),r=v(),i=ct(),a=St(),o=i("species"),s=RegExp.prototype;return ac=function(c,u,l,h){var d=i(c),f=!r(function(){var e={};return e[d]=function(){return 7},7!==""[c](e)}),m=f&&!r(function(){var e=!1,t=/a/;return"split"===c&&((t={}).constructor={},t.constructor[o]=function(){return t},t.flags="",t[d]=/./[d]),t.exec=function(){return e=!0,null},t[d](""),!e});if(!f||!m||l){var g=/./[d],p=u(d,""[c],function(t,r,i,a,o){var c=r.exec;return c===n||c===s.exec?f&&!o?{done:!0,value:e(g,r,i,a)}:{done:!0,value:e(t,i,r,a)}:{done:!1}});t(String.prototype,c,p[0]),t(s,d,p[1])}h&&a(s[d],"sham",!0)}}(),i=v(),a=Et(),o=ve(),s=ye(),c=mn(),u=pn(),l=Er(),h=ge(),d=yc(),f=Te(),m=Ac(),g=Vs(),p=function(){if(mc)return fc;mc=1;var e=_(),t=Et(),n=ve(),r=de(),i=rc(),a=TypeError;return fc=function(o,s){var c=o.exec;if(n(c)){var u=e(c,o,s);return null!==u&&t(u),u}if("RegExp"===r(o))return e(i,o,s);throw new a("RegExp#exec called on incompatible receiver")}}(),y=ct()("replace"),A=Math.max,b=Math.min,w=n([].concat),E=n([].push),x=n("".indexOf),S=n("".slice),C=function(e){return void 0===e?e:String(e)},I="$0"==="a".replace(/./,"$0"),T=!!/./[y]&&""===/./[y]("a","$0");r("replace",function(n,r,i){var v=T?"$":"$0";return[function(e,n){var i=h(this),a=s(e)?f(e,y):void 0;return a?t(a,e,i,n):t(r,l(i),e,n)},function(t,n){var s=a(this),h=l(t);if("string"==typeof n&&-1===x(n,v)&&-1===x(n,"$<")){var f=i(r,s,h,n);if(f.done)return f.value}var y=o(n);y||(n=l(n));var _,I=l(g(s)),T=-1!==x(I,"g");T&&(_=-1!==x(I,"u"),s.lastIndex=0);for(var R,P=[];null!==(R=p(s,h))&&(E(P,R),T);){""===l(R[0])&&(s.lastIndex=d(h,u(s.lastIndex),_))}for(var k="",M=0,O=0;O=M&&(k+=S(h,M,D)+L,M=D+B.length)}return k+S(h,M)}]},!!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})||!I||T)}();var _c,bc,wc,Ec,xc,Sc,Cc,Ic={};function Tc(){return bc?_c:(bc=1,_c="\t\n\v\f\r                 \u2028\u2029\ufeff")}!function(){if(Cc)return Ic;Cc=1;var e=mr(),t=function(){if(Ec)return wc;Ec=1;var e=he(),t=ge(),n=Er(),r=Tc(),i=e("".replace),a=RegExp("^["+r+"]+"),o=RegExp("(^|[^"+r+"])["+r+"]+$"),s=function(e){return function(r){var s=n(t(r));return 1&e&&(s=i(s,a,"")),2&e&&(s=i(s,o,"$1")),s}};return wc={start:s(1),end:s(2),trim:s(3)}}().trim,n=function(){if(Sc)return xc;Sc=1;var e=zt().PROPER,t=v(),n=Tc();return xc=function(r){return t(function(){return!!n[r]()||"​…᠎"!=="​…᠎"[r]()||e&&n[r].name!==r})}}();e({target:"String",proto:!0,forced:n("trim")},{trim:function(){return t(this)}})}();var Rc,Pc,kc,Mc,Oc,Lc,Bc,Dc,Uc,Fc,Nc,jc,Wc,zc,Hc,Gc,qc,Yc,Vc,Xc,Qc,Jc,$c,Zc,Kc,eu,tu,nu,ru={exports:{}};function iu(){if(Pc)return Rc;Pc=1;var e=ct()("iterator"),t=!1;try{var n=0,r={next:function(){return{done:!!n++}},return:function(){t=!0}};r[e]=function(){return this},Array.from(r,function(){throw 2})}catch(e){}return Rc=function(n,r){try{if(!r&&!t)return!1}catch(e){return!1}var i=!1;try{var a={};a[e]=function(){return{next:function(){return{done:i=!0}}}},n(a)}catch(e){}return i}}function au(){if(Mc)return kc;Mc=1;var e,t,n,r=Ca(),i=y(),a=s(),o=ve(),c=ye(),u=ot(),l=wr(),h=Ce(),d=St(),f=Xt(),m=Ia(),g=_e(),p=Oa(),v=Ar(),A=ct(),_=st(),b=Yt(),w=b.enforce,E=b.get,x=a.Int8Array,S=x&&x.prototype,C=a.Uint8ClampedArray,I=C&&C.prototype,T=x&&p(x),R=S&&p(S),P=Object.prototype,k=a.TypeError,M=A("toStringTag"),O=_("TYPED_ARRAY_TAG"),L="TypedArrayConstructor",B=r&&!!v&&"Opera"!==l(a.opera),D=!1,U={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},F={BigInt64Array:8,BigUint64Array:8},N=function(e){var t=p(e);if(c(t)){var n=E(t);return n&&u(n,L)?n[L]:N(t)}},j=function(e){if(!c(e))return!1;var t=l(e);return u(U,t)||u(F,t)};for(e in U)(n=(t=a[e])&&t.prototype)?w(n)[L]=t:B=!1;for(e in F)(n=(t=a[e])&&t.prototype)&&(w(n)[L]=t);if((!B||!o(T)||T===Function.prototype)&&(T=function(){throw new k("Incorrect invocation")},B))for(e in U)a[e]&&v(a[e],T);if((!B||!R||R===P)&&(R=T.prototype,B))for(e in U)a[e]&&v(a[e].prototype,R);if(B&&p(I)!==R&&v(I,R),i&&!u(R,M))for(e in D=!0,m(R,M,{configurable:!0,get:function(){return c(this)?this[O]:void 0}}),U)a[e]&&d(a[e],O,e);return kc={NATIVE_ARRAY_BUFFER_VIEWS:B,TYPED_ARRAY_TAG:D&&O,aTypedArray:function(e){if(j(e))return e;throw new k("Target is not a typed array")},aTypedArrayConstructor:function(e){if(o(e)&&(!v||g(T,e)))return e;throw new k(h(e)+" is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n,r){if(i){if(n)for(var o in U){var s=a[o];if(s&&u(s.prototype,e))try{delete s.prototype[e]}catch(n){try{s.prototype[e]=t}catch(e){}}}R[e]&&!n||f(R,e,n?t:B&&S[e]||t,r)}},exportTypedArrayStaticMethod:function(e,t,n){var r,o;if(i){if(v){if(n)for(r in U)if((o=a[r])&&u(o,e))try{delete o[e]}catch(e){}if(T[e]&&!n)return;try{return f(T,e,n?t:B&&T[e]||t)}catch(e){}}for(r in U)!(o=a[r])||o[e]&&!n||f(o,e,t)}},getTypedArrayConstructor:N,isView:function(e){if(!c(e))return!1;var t=l(e);return"DataView"===t||u(U,t)||u(F,t)},isTypedArray:j,TypedArray:T,TypedArrayPrototype:R}}function ou(){if(Dc)return Bc;Dc=1;var e=ye(),t=Math.floor;return Bc=Number.isInteger||function(n){return!e(n)&&isFinite(n)&&t(n)===n}}function su(){if(Fc)return Uc;Fc=1;var e=mn(),t=RangeError;return Uc=function(n){var r=e(n);if(r<0)throw new t("The argument can't be less than 0");return r}}function cu(){if(jc)return Nc;jc=1;var e=su(),t=RangeError;return Nc=function(n,r){var i=e(n);if(i%r)throw new t("Wrong offset");return i}}function uu(){if(zc)return Wc;zc=1;var e=Math.round;return Wc=function(t){var n=e(t);return n<0?0:n>255?255:255&n}}function lu(){if(Gc)return Hc;Gc=1;var e=Zr(),t=Ce(),n=TypeError;return Hc=function(r){if(e(r))return r;throw new n(t(r)+" is not a constructor")}}function hu(){if(Yc)return qc;Yc=1;var e=wr();return qc=function(t){var n=e(t);return"BigInt64Array"===n||"BigUint64Array"===n}}function du(){if(Xc)return Vc;Xc=1;var e=ut(),t=TypeError;return Vc=function(n){var r=e(n,"number");if("number"==typeof r)throw new t("Can't convert number to bigint");return BigInt(r)}}function fu(){if(Jc)return Qc;Jc=1;var e=Jr(),t=_(),n=lu(),r=at(),i=vn(),a=fs(),o=ds(),s=hs(),c=hu(),u=au().aTypedArrayConstructor,l=du();return Qc=function(h){var d,f,m,g,p,v,y,A,_=n(this),b=r(h),w=arguments.length,E=w>1?arguments[1]:void 0,x=void 0!==E,S=o(b);if(S&&!s(S))for(A=(y=a(b,S)).next,b=[];!(v=t(A,y)).done;)b.push(v.value);for(x&&w>2&&(E=e(E,arguments[2])),f=i(b),m=new(u(_))(f),g=c(m),d=0;f>d;d++)p=x?E(b[d],d):b[d],m[d]=g?l(p):+p;return m},Qc}function mu(){if(eu)return Kc;eu=1;var e=vn();return Kc=function(t,n,r){for(var i=0,a=arguments.length>2?r:e(n),o=new t(a);a>i;)o[i]=n[i++];return o},Kc}function gu(){if(tu)return ru.exports;tu=1;var e=mr(),t=s(),n=_(),r=y(),i=function(){if(Lc)return Oc;Lc=1;var e=s(),t=v(),n=iu(),r=au().NATIVE_ARRAY_BUFFER_VIEWS,i=e.ArrayBuffer,a=e.Int8Array;return Oc=!r||!t(function(){a(1)})||!t(function(){new a(-1)})||!n(function(e){new a,new a(null),new a(1.5),new a(e)},!0)||t(function(){return 1!==new a(new i(2),1,void 0).length})}(),a=au(),o=Da(),c=Ra(),u=le(),l=St(),h=ou(),d=pn(),f=Pa(),m=cu(),g=uu(),p=lt(),A=ot(),b=wr(),w=ye(),E=Se(),x=Hi(),S=_e(),C=Ar(),I=_n().f,T=fu(),R=function(){if(Zc)return $c;Zc=1;var e=Jr(),t=he(),n=fe(),r=at(),i=vn(),a=ei(),o=t([].push),s=function(t){var s=1===t,c=2===t,u=3===t,l=4===t,h=6===t,d=7===t,f=5===t||h;return function(m,g,p,v){for(var y,A,_=r(m),b=n(_),w=i(b),E=e(g,p),x=0,S=v||a,C=s?S(m,w):c||d?S(m,0):void 0;w>x;x++)if((f||x in b)&&(A=E(y=b[x],x,_),t))if(s)C[x]=A;else if(A)switch(t){case 3:return!0;case 5:return y;case 6:return x;case 2:o(C,y)}else switch(t){case 4:return!1;case 7:o(C,y)}return h?-1:u||l?l:C}};return $c={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6),filterReject:s(7)}}().forEach,P=Ua(),k=Ia(),M=xt(),O=ft(),L=mu(),B=Yt(),D=br(),U=B.get,F=B.set,N=B.enforce,j=M.f,W=O.f,z=t.RangeError,H=o.ArrayBuffer,G=H.prototype,q=o.DataView,Y=a.NATIVE_ARRAY_BUFFER_VIEWS,V=a.TYPED_ARRAY_TAG,X=a.TypedArray,Q=a.TypedArrayPrototype,J=a.isTypedArray,$="BYTES_PER_ELEMENT",Z="Wrong length",K=function(e,t){k(e,t,{configurable:!0,get:function(){return U(this)[t]}})},ee=function(e){var t;return S(G,e)||"ArrayBuffer"===(t=b(e))||"SharedArrayBuffer"===t},te=function(e,t){return J(e)&&!E(t)&&t in e&&h(+t)&&t>=0},ne=function(e,t){return t=p(t),te(e,t)?u(2,e[t]):W(e,t)},re=function(e,t,n){return t=p(t),!(te(e,t)&&w(n)&&A(n,"value"))||A(n,"get")||A(n,"set")||n.configurable||A(n,"writable")&&!n.writable||A(n,"enumerable")&&!n.enumerable?j(e,t,n):(e[t]=n.value,e)};return r?(Y||(O.f=ne,M.f=re,K(Q,"buffer"),K(Q,"byteOffset"),K(Q,"byteLength"),K(Q,"length")),e({target:"Object",stat:!0,forced:!Y},{getOwnPropertyDescriptor:ne,defineProperty:re}),ru.exports=function(r,a,o){var s=r.match(/\d+/)[0]/8,u=r+(o?"Clamped":"")+"Array",h="get"+r,p="set"+r,v=t[u],y=v,A=y&&y.prototype,_={},b=function(e,t){j(e,t,{get:function(){return function(e,t){var n=U(e);return n.view[h](t*s+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,n){var r=U(e);r.view[p](t*s+r.byteOffset,o?g(n):n,!0)}(this,t,e)},enumerable:!0})};Y?i&&(y=a(function(e,t,r,i){return c(e,A),D(w(t)?ee(t)?void 0!==i?new v(t,m(r,s),i):void 0!==r?new v(t,m(r,s)):new v(t):J(t)?L(y,t):n(T,y,t):new v(f(t)),e,y)}),C&&C(y,X),R(I(v),function(e){e in y||l(y,e,v[e])}),y.prototype=A):(y=a(function(e,t,r,i){c(e,A);var a,o,u,l=0,h=0;if(w(t)){if(!ee(t))return J(t)?L(y,t):n(T,y,t);a=t,h=m(r,s);var g=t.byteLength;if(void 0===i){if(g%s)throw new z(Z);if((o=g-h)<0)throw new z(Z)}else if((o=d(i)*s)+h>g)throw new z(Z);u=o/s}else u=f(t),a=new H(o=u*s);for(F(e,{buffer:a,byteOffset:h,byteLength:o,length:u,view:new q(a)});l=0?o:a+o;return s<0||s>=a?void 0:i[s]})}();var yu,Au={};!function(){if(yu)return Au;yu=1;var e=au(),t=La(),n=du(),r=wr(),i=_(),a=he(),o=v(),s=e.aTypedArray,c=e.exportTypedArrayMethod,u=a("".slice);c("fill",function(e){var a=arguments.length;s(this);var o="Big"===u(r(this),0,3)?n(e):+e;return i(t,this,o,a>1?arguments[1]:void 0,a>2?arguments[2]:void 0)},o(function(){var e=0;return new Int8Array(2).fill({valueOf:function(){return e++}}),1!==e}))}();var _u,bu,wu,Eu={};function xu(){if(bu)return _u;bu=1;var e=Jr(),t=fe(),n=at(),r=vn(),i=function(i){var a=1===i;return function(o,s,c){for(var u,l=n(o),h=t(l),d=r(h),f=e(s,c);d-- >0;)if(f(u=h[d],d,l))switch(i){case 0:return u;case 1:return d}return a?-1:void 0}};return _u={findLast:i(0),findLastIndex:i(1)}}!function(){if(wu)return Eu;wu=1;var e=au(),t=xu().findLast,n=e.aTypedArray;(0,e.exportTypedArrayMethod)("findLast",function(e){return t(n(this),e,arguments.length>1?arguments[1]:void 0)})}();var Su,Cu={};!function(){if(Su)return Cu;Su=1;var e=au(),t=xu().findLastIndex,n=e.aTypedArray;(0,e.exportTypedArrayMethod)("findLastIndex",function(e){return t(n(this),e,arguments.length>1?arguments[1]:void 0)})}();var Iu,Tu={};!function(){if(Iu)return Tu;Iu=1;var e=s(),t=_(),n=au(),r=vn(),i=cu(),a=at(),o=v(),c=e.RangeError,u=e.Int8Array,l=u&&u.prototype,h=l&&l.set,d=n.aTypedArray,f=n.exportTypedArrayMethod,m=!o(function(){var e=new Uint8ClampedArray(2);return t(h,e,{length:1,0:3},1),3!==e[1]}),g=m&&n.NATIVE_ARRAY_BUFFER_VIEWS&&o(function(){var e=new u(2);return e.set(1),e.set("2",1),0!==e[0]||2!==e[1]});f("set",function(e){d(this);var n=i(arguments.length>1?arguments[1]:void 0,1),o=a(e);if(m)return t(h,this,o,n);var s=this.length,u=r(o),l=0;if(u+n>s)throw new c("Wrong length");for(;l0&&1/n<0?1:-1:t>n}}(e))},!p||g)}();var ku,Mu,Ou,Lu={};function Bu(){if(Mu)return ku;Mu=1;var e=vn();return ku=function(t,n){for(var r=e(t),i=new n(r),a=0;a=s||u<0)throw new n("Incorrect index");for(var l=new i(s),h=0;h=t.length)return e.target=null,o(void 0,!0);switch(e.kind){case"keys":return o(n,!1);case"values":return o(t[n],!1)}return o([n,t[n]],!1)},"values");var d=n.Arguments=n.Array;if(t("keys"),t("values"),t("entries"),!s&&c&&"values"!==d.name)try{i(d,"name",{value:"values"})}catch(e){}return $u}!function(){if(Ku)return el;Ku=1;var e=s(),t=Gu?Hu:(Gu=1,Hu={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}),n=function(){if(Yu)return qu;Yu=1;var e=ht()("span").classList,t=e&&e.constructor&&e.constructor.prototype;return qu=t===Object.prototype?void 0:t}(),r=rl(),i=St(),a=Ba(),o=ct()("iterator"),c=r.values,u=function(e,n){if(e){if(e[o]!==c)try{i(e,o,c)}catch(t){e[o]=c}if(a(e,n,!0),t[n])for(var s in r)if(e[s]!==r[s])try{i(e,s,r[s])}catch(t){e[s]=r[s]}}};for(var l in t)u(e[l]&&e[l].prototype,l);u(n,"DOMTokenList")}();var il,al,ol,sl,cl,ul={};function ll(){if(al)return il;al=1;var e=y(),t=v(),n=Et(),r=xr(),i=Error.prototype.toString,a=t(function(){if(e){var t=Object.create(Object.defineProperty({},"name",{get:function(){return this===t}}));if("true"!==i.call(t))return!0}return"2: 1"!==i.call({message:1,name:2})||"Error"!==i.call({})});return il=a?function(){var e=n(this),t=r(e.name,"Error"),i=r(e.message);return t?i?t+": "+i:t:i}:i}function hl(){return sl?ol:(sl=1,ol={IndexSizeError:{s:"INDEX_SIZE_ERR",c:1,m:1},DOMStringSizeError:{s:"DOMSTRING_SIZE_ERR",c:2,m:0},HierarchyRequestError:{s:"HIERARCHY_REQUEST_ERR",c:3,m:1},WrongDocumentError:{s:"WRONG_DOCUMENT_ERR",c:4,m:1},InvalidCharacterError:{s:"INVALID_CHARACTER_ERR",c:5,m:1},NoDataAllowedError:{s:"NO_DATA_ALLOWED_ERR",c:6,m:0},NoModificationAllowedError:{s:"NO_MODIFICATION_ALLOWED_ERR",c:7,m:1},NotFoundError:{s:"NOT_FOUND_ERR",c:8,m:1},NotSupportedError:{s:"NOT_SUPPORTED_ERR",c:9,m:1},InUseAttributeError:{s:"INUSE_ATTRIBUTE_ERR",c:10,m:1},InvalidStateError:{s:"INVALID_STATE_ERR",c:11,m:1},SyntaxError:{s:"SYNTAX_ERR",c:12,m:1},InvalidModificationError:{s:"INVALID_MODIFICATION_ERR",c:13,m:1},NamespaceError:{s:"NAMESPACE_ERR",c:14,m:1},InvalidAccessError:{s:"INVALID_ACCESS_ERR",c:15,m:1},ValidationError:{s:"VALIDATION_ERR",c:16,m:0},TypeMismatchError:{s:"TYPE_MISMATCH_ERR",c:17,m:1},SecurityError:{s:"SECURITY_ERR",c:18,m:1},NetworkError:{s:"NETWORK_ERR",c:19,m:1},AbortError:{s:"ABORT_ERR",c:20,m:1},URLMismatchError:{s:"URL_MISMATCH_ERR",c:21,m:1},QuotaExceededError:{s:"QUOTA_EXCEEDED_ERR",c:22,m:1},TimeoutError:{s:"TIMEOUT_ERR",c:23,m:1},InvalidNodeTypeError:{s:"INVALID_NODE_TYPE_ERR",c:24,m:1},DataCloneError:{s:"DATA_CLONE_ERR",c:25,m:1}})}!function(){if(cl)return ul;cl=1;var e=mr(),t=Ae(),n=ho(),r=v(),i=Hi(),a=le(),o=xt().f,s=Xt(),c=Ia(),u=ot(),l=Ra(),h=Et(),d=ll(),f=xr(),m=hl(),g=Cr(),p=Yt(),A=y(),_=tt(),b="DOMException",w="DATA_CLONE_ERR",E=t("Error"),x=t(b)||function(){try{(new(t("MessageChannel")||n("worker_threads").MessageChannel)).port1.postMessage(new WeakMap)}catch(e){if(e.name===w&&25===e.code)return e.constructor}}(),S=x&&x.prototype,C=E.prototype,I=p.set,T=p.getterFor(b),R="stack"in new E(b),P=function(e){return u(m,e)&&m[e].m?m[e].c:0},k=function(){l(this,M);var e=arguments.length,t=f(e<1?void 0:arguments[0]),n=f(e<2?void 0:arguments[1],"Error"),r=P(n);if(I(this,{type:b,name:n,message:t,code:r}),A||(this.name=n,this.message=t,this.code=r),R){var i=new E(t);i.name=b,o(this,"stack",a(1,g(i.stack,1)))}},M=k.prototype=i(C),O=function(e){return{enumerable:!0,configurable:!0,get:e}},L=function(e){return O(function(){return T(this)[e]})};A&&(c(M,"code",L("code")),c(M,"message",L("message")),c(M,"name",L("name"))),o(M,"constructor",a(1,k));var B=r(function(){return!(new x instanceof E)}),D=B||r(function(){return C.toString!==d||"2: 1"!==String(new x(1,2))}),U=B||r(function(){return 25!==new x(1,"DataCloneError").code}),F=B||25!==x[w]||25!==S[w],N=_?D||U||F:B;e({global:!0,constructor:!0,forced:N},{DOMException:N?k:x});var j=t(b),W=j.prototype;for(var z in D&&(_||x===j)&&s(W,"toString",d),U&&A&&x===j&&c(W,"code",O(function(){return P(h(this).name)})),m)if(u(m,z)){var H=m[z],G=H.s,q=a(6,H.c);u(j,G)||o(j,G,q),u(W,G)||o(W,G,q)}}();var dl,fl={};!function(){if(dl)return fl;dl=1;var e=mr(),t=s(),n=Ae(),r=le(),i=xt().f,a=ot(),o=Ra(),c=br(),u=xr(),l=hl(),h=Cr(),d=y(),f=tt(),m="DOMException",g=n("Error"),p=n(m),v=function(){o(this,A);var e=arguments.length,t=u(e<1?void 0:arguments[0]),n=u(e<2?void 0:arguments[1],"Error"),a=new p(t,n),s=new g(t);return s.name=m,i(a,"stack",r(1,h(s.stack,1))),c(a,this,v),a},A=v.prototype=p.prototype,_="stack"in new g(m),b="stack"in new p(1,2),w=p&&d&&Object.getOwnPropertyDescriptor(t,m),E=!(!w||w.writable&&w.configurable),x=_&&!E&&!b;e({global:!0,constructor:!0,forced:f||x},{DOMException:x?v:p});var S=n(m),C=S.prototype;if(C.constructor!==S)for(var I in f||i(C,"constructor",r(1,S)),l)if(a(l,I)){var T=l[I],R=T.s;a(S,R)||i(S,R,r(6,T.c))}}();var ml,gl={};!function(){if(ml)return gl;ml=1;var e=Ae(),t="DOMException";Ba()(e(t),t)}();var pl,vl={};!function(){if(pl)return vl;pl=1;var e=mr(),t=s(),n=Ia(),r=y(),i=TypeError,a=Object.defineProperty,o=t.self!==t;try{if(r){var c=Object.getOwnPropertyDescriptor(t,"self");!o&&c&&c.get&&c.enumerable||n(t,"self",{get:function(){return t},set:function(e){if(this!==t)throw new i("Illegal invocation");a(t,"self",{value:e,writable:!0,configurable:!0,enumerable:!0})},configurable:!0,enumerable:!0})}else e({global:!0,simple:!0,forced:o},{self:t})}catch(e){}}();var yl,Al,_l,bl,wl,El,xl,Sl,Cl,Il,Tl,Rl={},Pl={};function kl(){if(_l)return Al;_l=1;var e=v(),t=ct(),n=y(),r=tt(),i=t("iterator");return Al=!e(function(){var e=new URL("b?a=1&b=2&c=3","https://a"),t=e.searchParams,a=new URLSearchParams("a=1&a=2&b=3"),o="";return e.pathname="c%20d",t.forEach(function(e,n){t.delete("b"),o+=n+e}),a.delete("a",2),a.delete("b",void 0),r&&(!e.toJSON||!a.has("a",1)||a.has("a",2)||!a.has("a",void 0)||a.has("b"))||!t.size&&(r||!n)||!t.sort||"https://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[i]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("https://тест").host||"#%D0%B1"!==new URL("https://a#б").hash||"a1c3"!==o||"x"!==new URL("https://x",void 0).host})}function Ml(){if(xl)return El;xl=1;var e=Jr(),t=_(),n=at(),r=Qo(),i=hs(),a=Zr(),o=vn(),s=xo(),c=fs(),u=ds(),l=Array;return El=function(h){var d=n(h),f=a(this),m=arguments.length,g=m>1?arguments[1]:void 0,p=void 0!==g;p&&(g=e(g,m>2?arguments[2]:void 0));var v,y,A,_,b,w,E=u(d),x=0;if(!E||this===l&&i(E))for(v=o(d),y=f?new this(v):l(v);v>x;x++)w=p?g(d[x],x):d[x],s(y,x,w);else for(y=f?new this:[],b=(_=c(d,E)).next;!(A=t(b,_)).done;x++)w=p?r(_,g,[A.value,x],!0):A.value,s(y,x,w);return y.length=x,y},El}function Ol(){if(Cl)return Sl;Cl=1;var e=he(),t=2147483647,n=/[^\0-\u007E]/,r=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",a=RangeError,o=e(r.exec),s=Math.floor,c=String.fromCharCode,u=e("".charCodeAt),l=e([].join),h=e([].push),d=e("".replace),f=e("".split),m=e("".toLowerCase),g=function(e){return e+22+75*(e<26)},p=function(e,t,n){var r=0;for(e=n?s(e/700):e>>1,e+=s(e/t);e>455;)e=s(e/35),r+=36;return s(r+36*e/(e+38))},v=function(e){var n=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&i<=56319&&n=f&&o<_&&(_=o);var b=A+1;if(_-f>s((t-m)/b))throw new a(i);for(m+=(_-f)*b,f=_,r=0;rt)throw new a(i);if(o===f){for(var w=m,E=36;;){var x=E<=v?1:E>=v+26?26:E-v;if(wc;){if(t=+arguments[c++],n(t,1114111)!==t)throw new r(t+" is not a valid code point");a[c]=t<65536?i(t):i(55296+((t-=65536)>>10),t%1024+56320)}return o(a,"")}})}();var e=mr(),t=s(),n=Hl(),r=Ae(),i=_(),a=he(),o=y(),c=kl(),u=Xt(),l=Ia(),h=Ta(),d=Ba(),f=tl(),m=Yt(),g=Ra(),p=ve(),v=ot(),A=Jr(),b=wr(),w=Et(),E=ye(),x=Er(),S=Hi(),C=le(),I=fs(),T=ds(),R=qo(),P=Ll(),k=ct(),M=Si(),O=k("iterator"),L="URLSearchParams",B=L+"Iterator",D=m.set,U=m.getterFor(L),F=m.getterFor(B),N=n("fetch"),j=n("Request"),W=n("Headers"),z=j&&j.prototype,H=W&&W.prototype,G=t.TypeError,q=t.encodeURIComponent,Y=String.fromCharCode,V=r("String","fromCodePoint"),X=parseInt,Q=a("".charAt),J=a([].join),$=a([].push),Z=a("".replace),K=a([].shift),ee=a([].splice),te=a("".split),ne=a("".slice),re=a(/./.exec),ie=/\+/g,ae=/^[0-9a-f]+$/i,oe=function(e,t){var n=ne(e,t,t+2);return re(ae,n)?X(n,16):NaN},se=function(e){for(var t=0,n=128;n>0&&0!==(e&n);n>>=1)t++;return t},ce=function(e){var t=null;switch(e.length){case 1:t=e[0];break;case 2:t=(31&e[0])<<6|63&e[1];break;case 3:t=(15&e[0])<<12|(63&e[1])<<6|63&e[2];break;case 4:t=(7&e[0])<<18|(63&e[1])<<12|(63&e[2])<<6|63&e[3]}return t>1114111?null:t},ue=function(e){for(var t=(e=Z(e,ie," ")).length,n="",r=0;rt){n+="%",r++;continue}var a=oe(e,r+1);if(a!=a){n+=i,r++;continue}r+=2;var o=se(a);if(0===o)i=Y(a);else{if(1===o||o>4){n+="�",r++;continue}for(var s=[a],c=1;ct||"%"!==Q(e,r));){var u=oe(e,r+1);if(u!=u){r+=3;break}if(u>191||u<128)break;$(s,u),r+=2,c++}if(s.length!==o){n+="�";continue}var l=ce(s);null===l?n+="�":i=V(l)}}n+=i,r++}return n},de=/[!'()~]|%20/g,fe={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},me=function(e){return fe[e]},ge=function(e){return Z(q(e),de,me)},pe=f(function(e,t){D(this,{type:B,target:U(e).entries,index:0,kind:t})},L,function(){var e=F(this),t=e.target,n=e.index++;if(!t||n>=t.length)return e.target=null,R(void 0,!0);var r=t[n];switch(e.kind){case"keys":return R(r.key,!1);case"values":return R(r.value,!1)}return R([r.key,r.value],!1)},!0),_e=function(e){this.entries=[],this.url=null,void 0!==e&&(E(e)?this.parseObject(e):this.parseQuery("string"==typeof e?"?"===Q(e,0)?ne(e,1):e:x(e)))};_e.prototype={type:L,bindURL:function(e){this.url=e,this.update()},parseObject:function(e){var t,n,r,a,o,s,c,u=this.entries,l=T(e);if(l)for(n=(t=I(e,l)).next;!(r=i(n,t)).done;){if(o=(a=I(w(r.value))).next,(s=i(o,a)).done||(c=i(o,a)).done||!i(o,a).done)throw new G("Expected sequence with length 2");$(u,{key:x(s.value),value:x(c.value)})}else for(var h in e)v(e,h)&&$(u,{key:h,value:x(e[h])})},parseQuery:function(e){if(e)for(var t,n,r=this.entries,i=te(e,"&"),a=0;a0?arguments[0]:void 0));o||(this.size=e.entries.length)},we=be.prototype;if(h(we,{append:function(e,t){var n=U(this);P(arguments.length,2),$(n.entries,{key:x(e),value:x(t)}),o||this.length++,n.updateURL()},delete:function(e){for(var t=U(this),n=P(arguments.length,1),r=t.entries,i=x(e),a=n<2?void 0:arguments[1],s=void 0===a?a:x(a),c=0;ct.key?1:-1}),e.updateURL()},forEach:function(e){for(var t,n=U(this).entries,r=A(e,arguments.length>1?arguments[1]:void 0),i=0;i1?Se(arguments[1]):{})}}),p(j)){var Ce=function(e){return g(this,z),new j(e,arguments.length>1?Se(arguments[1]):{})};z.constructor=Ce,Ce.prototype=z,e({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:Ce})}}return Fl={URLSearchParams:be,getState:U}}function ql(){if(jl)return Rl;jl=1,function(){if(yl)return Pl;yl=1;var e=vc().charAt,t=Er(),n=Yt(),r=nl(),i=qo(),a="String Iterator",o=n.set,s=n.getterFor(a);r(String,"String",function(e){o(this,{type:a,string:t(e),index:0})},function(){var t,n=s(this),r=n.string,a=n.index;return a>=r.length?i(void 0,!0):(t=e(r,a),n.index+=t.length,i(t,!1))})}();var e,t=mr(),n=y(),r=kl(),i=s(),a=Jr(),o=he(),c=Xt(),u=Ia(),l=Ra(),h=ot(),d=function(){if(wl)return bl;wl=1;var e=y(),t=he(),n=_(),r=v(),i=Wi(),a=lr(),o=ue(),s=at(),c=fe(),u=Object.assign,l=Object.defineProperty,h=t([].concat);return bl=!u||r(function(){if(e&&1!==u({b:1},u(l({},"a",{enumerable:!0,get:function(){l(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},n={},r=Symbol("assign detection"),a="abcdefghijklmnopqrst";return t[r]=7,a.split("").forEach(function(e){n[e]=e}),7!==u({},t)[r]||i(u({},n)).join("")!==a})?function(t,r){for(var u=s(t),l=arguments.length,d=1,f=a.f,m=o.f;l>d;)for(var g,p=c(arguments[d++]),v=f?h(i(p),f(p)):i(p),y=v.length,A=0;y>A;)g=v[A++],e&&!n(m,p,g)||(u[g]=p[g]);return u}:u,bl}(),f=Ml(),m=xi(),g=vc().codeAt,p=Ol(),A=Er(),b=Ba(),w=Ll(),E=Gl(),x=Yt(),S=x.set,C=x.getterFor("URL"),I=E.URLSearchParams,T=E.getState,R=i.URL,P=i.TypeError,k=i.parseInt,M=Math.floor,O=Math.pow,L=o("".charAt),B=o(/./.exec),D=o([].join),U=o(1.1.toString),F=o([].pop),N=o([].push),j=o("".replace),W=o([].shift),z=o("".split),H=o("".slice),G=o("".toLowerCase),q=o([].unshift),Y="Invalid scheme",V="Invalid host",X="Invalid port",Q=/[a-z]/i,J=/[\d+-.a-z]/i,$=/\d/,Z=/^0x/i,K=/^[0-7]+$/,ee=/^\d+$/,te=/^[\da-f]+$/i,ne=/[\0\t\n\r #%/:<>?@[\\\]^|]/,re=/[\0\t\n\r #/:<>?@[\\\]^|]/,ie=/^[\u0000-\u0020]+/,ae=/(^|[^\u0000-\u0020])[\u0000-\u0020]+$/,oe=/[\t\n\r]/g,se=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)q(t,e%256),e=M(e/256);return D(t,".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,a=0;a<8;a++)0!==e[a]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=a),++i);return i>n?r:t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=U(e[n],16),n<7&&(t+=":")));return"["+t+"]"}return e},ce={},le=d({},ce,{" ":1,'"':1,"<":1,">":1,"`":1}),de=d({},le,{"#":1,"?":1,"{":1,"}":1}),me=d({},de,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),ge=function(e,t){var n=g(e,0);return n>32&&n<127&&!h(t,e)?e:encodeURIComponent(e)},pe={ftp:21,file:null,http:80,https:443,ws:80,wss:443},ve=function(e,t){var n;return 2===e.length&&B(Q,L(e,0))&&(":"===(n=L(e,1))||!t&&"|"===n)},ye=function(e){var t;return e.length>1&&ve(H(e,0,2))&&(2===e.length||"/"===(t=L(e,2))||"\\"===t||"?"===t||"#"===t)},Ae=function(e){return"."===e||"%2e"===G(e)},_e=function(e){return".."===(e=G(e))||"%2e."===e||".%2e"===e||"%2e%2e"===e},be={},we={},Ee={},xe={},Se={},Ce={},Ie={},Te={},Re={},Pe={},ke={},Me={},Oe={},Le={},Be={},De={},Ue={},Fe={},Ne={},je={},We={},ze=function(e,t,n){var r,i,a,o=A(e);if(t){if(i=this.parse(o))throw new P(i);this.searchParams=null}else{if(void 0!==n&&(r=new ze(n,!0)),i=this.parse(o,null,r))throw new P(i);(a=T(new I)).bindURL(this),this.searchParams=a}};ze.prototype={type:"URL",parse:function(t,n,r){var i,a,o,s,c=this,u=n||be,l=0,d="",g=!1,p=!1,v=!1;for(t=A(t),n||(c.scheme="",c.username="",c.password="",c.host=null,c.port=null,c.path=[],c.query=null,c.fragment=null,c.cannotBeABaseURL=!1,t=j(t,ie,""),t=j(t,ae,"$1")),t=j(t,oe,""),i=f(t);l<=i.length;){switch(a=i[l],u){case be:if(!a||!B(Q,a)){if(n)return Y;u=Ee;continue}d+=G(a),u=we;break;case we:if(a&&(B(J,a)||"+"===a||"-"===a||"."===a))d+=G(a);else{if(":"!==a){if(n)return Y;d="",u=Ee,l=0;continue}if(n&&(c.isSpecial()!==h(pe,d)||"file"===d&&(c.includesCredentials()||null!==c.port)||"file"===c.scheme&&!c.host))return;if(c.scheme=d,n)return void(c.isSpecial()&&pe[c.scheme]===c.port&&(c.port=null));d="","file"===c.scheme?u=Le:c.isSpecial()&&r&&r.scheme===c.scheme?u=xe:c.isSpecial()?u=Te:"/"===i[l+1]?(u=Se,l++):(c.cannotBeABaseURL=!0,N(c.path,""),u=Ne)}break;case Ee:if(!r||r.cannotBeABaseURL&&"#"!==a)return Y;if(r.cannotBeABaseURL&&"#"===a){c.scheme=r.scheme,c.path=m(r.path),c.query=r.query,c.fragment="",c.cannotBeABaseURL=!0,u=We;break}u="file"===r.scheme?Le:Ce;continue;case xe:if("/"!==a||"/"!==i[l+1]){u=Ce;continue}u=Re,l++;break;case Se:if("/"===a){u=Pe;break}u=Fe;continue;case Ce:if(c.scheme=r.scheme,a===e)c.username=r.username,c.password=r.password,c.host=r.host,c.port=r.port,c.path=m(r.path),c.query=r.query;else if("/"===a||"\\"===a&&c.isSpecial())u=Ie;else if("?"===a)c.username=r.username,c.password=r.password,c.host=r.host,c.port=r.port,c.path=m(r.path),c.query="",u=je;else{if("#"!==a){c.username=r.username,c.password=r.password,c.host=r.host,c.port=r.port,c.path=m(r.path),c.path.length--,u=Fe;continue}c.username=r.username,c.password=r.password,c.host=r.host,c.port=r.port,c.path=m(r.path),c.query=r.query,c.fragment="",u=We}break;case Ie:if(!c.isSpecial()||"/"!==a&&"\\"!==a){if("/"!==a){c.username=r.username,c.password=r.password,c.host=r.host,c.port=r.port,u=Fe;continue}u=Pe}else u=Re;break;case Te:if(u=Re,"/"!==a||"/"!==L(d,l+1))continue;l++;break;case Re:if("/"!==a&&"\\"!==a){u=Pe;continue}break;case Pe:if("@"===a){g&&(d="%40"+d),g=!0,o=f(d);for(var y=0;y65535)return X;c.port=c.isSpecial()&&w===pe[c.scheme]?null:w,d=""}if(n)return;u=Ue;continue}return X}d+=a;break;case Le:if(c.scheme="file","/"===a||"\\"===a)u=Be;else{if(!r||"file"!==r.scheme){u=Fe;continue}switch(a){case e:c.host=r.host,c.path=m(r.path),c.query=r.query;break;case"?":c.host=r.host,c.path=m(r.path),c.query="",u=je;break;case"#":c.host=r.host,c.path=m(r.path),c.query=r.query,c.fragment="",u=We;break;default:ye(D(m(i,l),""))||(c.host=r.host,c.path=m(r.path),c.shortenPath()),u=Fe;continue}}break;case Be:if("/"===a||"\\"===a){u=De;break}r&&"file"===r.scheme&&!ye(D(m(i,l),""))&&(ve(r.path[0],!0)?N(c.path,r.path[0]):c.host=r.host),u=Fe;continue;case De:if(a===e||"/"===a||"\\"===a||"?"===a||"#"===a){if(!n&&ve(d))u=Fe;else if(""===d){if(c.host="",n)return;u=Ue}else{if(s=c.parseHost(d))return s;if("localhost"===c.host&&(c.host=""),n)return;d="",u=Ue}continue}d+=a;break;case Ue:if(c.isSpecial()){if(u=Fe,"/"!==a&&"\\"!==a)continue}else if(n||"?"!==a)if(n||"#"!==a){if(a!==e&&(u=Fe,"/"!==a))continue}else c.fragment="",u=We;else c.query="",u=je;break;case Fe:if(a===e||"/"===a||"\\"===a&&c.isSpecial()||!n&&("?"===a||"#"===a)){if(_e(d)?(c.shortenPath(),"/"===a||"\\"===a&&c.isSpecial()||N(c.path,"")):Ae(d)?"/"===a||"\\"===a&&c.isSpecial()||N(c.path,""):("file"===c.scheme&&!c.path.length&&ve(d)&&(c.host&&(c.host=""),d=L(d,0)+":"),N(c.path,d)),d="","file"===c.scheme&&(a===e||"?"===a||"#"===a))for(;c.path.length>1&&""===c.path[0];)W(c.path);"?"===a?(c.query="",u=je):"#"===a&&(c.fragment="",u=We)}else d+=ge(a,de);break;case Ne:"?"===a?(c.query="",u=je):"#"===a?(c.fragment="",u=We):a!==e&&(c.path[0]+=ge(a,ce));break;case je:n||"#"!==a?a!==e&&("'"===a&&c.isSpecial()?c.query+="%27":c.query+="#"===a?"%23":ge(a,ce)):(c.fragment="",u=We);break;case We:a!==e&&(c.fragment+=ge(a,le))}l++}},parseHost:function(e){var t,n,r;if("["===L(e,0)){if("]"!==L(e,e.length-1))return V;if(t=function(e){var t,n,r,i,a,o,s,c=[0,0,0,0,0,0,0,0],u=0,l=null,h=0,d=function(){return L(e,h)};if(":"===d()){if(":"!==L(e,1))return;h+=2,l=++u}for(;d();){if(8===u)return;if(":"!==d()){for(t=n=0;n<4&&B(te,d());)t=16*t+k(d(),16),h++,n++;if("."===d()){if(0===n)return;if(h-=n,u>6)return;for(r=0;d();){if(i=null,r>0){if(!("."===d()&&r<4))return;h++}if(!B($,d()))return;for(;B($,d());){if(a=k(d(),10),null===i)i=a;else{if(0===i)return;i=10*i+a}if(i>255)return;h++}c[u]=256*c[u]+i,2!==++r&&4!==r||u++}if(4!==r)return;break}if(":"===d()){if(h++,!d())return}else if(d())return;c[u++]=t}else{if(null!==l)return;h++,l=++u}}if(null!==l)for(o=u-l,u=7;0!==u&&o>0;)s=c[u],c[u--]=c[l+o-1],c[l+--o]=s;else if(8!==u)return;return c}(H(e,1,-1)),!t)return V;this.host=t}else if(this.isSpecial()){if(e=p(e),B(ne,e))return V;if(t=function(e){var t,n,r,i,a,o,s,c=z(e,".");if(c.length&&""===c[c.length-1]&&c.length--,(t=c.length)>4)return e;for(n=[],r=0;r1&&"0"===L(i,0)&&(a=B(Z,i)?16:8,i=H(i,8===a?1:2)),""===i)o=0;else{if(!B(10===a?ee:8===a?K:te,i))return e;o=k(i,a)}N(n,o)}for(r=0;r=O(256,5-t))return null}else if(o>255)return null;for(s=F(n),r=0;r1?arguments[1]:void 0,i=S(t,new ze(e,!1,r));n||(t.href=i.serialize(),t.origin=i.getOrigin(),t.protocol=i.getProtocol(),t.username=i.getUsername(),t.password=i.getPassword(),t.host=i.getHost(),t.hostname=i.getHostname(),t.port=i.getPort(),t.pathname=i.getPathname(),t.search=i.getSearch(),t.searchParams=i.getSearchParams(),t.hash=i.getHash())},Ge=He.prototype,qe=function(e,t){return{get:function(){return C(this)[e]()},set:t&&function(e){return C(this)[t](e)},configurable:!0,enumerable:!0}};if(n&&(u(Ge,"href",qe("serialize","setHref")),u(Ge,"origin",qe("getOrigin")),u(Ge,"protocol",qe("getProtocol","setProtocol")),u(Ge,"username",qe("getUsername","setUsername")),u(Ge,"password",qe("getPassword","setPassword")),u(Ge,"host",qe("getHost","setHost")),u(Ge,"hostname",qe("getHostname","setHostname")),u(Ge,"port",qe("getPort","setPort")),u(Ge,"pathname",qe("getPathname","setPathname")),u(Ge,"search",qe("getSearch","setSearch")),u(Ge,"searchParams",qe("getSearchParams")),u(Ge,"hash",qe("getHash","setHash"))),c(Ge,"toJSON",function(){return C(this).serialize()},{enumerable:!0}),c(Ge,"toString",function(){return C(this).serialize()},{enumerable:!0}),R){var Ye=R.createObjectURL,Ve=R.revokeObjectURL;Ye&&c(He,"createObjectURL",a(Ye,R)),Ve&&c(He,"revokeObjectURL",a(Ve,R))}return b(He,"URL"),t({global:!0,constructor:!0,forced:!r,sham:!n},{URL:He}),Rl}Wl||(Wl=1,ql());var Yl,Vl={};!function(){if(Yl)return Vl;Yl=1;var e=mr(),t=_();e({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return t(URL.prototype.toString,this)}})}();var Xl;Xl||(Xl=1,Gl());var Ql,Jl={};!function(){if(Ql)return Jl;Ql=1;var e=Xt(),t=he(),n=Er(),r=Ll(),i=URLSearchParams,a=i.prototype,o=t(a.append),s=t(a.delete),c=t(a.forEach),u=t([].push),l=new i("a=1&a=2&b=3");l.delete("a",1),l.delete("b",void 0),l+""!="a=2"&&e(a,"delete",function(e){var t=arguments.length,i=t<2?void 0:arguments[1];if(t&&void 0===i)return s(this,e);var a=[];c(this,function(e,t){u(a,{key:t,value:e})}),r(t,1);for(var l,h=n(e),d=n(i),f=0,m=0,g=!1,p=a.length;f=n;){const e=fh.keys().next().value;fh.delete(e)}fh.set(e,t)}}const gh={};let ph=null,vh=null,yh=null,Ah=null,_h=null,bh=null,wh=null;function Eh(e){return e&&"object"==typeof e&&!Array.isArray(e)}function xh(e){const t=[];return JSON.stringify(e,function(e,n){if("object"==typeof n&&null!==n){if(-1!==t.indexOf(n))return;t.push(n)}if(n instanceof Error||"undefined"!=typeof DOMException&&n instanceof DOMException){const e={name:n.name,message:n.message,stack:n.stack};return"cause"in n&&(e.cause=n.cause),Object.keys(n).forEach(t=>{e[t]=n[t]}),e}return n})}const Sh={messages:[],logLevelConsole:"warning",logLevelSystem:"error",systemTargetLogLevel:"",addMessage:function(e,t){if(!ah.debug)return;const n={level:e,date:(new Date).toISOString(),text:"",objs:[],stack:""},r=new Error;r.stack&&(n.stack=r.stack.toString().replace(/^Error\r?\n/,""));for(let e=0;e1e3&&Sh.messages.shift()},systemLog(e,t){vh&&vh.hass&&vh.hass.callService("system_log","write",{logger:"frontend.wallpanel".concat(Ah?"."+Ah:""),message:t,level:Sh.systemTargetLogLevel||e},void 0,!1).catch(()=>{})},downloadMessages:function(){const e=new Blob([xh(Sh.messages)],{type:"text/plain"}),t=URL.createObjectURL(e),n=document.createElement("a");n.href=t,n.target="_blank",n.download="wallpanel_log.txt",document.body.appendChild(n),n.click(),n.remove(),setTimeout(()=>URL.revokeObjectURL(t),0)},purgeMessages:function(){Sh.messages=[]},debug:function(){["debug"].includes(Sh.logLevelConsole)&&console.debug.apply(this,arguments),["debug"].includes(Sh.logLevelSystem)&&Sh.systemLog("debug",xh(arguments)),Sh.addMessage("debug",arguments)},info:function(){["debug","info"].includes(Sh.logLevelConsole)&&console.info.apply(this,arguments),["debug","info"].includes(Sh.logLevelSystem)&&Sh.systemLog("info",xh(arguments)),Sh.addMessage("info",arguments)},log:function(){Sh.info.apply(this,arguments)},warning:function(){["debug","info","warning"].includes(Sh.logLevelConsole)&&console.warn.apply(this,arguments),["debug","info","warning"].includes(Sh.logLevelSystem)&&Sh.systemLog("warning",xh(arguments)),Sh.addMessage("warning",arguments)},warn:function(){Sh.warning.apply(this,arguments)},error:function(){if(["debug","info","warning","error"].includes(Sh.logLevelConsole)&&console.error.apply(this,arguments),["debug","info","warning","error"].includes(Sh.logLevelSystem)&&Sh.systemLog("error",xh(arguments)),Sh.addMessage("error",arguments),ah.alert_errors){const e="Wallpanel error: ".concat(xh(arguments));lh?lh.showMessage("error","Error",e,1e4):alert(e)}},err:function(){Sh.error.apply(this,arguments)}};class Ch{constructor(){this.enabled=!1,this.error=null,this.nativeWakeLockSupported="wakeLock"in navigator,this._lock=null,this._player=null,this._isPlaying=!1,this._onWakeLockRelease=null;const e=()=>{Sh.debug("handleVisibilityChange"),this.enabled&&!document.hidden&&this.enable()};if(document.addEventListener("visibilitychange",e),document.addEventListener("fullscreenchange",e),!this.nativeWakeLockSupported){const e="data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAA1NtZGF0AAACrwYF//+r3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2NCByMzA5NSBiYWVlNDAwIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAyMiAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOi0zOi0zIGFuYWx5c2U9MHgzOjB4MTEzIG1lPWhleCBzdWJtZT03IHBzeT0xIHBzeV9yZD0yLjAwOjAuNzAgbWl4ZWRfcmVmPTEgbWVfcmFuZ2U9MTYgY2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6b25lPTIxLDExIGZhc3RfcHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS00IHRocmVhZHM9MSBsb29rYWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdlaWdodHA9MiBrZXlpbnQ9MjUwIGtleWludF9taW49MSBzY2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9MSBjcmY9MjMuMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMjAAgAAAABFliIQAF85//vfUt8yy7VNwgQAAAAlBmiRsQXzn/vAAAAAJQZ5CeIL5z4aBAAAACQGeYXRBfOeGgAAAAAkBnmNqQXznhoEAAAAPQZpoSahBaJlMCC+c//7xAAAAC0GehkURLBfOf4aBAAAACQGepXRBfOeGgQAAAAkBnqdqQXznhoAAAAAPQZqpSahBbJlMCC+c//7wAAADs21vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAA+gAACcQAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAALddHJhawAAAFx0a2hkAAAAAwAAAAAAAAAAAAAAAQAAAAAAACcQAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAIAAAACAAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAAAnEAAAgAAAAQAAAAACVW1kaWEAAAAgbWRoZAAAAAAAAAAAAAAAAAAAQAAAAoAAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAAAgBtaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAHAc3RibAAAAMBzdHNkAAAAAAAAAAEAAACwYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAIAAgASAAAAEgAAAAAAAAAARVMYXZjNTkuMzcuMTAwIGxpYngyNjQAAAAAAAAAAAAAABj//wAAADZhdmNDAWQACv/hABlnZAAKrNlfllwEQAAAAwBAAAADAIPEiWWAAQAGaOvjxMhM/fj4AAAAABBwYXNwAAAAAQAAAAEAAAAUYnRydAAAAAAAAAKiAAACogAAABhzdHRzAAAAAAAAAAEAAAAKAABAAAAAABRzdHNzAAAAAAAAAAEAAAABAAAAYGN0dHMAAAAAAAAACgAAAAEAAIAAAAAAAQABQAAAAAABAACAAAAAAAEAAAAAAAAAAQAAQAAAAAABAAFAAAAAAAEAAIAAAAAAAQAAAAAAAAABAABAAAAAAAEAAIAAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAAKAAAAAQAAADxzdHN6AAAAAAAAAAAAAAAKAAACyAAAAA0AAAANAAAADQAAAA0AAAATAAAADwAAAA0AAAANAAAAEwAAABRzdGNvAAAAAAAAAAEAAAAwAAAAYnVkdGEAAABabWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAtaWxzdAAAACWpdG9vAAAAHWRhdGEAAAABAAAAAExhdmY1OS4yNy4xMDA=";this._player=document.createElement("video"),this._player.setAttribute("id","ScreenWakeLockVideo"),this._player.setAttribute("src",e),this._player.setAttribute("playsinline",""),this._player.setAttribute("muted",""),this._player.style.display="none",document.getElementById("ScreenWakeLockVideo")||document.body.appendChild(this._player),this._player.addEventListener("ended",()=>{Sh.debug("Video ended"),this.enabled&&this.enable()}),this._player.addEventListener("playing",()=>{Sh.debug("Video playing"),this._isPlaying=!0}),this._player.addEventListener("pause",()=>{Sh.debug("Video pause"),this._isPlaying=!1})}}enable(){if(this.nativeWakeLockSupported){if(Sh.debug("Requesting native screen wakelock"),this._lock)return void Sh.debug("Screen wakelock already active");navigator.wakeLock.request("screen").then(e=>{Sh.debug("Request screen wakelock successful"),this._lock=e,this._onWakeLockRelease=()=>{Sh.debug("Screen wakelock released"),this.enabled=!1,this._lock=null},e.addEventListener("release",this._onWakeLockRelease),this.enabled=!0,this.error=null}).catch(e=>{this.enabled=!1,this.error=e,Sh.warning("Failed to request screen wakeLock: ".concat(e))})}else{Sh.debug("Starting video player"),!this._player.paused&&this._isPlaying&&this._player.pause();const e=this._player.play();e&&e.then(()=>{this.enabled=!0,this.error=null,Sh.debug("Video play successful")}).catch(e=>{this.enabled=!1,this.error=e,Sh.warning("Failed to play video: ".concat(e))})}}disable(){this.nativeWakeLockSupported?(Sh.debug("Releasing native screen wakelock"),this._lock&&(this._onWakeLockRelease&&(this._lock.removeEventListener("release",this._onWakeLockRelease),this._onWakeLockRelease=null),this._lock.release()),this._lock=null):(Sh.debug("Stopping video player"),!this._player.paused&&this._isPlaying&&this._player.pause()),this.enabled=!1}}class Ih{constructor(){this.enabled=!1,this.error=!1,this.width=64,this.height=48,this.thresholdRatio=.05,this.threshold=this.width*this.height*this.thresholdRatio,this.captureInterval=300,this.motionActive=!1,this.motionStartDelay=0,this.motionStopDelay=2e3,this.motionDetectionRequiredRatio=.8,this.roomSettledRequiredRatio=1,this.motionStopTimeout=null,this.captureTimer=null,this.referenceImageData=null,this.previousImageData=null,this.referenceChangeRatios=[],this.previousChangeRatios=[],this.maxRatioHistorySize=Math.ceil(6e4/this.captureInterval),this.videoElement=document.createElement("video"),this.videoElement.setAttribute("id","wallpanelMotionDetectionVideo"),this.videoElement.style.display="none",document.body.appendChild(this.videoElement),this.canvasElement=document.createElement("canvas"),this.canvasElement.setAttribute("id","wallpanelMotionDetectionCanvas"),this.canvasElement.style.display="none",document.body.appendChild(this.canvasElement),this.context=this.canvasElement.getContext("2d",{willReadFrequently:!0}),this._elementsAppended=!0}compareImageData(e,t){if(!e||!t)return 0;let n=0;const r=e.data,i=t.data;for(let e=0;e=256&&n++}return n/(this.width*this.height)}storeRatio(e,t){for(e.push(t);e.length>this.maxRatioHistorySize;)e.shift()}getRatiosForInterval(e,t){const n=Math.max(1,Math.ceil(t/this.captureInterval));return e.length0&&e.filter(e=>e>=this.thresholdRatio).length/e.length>=t}hasRequiredRatioBelowThreshold(e,t){return e.length>0&&e.filter(e=>e=t}resetMotionState(){this.motionActive=!1,this.motionStopTimeout&&(clearTimeout(this.motionStopTimeout),this.motionStopTimeout=null),this.referenceImageData=null,this.previousImageData=null,this.referenceChangeRatios=[],this.previousChangeRatios=[]}capture(){this.context.globalCompositeOperation="source-over",this.context.drawImage(this.videoElement,0,0,this.width,this.height);const e=this.context.getImageData(0,0,this.width,this.height);if(!this.referenceImageData)return this.referenceImageData=e,void(this.previousImageData=e);const t=this.compareImageData(e,this.referenceImageData),n=this.compareImageData(e,this.previousImageData);this.previousImageData=e,this.storeRatio(this.referenceChangeRatios,t),this.storeRatio(this.previousChangeRatios,n);const r=this.getRatiosForInterval(this.referenceChangeRatios,this.motionStartDelay),i=this.hasRequiredRatioAboveThreshold(r,this.motionDetectionRequiredRatio),a=this.previousChangeRatios.length>=this.maxRatioHistorySize&&this.hasRequiredRatioBelowThreshold(this.previousChangeRatios,this.roomSettledRequiredRatio);i?(this.motionActive||(Sh.debug("Motion started"),this.motionActive=!0,lh.motionDetected()),this.motionStopTimeout&&(clearTimeout(this.motionStopTimeout),this.motionStopTimeout=null)):this.motionActive&&!this.motionStopTimeout&&(this.motionStopTimeout=setTimeout(()=>{Sh.debug("Motion stopped"),this.motionActive=!1,this.motionStopTimeout=null,lh.motionStopped()},this.motionStopDelay)),a&&(Sh.info("Room settled, new reference image stored"),this.referenceImageData=e,this.referenceChangeRatios=[])}start(){if(!this.enabled&&!this.error){if(!navigator.mediaDevices)return this.error=!0,void Sh.error("No media devices found");this._elementsAppended||(document.body.appendChild(this.videoElement),document.body.appendChild(this.canvasElement),this._elementsAppended=!0),this.enabled=!0,this.width=ah.camera_motion_detection_capture_width,this.height=ah.camera_motion_detection_capture_height,this.thresholdRatio=.01*ah.camera_motion_detection_threshold,this.threshold=this.width*this.height*this.thresholdRatio,this.captureInterval=1e3*ah.camera_motion_detection_capture_interval,this.motionStartDelay=1e3*ah.camera_motion_detection_motion_start_delay,this.motionStopDelay=1e3*ah.camera_motion_detection_motion_stop_delay,this.maxRatioHistorySize=Math.ceil(6e4/this.captureInterval),this.resetMotionState(),this.videoElement.width=this.width,this.videoElement.height=this.height,this.canvasElement.width=this.width,this.canvasElement.height=this.height,ah.camera_motion_detection_capture_visible?(this.canvasElement.style.position="fixed",this.canvasElement.style.top=0,this.canvasElement.style.left=0,this.canvasElement.style.zIndex=1e4,this.canvasElement.style.border="1px solid black",this.canvasElement.style.display="block"):this.canvasElement.style.display="none",navigator.mediaDevices.getUserMedia({audio:!1,video:{facingMode:{ideal:ah.camera_motion_detection_facing_mode},width:this.width,height:this.height}}).then(e=>{this.videoElement.srcObject=e;const t=this.videoElement.play();t&&t.catch(e=>{Sh.warning("Camera motion detection video play failed: ".concat(e))}),this.enabled&&(this.captureTimer=setInterval(this.capture.bind(this),this.captureInterval))}).catch(e=>{this.enabled=!1,Sh.error("Camera motion detection error:",e),this._elementsAppended&&(this.videoElement.remove(),this.canvasElement.remove(),this._elementsAppended=!1)})}}stop(){if(!this.enabled)return;this.enabled=!1,this.resetMotionState(),this.captureTimer&&(clearInterval(this.captureTimer),this.captureTimer=null),this.videoElement.pause();const e=this.videoElement.srcObject;e&&"function"==typeof e.getTracks&&e.getTracks().forEach(e=>{e.stop()}),this.videoElement.srcObject=null,this._elementsAppended&&(this.videoElement.remove(),this.canvasElement.remove(),this._elementsAppended=!1)}}const Th=1592614637;function Rh(e){return function(){e=e+1831565813|0;let t=Math.imul(e^e>>>15,1|e);return t=t+Math.imul(t^t>>>7,61|t)^t,((t^t>>>14)>>>0)/4294967296}}function Ph(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Math.random;const n=e.slice();for(let e=n.length-1;e>0;e--){const r=Math.floor(t()*(e+1));[n[e],n[r]]=[n[r],n[e]]}return n}function kh(e){if(!e.shadowRoot)return[null,null];const t=e.shadowRoot.querySelector("ha-web-rtc-player")||e.shadowRoot.querySelector("ha-hls-player");if(!t||!t.shadowRoot)return[t,null];const n=t.shadowRoot.querySelector("video");return[t,n]}function Mh(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;rc(e)):Eh(t)&&(t=Object.fromEntries(Object.entries(t).map(e=>{let[t,n]=e;return[t,c(n)]}))),"boolean"==typeof e[a]&&(t=null!=t&&["true","on","yes","1"].includes(String(t).toLowerCase())),t}o=c(o),Array.isArray(e[a])&&"string"==typeof o&&(o=o.split(",").map(e=>e.trim())),Object.assign(e,{[a]:o})}}return Mh(e,...n)}function Oh(){const e=new URLSearchParams(window.location.search),t=ah;ah={},Mh(ah,nh),0===Object.keys(ih).length&&(ih=Nh(),0===Object.keys(ih).length&&Sh.debug("No wallpanel config found in dashboard config")),Mh(ah,ih);const n={};for(let[t,r]of e)if(t.startsWith("wp_")&&(t=t.substring(3),rh[t]&&(Sh.warn("The configuration option '".concat(t,"' has been renamed to '").concat(rh[t],"'. Please update your wallpanel configuration accordingly.")),t=rh[t]),t in nh&&r)){try{r=JSON.parse(r)}catch(e){}const e=nh[t];if(Array.isArray(e))Array.isArray(r)?n[t]=r:n[t]="string"==typeof r?r.split(",").map(e=>e.trim()):[r];else if("boolean"==typeof e)n[t]=["true","on","yes","1"].includes(String(r));else if("number"==typeof e){const e=Number(r);Number.isFinite(e)?n[t]=e:Sh.warn("Invalid numeric wp_ param '".concat(t,"': ").concat(r))}else n[t]=r}ah=Mh(ah,n);const r=ah.profile;if(ah.profiles&&r&&ah.profiles[r]&&(ah=Mh(ah,ah.profiles[r]),Sh.debug("Profile set from config: ".concat(r))),ah.profiles&&Ah&&ah.profiles["device.".concat(Ah)]){const e="device.".concat(Ah);ah=Mh(ah,ah.profiles[e]),Sh.debug("Profile set from device: ".concat(e))}if(ah.profiles){const e=[_h,bh,wh];for(let t=0;t{t.tagName.toLowerCase().startsWith("browser-mod-popup")&&t.shadowRoot&&t.shadowRoot.querySelector("ha-dialog")&&e.push(t)}),e):e}function Bh(){const e=Lh();return e&&0!=e.length?e[0]:null}function Dh(){if("1"==new URLSearchParams(window.location.search).get("edit"))return Sh.debug("Edit mode active"),!1;if(!ah.enabled)return Sh.debug("Wallpanel not enabled in config"),!1;if(ah.enabled_on_views&&ah.enabled_on_views.length>0&&ch&&!ah.enabled_on_views.includes(ch))return Sh.debug("Wallpanel not enabled on current tab ".concat(ch)),!1;if(ah.disable_screensaver_when_assist_active){const e=vh.shadowRoot.querySelector("ha-voice-command-dialog");if(e&&e.shadowRoot&&e.shadowRoot.querySelector("ha-dialog"))return Sh.debug("Assist is active, wallpanel disabled"),!1}return lh&&lh.disable_screensaver_on_browser_mod_popup_function&&Bh()&&lh.disable_screensaver_on_browser_mod_popup_function(Bh())?(Sh.debug("Browser mod popup function returned true, wallpanel disabled"),!1):!ah.disable_screensaver_on_browser_mod_popup||!Bh()||(Sh.debug("Browser mod popup active, wallpanel disabled"),!1)}function Uh(){return ah.show_images&&ah.image_url?ah.image_url.startsWith("media-entity-video://")?"media-entity-video":ah.image_url.startsWith("media-entity-image://")?"media-entity-image":ah.image_url.startsWith("media-source://")?"media-source":ah.image_url.startsWith("https://api.unsplash")?"unsplash-api":ah.image_url.startsWith("immich+")?"immich-api":ah.image_url.startsWith("iframe+")?"iframe":ah.image_url.startsWith("embed+")?"embed":"url":""}function Fh(){try{return yh.shadowRoot.querySelector("ha-panel-lovelace")}catch(e){Sh.error("Failed to get ha-panel-lovelace:",e)}}function Nh(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const t=Fh(),n={};if(t&&t.lovelace){let r;t.lovelace.config&&t.lovelace.config.wallpanel?r=t.lovelace.config.wallpanel:t.lovelace.rawConfig&&t.lovelace.rawConfig.wallpanel&&(r=t.lovelace.rawConfig.wallpanel),r&&(0===e.length&&(e=Object.keys(r)),e.forEach(e=>{(e in nh||e in rh)&&(n[e]=r[e])}))}return n}function jh(e){Sh.debug("setSidebarVisibility: hidden=".concat(e));try{const t=yh.shadowRoot.querySelector("ha-panel-lovelace");if(t){const n=t.shadowRoot.querySelector("hui-root");if(n){const t=n.shadowRoot.querySelector("ha-menu-button");t&&(e?t.style.display="none":t.style.removeProperty("display"))}}}catch(e){Sh.warn(e)}try{const t=yh.shadowRoot.querySelector("ha-drawer");if(t){const n=t.shadowRoot.querySelector(".sidebar-shell")||t.shadowRoot.querySelector("aside"),r=n&&n.classList.contains("sidebar-shell")?"--ha-sidebar-width":"--mdc-drawer-width";n&&(e?(n.style.opacity=0,n.style.maxWidth="0px",yh.style.setProperty(r,"env(safe-area-inset-left)")):(n.style.opacity=1,n.style.maxWidth="",yh.style.removeProperty(r)),window.dispatchEvent(new Event("resize")))}}catch(e){Sh.warn(e)}}function Wh(e,t){Sh.debug("setToolbarVisibility: hideToolbar=".concat(e,", hideActionItems=").concat(t));try{const n=yh.shadowRoot.querySelector("ha-panel-lovelace");if(!n)return;let r=n.shadowRoot.querySelector("hui-root");if(!r)return;r=r.shadowRoot;let i=r.querySelector("app-toolbar");i||(i=r.querySelector("div.toolbar"));const a="wallpanel-toolbar-visibility";let o=r.querySelector("#".concat(a));if(e)o||(o=document.createElement("style"),o.id=a,r.appendChild(o)),o.textContent=".header, app-toolbar, div.toolbar { display: none !important; }".concat(ah.keep_toolbar_space?"":"#view { min-height: 100vh !important; margin-top: 0 !important; padding-top: 0 !important; }");else{o&&o.remove();const e=i.querySelector("div.action-items");t?e.style.setProperty("display","none"):e.style.setProperty("display","flex")}window.dispatchEvent(new Event("resize"))}catch(e){Sh.warn(e)}}function zh(){return void 0!==document.fullscreenElement?Boolean(document.fullscreenElement):void 0!==document.webkitCurrentFullScreenElement&&Boolean(document.webkitCurrentFullScreenElement)}function Hh(){Sh.debug("Enter fullscreen");const e=document.documentElement;e.requestFullscreen?e.requestFullscreen().then(()=>{Sh.debug("Successfully requested fullscreen")},e=>{Sh.debug("Failed to enter fullscreen:",e)}):e.mozRequestFullScreen?e.mozRequestFullScreen():e.msRequestFullscreen?e.msRequestFullscreen():e.webkitRequestFullscreen&&e.webkitRequestFullscreen()}function Gh(){const e=customElements.get("hui-view-container"),t=customElements.get("hui-view");if(!e||!t){throw new Error("Failed to get hui-view-container / hui-view from customElements")}class r extends e{}class i extends t{constructor(){super(),this.mediaList=[],this.mediaIndex=-1,this.mediaListDirection="forwards",this.mediaPathLists=[],this.mediaPathQueue=[],this.currentMediaPath=null,this.lastMediaListUpdate,this.updatingMediaList=!1,this.mediaListRetryAt=0,this.mediaListRetryTimer=null,this.updatingMedia=!1,this.mediaLoadRetryAt=0,this.lastMediaUpdate=0,this.isPaused=!1,this.displayTime=null,this.mediaTimeElapsedBeforePause=0,this.lastImageUrlEntityValue=null,this.blockEventsUntil=0,this.screensaverStartedAt,this.screensaverStoppedAt=new Date,this.infoBoxContentCreatedDate,this.idleSince=Date.now(),this.lastProfileSet=ah.profile,this.lastMove=null,this.lastCorner=0,this.translateTimeout=null,this.afterFadeoutTimer=null,this.lastClickTime=0,this.clickCount=0,this.touchStartX=-1,this.touchStartY=-1,this.currentWidth=0,this.currentHeight=0,this.energyCollectionUpdateEnabled=!1,this.energyCollectionUpdateInterval=60,this.lastEnergyCollectionUpdate=0,this.screensaverStopNavigationPathTimeout=null,this.disable_screensaver_on_browser_mod_popup_function=null,this.moreInfoDialogOpenedAt=0,this.timerInterval=null,this.windowEventHandlers=[],this.infoBoxResizeObserver=null,this.screenWakeLock=new Ch,this.cameraMotionDetection=new Ih,this.lovelace=null,this.__hass=vh.hass||vh.__hass,this.__cards=[],this.__badges=[],this.__views=[],vh.provideHass(this),this.timerInterval=setInterval(this.timer.bind(this),1e3),uh.hass=this.__hass}set hass(e){Sh.debug("Update hass"),this.__hass=e;let t=!1;for(const e in gh){const n=this.__hass.states[e];n&&n.state!=gh[e]&&(gh[e]=n.state,t=!0)}if(!this.updateProfile()&&t&&Oh(),!Dh())return;const n=ah.screensaver_entity;if(n&&this.__hass.states[n]){const e=new Date(this.__hass.states[n].last_changed),t=this.__hass.states[n].state;"off"==t&&this.screensaverStartedAt&&e.getTime()-this.screensaverStartedAt>0?this.stopScreensaver(ah.fade_out_time_screensaver_entity):"on"==t&&this.screensaverStoppedAt&&e.getTime()-this.screensaverStoppedAt>0&&this.startScreensaver()}this.screensaverRunning()&&(this.__cards.forEach(e=>{e.hass=this.hass}),this.__badges.forEach(e=>{e.hass=this.hass}),this.__views.forEach(e=>{e.hass=this.hass}),"media-entity-image"==Uh()&&this.switchActiveMedia("entity_update"))}get hass(){return this.__hass}setScreensaverEntityState(){const e=ah.screensaver_entity;if(!e||!this.__hass.states[e])return;if(this.screensaverRunning()&&"on"==this.__hass.states[e].state)return;if(!this.screensaverRunning()&&"off"==this.__hass.states[e].state)return;const t=this.screensaverRunning()?"turn_on":"turn_off";Sh.debug("Updating screensaver_entity",e,t),this.__hass.callService("input_boolean",t,{entity_id:e}).then(e=>{Sh.debug(e)},e=>{Sh.error("Failed to set screensaver entity state:",e)})}setImageURLEntityState(){const e=ah.image_url_entity;if(!e||!this.__hass.states[e])return;const t=this.getActiveMediaElement();if(!t||!t.mediaUrl)return;const n=t.mediaUrl.substring(0,255);this.lastImageUrlEntityValue!==n&&(Sh.debug("Updating image_url_entity",e,n),this.__hass.callService("input_text","set_value",{entity_id:e,value:n}).then(e=>{Sh.debug(e),this.lastImageUrlEntityValue=n},e=>{Sh.error("Failed to set image url entity state:",e)}))}updateProfile(){const e=ah.profile_entity;if(e&&this.__hass.states[e]){const t=this.__hass.states[e].state;if(t&&t!=this.lastProfileSet||!t&&this.lastProfileSet)return Sh.debug("Set profile to ".concat(t)),this.lastProfileSet=t,Oh(),!0}return!1}timer(){ah.enabled&&sh&&(this.screensaverRunning()?ah.disable_screensaver_on_browser_mod_popup&&Bh()?this.stopScreensaver(ah.fade_out_time_browser_mod_popup):this.updateScreensaver():Dh()&&ah.idle_time>0&&Date.now()-this.idleSince>=1e3*ah.idle_time&&(ah.camera_motion_detection_stop_screensaver&&this.cameraMotionDetection&&this.cameraMotionDetection.motionActive||this.startScreensaver()))}setDefaultStyle(){this.messageContainer.removeAttribute("style"),this.messageContainer.style.position="fixed",this.messageContainer.style.top="1rem",this.messageContainer.style.left="1rem",this.messageContainer.style.bottom="1rem",this.messageContainer.style.right="1rem",this.messageContainer.style.alignItems="flex-end",this.messageContainer.style.display="flex",this.messageContainer.style.flexDirection="column",this.messageContainer.style.gap="0.5rem",this.messageContainer.style.zIndex=this.style.zIndex+1,this.messageContainer.style.pointerEvents="none",this.messageContainer.style.visibility="hidden",this.debugBox.removeAttribute("style"),this.debugBox.style.position="fixed",this.debugBox.style.pointerEvents="none",this.debugBox.style.top="0%",this.debugBox.style.left="0%",this.debugBox.style.width="100%",this.debugBox.style.height="100%",this.debugBox.style.background="#00000099",this.debugBox.style.color="#ffffff",this.debugBox.style.zIndex=this.style.zIndex+2,this.debugBox.style.fontFamily="monospace",this.debugBox.style.fontSize="12px",this.debugBox.style.overflowWrap="break-word",this.debugBox.style.overflowY="auto",this.debugBox.style.visibility="hidden",this.screensaverContainer.removeAttribute("style"),this.screensaverContainer.style.position="fixed",this.screensaverContainer.style.pointerEvents="auto",this.screensaverContainer.style.top=0,this.screensaverContainer.style.right=0,this.screensaverContainer.style.bottom=0,this.screensaverContainer.style.left=0,this.screensaverContainer.style.background="#000000",this.screensaverContainer.style.overflow="hidden",this.imageOneContainer.removeAttribute("style"),this.imageOneContainer.style.opacity=0,this.imageOneContainer.style.position="absolute",this.imageOneContainer.style.pointerEvents="none",this.imageOneContainer.style.top=0,this.imageOneContainer.style.left=0,this.imageOneContainer.style.width="100%",this.imageOneContainer.style.height="100%",this.imageOneContainer.style.border="none",this.imageOneBackground.style.position="absolute",this.imageOneBackground.style.pointerEvents="none",this.imageOneBackground.style.top=0,this.imageOneBackground.style.left=0,this.imageOneBackground.style.width="100%",this.imageOneBackground.style.height="100%",this.imageOneBackground.style.border="none",this.imageOne.removeAttribute("style"),this.imageOne.style.position="relative",this.imageOne.style.pointerEvents="none",this.imageOne.style.width="100%",this.imageOne.style.height="100%",this.imageOne.style.border="none",this.imageOneInfoContainer.removeAttribute("style"),this.imageOneInfoContainer.style.position="absolute",this.imageOneInfoContainer.style.pointerEvents="none",this.imageOneInfoContainer.style.top=0,this.imageOneInfoContainer.style.left=0,this.imageOneInfoContainer.style.width="100%",this.imageOneInfoContainer.style.height="100%",this.imageOneInfoContainer.style.border="none",this.imageOneInfo.style.overflowY="auto",this.imageTwoContainer.removeAttribute("style"),this.imageTwoContainer.style.opacity=0,this.imageTwoContainer.style.position="absolute",this.imageTwoContainer.style.pointerEvents="none",this.imageTwoContainer.style.top=0,this.imageTwoContainer.style.left=0,this.imageTwoContainer.style.width="100%",this.imageTwoContainer.style.height="100%",this.imageTwoContainer.style.border="none",this.imageTwoBackground.style.position="absolute",this.imageTwoBackground.style.pointerEvents="none",this.imageTwoBackground.style.top=0,this.imageTwoBackground.style.left=0,this.imageTwoBackground.style.width="100%",this.imageTwoBackground.style.height="100%",this.imageTwoBackground.style.border="none",this.imageTwo.removeAttribute("style"),this.imageTwo.style.position="relative",this.imageTwo.style.pointerEvents="none",this.imageTwo.style.width="100%",this.imageTwo.style.height="100%",this.imageTwo.style.border="none",this.imageTwoInfoContainer.removeAttribute("style"),this.imageTwoInfoContainer.style.position="absolute",this.imageTwoInfoContainer.style.pointerEvents="none",this.imageTwoInfoContainer.style.top=0,this.imageTwoInfoContainer.style.left=0,this.imageTwoInfoContainer.style.width="100%",this.imageTwoInfoContainer.style.height="100%",this.imageTwoInfoContainer.style.border="none",this.imageTwoInfo.style.overflowY="auto",this.screensaverImageOverlay.removeAttribute("style"),this.screensaverImageOverlay.style.position="absolute",this.screensaverImageOverlay.style.top=0,this.screensaverImageOverlay.style.left=0,this.screensaverImageOverlay.style.width="100%",this.screensaverImageOverlay.style.height="100%",this.screensaverImageOverlay.style.background="#00000000",this.infoContainer.removeAttribute("style"),this.infoContainer.style.position="absolute",this.infoContainer.style.pointerEvents="none",this.infoContainer.style.top=0,this.infoContainer.style.left=0,this.infoContainer.style.width="100%",this.infoContainer.style.height="100%",this.infoContainer.style.transition="opacity 2000ms ease-in-out",this.infoContainer.style.padding="25px",this.infoContainer.style.boxSizing="border-box",this.infoBox.removeAttribute("style"),this.infoBox.style.pointerEvents="none",this.infoBox.style.width="fit-content",this.infoBox.style.maxHeight="100%",this.infoBox.style.borderRadius="10px",this.infoBox.style.overflowY="auto",this.infoBox.style.scrollbarWidth="none",this.infoBox.style.setProperty("--wp-card-width","500px"),this.infoBox.style.setProperty("--wp-card-padding","0"),this.infoBox.style.setProperty("--wp-card-margin","5px"),this.infoBox.style.setProperty("--wp-card-backdrop-filter","none"),this.infoBox.style.setProperty("--wp-badges-minwidth","200px"),this.infoBoxPosX.style.pointerEvents="none",this.infoBoxPosX.style.height="100%",this.infoBoxPosX.style.width="100%",this.infoBoxPosY.style.pointerEvents="none",this.infoBoxPosY.style.height="100%",this.infoBoxPosY.style.width="100%",this.infoBoxContent.style.pointerEvents="none",this.infoBoxContent.style.width="fit-content",this.infoBoxContent.style.height="100%",this.infoBoxContent.style.display="grid",this.fixedInfoContainer.removeAttribute("style"),this.fixedInfoContainer.style.position="fixed",this.fixedInfoContainer.style.pointerEvents="none",this.fixedInfoContainer.style.top=0,this.fixedInfoContainer.style.left=0,this.fixedInfoContainer.style.width="100%",this.fixedInfoContainer.style.height="100%",this.fixedInfoBox.style.pointerEvents="none",this.fixedInfoBox.style.cssText=this.infoBox.style.cssText,this.screensaverOverlay.removeAttribute("style"),this.screensaverOverlay.style.position="absolute",this.screensaverOverlay.style.pointerEvents="none",this.screensaverOverlay.style.top=0,this.screensaverOverlay.style.left=0,this.screensaverOverlay.style.width="100%",this.screensaverOverlay.style.height="100%",this.screensaverOverlay.style.background="#00000000"}updateStyle(){this.screensaverOverlay.style.background="#00000000",this.debugBox.style.visibility=ah.debug?"visible":"hidden",this.debugBox.style.pointerEvents=ah.debug?"auto":"none",this.style.transition=ah.fade_in_time>0?"opacity ".concat(Math.round(1e3*ah.fade_in_time),"ms ease-in-out"):"",this.imageOneContainer.style.transition=ah.crossfade_time>0?"opacity ".concat(Math.round(1e3*ah.crossfade_time),"ms ease-in-out"):"",this.imageTwoContainer.style.transition=ah.crossfade_time>0?"opacity ".concat(Math.round(1e3*ah.crossfade_time),"ms ease-in-out"):"",this.messageContainer.style.visibility=this.screensaverRunning()?"visible":"hidden",this.screensaverImageOverlay.style.pointerEvents=ah.content_interaction?"none":"auto";const e=ah.show_image_info&&Boolean(ah.image_info_template);if(this.imageOneInfoContainer.style.display=e?"block":"none",this.imageTwoInfoContainer.style.display=e?"block":"none",ah.info_animation_duration_x?this.infoBoxPosX.style.animation="moveX ".concat(ah.info_animation_duration_x,"s ").concat(ah.info_animation_timing_function_x," infinite alternate"):this.infoBoxPosX.style.animation="",ah.info_animation_duration_y?this.infoBoxPosY.style.animation="moveY ".concat(ah.info_animation_duration_y,"s ").concat(ah.info_animation_timing_function_y," infinite alternate"):this.infoBoxPosY.style.animation="",ah.style)for(const e in ah.style)if(e.startsWith("wallpanel-")&&"wallpanel-shadow-host"!=e&&"wallpanel-screensaver-info-box-badges"!=e&&"wallpanel-screensaver-info-box-views"!=e&&!dh[e]){const t=this.shadowRoot.getElementById(e);if(t){Sh.debug("Setting style attributes for element #".concat(e));for(const n in ah.style[e])Sh.debug("Setting style attribute ".concat(n," to ").concat(ah.style[e][n])),t.style.setProperty(n,ah.style[e][n]);t==this.infoBox?this.fixedInfoBox.style.cssText=this.infoBox.style.cssText:t==this.infoBoxContent&&(this.fixedInfoBoxContent.style.cssText=this.infoBoxContent.style.cssText)}else Sh.error("Element #".concat(e," not found"))}}updateShadowStyle(){const e=getComputedStyle(this.infoContainer),t=this.infoContainer.offsetWidth-parseInt(e.paddingLeft)-parseInt(e.paddingRight)-this.infoBox.offsetWidth,n=this.infoContainer.offsetHeight-parseInt(e.paddingTop)-parseInt(e.paddingBottom)-this.infoBox.offsetHeight;let r="";if(ah.style){if(ah.style["wallpanel-shadow-host"])for(const e in ah.style["wallpanel-shadow-host"])r+="".concat(e,": ").concat(ah.style["wallpanel-shadow-host"][e],";\n");for(const e in dh)ah.style[e]&&Mh(dh[e],ah.style[e])}let i="";for(const e in dh){i+=".".concat(e," {\n");for(const t in dh[e])i+="".concat(t,": ").concat(dh[e][t],";\n");i+="}\n"}this.shadowStyle.innerHTML="\n\t\t\t\t:host {\n\t\t\t\t\t".concat(r,"\n\t\t\t\t}\n\t\t\t\t@keyframes moveX {\n\t\t\t\t\t100% {\n\t\t\t\t\t\ttransform: translate3d(").concat(t,"px, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t@keyframes moveY {\n\t\t\t\t\t100% {\n\t\t\t\t\t\ttransform: translate3d(0, ").concat(n,"px, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t@keyframes horizontalProgress {\n\t\t\t\t\t0% {\n\t\t\t\t\t\twidth: 0%;\n\t\t\t\t\t}\n\t\t\t\t\t100% {\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t@keyframes kenBurnsEffect-experimental {\n\t\t\t\t\t0% {\n\t\t\t\t\t\ttransform: scale(1.0) translateX(calc(var(--hidden-width) / -2 * 1px)) translateY(calc(var(--hidden-height) / -2 * 1px));\n\t\t\t\t\t}\n\t\t\t\t\t50% {\n\t\t\t\t\t\ttransform: scale(var(--ken-burns-zoom));\n\t\t\t\t\t}\n\t\t\t\t\t90% {\n\t\t\t\t\t\ttransform: scale(calc(1.0 + ((var(--ken-burns-zoom) - 1.0)/2))) translateX(calc(var(--hidden-width) / 2 * 1px)) translateY(calc(var(--hidden-height) / 2 * 1px));\n\t\t\t\t\t}\n\t\t\t\t\t100% {\n\t\t\t\t\t\ttransform: scale(1.0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t@keyframes kenBurnsEffect-experimental2 {\n\t\t\t\t\t0% {\n\t\t\t\t\t\ttransform: scale(1.0);\n\t\t\t\t\t}\n\t\t\t\t\t25% {\n\t\t\t\t\t\ttransform: scale(calc(1.0 + ((var(--ken-burns-zoom) - 1.0)/2))) translateX(calc(var(--hidden-width) / 2 * 1px)) translateY(calc(var(--hidden-height) / 2 * 1px));\n\t\t\t\t\t}\n\t\t\t\t\t50% {\n\t\t\t\t\t\ttransform: scale(var(--ken-burns-zoom));\n\t\t\t\t\t}\n\t\t\t\t\t75% {\n\t\t\t\t\t\ttransform: scale(calc(1.0 + ((var(--ken-burns-zoom) - 1.0)/2))) translateX(calc(var(--hidden-width) / -2 * 1px)) translateY(calc(var(--hidden-height) / -2 * 1px));\n\t\t\t\t\t}\n\t\t\t\t\t100% {\n\t\t\t\t\t\ttransform: scale(1.0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t@keyframes kenBurnsEffect-simple {\n\t\t\t\t\t0% {\n\t\t\t\t\t\ttransform-origin: bottom left;\n\t\t\t\t\t\ttransform: scale(1.0);\n\t\t\t\t\t}\n\t\t\t\t\t100% {\n\t\t\t\t\t\ttransform: scale(var(--ken-burns-zoom));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t").concat(i,"\n\t\t\t\t").concat(ah.custom_css,"\n\t\t\t")}randomMove(){const e=getComputedStyle(this.infoContainer),t=this.infoContainer.offsetWidth-parseInt(e.paddingLeft)-parseInt(e.paddingRight)-this.infoBox.offsetWidth,n=this.infoContainer.offsetHeight-parseInt(e.paddingTop)-parseInt(e.paddingBottom)-this.infoBox.offsetHeight,r=Math.floor(Math.random()*t),i=Math.floor(Math.random()*n);this.moveInfoBox(r,i)}moveAroundCorners(){let e=null;arguments.length>0&&void 0!==arguments[0]&&arguments[0]?e=0:this.lastCorner=(this.lastCorner+1)%4;const t=getComputedStyle(this.infoContainer),n=[2,3].includes(this.lastCorner)?this.infoContainer.offsetWidth-parseInt(t.paddingLeft)-parseInt(t.paddingRight)-this.infoBox.offsetWidth:0,r=[1,2].includes(this.lastCorner)?this.infoContainer.offsetHeight-parseInt(t.paddingTop)-parseInt(t.paddingBottom)-this.infoBox.offsetHeight:0;this.moveInfoBox(n,r,e)}moveInfoBox(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(this.lastMove=Date.now(),null===n&&(n=ah.info_move_fade_duration),n>0)if(this.infoBox.animate){const e=[{opacity:1},{opacity:0,offset:.5},{opacity:1}];this.infoBox.animate(e,{duration:Math.round(1e3*n),iterations:1})}else Sh.warn("This browser does not support the animate() method, please set info_move_fade_duration to 0");const r=this;let i=Math.round(500*n);i<0&&(i=0),r.translateTimeout&&clearTimeout(r.translateTimeout),r.translateTimeout=setTimeout(function(){r.infoBoxPosX.style.transform="translate3d(".concat(e,"px, 0, 0)"),r.infoBoxPosY.style.transform="translate3d(0, ".concat(t,"px, 0)")},i)}createInfoBoxContent(){Sh.debug("Creating info box content");const e=Fh();if(e){if(this.lovelace=e.lovelace||e.__lovelace,this.infoBoxContentCreatedDate=new Date,this.infoBoxContent.innerHTML="",this.__badges=[],this.__cards=[],this.__views=[],this.energyCollectionUpdateEnabled=!1,this.shadowRoot.querySelectorAll(".wp-card").forEach(e=>{e.parentElement.removeChild(e)}),ah.badges&&ah.badges.length>0){const e=document.createElement("div");if(e.id="wallpanel-screensaver-info-box-badges",e.classList.add("wp-badges"),e.style.padding="var(--wp-card-padding)",e.style.margin="var(--wp-card-margin)",e.style.textAlign="center",e.style.display="flex",e.style.alignItems="flex-start",e.style.flexWrap="wrap",e.style.justifyContent="center",e.style.gap="8px",e.style.margin="0px",e.style.minWidth="var(--wp-badges-minwidth)",ah.style[e.id])for(const t in ah.style[e.id])Sh.debug("Setting style attribute ".concat(t," to ").concat(ah.style[e.id][t])),e.style.setProperty(t,ah.style[e.id][t]);ah.badges.forEach(t=>{const n=JSON.parse(JSON.stringify(t));Sh.debug("Creating badge:",n);let r={};n.wp_style&&(r=n.wp_style,delete n.wp_style);const i=(this._createBadgeElement?this._createBadgeElement:this.createBadgeElement).bind(this)(n);i.hass=this.hass;for(const e in r)i.style.setProperty(e,r[e]);this.__badges.push(i),e.append(i)}),this.infoBoxContent.appendChild(e)}if(ah.views&&ah.views.length>0){const e=document.createElement("div");if(e.id="wallpanel-screensaver-info-box-views",e.classList.add("wp-views"),ah.style[e.id])for(const t in ah.style[e.id])Sh.debug("Setting style attribute ".concat(t," to ").concat(ah.style[e.id][t])),e.style.setProperty(t,ah.style[e.id][t]);const t=this.lovelace.config.views;ah.views.forEach(n=>{let r=-1;const i=JSON.parse(JSON.stringify(n));for(var a=0;a0&&ah.cards.forEach(e=>{const t=JSON.parse(JSON.stringify(e));Sh.debug("Creating card:",t);let n={};t.wp_style&&(n=t.wp_style,delete t.wp_style),t.type&&t.type.includes("energy")&&(t.collection_key="energy_wallpanel",this.energyCollectionUpdateEnabled=!0);const r=(this._createCardElement?this._createCardElement:this.createCardElement).bind(this)(t);r.hass=this.hass,this.__cards.push(r);let i=this.infoBoxContent;const a=document.createElement("div");a.classList.add("wp-card"),a.style.width="var(--wp-card-width)",a.style.padding="var(--wp-card-padding)",a.style.margin="var(--wp-card-margin)",a.style.backdropFilter="var(--wp-card-backdrop-filter)",ah.content_interaction?a.style.pointerEvents="auto":a.style.pointerEvents="none";for(const e in n)if("parent"==e){const t=this.shadowRoot.getElementById(n[e]);t&&(i=t)}else a.style.setProperty(e,n[e]);a.append(r),i.appendChild(a)}),setTimeout(this.updateShadowStyle.bind(this),500)}}setDisplayTime(){const e=ah.display_time,t=this.getActiveMediaElement(!0);t.play_to_end&&!t.loop?this.displayTime=t.duration:this.displayTime=e}getDisplayTime(){return this.displayTime}restartProgressBarAnimation(){if(!this.progressBarContainer)return;if(this.progressBar.style.animation="none",!ah.show_progress_bar)return;const e=this;setTimeout(function(){e.progressBar.style.animation="horizontalProgress ".concat(e.getDisplayTime(),"s linear"),e.progressBar.style.animationPlayState=e.isPaused?"paused":"running"},25)}restartKenBurnsEffect(){if(!ah.image_animation_ken_burns||!ah.image_animation_ken_burns_animations.length)return;const e=this.getActiveMediaElement();e.style.animation="none",e.style.setProperty("--ken-burns-zoom",ah.image_animation_ken_burns_zoom);let t=Math.floor(1e3*ah.image_animation_ken_burns_delay);t<50&&(t=50);const n=Math.ceil(ah.image_animation_ken_burns_duration||1.2*(this.getDisplayTime()+2*ah.crossfade_time)),r=ah.image_animation_ken_burns_animations[Math.floor(Math.random()*ah.image_animation_ken_burns_animations.length)];this.kenburnsDelayStartTimer&&clearTimeout(this.kenburnsDelayStartTimer),e.animationIterationCount=1,this.kenburnsDelayStartTimer=setTimeout(function(){e.style.animation="kenBurnsEffect-".concat(r," ").concat(n,"s linear forwards")},t)}getMediaElement(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.imageOneContainer.style.opacity==(e?1:0)?this.imageOne:this.imageTwo;if(t&&"ha-camera-stream"==n.tagName.toLowerCase()){const e=kh(n)[1];e&&(n=e)}return n}getActiveMediaElement(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return this.getMediaElement(!0,e)}getInactiveMediaElement(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return this.getMediaElement(!1,e)}releaseMediaElement(e){if(!e)return;e.style.animation="none";const t=e===this.imageOne?this.imageOneBackground:e===this.imageTwo?this.imageTwoBackground:null;t&&(t.style.backgroundImage="");const n=e.tagName.toLowerCase();if("ha-camera-stream"===n)try{const[t,n]=kh(e);n&&n.pause(),t&&"function"==typeof t.stop&&t.stop()}catch(e){Sh.debug(e)}else{if("function"==typeof e.pause)try{e.pause()}catch(e){Sh.debug(e)}const t=e.getAttribute("src")||"";t.startsWith("blob:")&&URL.revokeObjectURL(t),e.removeAttribute("src"),"video"===n&&"function"==typeof e.load&&e.load()}e.mediaUrl=null,e.infoCacheUrl=null}releaseAllMedia(){this.releaseMediaElement(this.imageOne),this.releaseMediaElement(this.imageTwo)}replaceMediaElement(e,t){if("string"==typeof e.src&&e.src.startsWith("blob:")&&URL.revokeObjectURL(e.src),"function"==typeof e.pause&&e.pause(),"ha-camera-stream"==e.tagName.toLowerCase()){const[t,n]=kh(e);n&&n.pause(),t&&"function"==typeof t.stop&&t.stop()}t=t.toLowerCase();const n=document.createElement(t);return[...e.attributes].filter(e=>"src"!=e.name).forEach(e=>n.setAttribute(e.name,e.value)),n.mediaUrl=e.mediaUrl,n.infoCacheUrl=e.infoCacheUrl,"video"===t&&Object.assign(n,{preload:"auto",muted:!1,volume:ah.video_volume}),e.replaceWith(n),e===this.imageOne?this.imageOne=n:this.imageTwo=n,e.remove(),n}loadBackgroundImage(e){let t=e.src;const n=e.tagName.toLowerCase();if("ha-camera-stream"===n){const n=kh(e)[1];if(!n||!n.poster)return;t=n.poster}else if("video"===n){const n=document.createElement("canvas");n.width=e.videoWidth,n.height=e.videoHeight;n.getContext("2d").drawImage(e,0,0,n.width,n.height);try{t=n.toDataURL("image/png")}catch(e){t=null,Sh.error("Error extracting canvas image:",e)}}let r=this.imageOneBackground;e==this.imageTwo&&(r=this.imageTwoBackground),r.style.backgroundImage=t?"url('".concat(t.replace(/'/g,"%27"),"')"):""}connectedCallback(){this.style.zIndex=ah.z_index,this.style.visibility="hidden",this.style.opacity=0,this.style.position="fixed",this.timerInterval||(this.timerInterval=setInterval(this.timer.bind(this),1e3)),this.messageContainer=document.createElement("div"),this.messageContainer.id="wallpanel-message-container",this.debugBox=document.createElement("div"),this.debugBox.id="wallpanel-debug-box",this.screensaverContainer=document.createElement("div"),this.screensaverContainer.id="wallpanel-screensaver-container",this.imageOneContainer=document.createElement("div"),this.imageOneContainer.id="wallpanel-screensaver-image-one-container",this.imageOneBackground=document.createElement("div"),this.imageOneBackground.className="wallpanel-screensaver-image-background",this.imageOneBackground.id="wallpanel-screensaver-image-one-background",this.imageOne=document.createElement("img"),this.imageOne.id="wallpanel-screensaver-image-one",this.imageOneInfoContainer=document.createElement("div"),this.imageOneInfoContainer.className="wallpanel-screensaver-image-info-container",this.imageOneInfoContainer.id="wallpanel-screensaver-image-one-info-container",this.imageOneInfo=document.createElement("div"),this.imageOneInfo.className="wallpanel-screensaver-image-info",this.imageOneInfo.id="wallpanel-screensaver-image-one-info",this.imageOneInfoContainer.appendChild(this.imageOneInfo),this.imageOneContainer.appendChild(this.imageOneBackground),this.imageOneContainer.appendChild(this.imageOne),this.imageOneContainer.appendChild(this.imageOneInfoContainer),this.screensaverContainer.appendChild(this.imageOneContainer),this.imageTwoContainer=document.createElement("div"),this.imageTwoContainer.id="wallpanel-screensaver-image-two-container",this.imageTwoBackground=document.createElement("div"),this.imageTwoBackground.className="wallpanel-screensaver-image-background",this.imageTwoBackground.id="wallpanel-screensaver-image-two-background",this.imageTwo=document.createElement("img"),this.imageTwo.id="wallpanel-screensaver-image-two",this.imageTwoInfoContainer=document.createElement("div"),this.imageTwoInfoContainer.className="wallpanel-screensaver-image-info-container",this.imageTwoInfoContainer.id="wallpanel-screensaver-image-two-info-container",this.imageTwoInfo=document.createElement("div"),this.imageTwoInfo.className="wallpanel-screensaver-image-info",this.imageTwoInfo.id="wallpanel-screensaver-image-two-info",this.imageTwoInfoContainer.appendChild(this.imageTwoInfo),this.imageTwoContainer.appendChild(this.imageTwoBackground),this.imageTwoContainer.appendChild(this.imageTwo),this.imageTwoContainer.appendChild(this.imageTwoInfoContainer),this.screensaverContainer.appendChild(this.imageTwoContainer),this.screensaverImageOverlay=document.createElement("div"),this.screensaverImageOverlay.id="wallpanel-screensaver-image-overlay",this.screensaverContainer.appendChild(this.screensaverImageOverlay),this.progressBarContainer=document.createElement("div"),this.progressBarContainer.className="wallpanel-progress",this.progressBar=document.createElement("div"),this.progressBar.className="wallpanel-progress-inner",this.progressBar.id="wallpanel-progress-inner",this.progressBarContainer.appendChild(this.progressBar),ah.show_progress_bar&&this.screensaverContainer.appendChild(this.progressBarContainer),this.pauseIndicator=document.createElement("div"),this.pauseIndicator.id="wp-pause-indicator",this.pauseIndicator.innerHTML="⏸️",this.pauseIndicator.style.position="absolute",this.pauseIndicator.style.top="1rem",this.pauseIndicator.style.left="1rem",this.pauseIndicator.style.fontSize="4rem",this.pauseIndicator.style.lineHeight="1",this.pauseIndicator.style.color="white",this.pauseIndicator.style.filter="drop-shadow(0 0 8px rgba(0,0,0,0.8))",this.pauseIndicator.style.zIndex="9999",this.pauseIndicator.style.pointerEvents="none",this.pauseIndicator.style.display="none",this.screensaverContainer.appendChild(this.pauseIndicator),this.infoContainer=document.createElement("div"),this.infoContainer.id="wallpanel-screensaver-info-container",this.fixedInfoContainer=document.createElement("div"),this.fixedInfoContainer.id="wallpanel-screensaver-fixed-info-container",this.fixedInfoBox=document.createElement("div"),this.fixedInfoBox.id="wallpanel-screensaver-fixed-info-box",this.fixedInfoBoxContent=document.createElement("div"),this.fixedInfoBoxContent.id="wallpanel-screensaver-fixed-info-box-content",this.screensaverContainer.appendChild(this.infoContainer),this.infoBoxPosX=document.createElement("div"),this.infoBoxPosX.id="wallpanel-screensaver-info-box-pos-x",this.infoBoxPosX.x="0",this.infoBoxPosY=document.createElement("div"),this.infoBoxPosY.id="wallpanel-screensaver-info-box-pos-y",this.infoBoxPosY.y="0",this.infoBox=document.createElement("div"),this.infoBox.id="wallpanel-screensaver-info-box",this.infoBoxContent=document.createElement("div"),this.infoBoxContent.id="wallpanel-screensaver-info-box-content",this.infoBoxContent.style.display="grid",this.infoBox.appendChild(this.infoBoxContent),this.infoBoxPosX.appendChild(this.infoBox),this.infoBoxPosY.appendChild(this.infoBoxPosX),this.infoContainer.appendChild(this.infoBoxPosY),this.fixedInfoBox.appendChild(this.fixedInfoBoxContent),this.fixedInfoContainer.appendChild(this.fixedInfoBox),this.infoContainer.appendChild(this.fixedInfoContainer),this.screensaverOverlay=document.createElement("div"),this.screensaverOverlay.id="wallpanel-screensaver-overlay",this.screensaverContainer.appendChild(this.screensaverOverlay),this.shadowStyle=document.createElement("style");const e=this.attachShadow({mode:"open"});e.appendChild(this.shadowStyle),e.appendChild(this.screensaverContainer),e.appendChild(this.messageContainer),e.appendChild(this.debugBox);const t=this,n=["click","touchstart","touchend","wheel"];ah.stop_screensaver_on_key_down&&n.push("keydown"),ah.stop_screensaver_on_mouse_move&&n.push("mousemove");const r=e=>{try{t.handleInteractionEvent(e)}catch(e){Sh.error(e.stack)}};n.forEach(function(e){window.addEventListener(e,r,!0),t.windowEventHandlers.push({eventName:e,handler:r,options:!0})});const i=e=>{ah.disable_context_menu&&t.screensaverRunning()&&e.preventDefault()};window.addEventListener("contextmenu",i),this.windowEventHandlers.push({eventName:"contextmenu",handler:i});const a=()=>{try{const e=this.screensaverContainer.clientWidth,n=this.screensaverContainer.clientHeight;!t.screensaverRunning()||t.currentWidth==e&&t.currentHeight==n||(Sh.debug("Size changed from ".concat(t.currentWidth,"x").concat(t.currentHeight," to ").concat(e,"x").concat(n)),t.currentWidth=e,t.currentHeight=n,t.updateShadowStyle(),t.setMediaDimensions())}catch(e){Sh.error(e.stack)}};window.addEventListener("resize",a),this.windowEventHandlers.push({eventName:"resize",handler:a});const o=()=>{try{t.screensaverRunning()&&t.moreInfoDialogToForeground()}catch(e){Sh.error(e.stack)}};window.addEventListener("hass-more-info",o),this.windowEventHandlers.push({eventName:"hass-more-info",handler:o}),this.infoBoxResizeObserver=new ResizeObserver(()=>{"corners"===ah.info_move_pattern&&this.moveAroundCorners(!0)}),this.infoBoxResizeObserver.observe(this.infoBoxContent),this.setScreensaverEntityState()}disconnectedCallback(){this.afterFadeoutTimer&&(clearTimeout(this.afterFadeoutTimer),this.afterFadeoutTimer=null),this.releaseAllMedia(),this.clearMediaListRetry(),this.timerInterval&&(clearInterval(this.timerInterval),this.timerInterval=null),this.translateTimeout&&(clearTimeout(this.translateTimeout),this.translateTimeout=null),this.windowEventHandlers.length&&(this.windowEventHandlers.forEach(e=>{let{eventName:t,handler:n,options:r}=e;window.removeEventListener(t,n,r)}),this.windowEventHandlers=[]),this.infoBoxResizeObserver&&(this.infoBoxResizeObserver.disconnect(),this.infoBoxResizeObserver=null)}reconfigure(e){const t=e&&Object.keys(e).length>0;!t||e.hide_toolbar==ah.hide_toolbar&&e.hide_toolbar_action_icons==ah.hide_toolbar_action_icons&&e.hide_toolbar_on_subviews==ah.hide_toolbar_on_subviews&&e.hide_sidebar==ah.hide_sidebar&&e.fullscreen==ah.fullscreen||qh(),ah.theme&&(Sh.info("Apply theme",ah.theme),uh.theme=ah.theme,uh._applyTheme()),this.updateStyle(),this.screensaverRunning()&&this.createInfoBoxContent(),!ah.info_move_interval&&t&&e.info_move_interval&&lh.moveInfoBox(0,0);const n=e.image_url!=ah.image_url||e.media_order!=ah.media_order||e.media_list_max_size!=ah.media_list_max_size||JSON.stringify(e.exclude_filenames)!=JSON.stringify(ah.exclude_filenames)||JSON.stringify(e.exclude_media_types)!=JSON.stringify(ah.exclude_media_types)||"immich-api"==Uh()&&(ah.immich_shared_albums!=e.immich_shared_albums||ah.immich_memories!=e.immich_memories||ah.immich_favorites!=e.immich_favorites||JSON.stringify(ah.immich_album_names)!=JSON.stringify(e.immich_album_names)||JSON.stringify(ah.immich_tag_names)!=JSON.stringify(e.immich_tag_names)||JSON.stringify(ah.immich_persons)!=JSON.stringify(e.immich_persons));if(ah.show_images&&(!this.mediaList||!this.mediaList.length||!t||!e.show_images||n)){const e=this,r=this.screensaverRunning()&&t;n&&(this.clearMediaListRetry(),this.resetMediaPathLists(),this.mediaList=[],this.mediaIndex=-1),this.updateMediaList(function(){r&&e.switchActiveMedia("reconfigure")},n)}if(ah.disable_screensaver_on_browser_mod_popup_func)try{this.disable_screensaver_on_browser_mod_popup_function=new Function("bmp",ah.disable_screensaver_on_browser_mod_popup_func)}catch(e){this.disable_screensaver_on_browser_mod_popup_function=null,Sh.error("Invalid disable_screensaver_on_browser_mod_popup_func:",e)}Dh()&&ah.camera_motion_detection_enabled?this.cameraMotionDetection.start():this.cameraMotionDetection.stop()}getMoreInfoDialog(){const e=vh.shadowRoot.querySelector("ha-more-info-dialog");if(!e)return;const t=e.shadowRoot.querySelector("ha-dialog");return t||void 0}moreInfoDialogToForeground(){const e=this;!function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;const r=e.getMoreInfoDialog();if(r)return r.style.position="absolute",void(r.style.zIndex=e.style.zIndex+1);n<10&&setTimeout(t,50,n+1)}()}fetchEXIFInfo(e){const t=this;if(fh.get(e.infoCacheUrl))return;const n=document.createElement("img");n.src=e.src,n.mediaUrl=e.mediaUrl,n.infoCacheUrl=e.infoCacheUrl,id(n,function(){Sh.debug("EXIF data:",n.exifdata),mh(n.infoCacheUrl,n.exifdata),t.setMediaDataInfo(n);const e=n.exifdata.GPSLongitude,r=n.exifdata.GPSLatitude;if(ah.fetch_address_data&&e&&!isNaN(e[0])&&r&&!isNaN(r[0])){let i="S"==n.exifdata.GPSLatitudeRef?-1:1;const a=r[0]*i+(r[1]*i*60+r[2]*i)/3600;i="W"==n.exifdata.GPSLongitudeRef?-1:1;const o=e[0]*i+(e[1]*i*60+e[2]*i)/3600;Sh.debug("Fetching nominatim data for lat=".concat(a," lon=").concat(o));const s=new XMLHttpRequest;s.onload=function(){if(200==this.status||0===this.status){const e=JSON.parse(s.responseText);if(Sh.debug("nominatim data:",e),e&&e.address){const r=fh.get(n.infoCacheUrl);r?(r.address=e.address,t.setMediaDataInfo(n)):Sh.warn("URL not in cache:",n.infoCacheUrl)}}else Sh.error("nominatim error:",this.status,s.status,s.responseText)},s.onerror=function(e){Sh.error("nominatim error:",e)},s.ontimeout=function(e){Sh.error("nominatim timeout:",e)},s.open("GET","https://nominatim.openstreetmap.org/reverse?lat=".concat(a,"&lon=").concat(o,"&format=json")),s.timeout=15e3,s.send()}})}setMediaDataInfo(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;const t=ah.show_image_info&&Boolean(ah.image_info_template);if(this.imageOneInfoContainer.style.display=t?"block":"none",this.imageTwoInfoContainer.style.display=t?"block":"none",!t)return this.imageOneInfo.innerHTML="",void(this.imageTwoInfo.innerHTML="");e||(e=this.getActiveMediaElement());const n=e.infoCacheUrl;let r=e.mediaUrl;if(!n)return void Sh.debug("infoCacheUrl missing:",e);if(!r)return void Sh.debug("mediaUrl missing:",e);r=decodeURI(r);const i=[];if(this.imageOne.infoCacheUrl==n&&i.push(this.imageOneInfo),this.imageTwo.infoCacheUrl==n&&i.push(this.imageTwoInfo),0==i.length)return;let a=fh.get(n);a||(a={}),a.image||(a.image={}),void 0===a.image.url&&(a.image.url=r);const o=r.replace(/\?[^?]*$/,"").replace(/\/+$/,"");if(void 0===a.image.path&&(a.image.path=o.replace(/^[^:]+:\/\/[^/]+/,"")),void 0===a.image.relativePath){const c="media-source"===Uh()?n.replace(/\?[^?]*$/,"").replace(/\/+$/,""):o;a.image.relativePath=c.replace(ah.image_url,"").replace(/^\/+/,"")}if(void 0===a.image.filename&&(a.image.filename=o.replace(/^.*[\\/]/,"")),void 0===a.image.folderName){a.image.folderName="";const u=o.split("/");u.length>=2&&(a.image.folderName=u[u.length-2])}a.mediaPosition=this.mediaIndex+1,a.mediaCount=this.mediaList.length,Sh.debug("Media info:",a);let s=ah.image_info_template||"";if("analyze"==s){function l(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const n=Object.keys(e);n.sort(),n.forEach(n=>{const r=e[n];"object"==typeof r&&null!==r?l(r,n+"."):s+="".concat(t).concat(n,": ").concat(xh(r),"
")})}s="",l(a),this.imageOneInfo.style.pointerEvents="none",this.imageTwoInfo.style.pointerEvents="none",i.forEach(e=>{e.style.pointerEvents="auto"})}else s=s.replace(/\${([^}]+)}/g,(e,t)=>{const n=t.split("||");for(let e=0;e{const t=e.split(":",2);t[0]&&t[1]&&(o[t[0].replace(/\s/g,"")]=t[1].replace(/\s/g,""))}))}}let s="";const c=t.split("|");let u="";for(let e=0;e{s&&(s=s[e])}),s)break}if(s){if(/DateTime/i.test(u)){const e=new Date(s.replace(/(\d\d\d\d):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)/,"$1-$2-$3T$4:$5:$6"));if(isNaN(e))continue;o||(o={year:"numeric",month:"2-digit",day:"2-digit"}),s=e.toLocaleDateString((vh.hass||vh.__hass).locale.language,o)}return"object"==typeof s&&(s=JSON.stringify(s)),r+s+i}}return""});i.forEach(e=>{e.innerHTML=s,e.style.display="block"})}clearMediaListRetry(){this.mediaListRetryTimer&&(clearTimeout(this.mediaListRetryTimer),this.mediaListRetryTimer=null),this.mediaListRetryAt=0}async updateMediaList(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(!ah.image_url)return;if(this.updatingMediaList)return;if(this.mediaListRetryAt>Date.now())return;if(!t&&(new Date).getTime()-this.lastMediaListUpdate<1e3*ah.media_list_update_interval)return;this.clearMediaListRetry();const r=this;let i=null;const a=Uh();if("unsplash-api"==a)i=r.updateMediaListFromUnsplashAPI;else if("immich-api"==a)i=r.updateMediaListFromImmichAPI;else{if("media-source"!=a){let t=ah.image_url;return"iframe"==a?t=t.replace(/^iframe\+/,""):"embed"==a&&(t=t.replace(/^embed\+/,"")),this.mediaList=[t],void(e&&e())}i=r.updateMediaListFromMediaSource}this.updatingMediaList=!0,this.lastMediaListUpdate=Date.now();try{await i.bind(r)(),this.clearMediaListRetry(),Sh.debug("Media list from ".concat(a," is now:"),r.mediaList),e&&e()}catch(t){const i=3;let o=3e3;if(429===t.httpStatus&&(o=Number.isFinite(t.retryAfterDelay)?Math.max(t.retryAfterDelay,3e3):Math.min(6e4*2**n,36e5)),Sh.warn("Failed to update media list from ".concat(a,":"),t),n{r.mediaListRetryTimer=null,r.mediaListRetryAt=0,r.updateMediaList(e,!0,n+1)},o);else{const e="Failed to update media list from ".concat(ah.image_url," after ").concat(i," retries: ").concat(t.message||xh(t));Sh.error(e)}}this.updatingMediaList=!1}resetMediaPathLists(){this.mediaPathLists=[],this.mediaPathQueue=[],this.currentMediaPath=null}limitMediaList(e){return e.length>ah.media_list_max_size?(Sh.info("Using only ".concat(ah.media_list_max_size," of ").concat(e.length," media items")),e.slice(0,ah.media_list_max_size)):e}async findMediaPathLists(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;const n=this;if(Sh.debug("findMediaPathLists: ".concat(e)),!t&&(t=[],ah.exclude_filenames))for(const e of ah.exclude_filenames)t.push(new RegExp(e));try{const r=await n.hass.callWS({type:"media_source/browse_media",media_content_id:e});Sh.debug("Found media entry",r);const i=[],a=[];for(const e of r.children){const r=e.media_content_id.replace(/^media-source:\/\/[^/]+/,"");let o=!1;for(const e of t)if(e.lastIndex=0,e.test(r)){o=!0;break}if(!o)if(["image","video"].includes(e.media_class)){if(ah.exclude_media_types&&ah.exclude_media_types.includes(e.media_class))continue;i.push(e.media_content_id)}else"directory"==e.media_class&&a.push(n.findMediaPathLists(e.media_content_id,t))}const o=(await Promise.all(a)).flat();return(i.length?[{path:e,medias:i}]:[]).concat(o)}catch(t){throw Sh.warn("Error browsing media ".concat(e,":"),t),t}}updateMediaPathQueue(){const e=this.mediaPathLists.map(e=>e.path);this.mediaPathQueue=this.mediaPathQueue.filter((t,n,r)=>t!=this.currentMediaPath&&e.includes(t)&&r.indexOf(t)==n)}selectNextMediaPath(){if(!this.mediaPathLists.length)return this.mediaList=[],this.mediaIndex=-1,this.currentMediaPath=null,!1;this.mediaPathQueue.length||(this.mediaPathQueue=Ph(this.mediaPathLists.map(e=>e.path)),this.mediaPathQueue.length>1&&this.mediaPathQueue[0]==this.currentMediaPath&&([this.mediaPathQueue[0],this.mediaPathQueue[1]]=[this.mediaPathQueue[1],this.mediaPathQueue[0]]));const e=this.mediaPathQueue.shift(),t=this.mediaPathLists.find(t=>t.path==e);return t?(this.currentMediaPath=e,this.mediaList=this.limitMediaList(t.medias.slice().sort()),this.mediaIndex=-1,Sh.debug("Selected media path ".concat(e,":"),this.mediaList),this.mediaList.length>0):(this.updateMediaPathQueue(),this.selectNextMediaPath())}updateRandomPathMediaLists(e){const t=this.mediaList[this.mediaIndex],n=this.mediaIndex;this.mediaPathLists=e,this.updateMediaPathQueue();const r=this.mediaPathLists.find(e=>e.path==this.currentMediaPath);if(!r)return this.currentMediaPath=null,this.mediaPathQueue=[],void this.selectNextMediaPath();this.mediaList=this.limitMediaList(r.medias.slice().sort()),t&&this.mediaList.includes(t)?this.mediaIndex=this.mediaList.indexOf(t):this.mediaIndex=n>=0?Math.min(n-1,this.mediaList.length-1):-1}async updateMediaListFromMediaSource(){const e=ah.image_url,t=this;try{const n=await t.findMediaPathLists(e);if("random_path"==ah.media_order)return void t.updateRandomPathMediaLists(n);t.resetMediaPathLists();let r=n.flatMap(e=>e.medias);r="random"==ah.media_order?Ph(r):"random_but_synced"==ah.media_order?Ph(r.slice().sort(),Rh(Th)):r.sort(),t.mediaList=t.limitMediaList(r)}catch(e){throw new Error("Failed to update image list from ".concat(ah.image_url,": ").concat(e.message||xh(e)))}}async updateMediaListFromUnsplashAPI(){const e=[],t="".concat(ah.image_url,"&count=30");Sh.debug("Unsplash API request: ".concat(t));try{const n={method:"GET",headers:{Accept:"application/json"}};"undefined"!=typeof AbortSignal&&void 0!==AbortSignal.timeout&&(Sh.debug("Using AbortSignal"),n.signal=AbortSignal.timeout(1e3*ah.immich_api_request_timeout));const r=await fetch(t,n);if(!r.ok){const e=await r.text(),t=new Error("Unsplash API request failed: ".concat(r.status," ").concat(r.statusText," - ").concat(e));throw t.httpStatus=r.status,429===r.status&&(t.retryAfterDelay=function(e){const t=e.headers.get("Retry-After");if(t){const e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.round(1e3*e);const n=Date.parse(t);if(Number.isFinite(n))return Math.max(0,n-Date.now())}const n=Number(e.headers.get("X-Ratelimit-Reset"));if(Number.isFinite(n)&&n>0){const e=n>1e12?n:1e3*n;return Math.max(0,e-Date.now())}return null}(r)),t}const i=await r.json();Sh.debug("Got Unsplash API response"),i.forEach(t=>{Sh.debug(t);const n="".concat(t.urls.raw,"&w=${width}&h=${height}&auto=format");e.push(n),mh(n,t)}),this.mediaList=e}catch(e){if("AbortError"===e.name)throw new Error("Unsplash API request timed out: ".concat(t));throw e}}async _immichFetch(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const i={headers:{"x-api-key":t,"Content-Type":"application/json",Accept:"application/json"}},a=n(n({},i),r);a.headers=n(n({},i.headers),r.headers),"undefined"!=typeof AbortSignal&&void 0!==AbortSignal.timeout&&(Sh.debug("Using AbortSignal"),a.signal=AbortSignal.timeout(1e4)),Sh.debug("Immich API request: ".concat(e));try{const t=await fetch(e,a);if(!t.ok){const e=await t.text();throw new Error("Immich API request failed: ".concat(t.status," ").concat(t.statusText," - ").concat(e))}return await t.json()}catch(t){if("AbortError"===t.name)throw new Error("Immich API request timed out: ".concat(e));throw t}}async updateMediaListFromImmichAPI(){if(!ah.immich_api_keys||!ah.immich_api_keys.length)throw new Error("No immich_api_key configured");const e=this,t=this.screensaverContainer.clientWidth>=this.screensaverContainer.clientHeight?"landscape":"portrait";let n=ah.exclude_media_orientation;"auto"==n&&(n="landscape"==t?"portrait":"landscape"),Sh.debug("config.exclude_media_orientation=".concat(ah.exclude_media_orientation,", screenOrientation=").concat(t,", exclude_media_orientation=").concat(n));let r=[];const i={},a=ah.image_url.replace(/^immich\+/,""),o=[];if(ah.exclude_filenames)for(const e of ah.exclude_filenames)o.push(new RegExp(e));function s(e){return null!=e.width&&null!=e.height?{width:e.width,height:e.height}:function(e){if(null==e||!e.exifImageWidth||null==e||!e.exifImageHeight)return null;let t=e.exifImageWidth,n=e.exifImageHeight;if(e.orientation){const r=Number(e.orientation);[5,6,7,8,90,-90].includes(r)&&([t,n]=[n,t])}return{width:t,height:n}}(e.exifInfo)}function c(e){const t=s(e);return t?t.width>=t.height?"landscape":"portrait":null}async function u(t,s){let u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;await async function(t,r){const i=ah.immich_exclude_tag_names&&ah.immich_exclude_tag_names.length,o=!!n;for(let n=0;n{var n;const s="image"===(null===(n=t.type)||void 0===n?void 0:n.toLowerCase()),c=s&&!0!==t.isEdited&&(null==t.width||null==t.height||void 0===t.isEdited),u=s&&o&&(null==t.width||null==t.height);if(!t.exifInfo||i&&!t.tags||u||c){Sh.debug("Fetching asset info for ".concat(t.id));const n=await e._immichFetch("".concat(a,"/assets/").concat(t.id),r);t.exifInfo=n.exifInfo,t.tags=(n.tags||[]).map(e=>e.value),t.width=n.width,t.height=n.height,t.isEdited=n.isEdited}}))}}(t,s);for(const e of t){Sh.debug("Processing immich asset",e);const t=e.type.toLowerCase();if(!["image","video"].includes(t)){Sh.debug("Neither image nor video, skipping");continue}if(ah.exclude_media_types&&ah.exclude_media_types.includes(t)){Sh.debug('Media type "'.concat(t,'" excluded'));continue}let l=!1;for(const t of o)t.test(e.originalFileName)&&(Sh.debug('Media item excluded by regex "'.concat(t,'"')),l=!0);if(l)continue;if(ah.immich_exclude_tag_names&&ah.immich_exclude_tag_names.length){const t=e.tags.filter(e=>ah.immich_exclude_tag_names.includes(e));if(t.length>0){Sh.debug("Media item excluded due to tag(s): ".concat(t.join(", ")));continue}}if(n){const t=c(e);if(t===n){Sh.debug('Media item with orientation "'.concat(t,'" excluded'));continue}}let h="original";"preview"==ah.immich_resolution&&(h="video"==t?"video/playback":"thumbnail?size=preview");let d="".concat(a,"/assets/").concat(e.id,"/").concat(h);if("image"==t&&(d+=d.includes("?")?"&edited=true":"?edited=true"),r.indexOf(d)>=0)continue;r.push(d);const f=e.exifInfo||{};f.immichApiKey=s,f.mediaType=t,f.image={filename:e.originalFileName,folderName:u},i[d]=f}}try{for(const t of ah.immich_api_keys)if(Sh.debug("Using immich API key ".concat(t)),ah.immich_persons&&ah.immich_persons.length){Sh.debug("Searching for assets based on persons");const n=ah.immich_persons.map(e=>(Array.isArray(e)?e:[e]).map(e=>e.toLowerCase())),r={};let i=[],o=1,s=!0;for(;s;){const n=await e._immichFetch("".concat(a,"/people?size=1000&page=").concat(o),t);i=i.concat(n.people),s=n.hasNextPage,o++}i.forEach(e=>{e.name&&e.id&&(r[e.name.toLowerCase()]=e.id)});for(const i of n){const n=[];if(i.forEach(e=>{const t=r[e.toLowerCase()];t?n.push(t):Sh.error("Person not found in immich: ".concat(e))}),n.length>0){Sh.debug("Searching asset metadata for persons: ",n);let r=1;for(;;){Sh.debug("Fetching asset metadata page ".concat(r));const o=await e._immichFetch("".concat(a,"/search/metadata"),t,{method:"POST",body:JSON.stringify({personIds:n,withExif:!0,page:r,size:1e3})});if(Sh.debug("Got immich API response",o),!o.assets.count){if(1==r){const e="No media items found in immich that contain all these people: ".concat(i);Sh.error(e)}break}if(await u(o.assets.items,t),!o.assets.nextPage)break;r=parseInt(o.assets.nextPage,10)}}}}else if(ah.immich_memories){Sh.debug("Fetching immich memories (on_this_day)");const n=await e._immichFetch("".concat(a,"/memories?type=on_this_day"),t);Sh.debug("Got immich API response",n);const r=new Date,i=n.filter(e=>{const t=new Date(e.showAt),n=new Date(e.hideAt);return r>=t&&r<=n});Sh.debug("Found ".concat(i.length," visible memories")),await Promise.all(i.map(async e=>{Sh.debug("Processing memory:",e),await u(e.assets,t)}))}else if(ah.immich_favorites){Sh.debug("Search for favorites in asset metadata");let n=1;for(;;){Sh.debug("Fetching asset metadata page ".concat(n));const r=await e._immichFetch("".concat(a,"/search/metadata"),t,{method:"POST",body:JSON.stringify({isFavorite:!0,withExif:!0,page:n,size:1e3})});if(Sh.debug("Got immich API response",r),!r.assets.count){if(1==n){const e="No favorite media items found in immich";Sh.error(e)}break}if(await u(r.assets.items,t),!r.assets.nextPage)break;n=parseInt(r.assets.nextPage,10)}}else if(ah.immich_tag_names&&ah.immich_tag_names.length){Sh.debug("Searching for assets based on tag names");const n=ah.immich_tag_names.map(e=>e.toLowerCase());Sh.debug("Fetching immich tags");const r=await e._immichFetch("".concat(a,"/tags"),t);Sh.debug("Got immich API response",r);const i=r.filter(e=>{const t=n.includes(e.name.toLowerCase());return Sh.debug("".concat(t?"Adding":"Skipping"," tag: ").concat(e.name)),t}).map(e=>e.id);if(i.length>0){Sh.debug("Searching asset metadata for tags: ",i);let r=1;for(;;){Sh.debug("Fetching asset metadata page ".concat(r));const o=await e._immichFetch("".concat(a,"/search/metadata"),t,{method:"POST",body:JSON.stringify({tagIds:i,withExif:!0,page:r,size:1e3})});if(Sh.debug("Got immich API response",o),!o.assets.count){if(1==r){const e="No media items found in immich that contain these tags: ".concat(n);Sh.error(e)}break}if(await u(o.assets.items,t),!o.assets.nextPage)break;r=parseInt(o.assets.nextPage,10)}}else{const e="No matching immich tags found or selected.";Sh.error(e)}}else{Sh.debug("Searching for assets based on albums");const n=(ah.immich_album_names||[]).map(e=>e.toLowerCase());Sh.debug("Fetching immich albums (shared=".concat(ah.immich_shared_albums,")"));const r=await e._immichFetch("".concat(a,"/server/version"),t);Sh.debug("Immich server version:",r);const i=r.major<3?"shared":"isShared",o=await e._immichFetch("".concat(a,"/albums?").concat(i,"=").concat(ah.immich_shared_albums),t);Sh.debug("Got immich API response",o);const s=o.filter(e=>{const t=!n.length||n.includes(e.albumName.toLowerCase());return Sh.debug("".concat(t?"Adding":"Skipping"," album: ").concat(e.albumName)),t});if(s.length>0)for(const n of s){Sh.debug("Fetching assets for album: ",n.albumName);let r=1;for(;;){const i=await e._immichFetch("".concat(a,"/search/metadata"),t,{method:"POST",body:JSON.stringify({albumIds:[n.id],withExif:!0,page:r})});if(Sh.debug("Got immich album assets (page ".concat(r,")"),i),await u(i.assets.items,t,n.albumName),!i.assets.nextPage)break;r=parseInt(i.assets.nextPage,10)}}else Sh.debug("No matching immich albums found or selected.")}!function(){if(0==r.length){const e="No matching media assets found";Sh.error(e)}r="random"==ah.media_order?Ph(r):"random_but_synced"==ah.media_order?Ph(r.slice().sort(),Rh(Th)):r.sort(),r.length>ah.media_list_max_size&&(Sh.info("Using only ".concat(ah.media_list_max_size," of ").concat(r.length," media items")),r=r.slice(0,ah.media_list_max_size)),r.forEach(e=>{mh(e,i[e])}),e.mediaList=r}()}catch(e){throw Sh.error("Immich API processing failed:",e),e}}fillPlaceholders(e){const t=this.screensaverContainer.clientWidth,n=this.screensaverContainer.clientHeight,r=Date.now(),i=Math.floor(r/1e3);return e=(e=(e=(e=e.replace(/\${width}/g,t)).replace(/\${height}/g,n)).replace(/\${timestamp_ms}/g,r)).replace(/\${timestamp}/g,i)}async updateMediaFromUrl(e,t){var n=this;let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];ah.force_load_media_with_fetch&&(a=!0);const o=(e,n)=>{const r=new Error("Failed to load ".concat(e.tagName,' "').concat(t,'": HTTP ').concat(n.status," ").concat(n.statusText).trim());return r.response={url:n.url,status:n.status,statusText:n.statusText,type:n.type},r},s=async e=>{const n=e.tagName.toLowerCase(),r={img:"load",video:"loadeddata",iframe:"load",embed:"load"}[n];if(!r)throw new Error('Unsupported element tag "'.concat(e.tagName,'"'));const s=new Promise((i,a)=>{const o=()=>{e.onerror=null,e.removeEventListener(r,s)},s=async()=>{if(o(),"img"===n&&"function"==typeof e.decode)try{await e.decode()}catch(e){Sh.debug('Failed to pre-decode loaded image "'.concat(t,'":'),e)}i()};e.addEventListener(r,s),e.onerror=()=>{o();const n=new Error("Failed to load ".concat(e.tagName,' "').concat(t,'"'));n.mediaElement={tagName:e.tagName,currentSrc:e.currentSrc||e.src||"",complete:e.complete,naturalWidth:e.naturalWidth,naturalHeight:e.naturalHeight,readyState:e.readyState,networkState:e.networkState},e.error&&(n.mediaElement.error={code:e.error.code,message:e.error.message}),a(n)}});if(a)if(i=i||{},ah.stream_load_media){const n=await fetch(t,{headers:i});if(!n.ok)throw o(e,n);if(!n.body)throw new Error("Failed to load ".concat(e.tagName,' "').concat(t,'": empty body'));const r=n.body.getReader(),a=new ReadableStream({start:e=>function t(){return r.read().then(n=>{let{done:r,value:i}=n;if(!r)return e.enqueue(i),t();e.close()})}()}),s=await new Response(a).blob();"string"==typeof e.src&&e.src.startsWith("blob:")&&URL.revokeObjectURL(e.src),e.src=URL.createObjectURL(s)}else{const n=await fetch(t,{headers:i});if(Sh.debug("Got respone",n),!n.ok)throw o(e,n);"string"==typeof e.src&&e.src.startsWith("blob:")&&URL.revokeObjectURL(e.src);const r=await n.blob();e.src=URL.createObjectURL(r)}else e.src=t;return s},c=async function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;t||(t="img"===e.tagName.toLowerCase()?"video":"img");const i=n.replaceMediaElement(e,t);try{return await s(i),i}catch(e){throw r||e}},u=async(e,t)=>{try{return await s(e),e}catch(n){if(t)return await c(e,null,n);throw n}};return r?r===e.tagName.toLowerCase()?await u(e,!1):await c(e,r):await u(e,!0)}getNextMediaURL(){let e,t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this.mediaList.length?("random_but_synced"==ah.media_order?e=Math.floor(Date.now()/(1e3*ah.display_time))%this.mediaList.length:(e=this.mediaIndex,"forwards"==this.mediaListDirection?e++:e--,e>=this.mediaList.length?("random_path"==ah.media_order&&t&&this.selectNextMediaPath(),e=0):e<0&&(e=this.mediaList.length-1)),t&&(this.mediaIndex=e),this.mediaList[e]):null}async updateMediaFromMediaSource(e){var t;const n=await this.hass.callWS({type:"media_source/resolve_media",media_content_id:e.mediaUrl}),r=null===(t=n.mime_type)||void 0===t?void 0:t.match(/^(image|video)\//),i={image:"img",video:"video"}[null==r?void 0:r[1]]||null;let a=n.url;return a.startsWith("http://")||a.startsWith("https://")||(a="".concat(document.location.origin).concat(a)),Sh.debug("Setting image src: ".concat(a)),e.mediaUrl=a,await this.updateMediaFromUrl(e,e.mediaUrl,i)}async updateMediaFromImmichAPI(e){const t=fh.get(e.mediaUrl)||{},n="video"==t.mediaType?"video":"img";return await this.updateMediaFromUrl(e,e.mediaUrl,n,{"x-api-key":t.immichApiKey},!0)}async updateMediaFromMediaEntity(e){const t=e.mediaUrl.match(/^media-entity-(image|video):\/\/(.*)/);if(!t)throw new Error('Invalid URL "'.concat(e.mediaUrl,'"'));const n=t[1],r=t[2],i=this.hass.states[r];if(!i)throw new Error('Entity "'.concat(r,'" not available'));function a(){"media_exif"in i.attributes?mh(e.infoCacheUrl,i.attributes.media_exif):mh(e.infoCacheUrl,i.attributes)}if(ph=i.state,"video"==n)return e.infoCacheUrl=e.mediaUrl,a(),(e=this.replaceMediaElement(e,"ha-camera-stream")).style.visibility="hidden",Object.assign(e,{hass:this.__hass,stateObj:this.__hass.states[r],"allow-exoplayer":!1,controls:!1}),new Promise((t,n)=>{let r=0;e.addEventListener("load",async function e(i){const a=i.currentTarget;a.removeEventListener("load",e),await a.updateComplete;const[o,s]=kh(a);if(!o||!s)return r++,r<=20?void setTimeout(()=>e(i),100):void n(new Error("Failed to initialize camera stream player"));if(o.style.height="100%",s.autoplay=!1,s.muted=!1,s.volume=ah.video_volume,s.style.maxHeight="100%",s.style.height="100%",s.readyState>=s.HAVE_ENOUGH_DATA)t(a);else{const e=()=>{s.removeEventListener("canplay",e),t(a)};s.addEventListener("canplay",e)}})});{if(!i.attributes||!i.attributes.entity_picture)throw new Error('Entity "'.concat(r,'" has no entity_picture attribute'));const t=i.attributes.entity_picture;let n=t.indexOf("?")>0?"&":"?";return n+=this.fillPlaceholders("width=${width}&height=${height}&ts=${timestamp_ms}"),e.mediaUrl=t+n,e.infoCacheUrl=e.mediaUrl,a(),await this.updateMediaFromUrl(e,e.mediaUrl,"img",null,!0)}}async updateMediaFromUnsplashAPI(e){const t=fh.get(e.mediaUrl);return e.mediaUrl=this.fillPlaceholders(e.mediaUrl),t&&mh(e.mediaUrl,t),await this.updateMediaFromUrl(e,e.mediaUrl,"img")}async updateMediaFromMediaIframe(e){return await this.updateMediaFromUrl(e,e.mediaUrl,"iframe")}async updateMediaFromMediaEmbed(e){return await this.updateMediaFromUrl(e,e.mediaUrl,"embed")}async updateMediaFromOtherSrc(e){return e.mediaUrl=this.fillPlaceholders(e.mediaUrl),await this.updateMediaFromUrl(e,e.mediaUrl)}async updateMedia(e){if(ah.show_images){this.updatingMedia=!0,e.style.visibility="hidden";try{if(e==this.getActiveMediaElement()){const e=this.getInactiveMediaElement();if("video"===e.tagName.toLowerCase())try{e.pause()}catch(e){Sh.debug(e)}else if("ha-camera-stream"===e.tagName.toLowerCase())try{const[t,n]=kh(e);n&&n.pause(),t&&"function"==typeof t.stop&&t.stop()}catch(e){Sh.debug(e)}}if(e.mediaUrl=this.getNextMediaURL(),!e.mediaUrl)return;if(e.infoCacheUrl=e.mediaUrl,e="media-source"==Uh()?await this.updateMediaFromMediaSource(e):"unsplash-api"==Uh()?await this.updateMediaFromUnsplashAPI(e):"immich-api"==Uh()?await this.updateMediaFromImmichAPI(e):Uh().startsWith("media-entity")?await this.updateMediaFromMediaEntity(e):"iframe"==Uh()?await this.updateMediaFromMediaIframe(e):"embed"==Uh()?await this.updateMediaFromMediaEmbed(e):await this.updateMediaFromOtherSrc(e)){e.style.visibility="visible";const t="video"===e.tagName.toLowerCase();t&&await new Promise((t,n)=>{if(e.readyState>=e.HAVE_ENOUGH_DATA)t();else{const r=()=>{e.removeEventListener("canplay",r),e.removeEventListener("error",i),t()},i=()=>{e.removeEventListener("canplay",r),e.removeEventListener("error",i),n(new Error("Video failed to load"))};e.addEventListener("canplay",r),e.addEventListener("error",i)}}),"image"===ah.image_background&&this.loadBackgroundImage(e),!t&&ah.show_image_info&&/.*\.jpe?g$/i.test(e.mediaUrl.split("?")[0].replace(/\/*$/,""))&&this.fetchEXIFInfo(e)}}catch(t){return Sh.error("Failed to update media from ".concat(e.mediaUrl,":"),t),null}finally{this.updatingMedia=!1}return e}}setMediaDimensions(){if(!ah.calculate_media_size)return;const e=this.getActiveMediaElement(),t=this.getActiveMediaElement(!0);if(Sh.debug("Setting dimensions for media element",e),!e.mediaUrl)return;const n=t.tagName.toLowerCase();let r=0,i=0;"video"===n?(r=t.videoWidth,i=t.videoHeight):"img"===n&&(r=t.naturalWidth,i=t.naturalHeight);const a=!r||!i||r>=i?ah.image_fit_landscape:ah.image_fit_portrait;e.style.position="absolute",e.style.left="0px",e.style.top="0px",e.style.objectFit=a;const o=this.screensaverContainer.clientWidth,s=this.screensaverContainer.clientHeight;let c=s,u=o,l=0,h=0,d=0,f=0;if(Sh.debug("Available size is ".concat(o,"x").concat(s,", media size is ").concat(r,"x").concat(i)),r&&i){const e=o/r,t=s/i,n=o-r*t,m=s-i*e;Sh.debug("Diff is ".concat(n,"x").concat(m)),"contain"==a&&n=m?(Sh.debug("Using available width"),u=o,c=Math.floor(i*e),d="top"==ah.media_vertical_align?0:"bottom"==ah.media_vertical_align?s-c:Math.floor((c-s)/-2),l=Math.max(c-s,0)):(Sh.debug("Using available height"),c=s,u=Math.floor(r*t),f="left"==ah.media_horizontal_align?0:"right"==ah.media_horizontal_align?o-u:Math.floor((u-o)/-2),h=Math.max(u-o,0))}else"iframe"!==n&&"embed"!==n&&Sh.warn("Size not available for media element",t);Sh.debug("Setting dimensions: size=".concat(u,"x").concat(c," - position=").concat(f,"x").concat(d," - hidden=").concat(h,"x").concat(l)),e.style.width="".concat(u,"px"),e.style.height="".concat(c,"px"),e.style.top="".concat(d,"px"),e.style.left="".concat(f,"px"),e.style.setProperty("--hidden-width",h),e.style.setProperty("--hidden-height",l)}startPlayingActiveMedia(){const e=this.getActiveMediaElement(),t=this.getActiveMediaElement(!0);if("function"!=typeof t.play)return void this.setDisplayTime();const n=()=>{t._wp_video_playback_listeners&&(Object.entries(t._wp_video_playback_listeners).forEach(e=>{let[n,r]=e;t.removeEventListener(n,r)}),t._wp_video_playback_listeners=null)};if(t.loop=ah.video_loop&&t.duration{if(this.getActiveMediaElement()===t){if(t.currentTime>ah.crossfade_time){t.duration-t.currentTime<=ah.crossfade_time&&(this.switchActiveMedia("display_time_elapsed"),n())}}else n()},r=()=>{this.getActiveMediaElement()===t&&this.switchActiveMedia("media_end"),n()},i=()=>{n()};t._wp_video_playback_listeners={timeupdate:e,ended:r,pause:i},Object.entries(t._wp_video_playback_listeners).forEach(e=>{let[n,r]=e;t.addEventListener(n,r)})}t.play().catch(r=>{n(),e===this.getActiveMediaElement()&&Sh.error('Failed to play media "'.concat(e.mediaUrl,'" (src=').concat(t.src,"):"),r)})}async switchActiveMedia(e){if(this.updatingMedia)return void Sh.debug("Already switching media");this.afterFadeoutTimer&&(clearTimeout(this.afterFadeoutTimer),this.afterFadeoutTimer=null);const t=Uh();if(t.startsWith("media-entity")){const t=ah.image_url.replace(/^media-entity-(image|video):\/\//,""),n=this.hass.states[t];if(!n)return void Sh.error('Media entity "'.concat(t,'" not available'));if(ph!=n.state)Sh.debug("Media entity ".concat(t," state has changed"));else{if("entity_update"==e)return;if("start"==e||"user_action"==e)Sh.debug("Media entity ".concat(t," state unchanged, but eventType = ").concat(e));else{if(!ah.media_entity_load_unchanged)return this.lastMediaUpdate=Date.now(),this.isPaused&&(this.mediaTimeElapsedBeforePause=0),void this.restartProgressBarAnimation();Sh.debug("Media entity ".concat(t," state unchanged, but media_entity_load_unchanged = true"))}}ph=n.state}this.lastMediaUpdate=Date.now(),this.isPaused&&(this.mediaTimeElapsedBeforePause=0);const n=this.getActiveMediaElement();if(("iframe"===t||"embed"===t)&&!ah.iframe_load_unchanged&&this.getNextMediaURL(!1)==n.mediaUrl)return;let r=0;"start"!=e&&(ah.crossfade_time>0&&(r=Math.round(1e3*ah.crossfade_time)),"user_action"==e&&r>250&&(r=250));const i=this.getInactiveMediaElement(),a=await this.updateMedia(i);a?(this.mediaLoadRetryAt=0,this._switchActiveMedia(a,r)):this.mediaLoadRetryAt=Date.now()+1e3}_switchActiveMedia(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.lastMediaUpdate=Date.now(),this.isPaused&&(this.mediaTimeElapsedBeforePause=0),this.imageOneContainer.style.transition="opacity ".concat(t,"ms ease-in-out"),this.imageTwoContainer.style.transition="opacity ".concat(t,"ms ease-in-out");let n=this.imageOneContainer,r=this.imageTwoContainer,i=this.imageOne,a=this.imageTwo;e==this.imageOne&&(n=this.imageTwoContainer,r=this.imageOneContainer,i=this.imageTwo,a=this.imageOne),Sh.debug("Switching active media to '".concat(r.id,"'")),1!=r.style.opacity&&(r.style.opacity=1),0!=n.style.opacity&&(n.style.opacity=0),"iframe"==a.tagName.toLowerCase()&&ah.iframe_interaction?a.style.pointerEvents="auto":a.style.pointerEvents="none",this.setMediaDataInfo(),this.setMediaDimensions(),this.setImageURLEntityState(),this.startPlayingActiveMedia(),this.restartProgressBarAnimation(),this.restartKenBurnsEffect();const o=this;this.afterFadeoutTimer=setTimeout(function(){o.afterFadeoutTimer=null,i===o.getInactiveMediaElement()&&o.releaseMediaElement(i)},t)}showMessage(e,t,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;if(!this.messageContainer)return;const i=document.createElement("div");i.className="wallpanel-message ".concat(e);const a=document.createElement("div");a.className="wallpanel-message-title",a.textContent=t,i.appendChild(a);const o=document.createElement("div");o.className="wallpanel-message-text",o.textContent=n,i.appendChild(o),this.messageContainer.appendChild(i),requestAnimationFrame(()=>i.classList.add("show"));const s=this;setTimeout(()=>s.hideMessage(i),r)}hideMessage(e){e.classList.remove("show"),e.addEventListener("transitionend",()=>e.remove())}hideAllMessages(){const e=this.messageContainer.querySelectorAll(".wallpanel-message");if(!e.length)return!1;const t=this;return e.forEach(e=>t.hideMessage(e)),!0}setupScreensaver(){Sh.debug("Setup screensaver"),ah.keep_screen_on_time>0&&!this.screenWakeLock.enabled&&this.screenWakeLock.enable(),ah.fullscreen&&!zh()&&Hh()}async startScreensaver(){if(Sh.debug("Start screensaver"),this.afterFadeoutTimer&&(clearTimeout(this.afterFadeoutTimer),this.afterFadeoutTimer=null),this.mediaLoadRetryAt=0,this.screensaverStartedAt=Date.now(),this.screensaverStoppedAt=null,this.currentWidth=this.screensaverContainer.clientWidth,this.currentHeight=this.screensaverContainer.clientHeight,this.setDefaultStyle(),Oh(),!Dh())return Sh.debug("Wallpanel not active, not starting screensaver"),this.screensaverStartedAt=null,void(this.screensaverStoppedAt=Date.now());if(this.getActiveMediaElement()==this.imageOne?(this.imageOneContainer.style.opacity=1,this.imageTwoContainer.style.opacity=0):(this.imageOneContainer.style.opacity=0,this.imageTwoContainer.style.opacity=1),this.setDisplayTime(),await this.switchActiveMedia("start"),this.setupScreensaver(),ah.keep_screen_on_time>0){const e=this;setTimeout(function(){e.screensaverRunning()&&!e.screenWakeLock.enabled&&(Sh.warning("Keep screen on will not work because the user didn't interact with the document first. https://goo.gl/xX8pDD"),e.showMessage("info","Keep screen on","Please tap the screen for a moment to keep it awake and prevent it from turning off.",15e3))},2e3)}this.lastMove=Date.now(),this.lastMediaUpdate=Date.now(),document.documentElement.style.overflow="hidden",this.isPaused=!1,this.mediaTimeElapsedBeforePause=0,this.pauseIndicator.style.display="none",this.createInfoBoxContent(),this.style.visibility="visible",this.style.opacity=1,this.style.pointerEvents="auto",this.setScreensaverEntityState(),(ah.screensaver_start_navigation_path||ah.screensaver_stop_close_browser_mod_popup)&&(this.screensaverStopNavigationPathTimeout=setTimeout(()=>{ah.screensaver_start_navigation_path&&(hh=!0,function(e){(!(arguments.length>1&&void 0!==arguments[1])||arguments[1])&&!e.includes("?")&&(e+=window.location.search),history.pushState(null,"",e),vh.dispatchEvent(new Event("location-changed",{bubbles:!0,cancelable:!1,composed:!0}))}(ah.screensaver_start_navigation_path),setTimeout(()=>{hh=!1},5e3)),ah.screensaver_stop_close_browser_mod_popup&&Lh().forEach(e=>{e.closeDialog()})},1e3*(ah.fade_in_time+1)))}screensaverRunning(){return Boolean(this.screensaverStartedAt)&&this.screensaverStartedAt>0}stopScreensaver(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;Sh.debug("Stop screensaver"),this.afterFadeoutTimer&&(clearTimeout(this.afterFadeoutTimer),this.afterFadeoutTimer=null),this.mediaLoadRetryAt=0,this.screensaverStartedAt=null,this.screensaverStoppedAt=Date.now(),document.documentElement.style.removeProperty("overflow"),this.screensaverStopNavigationPathTimeout&&clearTimeout(this.screensaverStopNavigationPathTimeout),this.hideAllMessages(),this.debugBox.style.pointerEvents="none",this.style.transition=e>0?"opacity ".concat(Math.round(1e3*e),"ms ease-in-out"):"",this.style.opacity=0,this.style.visibility="hidden",this.style.pointerEvents="none",this.imageOneInfo.style.pointerEvents="none",this.imageTwoInfo.style.pointerEvents="none",this.infoBoxPosX.style.animation="",this.infoBoxPosY.style.animation="",this.idleSince=Date.now(),this.screenWakeLock.enabled&&this.screenWakeLock.disable();const t=this;this.afterFadeoutTimer=setTimeout(function(){t.afterFadeoutTimer=null,t.screensaverRunning()||t.releaseAllMedia()},Math.round(1e3*e)),setTimeout(this.setScreensaverEntityState.bind(this),25)}updateScreensaver(){const e=new Date,t=e.getTime();if(this.energyCollectionUpdateEnabled&&t-this.lastEnergyCollectionUpdate>=1e3*this.energyCollectionUpdateInterval&&(this.hass.connection._energy_wallpanel&&this.hass.connection._energy_wallpanel.refresh(),this.lastEnergyCollectionUpdate=t),this.infoBoxContentCreatedDate&&this.infoBoxContentCreatedDate.getDate()!=e.getDate()&&this.createInfoBoxContent(),ah.info_move_interval>0&&t-this.lastMove>=1e3*ah.info_move_interval&&("random"===ah.info_move_pattern?this.randomMove():"corners"===ah.info_move_pattern?this.moveAroundCorners():Sh.error("Unknown info move type ".concat(ah.info_move_pattern))),ah.black_screen_after_time>0&&t-this.screensaverStartedAt>=1e3*ah.black_screen_after_time)Sh.debug("Setting screen to black"),this.screensaverOverlay.style.background="#000000";else if(ah.show_images){let e;e="random_but_synced"==ah.media_order?Math.floor(t/(1e3*ah.display_time))!=Math.floor(this.lastMediaUpdate/(1e3*ah.display_time)):t-this.lastMediaUpdate>=1e3*this.getDisplayTime();const n=this.mediaLoadRetryAt>0?t>=this.mediaLoadRetryAt:e;this.isPaused||this.updatingMedia||!n||this.switchActiveMedia("display_time_elapsed"),t-this.lastMediaListUpdate>=1e3*ah.media_list_update_interval&&this.updateMediaList(null,!0),"visible"!=this.imageOneContainer.style.visibility&&(this.imageOneContainer.style.visibility="visible"),"visible"!=this.imageOne.style.visibility&&(this.imageOne.style.visibility="visible"),"visible"!=this.imageTwoContainer.style.visibility&&(this.imageTwoContainer.style.visibility="visible"),"visible"!=this.imageTwo.style.visibility&&(this.imageTwo.style.visibility="visible")}else"hidden"!=this.imageOneContainer.style.visibility&&(this.imageOneContainer.style.visibility="hidden"),"hidden"!=this.imageOne.style.visibility&&(this.imageOne.style.visibility="hidden"),"hidden"!=this.imageTwoContainer.style.visibility&&(this.imageTwoContainer.style.visibility="hidden"),"hidden"!=this.imageTwo.style.visibility&&(this.imageTwo.style.visibility="hidden");if(ah.close_more_info_dialog_time>0){const e=this.getMoreInfoDialog();if(e){const t=new Date;this.moreInfoDialogOpenedAt?t-this.moreInfoDialogOpenedAt>=1e3*ah.close_more_info_dialog_time&&e.close():this.moreInfoDialogOpenedAt=t}else this.moreInfoDialogOpenedAt=0}if(ah.debug){let e="";const t={};for(const e in ah)["profiles"].includes(e)?t[e]="...":t[e]=ah[e];if(e+='
Download log
',e+="Version: ".concat(th,"
"),e+="User-Agent: ".concat(navigator.userAgent,"
"),e+="Config: ".concat(JSON.stringify(t),"
"),e+="Fullscreen: ".concat(zh(),"
"),e+="Screensaver started at: ".concat(lh.screensaverStartedAt,"
"),e+="Screen wake lock: enabled=".concat(this.screenWakeLock.enabled," native=").concat(this.screenWakeLock.nativeWakeLockSupported," lock=").concat(this.screenWakeLock._lock," player=").concat(this.screenWakeLock._player," error=").concat(this.screenWakeLock.error,"
"),this.screenWakeLock._player){const t=this.screenWakeLock._player;e+="Screen wake lock video: readyState=".concat(t.readyState," currentTime=").concat(t.currentTime," paused=").concat(t.paused," ended=").concat(t.ended,"
")}e+="Media list size: ".concat(this.mediaList.length,"
");const n=this.getActiveMediaElement();if(n){e+="Current media: ".concat(n.mediaUrl,"
");const t=fh.get(n.infoCacheUrl);t&&(e+="Media info: ".concat(JSON.stringify(t),"
"))}this.debugBox.innerHTML!==e&&(this.debugBox.innerHTML=e,this.debugBox.querySelector("#download_log").addEventListener("click",function(e){Sh.downloadMessages(),e.preventDefault()})),this.debugBox.scrollTop=this.debugBox.scrollHeight}this.screenWakeLock.enabled&&ah.keep_screen_on_time>0&&t-this.screensaverStartedAt>=1e3*ah.keep_screen_on_time&&(Sh.info("Disable wake lock after ".concat(ah.keep_screen_on_time," seconds")),this.screenWakeLock.disable())}switchMediaDirection(e){this.mediaListDirection=e,this.switchActiveMedia("user_action")}async nextImage(){if(this.updatingMedia)return void Sh.debug("Already switching media");Sh.debug("Next image");const e=this.mediaListDirection;this.mediaListDirection="forwards";try{await this.switchActiveMedia("user_action")}finally{this.mediaListDirection=e}}async previousImage(){if(this.updatingMedia)return void Sh.debug("Already switching media");Sh.debug("Previous image");const e=this.mediaListDirection;this.mediaListDirection="backwards";try{await this.switchActiveMedia("user_action")}finally{this.mediaListDirection=e}}togglePlayPause(){if(Sh.debug("Toggle play/pause"),this.screensaverRunning())if(this.isPaused)this.isPaused=!1,this.lastMediaUpdate=Date.now()-(this.mediaTimeElapsedBeforePause||0),this.pauseIndicator.style.display="none",this.progressBar.style.animationPlayState="running",this.startPlayingActiveMedia();else{this.isPaused=!0,this.mediaTimeElapsedBeforePause=Date.now()-this.lastMediaUpdate,this.lastMediaUpdate=Date.now(),this.pauseIndicator.style.display="block",this.progressBar.style.animationPlayState="paused";const e=this.getActiveMediaElement(!0);e&&"function"==typeof e.pause&&e.pause()}}setCameraMotionDetectionEntityState(e){const t=ah.camera_motion_detection_set_entity;t&&this.__hass.states[t]&&(Sh.debug("Updating camera motion detection entity",t,e),this.__hass.callService("input_boolean",e?"turn_on":"turn_off",{entity_id:t}).then(e=>{Sh.debug(e)},e=>{Sh.error("Failed to set camera motion detection entity state:",e)}))}motionDetected(){ah.camera_motion_detection_stop_screensaver&&this.screensaverRunning()&&this.stopScreensaver(ah.fade_out_time_motion_detected),this.setCameraMotionDetectionEntityState(!0)}motionStopped(){this.setCameraMotionDetectionEntityState(!1)}handleInteractionEvent(e){const t=["click","touchend"].includes(e.type),n=Date.now();this.idleSince=n;let r="";if("touchstart"==e.type)return void(e.touches&&e.touches[0]&&(this.touchStartX=e.touches[0].clientX,this.touchStartY=e.touches[0].clientY));if("touchend"==e.type&&this.touchStartX>=0&&e.changedTouches&&e.changedTouches[0]){const t=e.changedTouches[0].clientX-this.touchStartX,n=e.changedTouches[0].clientY-this.touchStartY,i=Math.max(20,.03*window.innerWidth);t>=i&&Math.abs(t)>Math.abs(n)?r="right":t<=-i&&Math.abs(t)>Math.abs(n)&&(r="left"),this.touchStartX=-1,this.touchStartY=-1}if(!this.screensaverRunning())return this.blockEventsUntil>n&&(t&&e.preventDefault(),e.stopImmediatePropagation()),void(t&&this.setupScreensaver());if(t&&this.hideAllMessages())return void(this.blockEventsUntil=n+1e3);let i=e.clientX,a=e.clientY;if(!i&&e.changedTouches&&e.changedTouches[0]&&(i=e.changedTouches[0].clientX),!a&&e.changedTouches&&e.changedTouches[0]&&(a=e.changedTouches[0].clientY),ah.debug&&i&&i<100&&a&&a<100)return;const o=Bh();if(o){const e=[o.shadowRoot.querySelector(".content"),o.shadowRoot.querySelector("ha-dialog-header")];for(let t=0;t=n.left&&i<=n.right&&a>=n.top&&a<=n.bottom)return void Sh.debug("Event on browser mod popup:",e[t])}}if(ah.iframe_interaction&&"iframe"==Uh())return;if(ah.content_interaction){if(this.getMoreInfoDialog())return;let e=[];e=e.concat(this.__cards||[]),e=e.concat(this.__badges||[]),e=e.concat(this.__views||[]),e.push(this.shadowRoot.getElementById("wallpanel-screensaver-info-box-content")),e.push(this.shadowRoot.getElementById("wallpanel-screensaver-fixed-info-box-content")),"analyze"==ah.image_info_template&&(e.push(this.imageOneInfo),e.push(this.imageTwoInfo));for(let t=0;t=n.left&&i<=n.right&&a>=n.top&&a<=n.bottom)return void Sh.debug("Event on:",e[t])}}let s="";if(r)s="left"==r?"forwards":"backwards",e.stopImmediatePropagation();else if(e instanceof MouseEvent||"TouchEvent"in window&&e instanceof TouchEvent){let n=0,r=0;const o=this.screensaverContainer.getBoundingClientRect();if(i&&(n=(o.right-i)/this.screensaverContainer.clientWidth),a&&(r=(o.bottom-a)/this.screensaverContainer.clientHeight),Sh.debug("Event position screensaver:",i,a,o.left,o.right,o.top,o.bottom),r>1||r<0||n>1||n<0)return;if(t&&e.preventDefault(),e.stopImmediatePropagation(),ah.touch_zone_size_next_image>0&&n<=ah.touch_zone_size_next_image/100){if(!t)return;s="forwards"}else if(ah.touch_zone_size_previous_image>0&&n>=(100-ah.touch_zone_size_previous_image)/100){if(!t)return;s="backwards"}else if(n>=.4&&n<=.6&&r<=.1){const e=new Date;return t&&e-this.lastClickTime<500?(this.clickCount+=1,3==this.clickCount&&(Sh.purgeMessages(),ah.debug=!ah.debug,this.debugBox.style.visibility=ah.debug?"visible":"hidden",this.debugBox.style.pointerEvents=ah.debug?"auto":"none")):this.clickCount=1,void(this.lastClickTime=e)}}s?this.updatingMedia?Sh.debug("Already switching media"):(Sh.debug("Switching media, direction ".concat(s)),this.mediaListDirection!=s?this.switchMediaDirection(s):this.switchActiveMedia("user_action")):t&&!ah.stop_screensaver_on_mouse_click||(this.blockEventsUntil=n+1e3*ah.control_reactivation_time,this.stopScreensaver(ah.fade_out_time_interaction))}}customElements.get("wallpanel-view-container")||customElements.define("wallpanel-view-container",r),customElements.get("wallpanel-view")||customElements.define("wallpanel-view",i),uh=document.createElement("wallpanel-view-container"),lh=document.createElement("wallpanel-view"),uh.appendChild(lh),yh.shadowRoot.appendChild(uh)}function qh(){Sh.debug("activateWallpanel");let e=ah.hide_toolbar,t=ah.hide_toolbar_action_icons;if(e&&!ah.hide_toolbar_on_subviews&&ch){const n=Fh();if(n&&n.lovelace&&n.lovelace.rawConfig&&n.lovelace.rawConfig.views)for(let r=0;r{Sh.debug("Successfully exited fullscreen")},e=>{Sh.debug("Failed to exit fullscreen:",e)}):document.mozCancelFullScreen?document.mozCancelFullScreen():document.msRequestFullscreen?document.msRequestFullscreen():document.webkitExitFullscreen&&document.webkitExitFullscreen())}function Vh(){sh&&ch?(Oh(),Dh()?qh():Yh()):Yh()}function Xh(){if(Sh.debug("Location changed from '".concat(oh,"' to '").concat(window.location.href,"'")),window.location.href==oh)return;oh=window.location.href,lh&&lh.screensaverRunning&&lh.screensaverRunning()&&ah.stop_screensaver_on_location_change&&(hh?(hh=!1,lh.screensaverStopNavigationPathTimeout&&clearTimeout(lh.screensaverStopNavigationPathTimeout)):lh.stopScreensaver());let e=null,t=null;const n=window.location.pathname.split("/");n.length>1&&(e=n[1],n.length>2&&(t=n[2]));const r=sh&&e!=sh;sh=e,ch=t,r?(Sh.debug("Reset dashboard config"),ih={},Qh(Vh)):Vh()}function Qh(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;const n=Date.now();null===t&&(t=n);const r=(n-t)/1e3;if(vh=document.querySelector("body > home-assistant"),vh&&vh.shadowRoot&&(yh=vh.shadowRoot.querySelector("home-assistant-main")),!vh||!vh.shadowRoot||!yh)return r>=5?void Sh.error("Wallpanel startup failed after ".concat(r," seconds, element home-assistant / home-assistant-main not found.")):void setTimeout(Qh,100,e,t);const i=Fh();if(!(i&&i.lovelace&&i.lovelace.config&&i.lovelace.config))return r>=5?void Sh.info("No lovelace config found after ".concat(r," seconds")):void setTimeout(Qh,100,e,t);if(!customElements.get("hui-view"))return r>=5?void Sh.error("Wallpanel startup failed after ".concat(r," seconds, hui-view not found.")):void setTimeout(Qh,100,e,t);if(!window.browser_mod){let n=Nh(["wait_for_browser_mod_time"]).wait_for_browser_mod_time;if(void 0===n&&(n=nh.wait_for_browser_mod_time),r{let t=null;try{t=e.target.location.href}catch(e){Sh.debug(e)}Sh.debug("location-changed",t,e),setTimeout(Xh,20)}),window.navigation&&window.navigation.addEventListener("navigate",e=>{let t=null;try{t=e.destination.url}catch(e){Sh.debug(e)}Sh.debug("navigate",t,e),setTimeout(Xh,30)}),(vh.hass||vh.__hass).connection.subscribeEvents(function(e){Sh.debug("lovelace_updated",e),(e.data.url_path?e.data.url_path:"lovelace")==sh&&(vh.hass||vh.__hass).connection.sendMessagePromise({type:"lovelace/config",url_path:e.data.url_path}).then(e=>{if(ih={},e.wallpanel)for(const t in e.wallpanel)(t in nh||t in rh)&&(ih[t]=e.wallpanel[t]);Vh()})},"lovelace_updated"),setTimeout(Xh,0)})}catch(e){Sh.error(e.stack)}var Jh=!1,$h=function(e){return e instanceof $h?e:this instanceof $h?void(this.EXIFwrapped=e):new $h(e)},Zh=$h.Tags={36864:"ExifVersion",40960:"FlashpixVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",37121:"ComponentsConfiguration",37122:"CompressedBitsPerPixel",37500:"MakerNote",37510:"UserComment",40964:"RelatedSoundFile",36867:"DateTimeOriginal",36868:"DateTimeDigitized",37520:"SubsecTime",37521:"SubsecTimeOriginal",37522:"SubsecTimeDigitized",33434:"ExposureTime",33437:"FNumber",34850:"ExposureProgram",34852:"SpectralSensitivity",34855:"ISOSpeedRatings",34856:"OECF",37377:"ShutterSpeedValue",37378:"ApertureValue",37379:"BrightnessValue",37380:"ExposureBias",37381:"MaxApertureValue",37382:"SubjectDistance",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37396:"SubjectArea",37386:"FocalLength",41483:"FlashEnergy",41484:"SpatialFrequencyResponse",41486:"FocalPlaneXResolution",41487:"FocalPlaneYResolution",41488:"FocalPlaneResolutionUnit",41492:"SubjectLocation",41493:"ExposureIndex",41495:"SensingMethod",41728:"FileSource",41729:"SceneType",41730:"CFAPattern",41985:"CustomRendered",41986:"ExposureMode",41987:"WhiteBalance",41988:"DigitalZoomRation",41989:"FocalLengthIn35mmFilm",41990:"SceneCaptureType",41991:"GainControl",41992:"Contrast",41993:"Saturation",41994:"Sharpness",41995:"DeviceSettingDescription",41996:"SubjectDistanceRange",40965:"InteroperabilityIFDPointer",42016:"ImageUniqueID"},Kh=$h.TiffTags={256:"ImageWidth",257:"ImageHeight",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer",40965:"InteroperabilityIFDPointer",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",274:"Orientation",277:"SamplesPerPixel",284:"PlanarConfiguration",530:"YCbCrSubSampling",531:"YCbCrPositioning",282:"XResolution",283:"YResolution",296:"ResolutionUnit",273:"StripOffsets",278:"RowsPerStrip",279:"StripByteCounts",513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",301:"TransferFunction",318:"WhitePoint",319:"PrimaryChromaticities",529:"YCbCrCoefficients",532:"ReferenceBlackWhite",306:"DateTime",270:"ImageDescription",271:"Make",272:"Model",305:"Software",315:"Artist",33432:"Copyright"},ed=$h.GPSTags={0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude",5:"GPSAltitudeRef",6:"GPSAltitude",7:"GPSTimeStamp",8:"GPSSatellites",9:"GPSStatus",10:"GPSMeasureMode",11:"GPSDOP",12:"GPSSpeedRef",13:"GPSSpeed",14:"GPSTrackRef",15:"GPSTrack",16:"GPSImgDirectionRef",17:"GPSImgDirection",18:"GPSMapDatum",19:"GPSDestLatitudeRef",20:"GPSDestLatitude",21:"GPSDestLongitudeRef",22:"GPSDestLongitude",23:"GPSDestBearingRef",24:"GPSDestBearing",25:"GPSDestDistanceRef",26:"GPSDestDistance",27:"GPSProcessingMethod",28:"GPSAreaInformation",29:"GPSDateStamp",30:"GPSDifferential"},td=$h.IFD1Tags={256:"ImageWidth",257:"ImageHeight",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",273:"StripOffsets",274:"Orientation",277:"SamplesPerPixel",278:"RowsPerStrip",279:"StripByteCounts",282:"XResolution",283:"YResolution",284:"PlanarConfiguration",296:"ResolutionUnit",513:"JpegIFOffset",514:"JpegIFByteCount",529:"YCbCrCoefficients",530:"YCbCrSubSampling",531:"YCbCrPositioning",532:"ReferenceBlackWhite"},nd=$h.StringValues={ExposureProgram:{0:"Not defined",1:"Manual",2:"Normal program",3:"Aperture priority",4:"Shutter priority",5:"Creative program",6:"Action program",7:"Portrait mode",8:"Landscape mode"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{0:"Unknown",1:"Daylight",2:"Fluorescent",3:"Tungsten (incandescent light)",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 - 5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},SensingMethod:{1:"Not defined",2:"One-chip color area sensor",3:"Two-chip color area sensor",4:"Three-chip color area sensor",5:"Color sequential area sensor",7:"Trilinear sensor",8:"Color sequential linear sensor"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},SceneType:{1:"Directly photographed"},CustomRendered:{0:"Normal process",1:"Custom process"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},GainControl:{0:"None",1:"Low gain up",2:"High gain up",3:"Low gain down",4:"High gain down"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},SubjectDistanceRange:{0:"Unknown",1:"Macro",2:"Close view",3:"Distant view"},FileSource:{3:"DSC"},Components:{0:"",1:"Y",2:"Cb",3:"Cr",4:"R",5:"G",6:"B"}};function rd(e){return!!e.exifdata}function id(e,t){function n(n){var r=ad(n);e.exifdata=r||{};var i=function(e){var t=new DataView(e);if(255!=t.getUint8(0)||216!=t.getUint8(1))return!1;var n=2,r=e.byteLength,i=function(e,t){return 56===e.getUint8(t)&&66===e.getUint8(t+1)&&73===e.getUint8(t+2)&&77===e.getUint8(t+3)&&4===e.getUint8(t+4)&&4===e.getUint8(t+5)};for(;n")+8,u=(s=s.substring(s.indexOf("4?f:t+8,o=[],c=0;c4?f:t+8,d-1);case 3:if(1==d)return e.getUint16(t+8,!i);for(a=d>2?f:t+8,o=[],c=0;c>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:t+=String.fromCharCode(i);break;case 12:case 13:a=e[n++],t+=String.fromCharCode((31&i)<<6|63&a);break;case 14:a=e[n++],o=e[n++],t+=String.fromCharCode((15&i)<<12|(63&a)<<6|63&o)}return t}(r)}function hd(e,t){if("Exif"!=ld(e,t,4))return!1;var n,r,i,a,o,s=t+6;if(18761==e.getUint16(s))n=!1;else{if(19789!=e.getUint16(s))return!1;n=!0}if(42!=e.getUint16(s+2,!n))return!1;var c=e.getUint32(s+4,!n);if(c<8)return!1;if((r=cd(e,s,s+c,Kh,n)).ExifIFDPointer)for(i in a=cd(e,s,s+r.ExifIFDPointer,Zh,n)){switch(i){case"LightSource":case"Flash":case"MeteringMode":case"ExposureProgram":case"SensingMethod":case"SceneCaptureType":case"SceneType":case"CustomRendered":case"WhiteBalance":case"GainControl":case"Contrast":case"Saturation":case"Sharpness":case"SubjectDistanceRange":case"FileSource":a[i]=nd[i][a[i]];break;case"ExifVersion":case"FlashpixVersion":a[i]=String.fromCharCode(a[i][0],a[i][1],a[i][2],a[i][3]);break;case"ComponentsConfiguration":a[i]=nd.Components[a[i][0]]+nd.Components[a[i][1]]+nd.Components[a[i][2]]+nd.Components[a[i][3]]}r[i]=a[i]}if(r.GPSInfoIFDPointer)for(i in o=cd(e,s,s+r.GPSInfoIFDPointer,ed,n)){if("GPSVersionID"==i)try{o[i]=o[i][0]+"."+o[i][1]+"."+o[i][2]+"."+o[i][3]}catch(e){}r[i]=o[i]}return r.thumbnail=function(e,t,n,r){var i=function(e,t,n){var r=e.getUint16(t,!n);return e.getUint32(t+2+12*r,!n)}(e,t+n,r);if(!i)return{};if(i>e.byteLength)return{};var a=cd(e,t,t+i,td,r);if(a.Compression)switch(a.Compression){case 6:if(a.JpegIFOffset&&a.JpegIFByteCount){var o=t+a.JpegIFOffset,s=a.JpegIFByteCount;a.blob=new Blob([new Uint8Array(e.buffer,o,s)],{type:"image/jpeg"})}break;case 1:Sh.log("Thumbnail image format is TIFF, which is not implemented.");break;default:Sh.log("Unknown thumbnail image format '%s'",a.Compression)}else 2==a.PhotometricInterpretation&&Sh.log("Thumbnail image format is RGB, which is not implemented.");return a}(e,s,c,n),r}function dd(e){var t={};if(1==e.nodeType){if(e.attributes.length>0){t["@attributes"]={};for(var n=0;n0)for(var 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

?4!6N&k8a94_xm|nif7Sz^_C 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

jeQIu(}Vj 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