--- /home/fdroid/fdroiddata/tmp/com.superproductivity.superproductivity_1403030000.apk +++ /home/fdroid/fdroiddata/tmp/sigcp_com.superproductivity.superproductivity_1403030000.apk ├── zipinfo {} │ @@ -123,14 +123,16 @@ │ -rw-r--r-- 0.0 unx 756 b- defN 81-Jan-01 01:01 assets/public/chip-list-input.component-GQQYZYBD.css.map │ -rw-r--r-- 0.0 unx 2001 b- defN 81-Jan-01 01:01 assets/public/chunk-2LCQAWGQ.js │ -rw-r--r-- 0.0 unx 3277 b- defN 81-Jan-01 01:01 assets/public/chunk-2LCQAWGQ.js.map │ -rw-r--r-- 0.0 unx 2086 b- defN 81-Jan-01 01:01 assets/public/chunk-2MOZFEFW.js │ -rw-r--r-- 0.0 unx 6640 b- defN 81-Jan-01 01:01 assets/public/chunk-2MOZFEFW.js.map │ -rw-r--r-- 0.0 unx 2044 b- defN 81-Jan-01 01:01 assets/public/chunk-2NYJ54WT.js │ -rw-r--r-- 0.0 unx 93 b- defN 81-Jan-01 01:01 assets/public/chunk-2NYJ54WT.js.map │ +-rw-r--r-- 0.0 unx 254888 b- defN 81-Jan-01 01:01 assets/public/chunk-2XB3YG6S.js │ +-rw-r--r-- 0.0 unx 798267 b- defN 81-Jan-01 01:01 assets/public/chunk-2XB3YG6S.js.map │ -rw-r--r-- 0.0 unx 1956 b- defN 81-Jan-01 01:01 assets/public/chunk-35DXYMHQ.js │ -rw-r--r-- 0.0 unx 7789 b- defN 81-Jan-01 01:01 assets/public/chunk-35DXYMHQ.js.map │ -rw-r--r-- 0.0 unx 9276 b- defN 81-Jan-01 01:01 assets/public/chunk-3E43H4SH.js │ -rw-r--r-- 0.0 unx 32056 b- defN 81-Jan-01 01:01 assets/public/chunk-3E43H4SH.js.map │ -rw-r--r-- 0.0 unx 51367 b- defN 81-Jan-01 01:01 assets/public/chunk-3PWEB74O.js │ -rw-r--r-- 0.0 unx 259551 b- defN 81-Jan-01 01:01 assets/public/chunk-3PWEB74O.js.map │ -rw-r--r-- 0.0 unx 615 b- defN 81-Jan-01 01:01 assets/public/chunk-3UB54IM4.js │ @@ -145,68 +147,70 @@ │ -rw-r--r-- 0.0 unx 4533 b- defN 81-Jan-01 01:01 assets/public/chunk-4LMAZLVZ.js.map │ -rw-r--r-- 0.0 unx 55071 b- defN 81-Jan-01 01:01 assets/public/chunk-4RZOEXF7.js │ -rw-r--r-- 0.0 unx 403411 b- defN 81-Jan-01 01:01 assets/public/chunk-4RZOEXF7.js.map │ -rw-r--r-- 0.0 unx 4853 b- defN 81-Jan-01 01:01 assets/public/chunk-4WKVJOAH.js │ -rw-r--r-- 0.0 unx 56024 b- defN 81-Jan-01 01:01 assets/public/chunk-4WKVJOAH.js.map │ -rw-r--r-- 0.0 unx 4604 b- defN 81-Jan-01 01:01 assets/public/chunk-5IJWVGPP.js │ -rw-r--r-- 0.0 unx 8705 b- defN 81-Jan-01 01:01 assets/public/chunk-5IJWVGPP.js.map │ +-rw-r--r-- 0.0 unx 1015 b- defN 81-Jan-01 01:01 assets/public/chunk-5TDSJN67.js │ +-rw-r--r-- 0.0 unx 93 b- defN 81-Jan-01 01:01 assets/public/chunk-5TDSJN67.js.map │ +-rw-r--r-- 0.0 unx 3098 b- defN 81-Jan-01 01:01 assets/public/chunk-6KMYC34R.js │ +-rw-r--r-- 0.0 unx 9576 b- defN 81-Jan-01 01:01 assets/public/chunk-6KMYC34R.js.map │ -rw-r--r-- 0.0 unx 1162 b- defN 81-Jan-01 01:01 assets/public/chunk-6QC7LO6P.js │ -rw-r--r-- 0.0 unx 2945 b- defN 81-Jan-01 01:01 assets/public/chunk-6QC7LO6P.js.map │ -rw-r--r-- 0.0 unx 8837 b- defN 81-Jan-01 01:01 assets/public/chunk-76O5NF5S.js │ -rw-r--r-- 0.0 unx 44826 b- defN 81-Jan-01 01:01 assets/public/chunk-76O5NF5S.js.map │ --rw-r--r-- 0.0 unx 29977 b- defN 81-Jan-01 01:01 assets/public/chunk-7JUHICSP.js │ --rw-r--r-- 0.0 unx 109075 b- defN 81-Jan-01 01:01 assets/public/chunk-7JUHICSP.js.map │ -rw-r--r-- 0.0 unx 2829 b- defN 81-Jan-01 01:01 assets/public/chunk-7KIIUYK2.js │ -rw-r--r-- 0.0 unx 11992 b- defN 81-Jan-01 01:01 assets/public/chunk-7KIIUYK2.js.map │ -rw-r--r-- 0.0 unx 1214 b- defN 81-Jan-01 01:01 assets/public/chunk-7MCI5DGR.js │ -rw-r--r-- 0.0 unx 3481 b- defN 81-Jan-01 01:01 assets/public/chunk-7MCI5DGR.js.map │ -rw-r--r-- 0.0 unx 8847 b- defN 81-Jan-01 01:01 assets/public/chunk-7VZPLBFY.js │ -rw-r--r-- 0.0 unx 15671 b- defN 81-Jan-01 01:01 assets/public/chunk-7VZPLBFY.js.map │ -rw-r--r-- 0.0 unx 3538 b- defN 81-Jan-01 01:01 assets/public/chunk-A3PBXKUF.js │ -rw-r--r-- 0.0 unx 10230 b- defN 81-Jan-01 01:01 assets/public/chunk-A3PBXKUF.js.map │ -rw-r--r-- 0.0 unx 10796 b- defN 81-Jan-01 01:01 assets/public/chunk-A5MBRGPF.js │ -rw-r--r-- 0.0 unx 41610 b- defN 81-Jan-01 01:01 assets/public/chunk-A5MBRGPF.js.map │ -rw-r--r-- 0.0 unx 335 b- defN 81-Jan-01 01:01 assets/public/chunk-A6QD6H33.js │ -rw-r--r-- 0.0 unx 680 b- defN 81-Jan-01 01:01 assets/public/chunk-A6QD6H33.js.map │ +-rw-r--r-- 0.0 unx 933 b- defN 81-Jan-01 01:01 assets/public/chunk-AF3ZV4WZ.js │ +-rw-r--r-- 0.0 unx 93 b- defN 81-Jan-01 01:01 assets/public/chunk-AF3ZV4WZ.js.map │ -rw-r--r-- 0.0 unx 51919 b- defN 81-Jan-01 01:01 assets/public/chunk-AYQ5AFM6.js │ -rw-r--r-- 0.0 unx 187498 b- defN 81-Jan-01 01:01 assets/public/chunk-AYQ5AFM6.js.map │ -rw-r--r-- 0.0 unx 54604 b- defN 81-Jan-01 01:01 assets/public/chunk-B55LM2KC.js │ -rw-r--r-- 0.0 unx 183846 b- defN 81-Jan-01 01:01 assets/public/chunk-B55LM2KC.js.map │ -rw-r--r-- 0.0 unx 2210 b- defN 81-Jan-01 01:01 assets/public/chunk-BE3UJ5P4.js │ -rw-r--r-- 0.0 unx 3017 b- defN 81-Jan-01 01:01 assets/public/chunk-BE3UJ5P4.js.map │ -rw-r--r-- 0.0 unx 997 b- defN 81-Jan-01 01:01 assets/public/chunk-BOROUNNF.js │ -rw-r--r-- 0.0 unx 93 b- defN 81-Jan-01 01:01 assets/public/chunk-BOROUNNF.js.map │ -rw-r--r-- 0.0 unx 4733 b- defN 81-Jan-01 01:01 assets/public/chunk-BZ5T5H44.js │ -rw-r--r-- 0.0 unx 18666 b- defN 81-Jan-01 01:01 assets/public/chunk-BZ5T5H44.js.map │ -rw-r--r-- 0.0 unx 426 b- defN 81-Jan-01 01:01 assets/public/chunk-CBO3U36G.js │ -rw-r--r-- 0.0 unx 949 b- defN 81-Jan-01 01:01 assets/public/chunk-CBO3U36G.js.map │ --rw-r--r-- 0.0 unx 3098 b- defN 81-Jan-01 01:01 assets/public/chunk-CDTG5YKL.js │ --rw-r--r-- 0.0 unx 9576 b- defN 81-Jan-01 01:01 assets/public/chunk-CDTG5YKL.js.map │ --rw-r--r-- 0.0 unx 254888 b- defN 81-Jan-01 01:01 assets/public/chunk-CW5T6SPQ.js │ --rw-r--r-- 0.0 unx 798267 b- defN 81-Jan-01 01:01 assets/public/chunk-CW5T6SPQ.js.map │ -rw-r--r-- 0.0 unx 2524 b- defN 81-Jan-01 01:01 assets/public/chunk-DEMP2BFS.js │ -rw-r--r-- 0.0 unx 10258 b- defN 81-Jan-01 01:01 assets/public/chunk-DEMP2BFS.js.map │ -rw-r--r-- 0.0 unx 5592 b- defN 81-Jan-01 01:01 assets/public/chunk-DJXQXNMS.js │ -rw-r--r-- 0.0 unx 20482 b- defN 81-Jan-01 01:01 assets/public/chunk-DJXQXNMS.js.map │ -rw-r--r-- 0.0 unx 1116304 b- defN 81-Jan-01 01:01 assets/public/chunk-DSREQ3L4.js │ -rw-r--r-- 0.0 unx 4970219 b- defN 81-Jan-01 01:01 assets/public/chunk-DSREQ3L4.js.map │ -rw-r--r-- 0.0 unx 2220 b- defN 81-Jan-01 01:01 assets/public/chunk-E6ILWUMV.js │ -rw-r--r-- 0.0 unx 4787 b- defN 81-Jan-01 01:01 assets/public/chunk-E6ILWUMV.js.map │ -rw-r--r-- 0.0 unx 18901 b- defN 81-Jan-01 01:01 assets/public/chunk-EXYSAUSN.js │ -rw-r--r-- 0.0 unx 72134 b- defN 81-Jan-01 01:01 assets/public/chunk-EXYSAUSN.js.map │ -rw-r--r-- 0.0 unx 6602 b- defN 81-Jan-01 01:01 assets/public/chunk-FOXRPRBP.js │ -rw-r--r-- 0.0 unx 27239 b- defN 81-Jan-01 01:01 assets/public/chunk-FOXRPRBP.js.map │ -rw-r--r-- 0.0 unx 97631 b- defN 81-Jan-01 01:01 assets/public/chunk-FS5VL5NZ.js │ -rw-r--r-- 0.0 unx 357262 b- defN 81-Jan-01 01:01 assets/public/chunk-FS5VL5NZ.js.map │ +-rw-r--r-- 0.0 unx 11454 b- defN 81-Jan-01 01:01 assets/public/chunk-FZ6Z4X5W.js │ +-rw-r--r-- 0.0 unx 22568 b- defN 81-Jan-01 01:01 assets/public/chunk-FZ6Z4X5W.js.map │ -rw-r--r-- 0.0 unx 48427 b- defN 81-Jan-01 01:01 assets/public/chunk-G26D3TEH.js │ -rw-r--r-- 0.0 unx 133326 b- defN 81-Jan-01 01:01 assets/public/chunk-G26D3TEH.js.map │ -rw-r--r-- 0.0 unx 9966 b- defN 81-Jan-01 01:01 assets/public/chunk-G6HECC4Q.js │ -rw-r--r-- 0.0 unx 27757 b- defN 81-Jan-01 01:01 assets/public/chunk-G6HECC4Q.js.map │ --rw-r--r-- 0.0 unx 118944 b- defN 81-Jan-01 01:01 assets/public/chunk-GWKOR6NW.js │ --rw-r--r-- 0.0 unx 180097 b- defN 81-Jan-01 01:01 assets/public/chunk-GWKOR6NW.js.map │ +-rw-r--r-- 0.0 unx 29977 b- defN 81-Jan-01 01:01 assets/public/chunk-H5C5NXL7.js │ +-rw-r--r-- 0.0 unx 109075 b- defN 81-Jan-01 01:01 assets/public/chunk-H5C5NXL7.js.map │ -rw-r--r-- 0.0 unx 33015 b- defN 81-Jan-01 01:01 assets/public/chunk-HUZPTJKV.js │ -rw-r--r-- 0.0 unx 112433 b- defN 81-Jan-01 01:01 assets/public/chunk-HUZPTJKV.js.map │ -rw-r--r-- 0.0 unx 437230 b- defN 81-Jan-01 01:01 assets/public/chunk-IIO2JXXO.js │ -rw-r--r-- 0.0 unx 1585333 b- defN 81-Jan-01 01:01 assets/public/chunk-IIO2JXXO.js.map │ -rw-r--r-- 0.0 unx 23637 b- defN 81-Jan-01 01:01 assets/public/chunk-JDOMNCB7.js │ -rw-r--r-- 0.0 unx 41275 b- defN 81-Jan-01 01:01 assets/public/chunk-JDOMNCB7.js.map │ -rw-r--r-- 0.0 unx 24109 b- defN 81-Jan-01 01:01 assets/public/chunk-JE2WCTYC.js │ @@ -223,40 +227,36 @@ │ -rw-r--r-- 0.0 unx 959 b- defN 81-Jan-01 01:01 assets/public/chunk-MASHVMAF.js.map │ -rw-r--r-- 0.0 unx 3030 b- defN 81-Jan-01 01:01 assets/public/chunk-MB37G7UP.js │ -rw-r--r-- 0.0 unx 10699 b- defN 81-Jan-01 01:01 assets/public/chunk-MB37G7UP.js.map │ -rw-r--r-- 0.0 unx 3323 b- defN 81-Jan-01 01:01 assets/public/chunk-MBD7FTOH.js │ -rw-r--r-- 0.0 unx 22451 b- defN 81-Jan-01 01:01 assets/public/chunk-MBD7FTOH.js.map │ -rw-r--r-- 0.0 unx 479 b- defN 81-Jan-01 01:01 assets/public/chunk-MKQ5S2AR.js │ -rw-r--r-- 0.0 unx 4619 b- defN 81-Jan-01 01:01 assets/public/chunk-MKQ5S2AR.js.map │ --rw-r--r-- 0.0 unx 63528 b- defN 81-Jan-01 01:01 assets/public/chunk-MRWZZVPU.js │ --rw-r--r-- 0.0 unx 160634 b- defN 81-Jan-01 01:01 assets/public/chunk-MRWZZVPU.js.map │ -rw-r--r-- 0.0 unx 15031 b- defN 81-Jan-01 01:01 assets/public/chunk-NUJOZVKJ.js │ -rw-r--r-- 0.0 unx 37882 b- defN 81-Jan-01 01:01 assets/public/chunk-NUJOZVKJ.js.map │ -rw-r--r-- 0.0 unx 168840 b- defN 81-Jan-01 01:01 assets/public/chunk-ODHOTLAK.js │ -rw-r--r-- 0.0 unx 532249 b- defN 81-Jan-01 01:01 assets/public/chunk-ODHOTLAK.js.map │ --rw-r--r-- 0.0 unx 1015 b- defN 81-Jan-01 01:01 assets/public/chunk-OITMHVU6.js │ --rw-r--r-- 0.0 unx 93 b- defN 81-Jan-01 01:01 assets/public/chunk-OITMHVU6.js.map │ +-rw-r--r-- 0.0 unx 59706 b- defN 81-Jan-01 01:01 assets/public/chunk-OPG5DMMF.js │ +-rw-r--r-- 0.0 unx 171342 b- defN 81-Jan-01 01:01 assets/public/chunk-OPG5DMMF.js.map │ +-rw-r--r-- 0.0 unx 118944 b- defN 81-Jan-01 01:01 assets/public/chunk-OTRGDQRH.js │ +-rw-r--r-- 0.0 unx 180097 b- defN 81-Jan-01 01:01 assets/public/chunk-OTRGDQRH.js.map │ -rw-r--r-- 0.0 unx 3929 b- defN 81-Jan-01 01:01 assets/public/chunk-OVAWK6DV.js │ -rw-r--r-- 0.0 unx 9310 b- defN 81-Jan-01 01:01 assets/public/chunk-OVAWK6DV.js.map │ -rw-r--r-- 0.0 unx 2069 b- defN 81-Jan-01 01:01 assets/public/chunk-OWECU7R2.js │ -rw-r--r-- 0.0 unx 11211 b- defN 81-Jan-01 01:01 assets/public/chunk-OWECU7R2.js.map │ -rw-r--r-- 0.0 unx 202242 b- defN 81-Jan-01 01:01 assets/public/chunk-OXDOKNTF.js │ -rw-r--r-- 0.0 unx 824865 b- defN 81-Jan-01 01:01 assets/public/chunk-OXDOKNTF.js.map │ --rw-r--r-- 0.0 unx 933 b- defN 81-Jan-01 01:01 assets/public/chunk-P4ZS4FNY.js │ --rw-r--r-- 0.0 unx 93 b- defN 81-Jan-01 01:01 assets/public/chunk-P4ZS4FNY.js.map │ -rw-r--r-- 0.0 unx 29737 b- defN 81-Jan-01 01:01 assets/public/chunk-PBOYRUP4.js │ -rw-r--r-- 0.0 unx 81980 b- defN 81-Jan-01 01:01 assets/public/chunk-PBOYRUP4.js.map │ -rw-r--r-- 0.0 unx 8263 b- defN 81-Jan-01 01:01 assets/public/chunk-PEJGMLLQ.js │ -rw-r--r-- 0.0 unx 32372 b- defN 81-Jan-01 01:01 assets/public/chunk-PEJGMLLQ.js.map │ -rw-r--r-- 0.0 unx 2830 b- defN 81-Jan-01 01:01 assets/public/chunk-PFD7B7VP.js │ -rw-r--r-- 0.0 unx 4560 b- defN 81-Jan-01 01:01 assets/public/chunk-PFD7B7VP.js.map │ -rw-r--r-- 0.0 unx 42689 b- defN 81-Jan-01 01:01 assets/public/chunk-PXNRYD53.js │ -rw-r--r-- 0.0 unx 170408 b- defN 81-Jan-01 01:01 assets/public/chunk-PXNRYD53.js.map │ --rw-r--r-- 0.0 unx 11454 b- defN 81-Jan-01 01:01 assets/public/chunk-QIY3ATD7.js │ --rw-r--r-- 0.0 unx 22568 b- defN 81-Jan-01 01:01 assets/public/chunk-QIY3ATD7.js.map │ -rw-r--r-- 0.0 unx 10634 b- defN 81-Jan-01 01:01 assets/public/chunk-QJ2MNBBP.js │ -rw-r--r-- 0.0 unx 15729 b- defN 81-Jan-01 01:01 assets/public/chunk-QJ2MNBBP.js.map │ -rw-r--r-- 0.0 unx 511 b- defN 81-Jan-01 01:01 assets/public/chunk-R7GGLO7M.js │ -rw-r--r-- 0.0 unx 1526 b- defN 81-Jan-01 01:01 assets/public/chunk-R7GGLO7M.js.map │ -rw-r--r-- 0.0 unx 11667 b- defN 81-Jan-01 01:01 assets/public/chunk-RBIRYWTS.js │ -rw-r--r-- 0.0 unx 18636 b- defN 81-Jan-01 01:01 assets/public/chunk-RBIRYWTS.js.map │ -rw-r--r-- 0.0 unx 19791 b- defN 81-Jan-01 01:01 assets/public/chunk-RBYF6WXY.js │ @@ -289,22 +289,22 @@ │ -rw-r--r-- 0.0 unx 1735 b- defN 81-Jan-01 01:01 assets/public/chunk-VALZJMB4.js.map │ -rw-r--r-- 0.0 unx 196498 b- defN 81-Jan-01 01:01 assets/public/chunk-VXMKIRI2.js │ -rw-r--r-- 0.0 unx 637374 b- defN 81-Jan-01 01:01 assets/public/chunk-VXMKIRI2.js.map │ -rw-r--r-- 0.0 unx 965 b- defN 81-Jan-01 01:01 assets/public/chunk-W3EHXDVY.js │ -rw-r--r-- 0.0 unx 3891 b- defN 81-Jan-01 01:01 assets/public/chunk-W3EHXDVY.js.map │ -rw-r--r-- 0.0 unx 2173 b- defN 81-Jan-01 01:01 assets/public/chunk-W6VSJC7P.js │ -rw-r--r-- 0.0 unx 8779 b- defN 81-Jan-01 01:01 assets/public/chunk-W6VSJC7P.js.map │ --rw-r--r-- 0.0 unx 59706 b- defN 81-Jan-01 01:01 assets/public/chunk-WBRMXYTW.js │ --rw-r--r-- 0.0 unx 171342 b- defN 81-Jan-01 01:01 assets/public/chunk-WBRMXYTW.js.map │ -rw-r--r-- 0.0 unx 3941 b- defN 81-Jan-01 01:01 assets/public/chunk-WPWCE7VM.js │ -rw-r--r-- 0.0 unx 10584 b- defN 81-Jan-01 01:01 assets/public/chunk-WPWCE7VM.js.map │ -rw-r--r-- 0.0 unx 9190 b- defN 81-Jan-01 01:01 assets/public/chunk-WQZWIAFQ.js │ -rw-r--r-- 0.0 unx 20947 b- defN 81-Jan-01 01:01 assets/public/chunk-WQZWIAFQ.js.map │ -rw-r--r-- 0.0 unx 411 b- defN 81-Jan-01 01:01 assets/public/chunk-WSSUFPT7.js │ -rw-r--r-- 0.0 unx 920 b- defN 81-Jan-01 01:01 assets/public/chunk-WSSUFPT7.js.map │ +-rw-r--r-- 0.0 unx 63528 b- defN 81-Jan-01 01:01 assets/public/chunk-X5SIPZ47.js │ +-rw-r--r-- 0.0 unx 160634 b- defN 81-Jan-01 01:01 assets/public/chunk-X5SIPZ47.js.map │ -rw-r--r-- 0.0 unx 770 b- defN 81-Jan-01 01:01 assets/public/chunk-XU2E3I7U.js │ -rw-r--r-- 0.0 unx 2780 b- defN 81-Jan-01 01:01 assets/public/chunk-XU2E3I7U.js.map │ -rw-r--r-- 0.0 unx 212584 b- defN 81-Jan-01 01:01 assets/public/chunk-YHHMPTRF.js │ -rw-r--r-- 0.0 unx 664332 b- defN 81-Jan-01 01:01 assets/public/chunk-YHHMPTRF.js.map │ -rw-r--r-- 0.0 unx 14084 b- defN 81-Jan-01 01:01 assets/public/chunk-YNQ5UEI2.js │ -rw-r--r-- 0.0 unx 35622 b- defN 81-Jan-01 01:01 assets/public/chunk-YNQ5UEI2.js.map │ -rw-r--r-- 0.0 unx 4447 b- defN 81-Jan-01 01:01 assets/public/chunk-ZLQPTJVZ.js │ @@ -386,16 +386,16 @@ │ -rw-r--r-- 0.0 unx 3561 b- defN 81-Jan-01 01:01 assets/public/issue-panel.component-GOP3ZPSQ.css.map │ -rw-r--r-- 0.0 unx 895 b- defN 81-Jan-01 01:01 assets/public/issue-preview-item.component-56RJZCNX.css.map │ -rw-r--r-- 0.0 unx 1761 b- defN 81-Jan-01 01:01 assets/public/issue-provider-setup-overview.component-YTYDZG3E.css.map │ -rw-r--r-- 0.0 unx 1899 b- defN 81-Jan-01 01:01 assets/public/issue-provider-tab.component-IAK65AKV.css.map │ -rw-r--r-- 0.0 unx 325 b- defN 81-Jan-01 01:01 assets/public/jira-additional-cfg.component-42ZCNEAB.css.map │ -rw-r--r-- 0.0 unx 393 b- defN 81-Jan-01 01:01 assets/public/jira-link.component-AKJUVRHV.css.map │ -rw-r--r-- 0.0 unx 891 b- defN 81-Jan-01 01:01 assets/public/lazy-chart.component-S7BZ22QP.css.map │ --rw-r--r-- 0.0 unx 597760 b- defN 81-Jan-01 01:01 assets/public/main-M2FPRGPY.js │ --rw-r--r-- 0.0 unx 2140605 b- defN 81-Jan-01 01:01 assets/public/main-M2FPRGPY.js.map │ +-rw-r--r-- 0.0 unx 597760 b- defN 81-Jan-01 01:01 assets/public/main-VSFTNGRN.js │ +-rw-r--r-- 0.0 unx 2140605 b- defN 81-Jan-01 01:01 assets/public/main-VSFTNGRN.js.map │ -rw-r--r-- 0.0 unx 15283 b- defN 81-Jan-01 01:01 assets/public/main-header.component-JG5JQ5CV.css.map │ -rw-r--r-- 0.0 unx 926 b- defN 81-Jan-01 01:01 assets/public/manifest.json │ -rw-r--r-- 0.0 unx 356840 b- defN 81-Jan-01 01:01 assets/public/media/MaterialIcons-Regular-5HNTTCIU.ttf │ -rw-r--r-- 0.0 unx 65164 b- defN 81-Jan-01 01:01 assets/public/media/roboto-all-300-normal-HGW5R6ZP.woff │ -rw-r--r-- 0.0 unx 69672 b- defN 81-Jan-01 01:01 assets/public/media/roboto-all-400-italic-HV3SWHL5.woff │ -rw-r--r-- 0.0 unx 65456 b- defN 81-Jan-01 01:01 assets/public/media/roboto-all-400-normal-F2PJIADI.woff │ -rw-r--r-- 0.0 unx 65556 b- defN 81-Jan-01 01:01 assets/public/media/roboto-all-700-normal-ZI6Q7W36.woff │ @@ -1270,8 +1270,8 @@ │ -rw---- 0.0 fat 308 b- defN 81-Jan-01 01:01 res/zn.xml │ -rw---- 0.0 fat 448 b- defN 81-Jan-01 01:01 res/zp.xml │ -rw---- 0.0 fat 464 b- defN 81-Jan-01 01:01 res/zq.xml │ -rw---- 0.0 fat 503540 b- stor 81-Jan-01 01:01 resources.arsc │ -rw---- 2.0 fat 127435 b- defN 81-Jan-01 01:01 META-INF/F4E24334.SF │ -rw---- 2.0 fat 1342 b- defN 81-Jan-01 01:01 META-INF/F4E24334.RSA │ -rw---- 2.0 fat 127308 b- defN 81-Jan-01 01:01 META-INF/MANIFEST.MF │ -1275 files, 41608279 bytes uncompressed, 14175110 bytes compressed: 65.9% │ +1275 files, 41608279 bytes uncompressed, 14175114 bytes compressed: 65.9% ├── assets/public/ngsw.json │ ├── Pretty-printed │ │┄ Similarity: 0.9313378298098984% │ │┄ Differences: {"'assetGroups'": "{0: {'urls': {insert: [(3, '/chunk-2XB3YG6S.js'), (15, '/chunk-5TDSJN67.js'), " │ │┄ "(16, '/chunk-6KMYC34R.js'), (25, '/chunk-AF3ZV4WZ.js'), (39, " │ │┄ "'/chunk-FZ6Z4X5W.js'), (42, '/chunk-H5C5NXL7.js'), (57, '/chunk-OPG5DMMF.js'), " │ │┄ "(58, '/chunk-OTRGDQRH.js'), (89, '/chunk-X5SIPZ47.js'), (98, " │ │┄ "'/main-VSFTNGRN.js')], delete: [98, 86, 65, 60, 56, 53, 40, 30, 29, 16]}}}", │ │┄ "'hashTable'": "{'/index.html': '4fb287545a751c3ba69 […] │ │ @@ -8,77 +8,77 @@ │ │ "name": "app", │ │ "patterns": [], │ │ "updateMode": "prefetch", │ │ "urls": [ │ │ "/chunk-2LCQAWGQ.js", │ │ "/chunk-2MOZFEFW.js", │ │ "/chunk-2NYJ54WT.js", │ │ + "/chunk-2XB3YG6S.js", │ │ "/chunk-35DXYMHQ.js", │ │ "/chunk-3E43H4SH.js", │ │ "/chunk-3PWEB74O.js", │ │ "/chunk-3UB54IM4.js", │ │ "/chunk-3VFKDWJ2.js", │ │ "/chunk-44M6NWXD.js", │ │ "/chunk-4A2AMUHE.js", │ │ "/chunk-4LMAZLVZ.js", │ │ "/chunk-4RZOEXF7.js", │ │ "/chunk-4WKVJOAH.js", │ │ "/chunk-5IJWVGPP.js", │ │ + "/chunk-5TDSJN67.js", │ │ + "/chunk-6KMYC34R.js", │ │ "/chunk-6QC7LO6P.js", │ │ "/chunk-76O5NF5S.js", │ │ - "/chunk-7JUHICSP.js", │ │ "/chunk-7KIIUYK2.js", │ │ "/chunk-7MCI5DGR.js", │ │ "/chunk-7VZPLBFY.js", │ │ "/chunk-A3PBXKUF.js", │ │ "/chunk-A5MBRGPF.js", │ │ "/chunk-A6QD6H33.js", │ │ + "/chunk-AF3ZV4WZ.js", │ │ "/chunk-AYQ5AFM6.js", │ │ "/chunk-B55LM2KC.js", │ │ "/chunk-BE3UJ5P4.js", │ │ "/chunk-BOROUNNF.js", │ │ "/chunk-BZ5T5H44.js", │ │ "/chunk-CBO3U36G.js", │ │ - "/chunk-CDTG5YKL.js", │ │ - "/chunk-CW5T6SPQ.js", │ │ "/chunk-DEMP2BFS.js", │ │ "/chunk-DJXQXNMS.js", │ │ "/chunk-DSREQ3L4.js", │ │ "/chunk-E6ILWUMV.js", │ │ "/chunk-EXYSAUSN.js", │ │ "/chunk-FOXRPRBP.js", │ │ "/chunk-FS5VL5NZ.js", │ │ + "/chunk-FZ6Z4X5W.js", │ │ "/chunk-G26D3TEH.js", │ │ "/chunk-G6HECC4Q.js", │ │ - "/chunk-GWKOR6NW.js", │ │ + "/chunk-H5C5NXL7.js", │ │ "/chunk-HUZPTJKV.js", │ │ "/chunk-IIO2JXXO.js", │ │ "/chunk-JDOMNCB7.js", │ │ "/chunk-JE2WCTYC.js", │ │ "/chunk-JKZKHAFX.js", │ │ "/chunk-JPHHIOXD.js", │ │ "/chunk-JXZN3XFF.js", │ │ "/chunk-KWH5G4G7.js", │ │ "/chunk-MASHVMAF.js", │ │ "/chunk-MB37G7UP.js", │ │ "/chunk-MBD7FTOH.js", │ │ "/chunk-MKQ5S2AR.js", │ │ - "/chunk-MRWZZVPU.js", │ │ "/chunk-NUJOZVKJ.js", │ │ "/chunk-ODHOTLAK.js", │ │ - "/chunk-OITMHVU6.js", │ │ + "/chunk-OPG5DMMF.js", │ │ + "/chunk-OTRGDQRH.js", │ │ "/chunk-OVAWK6DV.js", │ │ "/chunk-OWECU7R2.js", │ │ "/chunk-OXDOKNTF.js", │ │ - "/chunk-P4ZS4FNY.js", │ │ "/chunk-PBOYRUP4.js", │ │ "/chunk-PEJGMLLQ.js", │ │ "/chunk-PFD7B7VP.js", │ │ "/chunk-PXNRYD53.js", │ │ - "/chunk-QIY3ATD7.js", │ │ "/chunk-QJ2MNBBP.js", │ │ "/chunk-R7GGLO7M.js", │ │ "/chunk-RBIRYWTS.js", │ │ "/chunk-RBYF6WXY.js", │ │ "/chunk-RHU3AIGY.js", │ │ "/chunk-SE2PXJGT.js", │ │ "/chunk-SEPU4IXF.js", │ │ @@ -91,27 +91,27 @@ │ │ "/chunk-U233VVFY.js", │ │ "/chunk-V4JKK6SH.js", │ │ "/chunk-V5CES5ZB.js", │ │ "/chunk-VALZJMB4.js", │ │ "/chunk-VXMKIRI2.js", │ │ "/chunk-W3EHXDVY.js", │ │ "/chunk-W6VSJC7P.js", │ │ - "/chunk-WBRMXYTW.js", │ │ "/chunk-WPWCE7VM.js", │ │ "/chunk-WQZWIAFQ.js", │ │ "/chunk-WSSUFPT7.js", │ │ + "/chunk-X5SIPZ47.js", │ │ "/chunk-XU2E3I7U.js", │ │ "/chunk-YHHMPTRF.js", │ │ "/chunk-YNQ5UEI2.js", │ │ "/chunk-ZLQPTJVZ.js", │ │ "/chunk-ZPOPP5QH.js", │ │ "/chunk-ZYUJNAC5.js", │ │ "/favicon.ico", │ │ "/index.html", │ │ - "/main-M2FPRGPY.js", │ │ + "/main-VSFTNGRN.js", │ │ "/manifest.json", │ │ "/polyfills-D4CWKFPZ.js", │ │ "/styles-XO5YJIHV.css", │ │ "/worker-CEWFX3S5.js" │ │ ] │ │ }, │ │ { │ │ @@ -373,77 +373,77 @@ │ │ "/assets/themes/nord-polar-night.css": "1a2c7771f9ba66ff2404fcb7e91585df198735e0", │ │ "/assets/themes/nord-snow-storm.css": "c402e6a53c388e4c04f99af3fba0ed465a25d240", │ │ "/assets/themes/rainbow.css": "186baf9b9791daff9c3b1a973e4a4e29b1f6536b", │ │ "/assets/unicorn.png": "0326afe4a8f85faa5c3a01fd38efeafeb58094a2", │ │ "/chunk-2LCQAWGQ.js": "f1775bd3729183ca7341d920bfdd32a19e370264", │ │ "/chunk-2MOZFEFW.js": "7a39d7ed2f9d96b9f92e4cc25386f9528a438d88", │ │ "/chunk-2NYJ54WT.js": "6b2058100c2940dca4d746dd3f5d18ab6c115902", │ │ + "/chunk-2XB3YG6S.js": "e8b2839d548006cb3f1b93aaa825a968867f6fbb", │ │ "/chunk-35DXYMHQ.js": "c12faf475279609352e8ed4c6f649385c4f72472", │ │ "/chunk-3E43H4SH.js": "33caa87bbac6b8a44c021550f0bba30292886b0d", │ │ "/chunk-3PWEB74O.js": "996990c76122e775ba07bad9d924dcfbe6044b99", │ │ "/chunk-3UB54IM4.js": "6dd0205087c3166a305b1af5ec8ad771cd5ce0e3", │ │ "/chunk-3VFKDWJ2.js": "955c017e970cdadb9810ee1f8ce443a0cb3fde74", │ │ "/chunk-44M6NWXD.js": "ccb9c2b8d2d49c938a8369fd19818401250aeef4", │ │ "/chunk-4A2AMUHE.js": "e1688c1481697ed108cbd5880ac6164511c4756c", │ │ "/chunk-4LMAZLVZ.js": "d2198238446d02df0bb8ac94e1f27ca19428167d", │ │ "/chunk-4RZOEXF7.js": "cb44bf0f5a5a62ed47b6b08097db2546a749af45", │ │ "/chunk-4WKVJOAH.js": "755c38ce168a294972eb8d09e0b4d2ee35e45efa", │ │ "/chunk-5IJWVGPP.js": "d6dced11f01f7bca6b77b49199f2ae182d967cd9", │ │ + "/chunk-5TDSJN67.js": "9cd58008cde40f82b3b75d5ef6a8fbbe4c1fe50d", │ │ + "/chunk-6KMYC34R.js": "ffff4c0e93338126cd259b557ae0afcb8dbbc6b4", │ │ "/chunk-6QC7LO6P.js": "8d30638b1bdd1aa43f3b0698c444f03959b4dc20", │ │ "/chunk-76O5NF5S.js": "7e397ae0c785916231cdd6bf9419f5dac6d37377", │ │ - "/chunk-7JUHICSP.js": "578d31dccadc741338cafbc7fdb817dcd1f5d45a", │ │ "/chunk-7KIIUYK2.js": "db8824d5a4b9288b4b4dbc7f11033e2c8005d795", │ │ "/chunk-7MCI5DGR.js": "75eecb97cd96f693e13c6ee14a87baa046cd982f", │ │ "/chunk-7VZPLBFY.js": "2ee4ebab2ae92c18518a2adde86c01aa7557fcd9", │ │ "/chunk-A3PBXKUF.js": "e7d9c9c90cdb648d1d217aba27b951367e3768b4", │ │ "/chunk-A5MBRGPF.js": "1370eaa81f6ec887d8231e675fe4147619b78acd", │ │ "/chunk-A6QD6H33.js": "ec517b8d910ffcac343b58e04d3dbc538e2fd731", │ │ + "/chunk-AF3ZV4WZ.js": "616fd83389613cebe0670d68bf1945c793aaaa48", │ │ "/chunk-AYQ5AFM6.js": "f69345fa839745e3f86380e5288ae834de8e40e1", │ │ "/chunk-B55LM2KC.js": "d1fcb6370e2a309088ca615d022c25a5362c6df2", │ │ "/chunk-BE3UJ5P4.js": "f88f651b7604472e6e735d60840be0aad74e6e27", │ │ "/chunk-BOROUNNF.js": "459f904bd4a5c44bc789798d548ad8a666e2f15c", │ │ "/chunk-BZ5T5H44.js": "bfda9374337f454765f846c2d1b1c27939dfc5b1", │ │ "/chunk-CBO3U36G.js": "07f21f8cd1f9f6c1f93228f7a7dd15833d05fa00", │ │ - "/chunk-CDTG5YKL.js": "ded685fe202f89153c2a9836ed0ea002f12c1816", │ │ - "/chunk-CW5T6SPQ.js": "61a59f690deccb8f5ac7844bcf8e8b2dc990ed46", │ │ "/chunk-DEMP2BFS.js": "43cfdddad415ec9de73a50f1f1a9fae4913c65cb", │ │ "/chunk-DJXQXNMS.js": "180fcda5f470cfd725ce85b61a92ed4f16180116", │ │ "/chunk-DSREQ3L4.js": "1cb688ebcf19472a9735f70d03c6a03cc2702e4e", │ │ "/chunk-E6ILWUMV.js": "9fa6bb1d2ad90c0769df5629385023c57ef4fb44", │ │ "/chunk-EXYSAUSN.js": "06cdcac3921c33602861d73a5703bb94b578f4d8", │ │ "/chunk-FOXRPRBP.js": "418c05a0ab49c25132ce1f2db56e65418c3b52d4", │ │ "/chunk-FS5VL5NZ.js": "43bdb5f208f7a2de50b6e64a896653a07982e604", │ │ + "/chunk-FZ6Z4X5W.js": "b7f01c6d5ace9c1122e43135b7990265f9daddba", │ │ "/chunk-G26D3TEH.js": "06780bc6167c7b353861dc0ac7e9778449f3fc8b", │ │ "/chunk-G6HECC4Q.js": "6c6f58c2dfc37466d91cfe2c5f7a4fd22e985b73", │ │ - "/chunk-GWKOR6NW.js": "04bf4ff785a710dd28ec665903e9bb7571b4be34", │ │ + "/chunk-H5C5NXL7.js": "f43b087a872f8a45447aac5becf75fed2762f6b7", │ │ "/chunk-HUZPTJKV.js": "1c1528c05e27edc99ccc5db5759d09724621674d", │ │ "/chunk-IIO2JXXO.js": "f0d86e0cfbdfa96bd392ec400d20c69e1a7d3a59", │ │ "/chunk-JDOMNCB7.js": "9d86a3806f81e5f3c8668c490c53e05fe1242515", │ │ "/chunk-JE2WCTYC.js": "83c39a083fe7ea30578fe14d5942492b2c2ca0a4", │ │ "/chunk-JKZKHAFX.js": "e79e142890b82e49949c6167e43d435685321ed2", │ │ "/chunk-JPHHIOXD.js": "be220296d862ef79b224f6a7dc352ea36b25f73e", │ │ "/chunk-JXZN3XFF.js": "f262ccc676ef2419d850802250506a14d89f4eff", │ │ "/chunk-KWH5G4G7.js": "e70874ff4e6084560b19440ac9e78dffaf5fe2c4", │ │ "/chunk-MASHVMAF.js": "c3e060e28a228fc25d8d7a1a90983cfc33f80afa", │ │ "/chunk-MB37G7UP.js": "100e879bd04bfeeca964f816ace0d9112b414a6b", │ │ "/chunk-MBD7FTOH.js": "b61c7fb28ca40dbfbab583afce0daca6834469fc", │ │ "/chunk-MKQ5S2AR.js": "9368b54b4f102d5c8000a30747eda3da95a162a5", │ │ - "/chunk-MRWZZVPU.js": "271bc620b9fa0c6802a174212d4f0ca290574bfd", │ │ "/chunk-NUJOZVKJ.js": "60c37d1bde2f9ad1a59155617c5a6a2eadd68881", │ │ "/chunk-ODHOTLAK.js": "6cb085897c32a84c1255c975abbf0050861fb497", │ │ - "/chunk-OITMHVU6.js": "922662e18faa4b912fb8e4d823dca35db04da640", │ │ + "/chunk-OPG5DMMF.js": "9043d888f1082ae5c74f36ba9e8de5f3e21fa44c", │ │ + "/chunk-OTRGDQRH.js": "2fc7ab7891e3dc4fa991d879a1895be76de2606f", │ │ "/chunk-OVAWK6DV.js": "4361aa6648b214c9f6cc6a5bc622280f547db7f0", │ │ "/chunk-OWECU7R2.js": "454ea8e8327b9bae69ad53c55bfdbd24c9fdef68", │ │ "/chunk-OXDOKNTF.js": "501996a33f7f3e92729fcabc7c0b3cad82f22134", │ │ - "/chunk-P4ZS4FNY.js": "1a588d39b9d7fbe3662cd6c36e0b6577c77cc3ff", │ │ "/chunk-PBOYRUP4.js": "aed94cadb4ca38bc83270eb3485c2f6516a1ee25", │ │ "/chunk-PEJGMLLQ.js": "fe6775dde0b3e793079d9c7be74b708dd45a79ea", │ │ "/chunk-PFD7B7VP.js": "c3772e50e2b08de37d19583f2b99f264dc74c2dc", │ │ "/chunk-PXNRYD53.js": "d0d7dedc704b88acd3e7989657170072f92fc36e", │ │ - "/chunk-QIY3ATD7.js": "4e70e0f0234a055ac234e163ec392a75455ebcc1", │ │ "/chunk-QJ2MNBBP.js": "027b95c3ec03c25ae313ebd26a04ff43a3d7c66c", │ │ "/chunk-R7GGLO7M.js": "b6eb6c55dd59d017daa05f0ac198cbc8eaefd8b6", │ │ "/chunk-RBIRYWTS.js": "7c245bf7d55b83ca7031a1705d6ba96d842aea98", │ │ "/chunk-RBYF6WXY.js": "1d54e540ddea25f8bc6361515fa5f029c8cd59fd", │ │ "/chunk-RHU3AIGY.js": "70f3005532610e087402505fa642745a0759fb44", │ │ "/chunk-SE2PXJGT.js": "c57747f5e55d842c2be2ce5dc4526839aa77d5d1", │ │ "/chunk-SEPU4IXF.js": "668350309cd85e6d5e99fee3d25de811d153b19c", │ │ @@ -456,27 +456,27 @@ │ │ "/chunk-U233VVFY.js": "51f1f8a1d3f2ed2951838a10456ad42172522001", │ │ "/chunk-V4JKK6SH.js": "03d45ddcc649f29921efa454db745b7625643b21", │ │ "/chunk-V5CES5ZB.js": "839b1e08f38497e45d8a112d49c60c094bdf31db", │ │ "/chunk-VALZJMB4.js": "3178219d2e9a366851c6f9c278783f9c5628bdc6", │ │ "/chunk-VXMKIRI2.js": "c11d62e183b7ba38ba324187d6075ced70925411", │ │ "/chunk-W3EHXDVY.js": "23e1348651bae932954b8eb0918f95913e86d7bd", │ │ "/chunk-W6VSJC7P.js": "99433a01e04509d2a96e0f25fd1f8d68278743cb", │ │ - "/chunk-WBRMXYTW.js": "8066ac5320a521ad24ee9380b4f8a499e81e2f50", │ │ "/chunk-WPWCE7VM.js": "546c0984a2250af917758d9094c57c55ae803f14", │ │ "/chunk-WQZWIAFQ.js": "c786c83b18cd928f91bcb57ceaccdc481425393d", │ │ "/chunk-WSSUFPT7.js": "0a8671895075fccd0727ede3e5465ec087bfef13", │ │ + "/chunk-X5SIPZ47.js": "abe694786722fd0458886c132a110a4965babb0e", │ │ "/chunk-XU2E3I7U.js": "42be333379abd934534b707aa2e0824a038af868", │ │ "/chunk-YHHMPTRF.js": "ccf07204d867bd2ea9d3e63e16618302b857e755", │ │ "/chunk-YNQ5UEI2.js": "8feb65552c2274949c3bbfd779b1689241185f5d", │ │ "/chunk-ZLQPTJVZ.js": "33b5711a06eb4a5cc508dfe112f263bdd0dd62f4", │ │ "/chunk-ZPOPP5QH.js": "ec0bc0e4edcf93523fa499724e659294f1916955", │ │ "/chunk-ZYUJNAC5.js": "19ce0f70fe1a02cac359499b8c6b47be695ad6b6", │ │ "/favicon.ico": "041b337586bb0e48da6f4fdfc846ef3594373009", │ │ - "/index.html": "022cdf0a9a81d8cc323189c95cdf742148d310cf", │ │ - "/main-M2FPRGPY.js": "2f3a729d2356fb0d1deae3fdcbbfed1a53ef34ad", │ │ + "/index.html": "4fb287545a751c3ba69f1f3e2f92bf7c5ed2bdd7", │ │ + "/main-VSFTNGRN.js": "1aa13d793aa60dc12edf14e845d2f41569c55e0d", │ │ "/manifest.json": "94d39d23fcd194a0c89eb3bcd838730cec7cabee", │ │ "/polyfills-D4CWKFPZ.js": "be63e19dcbf7539a31849701283857d1ebe28b56", │ │ "/styles-XO5YJIHV.css": "704034676e9adae872acb4abdeb918f11f68453e", │ │ "/worker-CEWFX3S5.js": "c04beb9f76d7ef667d1cd33211966c41de706731" │ │ }, │ │ "index": "/index.html", │ │ "navigationRequestStrategy": "performance", │ │ @@ -494,9 +494,9 @@ │ │ "regex": "^\\/(?:.+\\/)?[^/]*__[^/]*$" │ │ }, │ │ { │ │ "positive": false, │ │ "regex": "^\\/(?:.+\\/)?[^/]*__[^/]*\\/.*$" │ │ } │ │ ], │ │ - "timestamp": 1755584605519 │ │ + "timestamp": 1755855850155 │ │ } ├── assets/public/index.html │ @@ -6455,29 +6455,29 @@ │ 00019360: 2068 7265 663d 2263 6875 6e6b 2d47 3236 href="chunk-G26 │ 00019370: 4433 5445 482e 6a73 223e 3c6c 696e 6b20 D3TEH.js">
  • │ +000193d0: 6e6b 2d46 5a36 5a34 5835 572e 6a73 223e nk-FZ6Z4X5W.js"> │ 000193e0: 3c6c 696e 6b20 7265 6c3d 226d 6f64 756c .. │ --- assets/public/chunk-MRWZZVPU.js ├── +++ assets/public/chunk-X5SIPZ47.js │┄ Files 0% similar despite different names │ ├── js-beautify {} │ │ @@ -108,15 +108,15 @@ │ │ import { │ │ L as ji, │ │ M as fo, │ │ k as Ai, │ │ l as yo, │ │ m as Bi, │ │ n as go │ │ -} from "./chunk-CW5T6SPQ.js"; │ │ +} from "./chunk-2XB3YG6S.js"; │ │ import "./chunk-B55LM2KC.js"; │ │ import "./chunk-VXMKIRI2.js"; │ │ import { │ │ q as Di, │ │ r as co │ │ } from "./chunk-OWECU7R2.js"; │ │ import { │ │ @@ -2216,8 +2216,8 @@ │ │ return e │ │ })() │ │ }); │ │ tr(); │ │ export { │ │ Yl as DailySummaryComponent │ │ }; │ │ -//# sourceMappingURL=chunk-MRWZZVPU.js.map │ │ +//# sourceMappingURL=chunk-X5SIPZ47.js.map │ --- assets/public/chunk-7JUHICSP.js ├── +++ assets/public/chunk-H5C5NXL7.js │┄ Files 1% similar despite different names │ ├── js-beautify {} │ │ @@ -5,21 +5,21 @@ │ │ f as Qe, │ │ i as Ne, │ │ j as et, │ │ q as Ae, │ │ r as tt, │ │ s as $e, │ │ t as it │ │ -} from "./chunk-GWKOR6NW.js"; │ │ +} from "./chunk-OTRGDQRH.js"; │ │ import { │ │ B as Ce, │ │ C as Je, │ │ c as Ie, │ │ d as Xe │ │ -} from "./chunk-CW5T6SPQ.js"; │ │ +} from "./chunk-2XB3YG6S.js"; │ │ import { │ │ a as fe, │ │ b as me, │ │ c as Pe, │ │ e as _e, │ │ f as Se, │ │ g as Ee, │ │ @@ -1114,8 +1114,8 @@ │ │ } │ │ return d │ │ })() │ │ }); │ │ export { │ │ Te as a, Le as b, Z as c, Y as d, Oe as e, oi as f, nt as g │ │ }; │ │ -//# sourceMappingURL=chunk-7JUHICSP.js.map │ │ +//# sourceMappingURL=chunk-H5C5NXL7.js.map │ --- assets/public/chunk-P4ZS4FNY.js ├── +++ assets/public/chunk-AF3ZV4WZ.js │┄ Files 12% similar despite different names │ ├── js-beautify {} │ │ @@ -1,12 +1,12 @@ │ │ import { │ │ s as a, │ │ t as b │ │ -} from "./chunk-GWKOR6NW.js"; │ │ -import "./chunk-CW5T6SPQ.js"; │ │ +} from "./chunk-OTRGDQRH.js"; │ │ +import "./chunk-2XB3YG6S.js"; │ │ import "./chunk-SEPU4IXF.js"; │ │ import "./chunk-B55LM2KC.js"; │ │ import "./chunk-VXMKIRI2.js"; │ │ import "./chunk-OWECU7R2.js"; │ │ import "./chunk-3VFKDWJ2.js"; │ │ import "./chunk-JPHHIOXD.js"; │ │ import "./chunk-JDOMNCB7.js"; │ │ @@ -31,8 +31,8 @@ │ │ import "./chunk-OXDOKNTF.js"; │ │ import "./chunk-PEJGMLLQ.js"; │ │ import "./chunk-2NYJ54WT.js"; │ │ b(); │ │ export { │ │ a as PluginRunner │ │ }; │ │ -//# sourceMappingURL=chunk-P4ZS4FNY.js.map │ │ +//# sourceMappingURL=chunk-AF3ZV4WZ.js.map │ --- assets/public/chunk-GWKOR6NW.js ├── +++ assets/public/chunk-OTRGDQRH.js │┄ Files 0% similar despite different names │ ├── js-beautify {} │ │ @@ -1,11 +1,11 @@ │ │ import { │ │ L as vr, │ │ M as St │ │ -} from "./chunk-CW5T6SPQ.js"; │ │ +} from "./chunk-2XB3YG6S.js"; │ │ import { │ │ c as Ir, │ │ d as Gt │ │ } from "./chunk-SEPU4IXF.js"; │ │ import { │ │ j as gr, │ │ k as fr, │ │ @@ -2870,15 +2870,15 @@ │ │ } │ │ }) │ │ } │ │ sendMessageToPlugin(t, d) { │ │ return S(this, null, function*() { │ │ let { │ │ PluginRunner: l │ │ - } = yield import("./chunk-P4ZS4FNY.js"); │ │ + } = yield import("./chunk-AF3ZV4WZ.js"); │ │ return this._injector.get(l).sendMessageToPlugin(t, d) │ │ }) │ │ } │ │ _initWindowFocusTracking() { │ │ window.addEventListener("focus", () => { │ │ this._isWindowFocused = !0, this._notifyFocusHandlers(!0) │ │ }), window.addEventListener("blur", () => { │ │ @@ -3474,8 +3474,8 @@ │ │ } │ │ return y │ │ })() │ │ }); │ │ export { │ │ de as a, ne as b, Or as c, Br as d, ee as e, ce as f, Ur as g, xr as h, re as i, ye as j, Wr as k, $r as l, ns as m, is as n, ls as o, Qr as p, qr as q, Jr as r, Ss as s, Mt as t │ │ }; │ │ -//# sourceMappingURL=chunk-GWKOR6NW.js.map │ │ +//# sourceMappingURL=chunk-OTRGDQRH.js.map │ --- assets/public/chunk-WBRMXYTW.js.map ├── +++ assets/public/chunk-OPG5DMMF.js.map │┄ Files identical despite different names │ --- assets/public/chunk-QIY3ATD7.js ├── +++ assets/public/chunk-FZ6Z4X5W.js │┄ Files 2% similar despite different names │ ├── js-beautify {} │ │ @@ -1,11 +1,11 @@ │ │ import { │ │ f as ie, │ │ g as we │ │ -} from "./chunk-7JUHICSP.js"; │ │ +} from "./chunk-H5C5NXL7.js"; │ │ import { │ │ a as re, │ │ b as oe, │ │ c as ae, │ │ f as le, │ │ g as Oe │ │ } from "./chunk-TU5ZIYGM.js"; │ │ @@ -14,15 +14,15 @@ │ │ l as Ie, │ │ m as Z, │ │ n as ee, │ │ o as te, │ │ p as ve, │ │ q as ne, │ │ r as Me │ │ -} from "./chunk-GWKOR6NW.js"; │ │ +} from "./chunk-OTRGDQRH.js"; │ │ import { │ │ a as W, │ │ b as xe │ │ } from "./chunk-WQZWIAFQ.js"; │ │ import { │ │ c as q, │ │ d as N, │ │ @@ -319,8 +319,8 @@ │ │ } │ │ return t │ │ })() │ │ }); │ │ export { │ │ rt as a, De as b │ │ }; │ │ -//# sourceMappingURL=chunk-QIY3ATD7.js.map │ │ +//# sourceMappingURL=chunk-FZ6Z4X5W.js.map │ --- assets/public/chunk-CW5T6SPQ.js.map ├── +++ assets/public/chunk-2XB3YG6S.js.map │┄ Files 0% similar despite different names │ ├── Pretty-printed │ │┄ Similarity: 0.9981684981684982% │ │┄ Differences: {"'sourcesContent'": "{insert: [(60, '// This file is auto-generated by tools/load-env.js\\n// Do " │ │┄ 'not modify directly - edit .env file instead\\n// Generated at: ' │ │┄ '2025-08-22T09:41:45.989Z\\n\\n/**\\n * Environment variables loaded from ' │ │┄ '.env file\\n * Access these constants instead of process.env in your Angular ' │ │┄ 'app\\n */\\nexport const ENV = {\\n\\n} as const;\\n\\n// Type-safe helper ' │ │┄ 'to en […] │ │ @@ -4085,15 +4085,15 @@ │ │ "\n @for (innerField of field.fieldGroup; track trackByFn(i, innerField); let i = $index) {\n
    \n \n \n more_vert\n \n\n \n\n \n @if (i > 0) {\n \n arrow_backward\n {{ T.G.MOVE_BACKWARD | translate }}\n \n }\n @if (i < field.fieldGroup?.length - 1) {\n \n arrow_forward\n {{ T.G.MOVE_FORWARD | translate }}\n \n }\n \n delete_forever\n {{ T.G.DELETE | translate }}\n \n \n
    \n }\n\n\n
    \n \n add\n {{ to.addText | translate }}\n \n
    \n", │ │ "import { Directionality } from '@angular/cdk/bidi';\nimport { Platform } from '@angular/cdk/platform';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, inject, ChangeDetectorRef, NgZone, Renderer2, ElementRef, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, ViewChild, booleanAttribute, numberAttribute, ViewChildren, ContentChild, ContentChildren, forwardRef, EventEmitter, signal, Directive, Output, NgModule } from '@angular/core';\nimport { b as RippleState, M as MatRipple, a as MAT_RIPPLE_GLOBAL_OPTIONS } from './ripple-BMyyyLz2.mjs';\nimport { _CdkPrivateStyleLoader } from '@angular/cdk/private';\nimport { _ as _animationsDisabled } from './animation-ChQ1vjiF.mjs';\nimport { _ as _StructuralStylesLoader } from './structural-styles-CObeNzjn.mjs';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { M as MatCommonModule } from './common-module-cKSwHniA.mjs';\nimport { M as MatRippleModule } from './index-BRImSAOu.mjs';\nimport '@angular/cdk/a11y';\nimport '@angular/cdk/coercion';\nimport '@angular/cdk/layout';\n\n/**\n * Thumb types: range slider has two thumbs (START, END) whereas single point\n * slider only has one thumb (END).\n */\nconst _c0 = [\"knob\"];\nconst _c1 = [\"valueIndicatorContainer\"];\nfunction MatSliderVisualThumb_Conditional_0_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275elementStart(0, \"div\", 2, 1)(2, \"div\", 5)(3, \"span\", 6);\n i0.\u0275\u0275text(4);\n i0.\u0275\u0275elementEnd()()();\n }\n if (rf & 2) {\n const ctx_r0 = i0.\u0275\u0275nextContext();\n i0.\u0275\u0275advance(4);\n i0.\u0275\u0275textInterpolate(ctx_r0.valueIndicatorText);\n }\n}\nconst _c2 = [\"trackActive\"];\nconst _c3 = [\"*\"];\nfunction MatSlider_Conditional_6_Conditional_2_For_1_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275element(0, \"div\");\n }\n if (rf & 2) {\n const tickMark_r1 = ctx.$implicit;\n const \u0275$index_14_r2 = ctx.$index;\n const ctx_r2 = i0.\u0275\u0275nextContext(3);\n i0.\u0275\u0275classMap(tickMark_r1 === 0 ? \"mdc-slider__tick-mark--active\" : \"mdc-slider__tick-mark--inactive\");\n i0.\u0275\u0275styleProp(\"transform\", ctx_r2._calcTickMarkTransform(\u0275$index_14_r2));\n }\n}\nfunction MatSlider_Conditional_6_Conditional_2_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275repeaterCreate(0, MatSlider_Conditional_6_Conditional_2_For_1_Template, 1, 4, \"div\", 8, i0.\u0275\u0275repeaterTrackByIndex);\n }\n if (rf & 2) {\n const ctx_r2 = i0.\u0275\u0275nextContext(2);\n i0.\u0275\u0275repeater(ctx_r2._tickMarks);\n }\n}\nfunction MatSlider_Conditional_6_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275elementStart(0, \"div\", 6, 1);\n i0.\u0275\u0275conditionalCreate(2, MatSlider_Conditional_6_Conditional_2_Template, 2, 0);\n i0.\u0275\u0275elementEnd();\n }\n if (rf & 2) {\n const ctx_r2 = i0.\u0275\u0275nextContext();\n i0.\u0275\u0275advance(2);\n i0.\u0275\u0275conditional(ctx_r2._cachedWidth ? 2 : -1);\n }\n}\nfunction MatSlider_Conditional_7_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275element(0, \"mat-slider-visual-thumb\", 7);\n }\n if (rf & 2) {\n const ctx_r2 = i0.\u0275\u0275nextContext();\n i0.\u0275\u0275property(\"discrete\", ctx_r2.discrete)(\"thumbPosition\", 1)(\"valueIndicatorText\", ctx_r2.startValueIndicatorText);\n }\n}\nvar _MatThumb = /*#__PURE__*/function (_MatThumb) {\n _MatThumb[_MatThumb[\"START\"] = 1] = \"START\";\n _MatThumb[_MatThumb[\"END\"] = 2] = \"END\";\n return _MatThumb;\n}(_MatThumb || {});\n/** Tick mark enum, for discrete sliders. */\nvar _MatTickMark = /*#__PURE__*/function (_MatTickMark) {\n _MatTickMark[_MatTickMark[\"ACTIVE\"] = 0] = \"ACTIVE\";\n _MatTickMark[_MatTickMark[\"INACTIVE\"] = 1] = \"INACTIVE\";\n return _MatTickMark;\n}(_MatTickMark || {});\n/**\n * Injection token that can be used for a `MatSlider` to provide itself as a\n * parent to the `MatSliderThumb` and `MatSliderRangeThumb`.\n * Used primarily to avoid circular imports.\n * @docs-private\n */\nconst MAT_SLIDER = /*#__PURE__*/new InjectionToken('_MatSlider');\n/**\n * Injection token that can be used to query for a `MatSliderThumb`.\n * Used primarily to avoid circular imports.\n * @docs-private\n */\nconst MAT_SLIDER_THUMB = /*#__PURE__*/new InjectionToken('_MatSliderThumb');\n/**\n * Injection token that can be used to query for a `MatSliderRangeThumb`.\n * Used primarily to avoid circular imports.\n * @docs-private\n */\nconst MAT_SLIDER_RANGE_THUMB = /*#__PURE__*/new InjectionToken('_MatSliderRangeThumb');\n/**\n * Injection token that can be used to query for a `MatSliderVisualThumb`.\n * Used primarily to avoid circular imports.\n * @docs-private\n */\nconst MAT_SLIDER_VISUAL_THUMB = /*#__PURE__*/new InjectionToken('_MatSliderVisualThumb');\n/**\n * A simple change event emitted by the MatSlider component.\n * @deprecated Use event bindings directly on the MatSliderThumbs for `change` and `input` events. See https://v17.material.angular.dev/guide/mdc-migration for information about migrating.\n * @breaking-change 17.0.0\n */\nclass MatSliderChange {\n /** The MatSliderThumb that was interacted with. */\n source;\n /** The MatSlider that was interacted with. */\n parent;\n /** The new value of the source slider. */\n value;\n}\n\n/**\n * The visual slider thumb.\n *\n * Handles the slider thumb ripple states (hover, focus, and active),\n * and displaying the value tooltip on discrete sliders.\n * @docs-private\n */\nlet MatSliderVisualThumb = /*#__PURE__*/(() => {\n class MatSliderVisualThumb {\n _cdr = inject(ChangeDetectorRef);\n _ngZone = inject(NgZone);\n _slider = inject(MAT_SLIDER);\n _renderer = inject(Renderer2);\n _listenerCleanups;\n /** Whether the slider displays a numeric value label upon pressing the thumb. */\n discrete;\n /** Indicates which slider thumb this input corresponds to. */\n thumbPosition;\n /** The display value of the slider thumb. */\n valueIndicatorText;\n /** The MatRipple for this slider thumb. */\n _ripple;\n /** The slider thumb knob. */\n _knob;\n /** The slider thumb value indicator container. */\n _valueIndicatorContainer;\n /** The slider input corresponding to this slider thumb. */\n _sliderInput;\n /** The native html element of the slider input corresponding to this thumb. */\n _sliderInputEl;\n /** The RippleRef for the slider thumbs hover state. */\n _hoverRippleRef;\n /** The RippleRef for the slider thumbs focus state. */\n _focusRippleRef;\n /** The RippleRef for the slider thumbs active state. */\n _activeRippleRef;\n /** Whether the slider thumb is currently being hovered. */\n _isHovered = false;\n /** Whether the slider thumb is currently being pressed. */\n _isActive = false;\n /** Whether the value indicator tooltip is visible. */\n _isValueIndicatorVisible = false;\n /** The host native HTML input element. */\n _hostElement = inject(ElementRef).nativeElement;\n _platform = inject(Platform);\n constructor() {}\n ngAfterViewInit() {\n const sliderInput = this._slider._getInput(this.thumbPosition);\n // No-op if the slider isn't configured properly. `MatSlider` will\n // throw an error instructing the user how to set up the slider.\n if (!sliderInput) {\n return;\n }\n this._ripple.radius = 24;\n this._sliderInput = sliderInput;\n this._sliderInputEl = this._sliderInput._hostElement;\n // These listeners don't update any data bindings so we bind them outside\n // of the NgZone to prevent Angular from needlessly running change detection.\n this._ngZone.runOutsideAngular(() => {\n const input = this._sliderInputEl;\n const renderer = this._renderer;\n this._listenerCleanups = [renderer.listen(input, 'pointermove', this._onPointerMove), renderer.listen(input, 'pointerdown', this._onDragStart), renderer.listen(input, 'pointerup', this._onDragEnd), renderer.listen(input, 'pointerleave', this._onMouseLeave), renderer.listen(input, 'focus', this._onFocus), renderer.listen(input, 'blur', this._onBlur)];\n });\n }\n ngOnDestroy() {\n this._listenerCleanups?.forEach(cleanup => cleanup());\n }\n _onPointerMove = event => {\n if (this._sliderInput._isFocused) {\n return;\n }\n const rect = this._hostElement.getBoundingClientRect();\n const isHovered = this._slider._isCursorOnSliderThumb(event, rect);\n this._isHovered = isHovered;\n if (isHovered) {\n this._showHoverRipple();\n } else {\n this._hideRipple(this._hoverRippleRef);\n }\n };\n _onMouseLeave = () => {\n this._isHovered = false;\n this._hideRipple(this._hoverRippleRef);\n };\n _onFocus = () => {\n // We don't want to show the hover ripple on top of the focus ripple.\n // Happen when the users cursor is over a thumb and then the user tabs to it.\n this._hideRipple(this._hoverRippleRef);\n this._showFocusRipple();\n this._hostElement.classList.add('mdc-slider__thumb--focused');\n };\n _onBlur = () => {\n // Happens when the user tabs away while still dragging a thumb.\n if (!this._isActive) {\n this._hideRipple(this._focusRippleRef);\n }\n // Happens when the user tabs away from a thumb but their cursor is still over it.\n if (this._isHovered) {\n this._showHoverRipple();\n }\n this._hostElement.classList.remove('mdc-slider__thumb--focused');\n };\n _onDragStart = event => {\n if (event.button !== 0) {\n return;\n }\n this._isActive = true;\n this._showActiveRipple();\n };\n _onDragEnd = () => {\n this._isActive = false;\n this._hideRipple(this._activeRippleRef);\n // Happens when the user starts dragging a thumb, tabs away, and then stops dragging.\n if (!this._sliderInput._isFocused) {\n this._hideRipple(this._focusRippleRef);\n }\n // On Safari we need to immediately re-show the hover ripple because\n // sliders do not retain focus from pointer events on that platform.\n if (this._platform.SAFARI) {\n this._showHoverRipple();\n }\n };\n /** Handles displaying the hover ripple. */\n _showHoverRipple() {\n if (!this._isShowingRipple(this._hoverRippleRef)) {\n this._hoverRippleRef = this._showRipple({\n enterDuration: 0,\n exitDuration: 0\n });\n this._hoverRippleRef?.element.classList.add('mat-mdc-slider-hover-ripple');\n }\n }\n /** Handles displaying the focus ripple. */\n _showFocusRipple() {\n // Show the focus ripple event if noop animations are enabled.\n if (!this._isShowingRipple(this._focusRippleRef)) {\n this._focusRippleRef = this._showRipple({\n enterDuration: 0,\n exitDuration: 0\n }, true);\n this._focusRippleRef?.element.classList.add('mat-mdc-slider-focus-ripple');\n }\n }\n /** Handles displaying the active ripple. */\n _showActiveRipple() {\n if (!this._isShowingRipple(this._activeRippleRef)) {\n this._activeRippleRef = this._showRipple({\n enterDuration: 225,\n exitDuration: 400\n });\n this._activeRippleRef?.element.classList.add('mat-mdc-slider-active-ripple');\n }\n }\n /** Whether the given rippleRef is currently fading in or visible. */\n _isShowingRipple(rippleRef) {\n return rippleRef?.state === RippleState.FADING_IN || rippleRef?.state === RippleState.VISIBLE;\n }\n /** Manually launches the slider thumb ripple using the specified ripple animation config. */\n _showRipple(animation, ignoreGlobalRippleConfig) {\n if (this._slider.disabled) {\n return;\n }\n this._showValueIndicator();\n if (this._slider._isRange) {\n const sibling = this._slider._getThumb(this.thumbPosition === _MatThumb.START ? _MatThumb.END : _MatThumb.START);\n sibling._showValueIndicator();\n }\n if (this._slider._globalRippleOptions?.disabled && !ignoreGlobalRippleConfig) {\n return;\n }\n return this._ripple.launch({\n animation: this._slider._noopAnimations ? {\n enterDuration: 0,\n exitDuration: 0\n } : animation,\n centered: true,\n persistent: true\n });\n }\n /**\n * Fades out the given ripple.\n * Also hides the value indicator if no ripple is showing.\n */\n _hideRipple(rippleRef) {\n rippleRef?.fadeOut();\n if (this._isShowingAnyRipple()) {\n return;\n }\n if (!this._slider._isRange) {\n this._hideValueIndicator();\n }\n const sibling = this._getSibling();\n if (!sibling._isShowingAnyRipple()) {\n this._hideValueIndicator();\n sibling._hideValueIndicator();\n }\n }\n /** Shows the value indicator ui. */\n _showValueIndicator() {\n this._hostElement.classList.add('mdc-slider__thumb--with-indicator');\n }\n /** Hides the value indicator ui. */\n _hideValueIndicator() {\n this._hostElement.classList.remove('mdc-slider__thumb--with-indicator');\n }\n _getSibling() {\n return this._slider._getThumb(this.thumbPosition === _MatThumb.START ? _MatThumb.END : _MatThumb.START);\n }\n /** Gets the value indicator container's native HTML element. */\n _getValueIndicatorContainer() {\n return this._valueIndicatorContainer?.nativeElement;\n }\n /** Gets the native HTML element of the slider thumb knob. */\n _getKnob() {\n return this._knob.nativeElement;\n }\n _isShowingAnyRipple() {\n return this._isShowingRipple(this._hoverRippleRef) || this._isShowingRipple(this._focusRippleRef) || this._isShowingRipple(this._activeRippleRef);\n }\n static \u0275fac = function MatSliderVisualThumb_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatSliderVisualThumb)();\n };\n static \u0275cmp = /* @__PURE__ */i0.\u0275\u0275defineComponent({\n type: MatSliderVisualThumb,\n selectors: [[\"mat-slider-visual-thumb\"]],\n viewQuery: function MatSliderVisualThumb_Query(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275viewQuery(MatRipple, 5);\n i0.\u0275\u0275viewQuery(_c0, 5);\n i0.\u0275\u0275viewQuery(_c1, 5);\n }\n if (rf & 2) {\n let _t;\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._ripple = _t.first);\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._knob = _t.first);\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._valueIndicatorContainer = _t.first);\n }\n },\n hostAttrs: [1, \"mdc-slider__thumb\", \"mat-mdc-slider-visual-thumb\"],\n inputs: {\n discrete: \"discrete\",\n thumbPosition: \"thumbPosition\",\n valueIndicatorText: \"valueIndicatorText\"\n },\n features: [i0.\u0275\u0275ProvidersFeature([{\n provide: MAT_SLIDER_VISUAL_THUMB,\n useExisting: MatSliderVisualThumb\n }])],\n decls: 4,\n vars: 2,\n consts: [[\"knob\", \"\"], [\"valueIndicatorContainer\", \"\"], [1, \"mdc-slider__value-indicator-container\"], [1, \"mdc-slider__thumb-knob\"], [\"matRipple\", \"\", 1, \"mat-focus-indicator\", 3, \"matRippleDisabled\"], [1, \"mdc-slider__value-indicator\"], [1, \"mdc-slider__value-indicator-text\"]],\n template: function MatSliderVisualThumb_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275conditionalCreate(0, MatSliderVisualThumb_Conditional_0_Template, 5, 1, \"div\", 2);\n i0.\u0275\u0275element(1, \"div\", 3, 0)(3, \"div\", 4);\n }\n if (rf & 2) {\n i0.\u0275\u0275conditional(ctx.discrete ? 0 : -1);\n i0.\u0275\u0275advance(3);\n i0.\u0275\u0275property(\"matRippleDisabled\", true);\n }\n },\n dependencies: [MatRipple],\n styles: [\".mat-mdc-slider-visual-thumb .mat-ripple{height:100%;width:100%}.mat-mdc-slider .mdc-slider__tick-marks{justify-content:start}.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--active,.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--inactive{position:absolute;left:2px}\\n\"],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n return MatSliderVisualThumb;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n// TODO(wagnermaciel): maybe handle the following edge case:\n// 1. start dragging discrete slider\n// 2. tab to disable checkbox\n// 3. without ending drag, disable the slider\n/**\n * Allows users to select from a range of values by moving the slider thumb. It is similar in\n * behavior to the native `` element.\n */\nlet MatSlider = /*#__PURE__*/(() => {\n class MatSlider {\n _ngZone = inject(NgZone);\n _cdr = inject(ChangeDetectorRef);\n _elementRef = inject(ElementRef);\n _dir = inject(Directionality, {\n optional: true\n });\n _globalRippleOptions = inject(MAT_RIPPLE_GLOBAL_OPTIONS, {\n optional: true\n });\n /** The active portion of the slider track. */\n _trackActive;\n /** The slider thumb(s). */\n _thumbs;\n /** The sliders hidden range input(s). */\n _input;\n /** The sliders hidden range input(s). */\n _inputs;\n /** Whether the slider is disabled. */\n get disabled() {\n return this._disabled;\n }\n set disabled(v) {\n this._disabled = v;\n const endInput = this._getInput(_MatThumb.END);\n const startInput = this._getInput(_MatThumb.START);\n if (endInput) {\n endInput.disabled = this._disabled;\n }\n if (startInput) {\n startInput.disabled = this._disabled;\n }\n }\n _disabled = false;\n /** Whether the slider displays a numeric value label upon pressing the thumb. */\n get discrete() {\n return this._discrete;\n }\n set discrete(v) {\n this._discrete = v;\n this._updateValueIndicatorUIs();\n }\n _discrete = false;\n /** Whether the slider displays tick marks along the slider track. */\n get showTickMarks() {\n return this._showTickMarks;\n }\n set showTickMarks(value) {\n this._showTickMarks = value;\n if (this._hasViewInitialized) {\n this._updateTickMarkUI();\n this._updateTickMarkTrackUI();\n }\n }\n _showTickMarks = false;\n /** The minimum value that the slider can have. */\n get min() {\n return this._min;\n }\n set min(v) {\n const min = v === undefined || v === null || isNaN(v) ? this._min : v;\n if (this._min !== min) {\n this._updateMin(min);\n }\n }\n _min = 0;\n /**\n * Theme color of the slider. This API is supported in M2 themes only, it\n * has no effect in M3 themes. For color customization in M3, see https://material.angular.dev/components/slider/styling.\n *\n * For information on applying color variants in M3, see\n * https://material.angular.dev/guide/material-2-theming#optional-add-backwards-compatibility-styles-for-color-variants\n */\n color;\n /** Whether ripples are disabled in the slider. */\n disableRipple = false;\n _updateMin(min) {\n const prevMin = this._min;\n this._min = min;\n this._isRange ? this._updateMinRange({\n old: prevMin,\n new: min\n }) : this._updateMinNonRange(min);\n this._onMinMaxOrStepChange();\n }\n _updateMinRange(min) {\n const endInput = this._getInput(_MatThumb.END);\n const startInput = this._getInput(_MatThumb.START);\n const oldEndValue = endInput.value;\n const oldStartValue = startInput.value;\n startInput.min = min.new;\n endInput.min = Math.max(min.new, startInput.value);\n startInput.max = Math.min(endInput.max, endInput.value);\n startInput._updateWidthInactive();\n endInput._updateWidthInactive();\n min.new < min.old ? this._onTranslateXChangeBySideEffect(endInput, startInput) : this._onTranslateXChangeBySideEffect(startInput, endInput);\n if (oldEndValue !== endInput.value) {\n this._onValueChange(endInput);\n }\n if (oldStartValue !== startInput.value) {\n this._onValueChange(startInput);\n }\n }\n _updateMinNonRange(min) {\n const input = this._getInput(_MatThumb.END);\n if (input) {\n const oldValue = input.value;\n input.min = min;\n input._updateThumbUIByValue();\n this._updateTrackUI(input);\n if (oldValue !== input.value) {\n this._onValueChange(input);\n }\n }\n }\n /** The maximum value that the slider can have. */\n get max() {\n return this._max;\n }\n set max(v) {\n const max = v === undefined || v === null || isNaN(v) ? this._max : v;\n if (this._max !== max) {\n this._updateMax(max);\n }\n }\n _max = 100;\n _updateMax(max) {\n const prevMax = this._max;\n this._max = max;\n this._isRange ? this._updateMaxRange({\n old: prevMax,\n new: max\n }) : this._updateMaxNonRange(max);\n this._onMinMaxOrStepChange();\n }\n _updateMaxRange(max) {\n const endInput = this._getInput(_MatThumb.END);\n const startInput = this._getInput(_MatThumb.START);\n const oldEndValue = endInput.value;\n const oldStartValue = startInput.value;\n endInput.max = max.new;\n startInput.max = Math.min(max.new, endInput.value);\n endInput.min = startInput.value;\n endInput._updateWidthInactive();\n startInput._updateWidthInactive();\n max.new > max.old ? this._onTranslateXChangeBySideEffect(startInput, endInput) : this._onTranslateXChangeBySideEffect(endInput, startInput);\n if (oldEndValue !== endInput.value) {\n this._onValueChange(endInput);\n }\n if (oldStartValue !== startInput.value) {\n this._onValueChange(startInput);\n }\n }\n _updateMaxNonRange(max) {\n const input = this._getInput(_MatThumb.END);\n if (input) {\n const oldValue = input.value;\n input.max = max;\n input._updateThumbUIByValue();\n this._updateTrackUI(input);\n if (oldValue !== input.value) {\n this._onValueChange(input);\n }\n }\n }\n /** The values at which the thumb will snap. */\n get step() {\n return this._step;\n }\n set step(v) {\n const step = isNaN(v) ? this._step : v;\n if (this._step !== step) {\n this._updateStep(step);\n }\n }\n _step = 1;\n _updateStep(step) {\n this._step = step;\n this._isRange ? this._updateStepRange() : this._updateStepNonRange();\n this._onMinMaxOrStepChange();\n }\n _updateStepRange() {\n const endInput = this._getInput(_MatThumb.END);\n const startInput = this._getInput(_MatThumb.START);\n const oldEndValue = endInput.value;\n const oldStartValue = startInput.value;\n const prevStartValue = startInput.value;\n endInput.min = this._min;\n startInput.max = this._max;\n endInput.step = this._step;\n startInput.step = this._step;\n if (this._platform.SAFARI) {\n endInput.value = endInput.value;\n startInput.value = startInput.value;\n }\n endInput.min = Math.max(this._min, startInput.value);\n startInput.max = Math.min(this._max, endInput.value);\n startInput._updateWidthInactive();\n endInput._updateWidthInactive();\n endInput.value < prevStartValue ? this._onTranslateXChangeBySideEffect(startInput, endInput) : this._onTranslateXChangeBySideEffect(endInput, startInput);\n if (oldEndValue !== endInput.value) {\n this._onValueChange(endInput);\n }\n if (oldStartValue !== startInput.value) {\n this._onValueChange(startInput);\n }\n }\n _updateStepNonRange() {\n const input = this._getInput(_MatThumb.END);\n if (input) {\n const oldValue = input.value;\n input.step = this._step;\n if (this._platform.SAFARI) {\n input.value = input.value;\n }\n input._updateThumbUIByValue();\n if (oldValue !== input.value) {\n this._onValueChange(input);\n }\n }\n }\n /**\n * Function that will be used to format the value before it is displayed\n * in the thumb label. Can be used to format very large number in order\n * for them to fit into the slider thumb.\n */\n displayWith = value => `${value}`;\n /** Used to keep track of & render the active & inactive tick marks on the slider track. */\n _tickMarks;\n /** Whether animations have been disabled. */\n _noopAnimations = _animationsDisabled();\n /** Subscription to changes to the directionality (LTR / RTL) context for the application. */\n _dirChangeSubscription;\n /** Observer used to monitor size changes in the slider. */\n _resizeObserver;\n // Stored dimensions to avoid calling getBoundingClientRect redundantly.\n _cachedWidth;\n _cachedLeft;\n _rippleRadius = 24;\n // The value indicator tooltip text for the visual slider thumb(s).\n /** @docs-private */\n startValueIndicatorText = '';\n /** @docs-private */\n endValueIndicatorText = '';\n // Used to control the translateX of the visual slider thumb(s).\n _endThumbTransform;\n _startThumbTransform;\n _isRange = false;\n /** Whether the slider is rtl. */\n _isRtl = false;\n _hasViewInitialized = false;\n /**\n * The width of the tick mark track.\n * The tick mark track width is different from full track width\n */\n _tickMarkTrackWidth = 0;\n _hasAnimation = false;\n _resizeTimer = null;\n _platform = inject(Platform);\n constructor() {\n inject(_CdkPrivateStyleLoader).load(_StructuralStylesLoader);\n if (this._dir) {\n this._dirChangeSubscription = this._dir.change.subscribe(() => this._onDirChange());\n this._isRtl = this._dir.value === 'rtl';\n }\n }\n /** The radius of the native slider's knob. AFAIK there is no way to avoid hardcoding this. */\n _knobRadius = 8;\n _inputPadding;\n ngAfterViewInit() {\n if (this._platform.isBrowser) {\n this._updateDimensions();\n }\n const eInput = this._getInput(_MatThumb.END);\n const sInput = this._getInput(_MatThumb.START);\n this._isRange = !!eInput && !!sInput;\n this._cdr.detectChanges();\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n _validateInputs(this._isRange, this._getInput(_MatThumb.END), this._getInput(_MatThumb.START));\n }\n const thumb = this._getThumb(_MatThumb.END);\n this._rippleRadius = thumb._ripple.radius;\n this._inputPadding = this._rippleRadius - this._knobRadius;\n this._isRange ? this._initUIRange(eInput, sInput) : this._initUINonRange(eInput);\n this._updateTrackUI(eInput);\n this._updateTickMarkUI();\n this._updateTickMarkTrackUI();\n this._observeHostResize();\n this._cdr.detectChanges();\n }\n _initUINonRange(eInput) {\n eInput.initProps();\n eInput.initUI();\n this._updateValueIndicatorUI(eInput);\n this._hasViewInitialized = true;\n eInput._updateThumbUIByValue();\n }\n _initUIRange(eInput, sInput) {\n eInput.initProps();\n eInput.initUI();\n sInput.initProps();\n sInput.initUI();\n eInput._updateMinMax();\n sInput._updateMinMax();\n eInput._updateStaticStyles();\n sInput._updateStaticStyles();\n this._updateValueIndicatorUIs();\n this._hasViewInitialized = true;\n eInput._updateThumbUIByValue();\n sInput._updateThumbUIByValue();\n }\n ngOnDestroy() {\n this._dirChangeSubscription.unsubscribe();\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n }\n /** Handles updating the slider ui after a dir change. */\n _onDirChange() {\n this._isRtl = this._dir?.value === 'rtl';\n this._isRange ? this._onDirChangeRange() : this._onDirChangeNonRange();\n this._updateTickMarkUI();\n }\n _onDirChangeRange() {\n const endInput = this._getInput(_MatThumb.END);\n const startInput = this._getInput(_MatThumb.START);\n endInput._setIsLeftThumb();\n startInput._setIsLeftThumb();\n endInput.translateX = endInput._calcTranslateXByValue();\n startInput.translateX = startInput._calcTranslateXByValue();\n endInput._updateStaticStyles();\n startInput._updateStaticStyles();\n endInput._updateWidthInactive();\n startInput._updateWidthInactive();\n endInput._updateThumbUIByValue();\n startInput._updateThumbUIByValue();\n }\n _onDirChangeNonRange() {\n const input = this._getInput(_MatThumb.END);\n input._updateThumbUIByValue();\n }\n /** Starts observing and updating the slider if the host changes its size. */\n _observeHostResize() {\n if (typeof ResizeObserver === 'undefined' || !ResizeObserver) {\n return;\n }\n this._ngZone.runOutsideAngular(() => {\n this._resizeObserver = new ResizeObserver(() => {\n if (this._isActive()) {\n return;\n }\n if (this._resizeTimer) {\n clearTimeout(this._resizeTimer);\n }\n this._onResize();\n });\n this._resizeObserver.observe(this._elementRef.nativeElement);\n });\n }\n /** Whether any of the thumbs are currently active. */\n _isActive() {\n return this._getThumb(_MatThumb.START)._isActive || this._getThumb(_MatThumb.END)._isActive;\n }\n _getValue(thumbPosition = _MatThumb.END) {\n const input = this._getInput(thumbPosition);\n if (!input) {\n return this.min;\n }\n return input.value;\n }\n _skipUpdate() {\n return !!(this._getInput(_MatThumb.START)?._skipUIUpdate || this._getInput(_MatThumb.END)?._skipUIUpdate);\n }\n /** Stores the slider dimensions. */\n _updateDimensions() {\n this._cachedWidth = this._elementRef.nativeElement.offsetWidth;\n this._cachedLeft = this._elementRef.nativeElement.getBoundingClientRect().left;\n }\n /** Sets the styles for the active portion of the track. */\n _setTrackActiveStyles(styles) {\n const trackStyle = this._trackActive.nativeElement.style;\n trackStyle.left = styles.left;\n trackStyle.right = styles.right;\n trackStyle.transformOrigin = styles.transformOrigin;\n trackStyle.transform = styles.transform;\n }\n /** Returns the translateX positioning for a tick mark based on it's index. */\n _calcTickMarkTransform(index) {\n // TODO(wagnermaciel): See if we can avoid doing this and just using flex to position these.\n const offset = index * (this._tickMarkTrackWidth / (this._tickMarks.length - 1));\n const translateX = this._isRtl ? this._cachedWidth - 6 - offset : offset;\n return `translateX(${translateX}px`;\n }\n // Handlers for updating the slider ui.\n _onTranslateXChange(source) {\n if (!this._hasViewInitialized) {\n return;\n }\n this._updateThumbUI(source);\n this._updateTrackUI(source);\n this._updateOverlappingThumbUI(source);\n }\n _onTranslateXChangeBySideEffect(input1, input2) {\n if (!this._hasViewInitialized) {\n return;\n }\n input1._updateThumbUIByValue();\n input2._updateThumbUIByValue();\n }\n _onValueChange(source) {\n if (!this._hasViewInitialized) {\n return;\n }\n this._updateValueIndicatorUI(source);\n this._updateTickMarkUI();\n this._cdr.detectChanges();\n }\n _onMinMaxOrStepChange() {\n if (!this._hasViewInitialized) {\n return;\n }\n this._updateTickMarkUI();\n this._updateTickMarkTrackUI();\n this._cdr.markForCheck();\n }\n _onResize() {\n if (!this._hasViewInitialized) {\n return;\n }\n this._updateDimensions();\n if (this._isRange) {\n const eInput = this._getInput(_MatThumb.END);\n const sInput = this._getInput(_MatThumb.START);\n eInput._updateThumbUIByValue();\n sInput._updateThumbUIByValue();\n eInput._updateStaticStyles();\n sInput._updateStaticStyles();\n eInput._updateMinMax();\n sInput._updateMinMax();\n eInput._updateWidthInactive();\n sInput._updateWidthInactive();\n } else {\n const eInput = this._getInput(_MatThumb.END);\n if (eInput) {\n eInput._updateThumbUIByValue();\n }\n }\n this._updateTickMarkUI();\n this._updateTickMarkTrackUI();\n this._cdr.detectChanges();\n }\n /** Whether or not the slider thumbs overlap. */\n _thumbsOverlap = false;\n /** Returns true if the slider knobs are overlapping one another. */\n _areThumbsOverlapping() {\n const startInput = this._getInput(_MatThumb.START);\n const endInput = this._getInput(_MatThumb.END);\n if (!startInput || !endInput) {\n return false;\n }\n return endInput.translateX - startInput.translateX < 20;\n }\n /**\n * Updates the class names of overlapping slider thumbs so\n * that the current active thumb is styled to be on \"top\".\n */\n _updateOverlappingThumbClassNames(source) {\n const sibling = source.getSibling();\n const sourceThumb = this._getThumb(source.thumbPosition);\n const siblingThumb = this._getThumb(sibling.thumbPosition);\n siblingThumb._hostElement.classList.remove('mdc-slider__thumb--top');\n sourceThumb._hostElement.classList.toggle('mdc-slider__thumb--top', this._thumbsOverlap);\n }\n /** Updates the UI of slider thumbs when they begin or stop overlapping. */\n _updateOverlappingThumbUI(source) {\n if (!this._isRange || this._skipUpdate()) {\n return;\n }\n if (this._thumbsOverlap !== this._areThumbsOverlapping()) {\n this._thumbsOverlap = !this._thumbsOverlap;\n this._updateOverlappingThumbClassNames(source);\n }\n }\n // _MatThumb styles update conditions\n //\n // 1. TranslateX, resize, or dir change\n // - Reason: The thumb styles need to be updated according to the new translateX.\n // 2. Min, max, or step\n // - Reason: The value may have silently changed.\n /** Updates the translateX of the given thumb. */\n _updateThumbUI(source) {\n if (this._skipUpdate()) {\n return;\n }\n const thumb = this._getThumb(source.thumbPosition === _MatThumb.END ? _MatThumb.END : _MatThumb.START);\n thumb._hostElement.style.transform = `translateX(${source.translateX}px)`;\n }\n // Value indicator text update conditions\n //\n // 1. Value\n // - Reason: The value displayed needs to be updated.\n // 2. Min, max, or step\n // - Reason: The value may have silently changed.\n /** Updates the value indicator tooltip ui for the given thumb. */\n _updateValueIndicatorUI(source) {\n if (this._skipUpdate()) {\n return;\n }\n const valuetext = this.displayWith(source.value);\n this._hasViewInitialized ? source._valuetext.set(valuetext) : source._hostElement.setAttribute('aria-valuetext', valuetext);\n if (this.discrete) {\n source.thumbPosition === _MatThumb.START ? this.startValueIndicatorText = valuetext : this.endValueIndicatorText = valuetext;\n const visualThumb = this._getThumb(source.thumbPosition);\n valuetext.length < 3 ? visualThumb._hostElement.classList.add('mdc-slider__thumb--short-value') : visualThumb._hostElement.classList.remove('mdc-slider__thumb--short-value');\n }\n }\n /** Updates all value indicator UIs in the slider. */\n _updateValueIndicatorUIs() {\n const eInput = this._getInput(_MatThumb.END);\n const sInput = this._getInput(_MatThumb.START);\n if (eInput) {\n this._updateValueIndicatorUI(eInput);\n }\n if (sInput) {\n this._updateValueIndicatorUI(sInput);\n }\n }\n // Update Tick Mark Track Width\n //\n // 1. Min, max, or step\n // - Reason: The maximum reachable value may have changed.\n // - Side note: The maximum reachable value is different from the maximum value set by the\n // user. For example, a slider with [min: 5, max: 100, step: 10] would have a maximum\n // reachable value of 95.\n // 2. Resize\n // - Reason: The position for the maximum reachable value needs to be recalculated.\n /** Updates the width of the tick mark track. */\n _updateTickMarkTrackUI() {\n if (!this.showTickMarks || this._skipUpdate()) {\n return;\n }\n const step = this._step && this._step > 0 ? this._step : 1;\n const maxValue = Math.floor(this.max / step) * step;\n const percentage = (maxValue - this.min) / (this.max - this.min);\n this._tickMarkTrackWidth = (this._cachedWidth - 6) * percentage;\n }\n // Track active update conditions\n //\n // 1. TranslateX\n // - Reason: The track active should line up with the new thumb position.\n // 2. Min or max\n // - Reason #1: The 'active' percentage needs to be recalculated.\n // - Reason #2: The value may have silently changed.\n // 3. Step\n // - Reason: The value may have silently changed causing the thumb(s) to shift.\n // 4. Dir change\n // - Reason: The track active will need to be updated according to the new thumb position(s).\n // 5. Resize\n // - Reason: The total width the 'active' tracks translateX is based on has changed.\n /** Updates the scale on the active portion of the track. */\n _updateTrackUI(source) {\n if (this._skipUpdate()) {\n return;\n }\n this._isRange ? this._updateTrackUIRange(source) : this._updateTrackUINonRange(source);\n }\n _updateTrackUIRange(source) {\n const sibling = source.getSibling();\n if (!sibling || !this._cachedWidth) {\n return;\n }\n const activePercentage = Math.abs(sibling.translateX - source.translateX) / this._cachedWidth;\n if (source._isLeftThumb && this._cachedWidth) {\n this._setTrackActiveStyles({\n left: 'auto',\n right: `${this._cachedWidth - sibling.translateX}px`,\n transformOrigin: 'right',\n transform: `scaleX(${activePercentage})`\n });\n } else {\n this._setTrackActiveStyles({\n left: `${sibling.translateX}px`,\n right: 'auto',\n transformOrigin: 'left',\n transform: `scaleX(${activePercentage})`\n });\n }\n }\n _updateTrackUINonRange(source) {\n this._isRtl ? this._setTrackActiveStyles({\n left: 'auto',\n right: '0px',\n transformOrigin: 'right',\n transform: `scaleX(${1 - source.fillPercentage})`\n }) : this._setTrackActiveStyles({\n left: '0px',\n right: 'auto',\n transformOrigin: 'left',\n transform: `scaleX(${source.fillPercentage})`\n });\n }\n // Tick mark update conditions\n //\n // 1. Value\n // - Reason: a tick mark which was once active might now be inactive or vice versa.\n // 2. Min, max, or step\n // - Reason #1: the number of tick marks may have changed.\n // - Reason #2: The value may have silently changed.\n /** Updates the dots along the slider track. */\n _updateTickMarkUI() {\n if (!this.showTickMarks || this.step === undefined || this.min === undefined || this.max === undefined) {\n return;\n }\n const step = this.step > 0 ? this.step : 1;\n this._isRange ? this._updateTickMarkUIRange(step) : this._updateTickMarkUINonRange(step);\n }\n _updateTickMarkUINonRange(step) {\n const value = this._getValue();\n let numActive = Math.max(Math.round((value - this.min) / step), 0) + 1;\n let numInactive = Math.max(Math.round((this.max - value) / step), 0) - 1;\n this._isRtl ? numActive++ : numInactive++;\n this._tickMarks = Array(numActive).fill(_MatTickMark.ACTIVE).concat(Array(numInactive).fill(_MatTickMark.INACTIVE));\n }\n _updateTickMarkUIRange(step) {\n const endValue = this._getValue();\n const startValue = this._getValue(_MatThumb.START);\n const numInactiveBeforeStartThumb = Math.max(Math.round((startValue - this.min) / step), 0);\n const numActive = Math.max(Math.round((endValue - startValue) / step) + 1, 0);\n const numInactiveAfterEndThumb = Math.max(Math.round((this.max - endValue) / step), 0);\n this._tickMarks = Array(numInactiveBeforeStartThumb).fill(_MatTickMark.INACTIVE).concat(Array(numActive).fill(_MatTickMark.ACTIVE), Array(numInactiveAfterEndThumb).fill(_MatTickMark.INACTIVE));\n }\n /** Gets the slider thumb input of the given thumb position. */\n _getInput(thumbPosition) {\n if (thumbPosition === _MatThumb.END && this._input) {\n return this._input;\n }\n if (this._inputs?.length) {\n return thumbPosition === _MatThumb.START ? this._inputs.first : this._inputs.last;\n }\n return;\n }\n /** Gets the slider thumb HTML input element of the given thumb position. */\n _getThumb(thumbPosition) {\n return thumbPosition === _MatThumb.END ? this._thumbs?.last : this._thumbs?.first;\n }\n _setTransition(withAnimation) {\n this._hasAnimation = !this._platform.IOS && withAnimation && !this._noopAnimations;\n this._elementRef.nativeElement.classList.toggle('mat-mdc-slider-with-animation', this._hasAnimation);\n }\n /** Whether the given pointer event occurred within the bounds of the slider pointer's DOM Rect. */\n _isCursorOnSliderThumb(event, rect) {\n const radius = rect.width / 2;\n const centerX = rect.x + radius;\n const centerY = rect.y + radius;\n const dx = event.clientX - centerX;\n const dy = event.clientY - centerY;\n return Math.pow(dx, 2) + Math.pow(dy, 2) < Math.pow(radius, 2);\n }\n static \u0275fac = function MatSlider_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatSlider)();\n };\n static \u0275cmp = /* @__PURE__ */i0.\u0275\u0275defineComponent({\n type: MatSlider,\n selectors: [[\"mat-slider\"]],\n contentQueries: function MatSlider_ContentQueries(rf, ctx, dirIndex) {\n if (rf & 1) {\n i0.\u0275\u0275contentQuery(dirIndex, MAT_SLIDER_THUMB, 5);\n i0.\u0275\u0275contentQuery(dirIndex, MAT_SLIDER_RANGE_THUMB, 4);\n }\n if (rf & 2) {\n let _t;\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._input = _t.first);\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._inputs = _t);\n }\n },\n viewQuery: function MatSlider_Query(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275viewQuery(_c2, 5);\n i0.\u0275\u0275viewQuery(MAT_SLIDER_VISUAL_THUMB, 5);\n }\n if (rf & 2) {\n let _t;\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._trackActive = _t.first);\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._thumbs = _t);\n }\n },\n hostAttrs: [1, \"mat-mdc-slider\", \"mdc-slider\"],\n hostVars: 12,\n hostBindings: function MatSlider_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.\u0275\u0275classMap(\"mat-\" + (ctx.color || \"primary\"));\n i0.\u0275\u0275classProp(\"mdc-slider--range\", ctx._isRange)(\"mdc-slider--disabled\", ctx.disabled)(\"mdc-slider--discrete\", ctx.discrete)(\"mdc-slider--tick-marks\", ctx.showTickMarks)(\"_mat-animation-noopable\", ctx._noopAnimations);\n }\n },\n inputs: {\n disabled: [2, \"disabled\", \"disabled\", booleanAttribute],\n discrete: [2, \"discrete\", \"discrete\", booleanAttribute],\n showTickMarks: [2, \"showTickMarks\", \"showTickMarks\", booleanAttribute],\n min: [2, \"min\", \"min\", numberAttribute],\n color: \"color\",\n disableRipple: [2, \"disableRipple\", \"disableRipple\", booleanAttribute],\n max: [2, \"max\", \"max\", numberAttribute],\n step: [2, \"step\", \"step\", numberAttribute],\n displayWith: \"displayWith\"\n },\n exportAs: [\"matSlider\"],\n features: [i0.\u0275\u0275ProvidersFeature([{\n provide: MAT_SLIDER,\n useExisting: MatSlider\n }])],\n ngContentSelectors: _c3,\n decls: 9,\n vars: 5,\n consts: [[\"trackActive\", \"\"], [\"tickMarkContainer\", \"\"], [1, \"mdc-slider__track\"], [1, \"mdc-slider__track--inactive\"], [1, \"mdc-slider__track--active\"], [1, \"mdc-slider__track--active_fill\"], [1, \"mdc-slider__tick-marks\"], [3, \"discrete\", \"thumbPosition\", \"valueIndicatorText\"], [3, \"class\", \"transform\"]],\n template: function MatSlider_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275projectionDef();\n i0.\u0275\u0275projection(0);\n i0.\u0275\u0275elementStart(1, \"div\", 2);\n i0.\u0275\u0275element(2, \"div\", 3);\n i0.\u0275\u0275elementStart(3, \"div\", 4);\n i0.\u0275\u0275element(4, \"div\", 5, 0);\n i0.\u0275\u0275elementEnd();\n i0.\u0275\u0275conditionalCreate(6, MatSlider_Conditional_6_Template, 3, 1, \"div\", 6);\n i0.\u0275\u0275elementEnd();\n i0.\u0275\u0275conditionalCreate(7, MatSlider_Conditional_7_Template, 1, 3, \"mat-slider-visual-thumb\", 7);\n i0.\u0275\u0275element(8, \"mat-slider-visual-thumb\", 7);\n }\n if (rf & 2) {\n i0.\u0275\u0275advance(6);\n i0.\u0275\u0275conditional(ctx.showTickMarks ? 6 : -1);\n i0.\u0275\u0275advance();\n i0.\u0275\u0275conditional(ctx._isRange ? 7 : -1);\n i0.\u0275\u0275advance();\n i0.\u0275\u0275property(\"discrete\", ctx.discrete)(\"thumbPosition\", 2)(\"valueIndicatorText\", ctx.endValueIndicatorText);\n }\n },\n dependencies: [MatSliderVisualThumb],\n styles: [\".mdc-slider__track{position:absolute;top:50%;transform:translateY(-50%);width:100%;pointer-events:none;height:var(--mat-slider-inactive-track-height, 4px)}.mdc-slider__track--active,.mdc-slider__track--inactive{display:flex;height:100%;position:absolute;width:100%}.mdc-slider__track--active{overflow:hidden;border-radius:var(--mat-slider-active-track-shape, var(--mat-sys-corner-full));height:var(--mat-slider-active-track-height, 4px);top:calc((var(--mat-slider-inactive-track-height, 4px) - var(--mat-slider-active-track-height, 4px))/2)}.mdc-slider__track--active_fill{border-top-style:solid;box-sizing:border-box;height:100%;width:100%;position:relative;transform-origin:left;transition:transform 80ms ease;border-color:var(--mat-slider-active-track-color, var(--mat-sys-primary));border-top-width:var(--mat-slider-active-track-height, 4px)}.mdc-slider--disabled .mdc-slider__track--active_fill{border-color:var(--mat-slider-disabled-active-track-color, var(--mat-sys-on-surface))}[dir=rtl] .mdc-slider__track--active_fill{-webkit-transform-origin:right;transform-origin:right}.mdc-slider__track--inactive{left:0;top:0;opacity:.24;background-color:var(--mat-slider-inactive-track-color, var(--mat-sys-surface-variant));height:var(--mat-slider-inactive-track-height, 4px);border-radius:var(--mat-slider-inactive-track-shape, var(--mat-sys-corner-full))}.mdc-slider--disabled .mdc-slider__track--inactive{background-color:var(--mat-slider-disabled-inactive-track-color, var(--mat-sys-on-surface));opacity:.24}.mdc-slider__track--inactive::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:\\\"\\\";pointer-events:none}@media(forced-colors: active){.mdc-slider__track--inactive::before{border-color:CanvasText}}.mdc-slider__value-indicator-container{bottom:44px;left:50%;pointer-events:none;position:absolute;transform:var(--mat-slider-value-indicator-container-transform, translateX(-50%) rotate(-45deg))}.mdc-slider__thumb--with-indicator .mdc-slider__value-indicator-container{pointer-events:auto}.mdc-slider__value-indicator{display:flex;align-items:center;transform:scale(0);transform-origin:bottom;transition:transform 100ms cubic-bezier(0.4, 0, 1, 1);word-break:normal;background-color:var(--mat-slider-label-container-color, var(--mat-sys-primary));color:var(--mat-slider-label-label-text-color, var(--mat-sys-on-primary));width:var(--mat-slider-value-indicator-width, 28px);height:var(--mat-slider-value-indicator-height, 28px);padding:var(--mat-slider-value-indicator-padding, 0);opacity:var(--mat-slider-value-indicator-opacity, 1);border-radius:var(--mat-slider-value-indicator-border-radius, 50% 50% 50% 0)}.mdc-slider__thumb--with-indicator .mdc-slider__value-indicator{transition:transform 100ms cubic-bezier(0, 0, 0.2, 1);transform:scale(1)}.mdc-slider__value-indicator::before{border-left:6px solid rgba(0,0,0,0);border-right:6px solid rgba(0,0,0,0);border-top:6px solid;bottom:-5px;content:\\\"\\\";height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;display:var(--mat-slider-value-indicator-caret-display, none);border-top-color:var(--mat-slider-label-container-color, var(--mat-sys-primary))}.mdc-slider__value-indicator::after{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:\\\"\\\";pointer-events:none}@media(forced-colors: active){.mdc-slider__value-indicator::after{border-color:CanvasText}}.mdc-slider__value-indicator-text{text-align:center;width:var(--mat-slider-value-indicator-width, 28px);transform:var(--mat-slider-value-indicator-text-transform, rotate(45deg));font-family:var(--mat-slider-label-label-text-font, var(--mat-sys-label-medium-font));font-size:var(--mat-slider-label-label-text-size, var(--mat-sys-label-medium-size));font-weight:var(--mat-slider-label-label-text-weight, var(--mat-sys-label-medium-weight));line-height:var(--mat-slider-label-label-text-line-height, var(--mat-sys-label-medium-line-height));letter-spacing:var(--mat-slider-label-label-text-tracking, var(--mat-sys-label-medium-tracking))}.mdc-slider__thumb{-webkit-user-select:none;user-select:none;display:flex;left:-24px;outline:none;position:absolute;height:48px;width:48px;pointer-events:none}.mdc-slider--discrete .mdc-slider__thumb{transition:transform 80ms ease}.mdc-slider--disabled .mdc-slider__thumb{pointer-events:none}.mdc-slider__thumb--top{z-index:1}.mdc-slider__thumb-knob{position:absolute;box-sizing:border-box;left:50%;top:50%;transform:translate(-50%, -50%);border-style:solid;width:var(--mat-slider-handle-width, 20px);height:var(--mat-slider-handle-height, 20px);border-width:calc(var(--mat-slider-handle-height, 20px)/2) calc(var(--mat-slider-handle-width, 20px)/2);box-shadow:var(--mat-slider-handle-elevation, var(--mat-sys-level1));background-color:var(--mat-slider-handle-color, var(--mat-sys-primary));border-color:var(--mat-slider-handle-color, var(--mat-sys-primary));border-radius:var(--mat-slider-handle-shape, var(--mat-sys-corner-full))}.mdc-slider__thumb:hover .mdc-slider__thumb-knob{background-color:var(--mat-slider-hover-handle-color, var(--mat-sys-primary));border-color:var(--mat-slider-hover-handle-color, var(--mat-sys-primary))}.mdc-slider__thumb--focused .mdc-slider__thumb-knob{background-color:var(--mat-slider-focus-handle-color, var(--mat-sys-primary));border-color:var(--mat-slider-focus-handle-color, var(--mat-sys-primary))}.mdc-slider--disabled .mdc-slider__thumb-knob{background-color:var(--mat-slider-disabled-handle-color, var(--mat-sys-on-surface));border-color:var(--mat-slider-disabled-handle-color, var(--mat-sys-on-surface))}.mdc-slider__thumb--top .mdc-slider__thumb-knob,.mdc-slider__thumb--top.mdc-slider__thumb:hover .mdc-slider__thumb-knob,.mdc-slider__thumb--top.mdc-slider__thumb--focused .mdc-slider__thumb-knob{border:solid 1px #fff;box-sizing:content-box;border-color:var(--mat-slider-with-overlap-handle-outline-color, var(--mat-sys-on-primary));border-width:var(--mat-slider-with-overlap-handle-outline-width, 1px)}.mdc-slider__tick-marks{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:space-between;padding:0 1px;position:absolute;width:100%}.mdc-slider__tick-mark--active,.mdc-slider__tick-mark--inactive{width:var(--mat-slider-with-tick-marks-container-size, 2px);height:var(--mat-slider-with-tick-marks-container-size, 2px);border-radius:var(--mat-slider-with-tick-marks-container-shape, var(--mat-sys-corner-full))}.mdc-slider__tick-mark--inactive{opacity:var(--mat-slider-with-tick-marks-inactive-container-opacity, 0.38);background-color:var(--mat-slider-with-tick-marks-inactive-container-color, var(--mat-sys-on-surface-variant))}.mdc-slider--disabled .mdc-slider__tick-mark--inactive{opacity:var(--mat-slider-with-tick-marks-inactive-container-opacity, 0.38);background-color:var(--mat-slider-with-tick-marks-disabled-container-color, var(--mat-sys-on-surface))}.mdc-slider__tick-mark--active{opacity:var(--mat-slider-with-tick-marks-active-container-opacity, 0.38);background-color:var(--mat-slider-with-tick-marks-active-container-color, var(--mat-sys-on-primary))}.mdc-slider__input{cursor:pointer;left:2px;margin:0;height:44px;opacity:0;position:absolute;top:2px;width:44px;box-sizing:content-box}.mdc-slider__input.mat-mdc-slider-input-no-pointer-events{pointer-events:none}.mdc-slider__input.mat-slider__right-input{left:auto;right:0}.mat-mdc-slider{display:inline-block;box-sizing:border-box;outline:none;vertical-align:middle;cursor:pointer;height:48px;margin:0 8px;position:relative;touch-action:pan-y;width:auto;min-width:112px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-slider.mdc-slider--disabled{cursor:auto;opacity:.38}.mat-mdc-slider.mdc-slider--disabled .mdc-slider__input{cursor:auto}.mat-mdc-slider .mdc-slider__thumb,.mat-mdc-slider .mdc-slider__track--active_fill{transition-duration:0ms}.mat-mdc-slider.mat-mdc-slider-with-animation .mdc-slider__thumb,.mat-mdc-slider.mat-mdc-slider-with-animation .mdc-slider__track--active_fill{transition-duration:80ms}.mat-mdc-slider.mdc-slider--discrete .mdc-slider__thumb,.mat-mdc-slider.mdc-slider--discrete .mdc-slider__track--active_fill{transition-duration:0ms}.mat-mdc-slider.mat-mdc-slider-with-animation .mdc-slider__thumb,.mat-mdc-slider.mat-mdc-slider-with-animation .mdc-slider__track--active_fill{transition-duration:80ms}.mat-mdc-slider .mat-ripple .mat-ripple-element{background-color:var(--mat-slider-ripple-color, var(--mat-sys-primary))}.mat-mdc-slider .mat-ripple .mat-mdc-slider-hover-ripple{background-color:var(--mat-slider-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-primary) 5%, transparent))}.mat-mdc-slider .mat-ripple .mat-mdc-slider-focus-ripple,.mat-mdc-slider .mat-ripple .mat-mdc-slider-active-ripple{background-color:var(--mat-slider-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-primary) 20%, transparent))}.mat-mdc-slider._mat-animation-noopable.mdc-slider--discrete .mdc-slider__thumb,.mat-mdc-slider._mat-animation-noopable.mdc-slider--discrete .mdc-slider__track--active_fill,.mat-mdc-slider._mat-animation-noopable .mdc-slider__value-indicator{transition:none}.mat-mdc-slider .mat-focus-indicator::before{border-radius:50%}.mdc-slider__thumb--focused .mat-focus-indicator::before{content:\\\"\\\"}\\n\"],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n return MatSlider;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Ensures that there is not an invalid configuration for the slider thumb inputs. */\nfunction _validateInputs(isRange, endInputElement, startInputElement) {\n const startValid = !isRange || startInputElement?._hostElement.hasAttribute('matSliderStartThumb');\n const endValid = endInputElement?._hostElement.hasAttribute(isRange ? 'matSliderEndThumb' : 'matSliderThumb');\n if (!startValid || !endValid) {\n _throwInvalidInputConfigurationError();\n }\n}\nfunction _throwInvalidInputConfigurationError() {\n throw Error(`Invalid slider thumb input configuration!\n\n Valid configurations are as follows:\n\n \n \n \n\n or\n\n \n \n \n \n `);\n}\n\n/**\n * Provider that allows the slider thumb to register as a ControlValueAccessor.\n * @docs-private\n */\nconst MAT_SLIDER_THUMB_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: /*#__PURE__*/forwardRef(() => MatSliderThumb),\n multi: true\n};\n/**\n * Provider that allows the range slider thumb to register as a ControlValueAccessor.\n * @docs-private\n */\nconst MAT_SLIDER_RANGE_THUMB_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: /*#__PURE__*/forwardRef(() => MatSliderRangeThumb),\n multi: true\n};\n/**\n * Directive that adds slider-specific behaviors to an input element inside ``.\n * Up to two may be placed inside of a ``.\n *\n * If one is used, the selector `matSliderThumb` must be used, and the outcome will be a normal\n * slider. If two are used, the selectors `matSliderStartThumb` and `matSliderEndThumb` must be\n * used, and the outcome will be a range slider with two slider thumbs.\n */\nlet MatSliderThumb = /*#__PURE__*/(() => {\n class MatSliderThumb {\n _ngZone = inject(NgZone);\n _elementRef = inject(ElementRef);\n _cdr = inject(ChangeDetectorRef);\n _slider = inject(MAT_SLIDER);\n _platform = inject(Platform);\n _listenerCleanups;\n get value() {\n return numberAttribute(this._hostElement.value, 0);\n }\n set value(value) {\n if (value === null) {\n value = this._getDefaultValue();\n }\n value = isNaN(value) ? 0 : value;\n const stringValue = value + '';\n if (!this._hasSetInitialValue) {\n this._initialValue = stringValue;\n return;\n }\n if (this._isActive) {\n return;\n }\n this._setValue(stringValue);\n }\n /**\n * Handles programmatic value setting. This has been split out to\n * allow the range thumb to override it and add additional necessary logic.\n */\n _setValue(value) {\n this._hostElement.value = value;\n this._updateThumbUIByValue();\n this._slider._onValueChange(this);\n this._cdr.detectChanges();\n this._slider._cdr.markForCheck();\n }\n /** Event emitted when the `value` is changed. */\n valueChange = new EventEmitter();\n /** Event emitted when the slider thumb starts being dragged. */\n dragStart = new EventEmitter();\n /** Event emitted when the slider thumb stops being dragged. */\n dragEnd = new EventEmitter();\n /**\n * The current translateX in px of the slider visual thumb.\n * @docs-private\n */\n get translateX() {\n if (this._slider.min >= this._slider.max) {\n this._translateX = this._tickMarkOffset;\n return this._translateX;\n }\n if (this._translateX === undefined) {\n this._translateX = this._calcTranslateXByValue();\n }\n return this._translateX;\n }\n set translateX(v) {\n this._translateX = v;\n }\n _translateX;\n /**\n * Indicates whether this thumb is the start or end thumb.\n * @docs-private\n */\n thumbPosition = _MatThumb.END;\n /** @docs-private */\n get min() {\n return numberAttribute(this._hostElement.min, 0);\n }\n set min(v) {\n this._hostElement.min = v + '';\n this._cdr.detectChanges();\n }\n /** @docs-private */\n get max() {\n return numberAttribute(this._hostElement.max, 0);\n }\n set max(v) {\n this._hostElement.max = v + '';\n this._cdr.detectChanges();\n }\n get step() {\n return numberAttribute(this._hostElement.step, 0);\n }\n set step(v) {\n this._hostElement.step = v + '';\n this._cdr.detectChanges();\n }\n /** @docs-private */\n get disabled() {\n return booleanAttribute(this._hostElement.disabled);\n }\n set disabled(v) {\n this._hostElement.disabled = v;\n this._cdr.detectChanges();\n if (this._slider.disabled !== this.disabled) {\n this._slider.disabled = this.disabled;\n }\n }\n /** The percentage of the slider that coincides with the value. */\n get percentage() {\n if (this._slider.min >= this._slider.max) {\n return this._slider._isRtl ? 1 : 0;\n }\n return (this.value - this._slider.min) / (this._slider.max - this._slider.min);\n }\n /** @docs-private */\n get fillPercentage() {\n if (!this._slider._cachedWidth) {\n return this._slider._isRtl ? 1 : 0;\n }\n if (this._translateX === 0) {\n return 0;\n }\n return this.translateX / this._slider._cachedWidth;\n }\n /** The host native HTML input element. */\n _hostElement = this._elementRef.nativeElement;\n /** The aria-valuetext string representation of the input's value. */\n _valuetext = signal('');\n /** The radius of a native html slider's knob. */\n _knobRadius = 8;\n /** The distance in px from the start of the slider track to the first tick mark. */\n _tickMarkOffset = 3;\n /** Whether user's cursor is currently in a mouse down state on the input. */\n _isActive = false;\n /** Whether the input is currently focused (either by tab or after clicking). */\n _isFocused = false;\n /** Used to relay updates to _isFocused to the slider visual thumbs. */\n _setIsFocused(v) {\n this._isFocused = v;\n }\n /**\n * Whether the initial value has been set.\n * This exists because the initial value cannot be immediately set because the min and max\n * must first be relayed from the parent MatSlider component, which can only happen later\n * in the component lifecycle.\n */\n _hasSetInitialValue = false;\n /** The stored initial value. */\n _initialValue;\n /** Defined when a user is using a form control to manage slider value & validation. */\n _formControl;\n /** Emits when the component is destroyed. */\n _destroyed = new Subject();\n /**\n * Indicates whether UI updates should be skipped.\n *\n * This flag is used to avoid flickering\n * when correcting values on pointer up/down.\n */\n _skipUIUpdate = false;\n /** Callback called when the slider input value changes. */\n _onChangeFn;\n /** Callback called when the slider input has been touched. */\n _onTouchedFn = () => {};\n /**\n * Whether the NgModel has been initialized.\n *\n * This flag is used to ignore ghost null calls to\n * writeValue which can break slider initialization.\n *\n * See https://github.com/angular/angular/issues/14988.\n */\n _isControlInitialized = false;\n constructor() {\n const renderer = inject(Renderer2);\n this._ngZone.runOutsideAngular(() => {\n this._listenerCleanups = [renderer.listen(this._hostElement, 'pointerdown', this._onPointerDown.bind(this)), renderer.listen(this._hostElement, 'pointermove', this._onPointerMove.bind(this)), renderer.listen(this._hostElement, 'pointerup', this._onPointerUp.bind(this))];\n });\n }\n ngOnDestroy() {\n this._listenerCleanups.forEach(cleanup => cleanup());\n this._destroyed.next();\n this._destroyed.complete();\n this.dragStart.complete();\n this.dragEnd.complete();\n }\n /** @docs-private */\n initProps() {\n this._updateWidthInactive();\n // If this or the parent slider is disabled, just make everything disabled.\n if (this.disabled !== this._slider.disabled) {\n // The MatSlider setter for disabled will relay this and disable both inputs.\n this._slider.disabled = true;\n }\n this.step = this._slider.step;\n this.min = this._slider.min;\n this.max = this._slider.max;\n this._initValue();\n }\n /** @docs-private */\n initUI() {\n this._updateThumbUIByValue();\n }\n _initValue() {\n this._hasSetInitialValue = true;\n if (this._initialValue === undefined) {\n this.value = this._getDefaultValue();\n } else {\n this._hostElement.value = this._initialValue;\n this._updateThumbUIByValue();\n this._slider._onValueChange(this);\n this._cdr.detectChanges();\n }\n }\n _getDefaultValue() {\n return this.min;\n }\n _onBlur() {\n this._setIsFocused(false);\n this._onTouchedFn();\n }\n _onFocus() {\n this._slider._setTransition(false);\n this._slider._updateTrackUI(this);\n this._setIsFocused(true);\n }\n _onChange() {\n this.valueChange.emit(this.value);\n // only used to handle the edge case where user\n // mousedown on the slider then uses arrow keys.\n if (this._isActive) {\n this._updateThumbUIByValue({\n withAnimation: true\n });\n }\n }\n _onInput() {\n this._onChangeFn?.(this.value);\n // handles arrowing and updating the value when\n // a step is defined.\n if (this._slider.step || !this._isActive) {\n this._updateThumbUIByValue({\n withAnimation: true\n });\n }\n this._slider._onValueChange(this);\n }\n _onNgControlValueChange() {\n // only used to handle when the value change\n // originates outside of the slider.\n if (!this._isActive || !this._isFocused) {\n this._slider._onValueChange(this);\n this._updateThumbUIByValue();\n }\n this._slider.disabled = this._formControl.disabled;\n }\n _onPointerDown(event) {\n if (this.disabled || event.button !== 0) {\n return;\n }\n // On IOS, dragging only works if the pointer down happens on the\n // slider thumb and the slider does not receive focus from pointer events.\n if (this._platform.IOS) {\n const isCursorOnSliderThumb = this._slider._isCursorOnSliderThumb(event, this._slider._getThumb(this.thumbPosition)._hostElement.getBoundingClientRect());\n this._isActive = isCursorOnSliderThumb;\n this._updateWidthActive();\n this._slider._updateDimensions();\n return;\n }\n this._isActive = true;\n this._setIsFocused(true);\n this._updateWidthActive();\n this._slider._updateDimensions();\n // Does nothing if a step is defined because we\n // want the value to snap to the values on input.\n if (!this._slider.step) {\n this._updateThumbUIByPointerEvent(event, {\n withAnimation: true\n });\n }\n if (!this.disabled) {\n this._handleValueCorrection(event);\n this.dragStart.emit({\n source: this,\n parent: this._slider,\n value: this.value\n });\n }\n }\n /**\n * Corrects the value of the slider on pointer up/down.\n *\n * Called on pointer down and up because the value is set based\n * on the inactive width instead of the active width.\n */\n _handleValueCorrection(event) {\n // Don't update the UI with the current value! The value on pointerdown\n // and pointerup is calculated in the split second before the input(s)\n // resize. See _updateWidthInactive() and _updateWidthActive() for more\n // details.\n this._skipUIUpdate = true;\n // Note that this function gets triggered before the actual value of the\n // slider is updated. This means if we were to set the value here, it\n // would immediately be overwritten. Using setTimeout ensures the setting\n // of the value happens after the value has been updated by the\n // pointerdown event.\n setTimeout(() => {\n this._skipUIUpdate = false;\n this._fixValue(event);\n }, 0);\n }\n /** Corrects the value of the slider based on the pointer event's position. */\n _fixValue(event) {\n const xPos = event.clientX - this._slider._cachedLeft;\n const width = this._slider._cachedWidth;\n const step = this._slider.step === 0 ? 1 : this._slider.step;\n const numSteps = Math.floor((this._slider.max - this._slider.min) / step);\n const percentage = this._slider._isRtl ? 1 - xPos / width : xPos / width;\n // To ensure the percentage is rounded to the necessary number of decimals.\n const fixedPercentage = Math.round(percentage * numSteps) / numSteps;\n const impreciseValue = fixedPercentage * (this._slider.max - this._slider.min) + this._slider.min;\n const value = Math.round(impreciseValue / step) * step;\n const prevValue = this.value;\n if (value === prevValue) {\n // Because we prevented UI updates, if it turns out that the race\n // condition didn't happen and the value is already correct, we\n // have to apply the ui updates now.\n this._slider._onValueChange(this);\n this._slider.step > 0 ? this._updateThumbUIByValue() : this._updateThumbUIByPointerEvent(event, {\n withAnimation: this._slider._hasAnimation\n });\n return;\n }\n this.value = value;\n this.valueChange.emit(this.value);\n this._onChangeFn?.(this.value);\n this._slider._onValueChange(this);\n this._slider.step > 0 ? this._updateThumbUIByValue() : this._updateThumbUIByPointerEvent(event, {\n withAnimation: this._slider._hasAnimation\n });\n }\n _onPointerMove(event) {\n // Again, does nothing if a step is defined because\n // we want the value to snap to the values on input.\n if (!this._slider.step && this._isActive) {\n this._updateThumbUIByPointerEvent(event);\n }\n }\n _onPointerUp() {\n if (this._isActive) {\n this._isActive = false;\n if (this._platform.SAFARI) {\n this._setIsFocused(false);\n }\n this.dragEnd.emit({\n source: this,\n parent: this._slider,\n value: this.value\n });\n // This setTimeout is to prevent the pointerup from triggering a value\n // change on the input based on the inactive width. It's not clear why\n // but for some reason on IOS this race condition is even more common so\n // the timeout needs to be increased.\n setTimeout(() => this._updateWidthInactive(), this._platform.IOS ? 10 : 0);\n }\n }\n _clamp(v) {\n const min = this._tickMarkOffset;\n const max = this._slider._cachedWidth - this._tickMarkOffset;\n return Math.max(Math.min(v, max), min);\n }\n _calcTranslateXByValue() {\n if (this._slider._isRtl) {\n return (1 - this.percentage) * (this._slider._cachedWidth - this._tickMarkOffset * 2) + this._tickMarkOffset;\n }\n return this.percentage * (this._slider._cachedWidth - this._tickMarkOffset * 2) + this._tickMarkOffset;\n }\n _calcTranslateXByPointerEvent(event) {\n return event.clientX - this._slider._cachedLeft;\n }\n /**\n * Used to set the slider width to the correct\n * dimensions while the user is dragging.\n */\n _updateWidthActive() {}\n /**\n * Sets the slider input to disproportionate dimensions to allow for touch\n * events to be captured on touch devices.\n */\n _updateWidthInactive() {\n this._hostElement.style.padding = `0 ${this._slider._inputPadding}px`;\n this._hostElement.style.width = `calc(100% + ${this._slider._inputPadding - this._tickMarkOffset * 2}px)`;\n this._hostElement.style.left = `-${this._slider._rippleRadius - this._tickMarkOffset}px`;\n }\n _updateThumbUIByValue(options) {\n this.translateX = this._clamp(this._calcTranslateXByValue());\n this._updateThumbUI(options);\n }\n _updateThumbUIByPointerEvent(event, options) {\n this.translateX = this._clamp(this._calcTranslateXByPointerEvent(event));\n this._updateThumbUI(options);\n }\n _updateThumbUI(options) {\n this._slider._setTransition(!!options?.withAnimation);\n this._slider._onTranslateXChange(this);\n }\n /**\n * Sets the input's value.\n * @param value The new value of the input\n * @docs-private\n */\n writeValue(value) {\n if (this._isControlInitialized || value !== null) {\n this.value = value;\n }\n }\n /**\n * Registers a callback to be invoked when the input's value changes from user input.\n * @param fn The callback to register\n * @docs-private\n */\n registerOnChange(fn) {\n this._onChangeFn = fn;\n this._isControlInitialized = true;\n }\n /**\n * Registers a callback to be invoked when the input is blurred by the user.\n * @param fn The callback to register\n * @docs-private\n */\n registerOnTouched(fn) {\n this._onTouchedFn = fn;\n }\n /**\n * Sets the disabled state of the slider.\n * @param isDisabled The new disabled state\n * @docs-private\n */\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n }\n focus() {\n this._hostElement.focus();\n }\n blur() {\n this._hostElement.blur();\n }\n static \u0275fac = function MatSliderThumb_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatSliderThumb)();\n };\n static \u0275dir = /* @__PURE__ */i0.\u0275\u0275defineDirective({\n type: MatSliderThumb,\n selectors: [[\"input\", \"matSliderThumb\", \"\"]],\n hostAttrs: [\"type\", \"range\", 1, \"mdc-slider__input\"],\n hostVars: 1,\n hostBindings: function MatSliderThumb_HostBindings(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275listener(\"change\", function MatSliderThumb_change_HostBindingHandler() {\n return ctx._onChange();\n })(\"input\", function MatSliderThumb_input_HostBindingHandler() {\n return ctx._onInput();\n })(\"blur\", function MatSliderThumb_blur_HostBindingHandler() {\n return ctx._onBlur();\n })(\"focus\", function MatSliderThumb_focus_HostBindingHandler() {\n return ctx._onFocus();\n });\n }\n if (rf & 2) {\n i0.\u0275\u0275attribute(\"aria-valuetext\", ctx._valuetext());\n }\n },\n inputs: {\n value: [2, \"value\", \"value\", numberAttribute]\n },\n outputs: {\n valueChange: \"valueChange\",\n dragStart: \"dragStart\",\n dragEnd: \"dragEnd\"\n },\n exportAs: [\"matSliderThumb\"],\n features: [i0.\u0275\u0275ProvidersFeature([MAT_SLIDER_THUMB_VALUE_ACCESSOR, {\n provide: MAT_SLIDER_THUMB,\n useExisting: MatSliderThumb\n }])]\n });\n }\n return MatSliderThumb;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatSliderRangeThumb = /*#__PURE__*/(() => {\n class MatSliderRangeThumb extends MatSliderThumb {\n _cdr = inject(ChangeDetectorRef);\n /** @docs-private */\n getSibling() {\n if (!this._sibling) {\n this._sibling = this._slider._getInput(this._isEndThumb ? _MatThumb.START : _MatThumb.END);\n }\n return this._sibling;\n }\n _sibling;\n /**\n * Returns the minimum translateX position allowed for this slider input's visual thumb.\n * @docs-private\n */\n getMinPos() {\n const sibling = this.getSibling();\n if (!this._isLeftThumb && sibling) {\n return sibling.translateX;\n }\n return this._tickMarkOffset;\n }\n /**\n * Returns the maximum translateX position allowed for this slider input's visual thumb.\n * @docs-private\n */\n getMaxPos() {\n const sibling = this.getSibling();\n if (this._isLeftThumb && sibling) {\n return sibling.translateX;\n }\n return this._slider._cachedWidth - this._tickMarkOffset;\n }\n _setIsLeftThumb() {\n this._isLeftThumb = this._isEndThumb && this._slider._isRtl || !this._isEndThumb && !this._slider._isRtl;\n }\n /** Whether this slider corresponds to the input on the left hand side. */\n _isLeftThumb;\n /** Whether this slider corresponds to the input with greater value. */\n _isEndThumb;\n constructor() {\n super();\n this._isEndThumb = this._hostElement.hasAttribute('matSliderEndThumb');\n this._setIsLeftThumb();\n this.thumbPosition = this._isEndThumb ? _MatThumb.END : _MatThumb.START;\n }\n _getDefaultValue() {\n return this._isEndThumb && this._slider._isRange ? this.max : this.min;\n }\n _onInput() {\n super._onInput();\n this._updateSibling();\n if (!this._isActive) {\n this._updateWidthInactive();\n }\n }\n _onNgControlValueChange() {\n super._onNgControlValueChange();\n this.getSibling()?._updateMinMax();\n }\n _onPointerDown(event) {\n if (this.disabled || event.button !== 0) {\n return;\n }\n if (this._sibling) {\n this._sibling._updateWidthActive();\n this._sibling._hostElement.classList.add('mat-mdc-slider-input-no-pointer-events');\n }\n super._onPointerDown(event);\n }\n _onPointerUp() {\n super._onPointerUp();\n if (this._sibling) {\n setTimeout(() => {\n this._sibling._updateWidthInactive();\n this._sibling._hostElement.classList.remove('mat-mdc-slider-input-no-pointer-events');\n });\n }\n }\n _onPointerMove(event) {\n super._onPointerMove(event);\n if (!this._slider.step && this._isActive) {\n this._updateSibling();\n }\n }\n _fixValue(event) {\n super._fixValue(event);\n this._sibling?._updateMinMax();\n }\n _clamp(v) {\n return Math.max(Math.min(v, this.getMaxPos()), this.getMinPos());\n }\n _updateMinMax() {\n const sibling = this.getSibling();\n if (!sibling) {\n return;\n }\n if (this._isEndThumb) {\n this.min = Math.max(this._slider.min, sibling.value);\n this.max = this._slider.max;\n } else {\n this.min = this._slider.min;\n this.max = Math.min(this._slider.max, sibling.value);\n }\n }\n _updateWidthActive() {\n const minWidth = this._slider._rippleRadius * 2 - this._slider._inputPadding * 2;\n const maxWidth = this._slider._cachedWidth + this._slider._inputPadding - minWidth - this._tickMarkOffset * 2;\n const percentage = this._slider.min < this._slider.max ? (this.max - this.min) / (this._slider.max - this._slider.min) : 1;\n const width = maxWidth * percentage + minWidth;\n this._hostElement.style.width = `${width}px`;\n this._hostElement.style.padding = `0 ${this._slider._inputPadding}px`;\n }\n _updateWidthInactive() {\n const sibling = this.getSibling();\n if (!sibling) {\n return;\n }\n const maxWidth = this._slider._cachedWidth - this._tickMarkOffset * 2;\n const midValue = this._isEndThumb ? this.value - (this.value - sibling.value) / 2 : this.value + (sibling.value - this.value) / 2;\n const _percentage = this._isEndThumb ? (this.max - midValue) / (this._slider.max - this._slider.min) : (midValue - this.min) / (this._slider.max - this._slider.min);\n const percentage = this._slider.min < this._slider.max ? _percentage : 1;\n // Extend the native input width by the radius of the ripple\n let ripplePadding = this._slider._rippleRadius;\n // If one of the inputs is maximally sized (the value of both thumbs is\n // equal to the min or max), make that input take up all of the width and\n // make the other unselectable.\n if (percentage === 1) {\n ripplePadding = 48;\n } else if (percentage === 0) {\n ripplePadding = 0;\n }\n const width = maxWidth * percentage + ripplePadding;\n this._hostElement.style.width = `${width}px`;\n this._hostElement.style.padding = '0px';\n if (this._isLeftThumb) {\n this._hostElement.style.left = `-${this._slider._rippleRadius - this._tickMarkOffset}px`;\n this._hostElement.style.right = 'auto';\n } else {\n this._hostElement.style.left = 'auto';\n this._hostElement.style.right = `-${this._slider._rippleRadius - this._tickMarkOffset}px`;\n }\n }\n _updateStaticStyles() {\n this._hostElement.classList.toggle('mat-slider__right-input', !this._isLeftThumb);\n }\n _updateSibling() {\n const sibling = this.getSibling();\n if (!sibling) {\n return;\n }\n sibling._updateMinMax();\n if (this._isActive) {\n sibling._updateWidthActive();\n } else {\n sibling._updateWidthInactive();\n }\n }\n /**\n * Sets the input's value.\n * @param value The new value of the input\n * @docs-private\n */\n writeValue(value) {\n if (this._isControlInitialized || value !== null) {\n this.value = value;\n this._updateWidthInactive();\n this._updateSibling();\n }\n }\n _setValue(value) {\n super._setValue(value);\n this._updateWidthInactive();\n this._updateSibling();\n }\n static \u0275fac = function MatSliderRangeThumb_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatSliderRangeThumb)();\n };\n static \u0275dir = /* @__PURE__ */i0.\u0275\u0275defineDirective({\n type: MatSliderRangeThumb,\n selectors: [[\"input\", \"matSliderStartThumb\", \"\"], [\"input\", \"matSliderEndThumb\", \"\"]],\n exportAs: [\"matSliderRangeThumb\"],\n features: [i0.\u0275\u0275ProvidersFeature([MAT_SLIDER_RANGE_THUMB_VALUE_ACCESSOR, {\n provide: MAT_SLIDER_RANGE_THUMB,\n useExisting: MatSliderRangeThumb\n }]), i0.\u0275\u0275InheritDefinitionFeature]\n });\n }\n return MatSliderRangeThumb;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatSliderModule = /*#__PURE__*/(() => {\n class MatSliderModule {\n static \u0275fac = function MatSliderModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatSliderModule)();\n };\n static \u0275mod = /* @__PURE__ */i0.\u0275\u0275defineNgModule({\n type: MatSliderModule\n });\n static \u0275inj = /* @__PURE__ */i0.\u0275\u0275defineInjector({\n imports: [MatCommonModule, MatRippleModule]\n });\n }\n return MatSliderModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { MatSlider, MatSliderChange, MatSliderModule, MatSliderRangeThumb, MatSliderThumb, MatSliderVisualThumb };\n", │ │ "import * as i0 from '@angular/core';\nimport { ChangeDetectionStrategy, Component, NgModule } from '@angular/core';\nimport { FieldType, FormlyMatFormFieldModule } from '@ngx-formly/material/form-field';\nimport * as i1 from '@angular/forms';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport * as i2 from '@angular/material/slider';\nimport { MatSliderModule } from '@angular/material/slider';\nimport * as i3 from '@ngx-formly/core';\nimport { FormlyModule } from '@ngx-formly/core';\nimport { CommonModule } from '@angular/common';\nimport { MatCommonModule, MatRippleModule } from '@angular/material/core';\nlet FormlyFieldSlider = /*#__PURE__*/(() => {\n class FormlyFieldSlider extends FieldType {\n constructor() {\n super(...arguments);\n this.defaultOptions = {\n props: {\n hideFieldUnderline: true,\n floatLabel: 'always',\n displayWith: value => `${value}`\n }\n };\n }\n static {\n this.\u0275fac = /* @__PURE__ */(() => {\n let \u0275FormlyFieldSlider_BaseFactory;\n return function FormlyFieldSlider_Factory(__ngFactoryType__) {\n return (\u0275FormlyFieldSlider_BaseFactory || (\u0275FormlyFieldSlider_BaseFactory = i0.\u0275\u0275getInheritedFactory(FormlyFieldSlider)))(__ngFactoryType__ || FormlyFieldSlider);\n };\n })();\n }\n static {\n this.\u0275cmp = /* @__PURE__ */i0.\u0275\u0275defineComponent({\n type: FormlyFieldSlider,\n selectors: [[\"formly-field-mat-slider\"]],\n standalone: false,\n features: [i0.\u0275\u0275InheritDefinitionFeature],\n decls: 2,\n vars: 15,\n consts: [[3, \"input\", \"change\", \"id\", \"formlyAttributes\", \"tabIndex\", \"color\", \"displayWith\", \"max\", \"min\", \"step\", \"discrete\", \"showTickMarks\"], [\"matSliderThumb\", \"\", 3, \"formControl\", \"formlyAttributes\"]],\n template: function FormlyFieldSlider_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275elementStart(0, \"mat-slider\", 0);\n i0.\u0275\u0275listener(\"input\", function FormlyFieldSlider_Template_mat_slider_input_0_listener($event) {\n return ctx.props.input && ctx.props.input(ctx.field, $event);\n })(\"change\", function FormlyFieldSlider_Template_mat_slider_change_0_listener($event) {\n return ctx.props.change && ctx.props.change(ctx.field, $event);\n });\n i0.\u0275\u0275element(1, \"input\", 1);\n i0.\u0275\u0275elementEnd();\n }\n if (rf & 2) {\n i0.\u0275\u0275styleProp(\"width\", \"100%\");\n i0.\u0275\u0275property(\"id\", ctx.id)(\"formlyAttributes\", ctx.field)(\"tabIndex\", ctx.props.tabindex)(\"color\", ctx.props.color)(\"displayWith\", ctx.props.displayWith)(\"max\", ctx.props.max)(\"min\", ctx.props.min)(\"step\", ctx.props.step)(\"discrete\", ctx.props.discrete)(\"showTickMarks\", ctx.props.showTickMarks)(\"step\", ctx.props.step);\n i0.\u0275\u0275advance();\n i0.\u0275\u0275property(\"formControl\", ctx.formControl)(\"formlyAttributes\", ctx.field);\n }\n },\n dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.FormControlDirective, i2.MatSlider, i2.MatSliderThumb, i3.LegacyFormlyAttributes],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n }\n return FormlyFieldSlider;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nfunction withFormlyFieldSlider() {\n return {\n types: [{\n name: 'slider',\n component: FormlyFieldSlider,\n wrappers: ['form-field']\n }]\n };\n}\nlet FormlyMatSliderModule = /*#__PURE__*/(() => {\n class FormlyMatSliderModule {\n static {\n this.\u0275fac = function FormlyMatSliderModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || FormlyMatSliderModule)();\n };\n }\n static {\n this.\u0275mod = /* @__PURE__ */i0.\u0275\u0275defineNgModule({\n type: FormlyMatSliderModule\n });\n }\n static {\n this.\u0275inj = /* @__PURE__ */i0.\u0275\u0275defineInjector({\n imports: [CommonModule, MatCommonModule, MatRippleModule, ReactiveFormsModule, MatSliderModule, FormlyMatFormFieldModule, FormlyModule.forChild(withFormlyFieldSlider())]\n });\n }\n }\n return FormlyMatSliderModule;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { FormlyFieldSlider, FormlyMatSliderModule, withFormlyFieldSlider };\n", │ │ "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FieldType } from '@ngx-formly/material';\nimport { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core';\nimport { T } from 'src/app/t.const';\nimport { TagEditComponent } from '../../features/tag/tag-edit/tag-edit.component';\n\n@Component({\n selector: 'formly-tag-selection',\n standalone: true,\n imports: [FormsModule, FormlyModule, ReactiveFormsModule, TagEditComponent],\n templateUrl: './formly-tag-selection.component.html',\n styleUrl: './formly-tag-selection.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormlyTagSelectionComponent extends FieldType {\n T: typeof T = T;\n}\n", │ │ "\n\n\n\n", │ │ "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core';\nimport { FieldType } from '@ngx-formly/material';\nimport { MatButton } from '@angular/material/button';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Log } from '../../core/log';\n\n@Component({\n selector: 'formly-btn',\n templateUrl: './formly-btn.component.html',\n styleUrl: './formly-btn.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormlyModule, MatButton, TranslatePipe],\n})\nexport class FormlyBtnComponent extends FieldType {\n onClick(): void {\n if (this.to.onClick) {\n const r = this.to.onClick(this.field, this.form, this.model);\n if (r && 'then' in r) {\n r.then((v) => {\n Log.log('update', v, this);\n this.formControl.setValue(v);\n this.form.markAsDirty();\n });\n } else {\n this.formControl.setValue(r);\n }\n }\n }\n}\n", │ │ "@if (value) {\n
    {{ value }}
    \n}\n\n {{ (to.text | translate) || 'Click Me' }}\n\n", │ │ - "// This file is auto-generated by tools/load-env.js\n// Do not modify directly - edit .env file instead\n// Generated at: 2025-08-19T06:20:05.379Z\n\n/**\n * Environment variables loaded from .env file\n * Access these constants instead of process.env in your Angular app\n */\nexport const ENV = {\n\n} as const;\n\n// Type-safe helper to ensure all expected env vars are defined\nexport type EnvVars = typeof ENV;\n", │ │ + "// This file is auto-generated by tools/load-env.js\n// Do not modify directly - edit .env file instead\n// Generated at: 2025-08-22T09:41:45.989Z\n\n/**\n * Environment variables loaded from .env file\n * Access these constants instead of process.env in your Angular app\n */\nexport const ENV = {\n\n} as const;\n\n// Type-safe helper to ensure all expected env vars are defined\nexport type EnvVars = typeof ENV;\n", │ │ "/**\n * Pure functions for accessing environment variables.\n * These can be used anywhere in the codebase, including outside Angular context.\n */\n\n// Import the generated environment constants\n// This file is auto-generated from .env by tools/load-env.js\nimport { ENV } from '../config/env.generated';\n\n/**\n * Get an environment variable value.\n * Returns undefined if the variable is not set.\n */\nexport const getEnv = (key: keyof typeof ENV): string | undefined => {\n return ENV[key] || undefined;\n};\n\n/**\n * Get an optional environment variable that may not be in the required list.\n * Use this for environment variables that are truly optional and may not be defined\n * in the REQUIRED_ENV_KEYS list in load-env.js.\n * Returns undefined if the variable is not set.\n */\nexport const getEnvOptional = (key: string): string | undefined => {\n return (ENV as any)[key] || undefined;\n};\n\n/**\n * Get an environment variable as a number.\n * Returns undefined if the value is not a valid number.\n */\nexport const getEnvNumber = (key: keyof typeof ENV): number | undefined => {\n const value = getEnv(key);\n if (value === undefined) return undefined;\n const num = Number(value);\n return isNaN(num) ? undefined : num;\n};\n\n/**\n * Get all environment variables as an object.\n * Useful for debugging or passing multiple values.\n */\nexport const getAllEnv = (): typeof ENV => ENV;\n", │ │ "import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { getEnvOptional } from '../../util/env';\n\nexport interface UnsplashPhoto {\n id: string;\n urls: {\n raw: string;\n full: string;\n regular: string;\n small: string;\n thumb: string;\n };\n links?: {\n self?: string;\n html?: string;\n download?: string;\n download_location?: string;\n };\n description: string | null;\n alt_description: string | null;\n user: {\n name: string;\n links?: {\n html?: string;\n };\n };\n}\n\nexport interface UnsplashSearchResponse {\n results: UnsplashPhoto[];\n total: number;\n total_pages: number;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UnsplashService {\n private _http = inject(HttpClient);\n\n private readonly API_URL = 'https://api.unsplash.com';\n // Register your app at https://unsplash.com/developers?utm_source=super-productivity&utm_medium=referral&utm_campaign=api-credit for a free Access Key (50 req/hour)\n // The Access Key is used with \"Client-ID\" prefix in the Authorization header\n private readonly ACCESS_KEY = getEnvOptional('UNSPLASH_KEY');\n\n isAvailable(): boolean {\n return !!this.ACCESS_KEY;\n }\n\n searchPhotos(query: string, page = 1): Observable {\n if (!query || query.trim() === '') {\n return of({ results: [], total: 0, total_pages: 0 });\n }\n\n if (!this.ACCESS_KEY) {\n console.warn(\n 'No Unsplash Access Key configured. Register at https://unsplash.com/developers?utm_source=super-productivity&utm_medium=referral&utm_campaign=api-credit',\n );\n return of({ results: [], total: 0, total_pages: 0 });\n }\n\n const params = {\n query: query.trim(),\n page: page.toString(),\n per_page: '20',\n orientation: 'landscape',\n };\n\n const url = `${this.API_URL}/search/photos`;\n const headers = {\n Authorization: `Client-ID ${this.ACCESS_KEY}`,\n };\n\n return this._http\n .get(url, {\n params,\n headers,\n })\n .pipe(\n catchError((error) => {\n console.error('Unsplash API error:', error);\n return of({ results: [], total: 0, total_pages: 0 });\n }),\n );\n }\n\n getPhotoUrl(\n photo: UnsplashPhoto,\n size: 'thumb' | 'small' | 'regular' = 'regular',\n ): string {\n return photo.urls[size];\n }\n\n /**\n * Get optimized image URL for backgrounds\n * @param photo - The Unsplash photo object\n * @param width - Desired width (default 2560 for high res displays)\n * @param quality - Image quality 1-100 (default 85)\n */\n getBackgroundImageUrl(photo: UnsplashPhoto, width = 2560, quality = 85): string {\n return `${photo.urls.raw}&w=${width}&q=${quality}&auto=format`;\n }\n\n /**\n * Add UTM parameters to Unsplash attribution links as required\n * @param url - The original Unsplash URL\n */\n addUtmParams(url: string): string {\n if (!url) return url;\n\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}utm_source=super-productivity&utm_medium=referral&utm_campaign=api-credit`;\n }\n\n /**\n * Trigger download tracking as required by Unsplash API guidelines\n * This must be called when a user selects a photo for use\n * @param photo - The selected photo\n */\n trackPhotoDownload(photo: UnsplashPhoto): Observable {\n if (!photo.links?.download_location) {\n console.warn('No download_location available for photo', photo.id);\n return of(null);\n }\n\n if (!this.ACCESS_KEY) {\n console.warn('No Unsplash Access Key configured');\n return of(null);\n }\n\n const headers = {\n Authorization: `Client-ID ${this.ACCESS_KEY}`,\n };\n\n // Call the download endpoint to track usage\n return this._http.get(photo.links.download_location, { headers }).pipe(\n catchError((error) => {\n console.error('Failed to track photo download:', error);\n // Don't fail the selection if tracking fails\n return of(null);\n }),\n );\n }\n}\n", │ │ "export const IS_MAC = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n", │ │ "import * as i0 from '@angular/core';\nimport { InjectionToken, Injectable, EventEmitter, Directive, Optional, Inject, Input, Output } from '@angular/core';\nimport { registerables, Chart, defaults } from 'chart.js';\nimport { merge } from 'lodash-es';\nimport { BehaviorSubject } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nconst NG_CHARTS_CONFIGURATION = new InjectionToken('Configuration for ngCharts');\n/**\n * Provide all the default registerable as defined by Chart.js\n */\nfunction withDefaultRegisterables(...registerables$1) {\n return {\n registerables: [...registerables, ...registerables$1]\n };\n}\n/**\n * Provide configuration for ngCharts. In most cases, you have to pass it some registerables. So either\n * `withDefaultRegisterables()`, or a custom list of registerables tailored to your needs to reduce bundle size.\n */\nfunction provideCharts(...configurations) {\n const config = merge({}, ...configurations);\n return {\n provide: NG_CHARTS_CONFIGURATION,\n useValue: config\n };\n}\nlet ThemeService = /*#__PURE__*/(() => {\n class ThemeService {\n constructor() {\n this.colorschemesOptions = new BehaviorSubject(undefined);\n }\n setColorschemesOptions(options) {\n this.pColorschemesOptions = options;\n this.colorschemesOptions.next(options);\n }\n getColorschemesOptions() {\n return this.pColorschemesOptions;\n }\n static {\n this.\u0275fac = function ThemeService_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || ThemeService)();\n };\n }\n static {\n this.\u0275prov = /* @__PURE__ */i0.\u0275\u0275defineInjectable({\n token: ThemeService,\n factory: ThemeService.\u0275fac,\n providedIn: 'root'\n });\n }\n }\n return ThemeService;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet BaseChartDirective = /*#__PURE__*/(() => {\n class BaseChartDirective {\n constructor(element, zone, themeService, config) {\n this.zone = zone;\n this.themeService = themeService;\n this.type = 'bar';\n this.plugins = [];\n this.chartClick = new EventEmitter();\n this.chartHover = new EventEmitter();\n this.subs = [];\n this.themeOverrides = {};\n if (config?.registerables) {\n Chart.register(...config.registerables);\n }\n if (config?.defaults) {\n defaults.set(config.defaults);\n }\n this.ctx = element.nativeElement.getContext('2d');\n this.subs.push(this.themeService.colorschemesOptions.pipe(distinctUntilChanged()).subscribe(r => this.themeChanged(r)));\n }\n ngOnChanges(changes) {\n const requireRender = ['type'];\n const propertyNames = Object.getOwnPropertyNames(changes);\n if (propertyNames.some(key => requireRender.includes(key)) || propertyNames.every(key => changes[key].isFirstChange())) {\n this.render();\n } else {\n const config = this.getChartConfiguration();\n // Using assign to avoid changing the original object reference\n if (this.chart) {\n Object.assign(this.chart.config.data, config.data);\n if (this.chart.config.plugins) {\n Object.assign(this.chart.config.plugins, config.plugins);\n }\n if (this.chart.config.options) {\n Object.assign(this.chart.config.options, config.options);\n }\n }\n this.update();\n }\n }\n ngOnDestroy() {\n if (this.chart) {\n this.chart.destroy();\n this.chart = void 0;\n }\n this.subs.forEach(s => s.unsubscribe());\n }\n render() {\n if (this.chart) {\n this.chart.destroy();\n }\n return this.zone.runOutsideAngular(() => this.chart = new Chart(this.ctx, this.getChartConfiguration()));\n }\n update(mode) {\n if (this.chart) {\n this.zone.runOutsideAngular(() => this.chart?.update(mode));\n }\n }\n hideDataset(index, hidden) {\n if (this.chart) {\n this.chart.getDatasetMeta(index).hidden = hidden;\n this.update();\n }\n }\n isDatasetHidden(index) {\n return this.chart?.getDatasetMeta(index)?.hidden;\n }\n toBase64Image() {\n return this.chart?.toBase64Image();\n }\n themeChanged(options) {\n this.themeOverrides = options;\n if (this.chart) {\n if (this.chart.config.options) {\n Object.assign(this.chart.config.options, this.getChartOptions());\n }\n this.update();\n }\n }\n getChartOptions() {\n return merge({\n onHover: (event, active) => {\n if (!this.chartHover.observed && !this.chartHover.observers?.length) {\n return;\n }\n this.zone.run(() => this.chartHover.emit({\n event,\n active\n }));\n },\n onClick: (event, active) => {\n if (!this.chartClick.observed && !this.chartClick.observers?.length) {\n return;\n }\n this.zone.run(() => this.chartClick.emit({\n event,\n active\n }));\n }\n }, this.themeOverrides, this.options, {\n plugins: {\n legend: {\n display: this.legend\n }\n }\n });\n }\n getChartConfiguration() {\n return {\n type: this.type,\n data: this.getChartData(),\n options: this.getChartOptions(),\n plugins: this.plugins\n };\n }\n getChartData() {\n return this.data ? this.data : {\n labels: this.labels || [],\n datasets: this.datasets || []\n };\n }\n static {\n this.\u0275fac = function BaseChartDirective_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || BaseChartDirective)(i0.\u0275\u0275directiveInject(i0.ElementRef), i0.\u0275\u0275directiveInject(i0.NgZone), i0.\u0275\u0275directiveInject(ThemeService), i0.\u0275\u0275directiveInject(NG_CHARTS_CONFIGURATION, 8));\n };\n }\n static {\n this.\u0275dir = /* @__PURE__ */i0.\u0275\u0275defineDirective({\n type: BaseChartDirective,\n selectors: [[\"canvas\", \"baseChart\", \"\"]],\n inputs: {\n type: \"type\",\n legend: \"legend\",\n data: \"data\",\n options: \"options\",\n plugins: \"plugins\",\n labels: \"labels\",\n datasets: \"datasets\"\n },\n outputs: {\n chartClick: \"chartClick\",\n chartHover: \"chartHover\"\n },\n exportAs: [\"base-chart\"],\n features: [i0.\u0275\u0275NgOnChangesFeature]\n });\n }\n }\n return BaseChartDirective;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/*\n * Public API Surface of ng2-charts\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BaseChartDirective, NG_CHARTS_CONFIGURATION, ThemeService, provideCharts, withDefaultRegisterables };\n", │ │ "export const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n", │ │ "import { inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { Log } from '../log';\n\nexport interface CustomTheme {\n id: string;\n name: string;\n url: string;\n requiredMode?: 'dark' | 'light' | 'system';\n}\n\nexport const AVAILABLE_CUSTOM_THEMES: CustomTheme[] = [\n {\n id: 'default',\n name: 'Default',\n url: '',\n requiredMode: 'system',\n },\n {\n id: 'arc',\n name: 'Arc',\n url: 'assets/themes/arc.css',\n requiredMode: 'dark',\n },\n {\n id: 'dark-base',\n name: 'Dark Base',\n url: 'assets/themes/dark-base.css',\n requiredMode: 'dark',\n },\n {\n id: 'dracula',\n name: 'Dracula',\n url: 'assets/themes/dracula.css',\n requiredMode: 'dark',\n },\n {\n id: 'everforest',\n name: 'Everforest',\n url: 'assets/themes/everforest.css',\n requiredMode: 'system',\n },\n {\n id: 'rainbow',\n name: 'Rainbow',\n url: 'assets/themes/rainbow.css',\n requiredMode: 'system',\n },\n {\n id: 'glass',\n name: 'Glass',\n url: 'assets/themes/glass.css',\n requiredMode: 'dark',\n },\n {\n id: 'nord-polar-night',\n name: 'Nord Polar Night',\n url: 'assets/themes/nord-polar-night.css',\n requiredMode: 'dark',\n },\n {\n id: 'nord-snow-storm',\n name: 'Nord Snow Storm',\n url: 'assets/themes/nord-snow-storm.css',\n requiredMode: 'light',\n },\n];\n\n@Injectable({ providedIn: 'root' })\nexport class CustomThemeService {\n private document = inject(DOCUMENT);\n private currentThemeLinkElement: HTMLLinkElement | null = null;\n\n loadTheme(themeId: string): void {\n const theme = AVAILABLE_CUSTOM_THEMES.find((t) => t.id === themeId);\n\n if (!theme) {\n Log.err(`Theme with id ${themeId} not found`);\n return;\n }\n\n // Remove existing theme\n this.unloadCurrentTheme();\n\n // If default theme, no need to load external CSS\n if (theme.id === 'default' || !theme.url) {\n return;\n }\n\n // Create new link element for theme\n const linkElement = this.document.createElement('link');\n linkElement.rel = 'stylesheet';\n linkElement.href = theme.url;\n linkElement.id = 'custom-theme-stylesheet';\n\n // Add to head\n this.document.head.appendChild(linkElement);\n this.currentThemeLinkElement = linkElement;\n }\n\n unloadCurrentTheme(): void {\n if (this.currentThemeLinkElement) {\n this.currentThemeLinkElement.remove();\n this.currentThemeLinkElement = null;\n }\n\n // Also remove any existing custom theme stylesheets\n const existingThemeLink = this.document.getElementById('custom-theme-stylesheet');\n if (existingThemeLink) {\n existingThemeLink.remove();\n }\n }\n\n getAvailableThemes(): CustomTheme[] {\n return AVAILABLE_CUSTOM_THEMES;\n }\n}\n", │ │ "import { effect, inject, Injectable, signal } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { BodyClass, IS_ELECTRON } from '../../app.constants';\nimport { IS_MAC } from '../../util/is-mac';\nimport { distinctUntilChanged, map, startWith, switchMap, take } from 'rxjs/operators';\nimport { IS_TOUCH_ONLY } from '../../util/is-touch-only';\nimport { MaterialCssVarsService } from 'angular-material-css-vars';\nimport { DOCUMENT } from '@angular/common';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ChromeExtensionInterfaceService } from '../chrome-extension-interface/chrome-extension-interface.service';\nimport { ThemeService as NgChartThemeService } from 'ng2-charts';\nimport { GlobalConfigService } from '../../features/config/global-config.service';\nimport { WorkContextThemeCfg } from '../../features/work-context/work-context.model';\nimport { WorkContextService } from '../../features/work-context/work-context.service';\nimport { combineLatest, fromEvent, Observable, of } from 'rxjs';\nimport { IS_FIREFOX } from '../../util/is-firefox';\nimport { ImexViewService } from '../../imex/imex-meta/imex-view.service';\nimport { IS_MOUSE_PRIMARY, IS_TOUCH_PRIMARY } from '../../util/is-mouse-primary';\nimport { ChartConfiguration } from 'chart.js';\nimport { IS_ANDROID_WEB_VIEW } from '../../util/is-android-web-view';\nimport { androidInterface } from '../../features/android/android-interface';\nimport { HttpClient } from '@angular/common/http';\nimport { LS } from '../persistence/storage-keys.const';\nimport { CustomThemeService } from './custom-theme.service';\nimport { Log } from '../log';\n\nexport type DarkModeCfg = 'dark' | 'light' | 'system';\n\n@Injectable({ providedIn: 'root' })\nexport class GlobalThemeService {\n private document = inject(DOCUMENT);\n private _materialCssVarsService = inject(MaterialCssVarsService);\n private _workContextService = inject(WorkContextService);\n private _globalConfigService = inject(GlobalConfigService);\n private _matIconRegistry = inject(MatIconRegistry);\n private _domSanitizer = inject(DomSanitizer);\n private _chartThemeService = inject(NgChartThemeService);\n private _chromeExtensionInterfaceService = inject(ChromeExtensionInterfaceService);\n private _imexMetaService = inject(ImexViewService);\n private _http = inject(HttpClient);\n private _customThemeService = inject(CustomThemeService);\n\n darkMode = signal(\n (localStorage.getItem(LS.DARK_MODE) as DarkModeCfg) || 'system',\n );\n\n private _isDarkThemeObs$: Observable = toObservable(this.darkMode).pipe(\n switchMap((darkMode) => {\n switch (darkMode) {\n case 'dark':\n return of(true);\n case 'light':\n return of(false);\n default:\n const darkModePreference = window.matchMedia('(prefers-color-scheme: dark)');\n return fromEvent(darkModePreference, 'change').pipe(\n map((e: any) => e.matches),\n startWith(darkModePreference.matches),\n );\n }\n }),\n distinctUntilChanged(),\n );\n\n isDarkTheme = toSignal(this._isDarkThemeObs$, { initialValue: false });\n\n private _backgroundImgObs$: Observable = combineLatest([\n this._workContextService.currentTheme$,\n this._isDarkThemeObs$,\n ]).pipe(\n map(([theme, isDarkMode]) =>\n isDarkMode ? theme.backgroundImageDark : theme.backgroundImageLight,\n ),\n distinctUntilChanged(),\n );\n\n backgroundImg = toSignal(this._backgroundImgObs$);\n\n init(): void {\n // This is here to make web page reloads on non-work-context pages at least usable\n this._setBackgroundGradient(true);\n this._initIcons();\n this._initHandlersForInitialBodyClasses();\n this._initThemeWatchers();\n\n // Set up dark mode persistence effect\n effect(\n () => {\n const darkMode = this.darkMode();\n localStorage.setItem(LS.DARK_MODE, darkMode);\n },\n { allowSignalWrites: false },\n );\n\n // Set up reactive custom theme updates\n this._setupCustomThemeEffect();\n }\n\n private _setDarkTheme(isDarkTheme: boolean): void {\n this._materialCssVarsService.setDarkTheme(isDarkTheme);\n this._setChartTheme(isDarkTheme);\n // this._materialCssVarsService.setDarkTheme(true);\n // this._materialCssVarsService.setDarkTheme(false);\n }\n\n private _setColorTheme(theme: WorkContextThemeCfg): void {\n this._materialCssVarsService.setAutoContrastEnabled(!!theme.isAutoContrast);\n this._setBackgroundGradient(!!theme.isDisableBackgroundGradient);\n\n // NOTE: setting undefined values does not seem to be a problem so we use !\n if (!theme.isAutoContrast) {\n this._materialCssVarsService.setContrastColorThresholdPrimary(theme.huePrimary!);\n this._materialCssVarsService.setContrastColorThresholdAccent(theme.hueAccent!);\n this._materialCssVarsService.setContrastColorThresholdWarn(theme.hueWarn!);\n }\n\n this._materialCssVarsService.setPrimaryColor(theme.primary!);\n this._materialCssVarsService.setAccentColor(theme.accent!);\n this._materialCssVarsService.setWarnColor(theme.warn!);\n }\n\n private _setBackgroundGradient(isDisableBackgroundGradient: boolean): void {\n if (isDisableBackgroundGradient) {\n this.document.body.classList.add(BodyClass.isDisableBackgroundGradient);\n this.document.body.classList.remove(BodyClass.isEnabledBackgroundGradient);\n } else {\n this.document.body.classList.add(BodyClass.isEnabledBackgroundGradient);\n this.document.body.classList.remove(BodyClass.isDisableBackgroundGradient);\n }\n }\n\n private _initIcons(): void {\n const icons: [string, string][] = [\n ['sp', 'assets/icons/sp.svg'],\n ['play', 'assets/icons/play.svg'],\n ['github', 'assets/icons/github.svg'],\n ['gitlab', 'assets/icons/gitlab.svg'],\n ['jira', 'assets/icons/jira.svg'],\n ['caldav', 'assets/icons/caldav.svg'],\n ['open_project', 'assets/icons/open-project.svg'],\n ['drag_handle', 'assets/icons/drag-handle.svg'],\n ['remove_today', 'assets/icons/remove-today-48px.svg'],\n ['estimate_remaining', 'assets/icons/estimate-remaining.svg'],\n ['working_today', 'assets/icons/working-today.svg'],\n ['repeat', 'assets/icons/repeat.svg'],\n ['gitea', 'assets/icons/gitea.svg'],\n ['redmine', 'assets/icons/redmine.svg'],\n ['calendar', 'assets/icons/calendar.svg'],\n ['early_on', 'assets/icons/early-on.svg'],\n ['tomorrow', 'assets/icons/tomorrow.svg'],\n ['next_week', 'assets/icons/next-week.svg'],\n ['keep', 'assets/icons/keep.svg'],\n ['keep_filled', 'assets/icons/keep-filled.svg'],\n ];\n\n // todo test if can be removed with airplane mode and wifi without internet\n icons.forEach(([name, path]) => {\n this._matIconRegistry.addSvgIcon(\n name,\n this._domSanitizer.bypassSecurityTrustResourceUrl(path),\n );\n });\n\n this.preloadIcons(icons);\n }\n\n preloadIcons(icons: [string, string][]): Promise {\n // Map each icon name to a promise that fetches and registers the icon.\n const iconPromises = icons.map(([iconName, url]) => {\n // Construct the URL for the SVG file.\n // Adjust the path if your SVGs are located elsewhere.\n return this._http\n .get(url, { responseType: 'text' })\n .toPromise()\n .then((svg) => {\n // Register the fetched SVG as an inline icon.\n this._matIconRegistry.addSvgIconLiteral(\n iconName,\n this._domSanitizer.bypassSecurityTrustHtml(svg),\n );\n })\n .catch((error) => {\n Log.err(`Error loading icon: ${iconName} from ${url}`, error);\n });\n });\n\n // Return a promise that resolves when all icons have been processed.\n return Promise.all(iconPromises);\n }\n\n private _initThemeWatchers(): void {\n // init theme watchers\n this._workContextService.currentTheme$.subscribe((theme: WorkContextThemeCfg) =>\n this._setColorTheme(theme),\n );\n this._isDarkThemeObs$.subscribe((isDarkTheme) => this._setDarkTheme(isDarkTheme));\n }\n\n private _initHandlersForInitialBodyClasses(): void {\n this.document.body.classList.add(BodyClass.isNoAdvancedFeatures);\n\n if (!IS_FIREFOX) {\n this.document.body.classList.add(BodyClass.isNoFirefox);\n }\n\n if (IS_MAC) {\n this.document.body.classList.add(BodyClass.isMac);\n } else {\n this.document.body.classList.add(BodyClass.isNoMac);\n }\n\n if (IS_ELECTRON) {\n this.document.body.classList.add(BodyClass.isElectron);\n this.document.body.classList.add(BodyClass.isAdvancedFeatures);\n this.document.body.classList.remove(BodyClass.isNoAdvancedFeatures);\n } else {\n this.document.body.classList.add(BodyClass.isWeb);\n this._chromeExtensionInterfaceService.onReady$.pipe(take(1)).subscribe(() => {\n this.document.body.classList.add(BodyClass.isExtension);\n this.document.body.classList.add(BodyClass.isAdvancedFeatures);\n this.document.body.classList.remove(BodyClass.isNoAdvancedFeatures);\n });\n }\n\n if (IS_ANDROID_WEB_VIEW) {\n androidInterface.isKeyboardShown$.subscribe((isShown) => {\n Log.log('isShown', isShown);\n\n this.document.body.classList.remove(BodyClass.isAndroidKeyboardHidden);\n this.document.body.classList.remove(BodyClass.isAndroidKeyboardShown);\n this.document.body.classList.add(\n isShown ? BodyClass.isAndroidKeyboardShown : BodyClass.isAndroidKeyboardHidden,\n );\n });\n }\n\n // Use effect to reactively update animation class\n effect(() => {\n const misc = this._globalConfigService.misc();\n if (misc?.isDisableAnimations) {\n this.document.body.classList.add(BodyClass.isDisableAnimations);\n } else {\n this.document.body.classList.remove(BodyClass.isDisableAnimations);\n }\n });\n\n this._imexMetaService.isDataImportInProgress$.subscribe((isInProgress) => {\n // timer(1000, 5000)\n // .pipe(map((val) => val % 2 === 0))\n // .subscribe((isInProgress) => {\n if (isInProgress) {\n this.document.body.classList.add(BodyClass.isDataImportInProgress);\n } else {\n this.document.body.classList.remove(BodyClass.isDataImportInProgress);\n }\n });\n\n if (IS_TOUCH_ONLY) {\n this.document.body.classList.add(BodyClass.isTouchOnly);\n } else {\n this.document.body.classList.add(BodyClass.isNoTouchOnly);\n }\n\n if (IS_MOUSE_PRIMARY) {\n this.document.body.classList.add(BodyClass.isMousePrimary);\n } else if (IS_TOUCH_PRIMARY) {\n this.document.body.classList.add(BodyClass.isTouchPrimary);\n }\n }\n\n private _setChartTheme(isDarkTheme: boolean): void {\n const overrides: ChartConfiguration['options'] = isDarkTheme\n ? {\n // legend: {\n // labels: { fontColor: 'white' },\n // },\n scales: {\n x: {\n ticks: {\n color: 'white',\n },\n grid: {\n color: 'rgba(255,255,255,0.1)',\n },\n },\n\n y: {\n ticks: {\n color: 'white',\n },\n grid: {\n color: 'rgba(255,255,255,0.1)',\n },\n },\n },\n }\n : {\n scales: {},\n };\n this._chartThemeService.setColorschemesOptions(overrides);\n }\n\n private _setupCustomThemeEffect(): void {\n // Track previous theme to avoid unnecessary reloads\n let previousThemeId: string | null = null;\n\n // Set up effect to reactively update custom theme when config changes\n effect(() => {\n const misc = this._globalConfigService.misc();\n const themeId = misc?.customTheme || 'default';\n\n // Only load theme if it has changed\n if (themeId !== previousThemeId) {\n this._customThemeService.loadTheme(themeId);\n previousThemeId = themeId;\n }\n });\n }\n}\n", │ --- assets/public/chunk-OITMHVU6.js ├── +++ assets/public/chunk-5TDSJN67.js │┄ Files 13% similar despite different names │ ├── js-beautify {} │ │ @@ -1,15 +1,15 @@ │ │ import { │ │ a, │ │ b │ │ -} from "./chunk-QIY3ATD7.js"; │ │ -import "./chunk-7JUHICSP.js"; │ │ +} from "./chunk-FZ6Z4X5W.js"; │ │ +import "./chunk-H5C5NXL7.js"; │ │ import "./chunk-TU5ZIYGM.js"; │ │ -import "./chunk-GWKOR6NW.js"; │ │ -import "./chunk-CW5T6SPQ.js"; │ │ +import "./chunk-OTRGDQRH.js"; │ │ +import "./chunk-2XB3YG6S.js"; │ │ import "./chunk-SEPU4IXF.js"; │ │ import "./chunk-B55LM2KC.js"; │ │ import "./chunk-VXMKIRI2.js"; │ │ import "./chunk-OWECU7R2.js"; │ │ import "./chunk-3VFKDWJ2.js"; │ │ import "./chunk-JPHHIOXD.js"; │ │ import "./chunk-JDOMNCB7.js"; │ │ @@ -34,8 +34,8 @@ │ │ import "./chunk-OXDOKNTF.js"; │ │ import "./chunk-PEJGMLLQ.js"; │ │ import "./chunk-2NYJ54WT.js"; │ │ b(); │ │ export { │ │ a as PluginIndexComponent │ │ }; │ │ -//# sourceMappingURL=chunk-OITMHVU6.js.map │ │ +//# sourceMappingURL=chunk-5TDSJN67.js.map │ --- assets/public/chunk-WBRMXYTW.js ├── +++ assets/public/chunk-OPG5DMMF.js │┄ Files 0% similar despite different names │ ├── js-beautify {} │ │ @@ -11,28 +11,28 @@ │ │ b as rn, │ │ c as Se, │ │ d as Vt, │ │ e as Ht, │ │ f as bn, │ │ g as ai, │ │ h as Dn │ │ -} from "./chunk-CDTG5YKL.js"; │ │ +} from "./chunk-6KMYC34R.js"; │ │ import { │ │ a as X, │ │ b as st │ │ } from "./chunk-3UB54IM4.js"; │ │ import { │ │ a as qt, │ │ b as Nn, │ │ c as zt, │ │ d as Pn, │ │ e as Rn, │ │ f as jt, │ │ g as kn │ │ -} from "./chunk-7JUHICSP.js"; │ │ +} from "./chunk-H5C5NXL7.js"; │ │ import { │ │ a as Qt, │ │ b as ei, │ │ c as ti, │ │ d as ii, │ │ e as ni, │ │ f as oi, │ │ @@ -50,15 +50,15 @@ │ │ import { │ │ e as Wt, │ │ f as yn, │ │ g as Xt, │ │ h as Fn, │ │ k as $t, │ │ l as Mn │ │ -} from "./chunk-GWKOR6NW.js"; │ │ +} from "./chunk-OTRGDQRH.js"; │ │ import { │ │ A as Bt, │ │ B as Kt, │ │ C as In, │ │ H as wt, │ │ I as hn, │ │ L as Yt, │ │ @@ -68,15 +68,15 @@ │ │ o as Pt, │ │ p as On, │ │ s as kt, │ │ t as xt, │ │ v as Sn, │ │ y as Lt, │ │ z as Ut │ │ -} from "./chunk-CW5T6SPQ.js"; │ │ +} from "./chunk-2XB3YG6S.js"; │ │ import "./chunk-SEPU4IXF.js"; │ │ import "./chunk-B55LM2KC.js"; │ │ import { │ │ U as vt, │ │ X as Gt, │ │ aa as Tn │ │ } from "./chunk-VXMKIRI2.js"; │ │ @@ -2571,8 +2571,8 @@ │ │ return i │ │ })() │ │ }); │ │ go(); │ │ export { │ │ Pl as ConfigPageComponent │ │ }; │ │ -//# sourceMappingURL=chunk-WBRMXYTW.js.map │ │ +//# sourceMappingURL=chunk-OPG5DMMF.js.map │ --- assets/public/chunk-GWKOR6NW.js.map ├── +++ assets/public/chunk-OTRGDQRH.js.map │┄ Files identical despite different names │ --- assets/public/chunk-CW5T6SPQ.js ├── +++ assets/public/chunk-2XB3YG6S.js │┄ Files 0% similar despite different names │ ├── js-beautify {} │ │ @@ -8185,8 +8185,8 @@ │ │ } │ │ return r │ │ })() │ │ }); │ │ export { │ │ de as a, Ma as b, It as c, Li as d, ho as e, Fl as f, ct as g, Ea as h, Wr as i, Fa as j, Vd as k, Cs as l, Ud as m, ws as n, Ts as o, Is as p, $s as q, Ys as r, Js as s, co as t, el as u, mo as v, Ep as w, Ga as x, gl as y, bl as z, yl as A, vl as B, kl as C, xl as D, wl as E, Il as F, Ml as G, Sr as H, uo as I, Bl as J, Ul as K, ql as L, jl as M │ │ }; │ │ -//# sourceMappingURL=chunk-CW5T6SPQ.js.map │ │ +//# sourceMappingURL=chunk-2XB3YG6S.js.map │ --- assets/public/chunk-CDTG5YKL.js.map ├── +++ assets/public/chunk-6KMYC34R.js.map │┄ Files identical despite different names │ --- assets/public/chunk-CDTG5YKL.js ├── +++ assets/public/chunk-6KMYC34R.js │┄ Files 3% similar despite different names │ ├── js-beautify {} │ │ @@ -1,15 +1,15 @@ │ │ import { │ │ f as V, │ │ g as X │ │ -} from "./chunk-7JUHICSP.js"; │ │ +} from "./chunk-H5C5NXL7.js"; │ │ import { │ │ a as L, │ │ b as $ │ │ -} from "./chunk-CW5T6SPQ.js"; │ │ +} from "./chunk-2XB3YG6S.js"; │ │ import { │ │ b as F, │ │ d as W │ │ } from "./chunk-4RZOEXF7.js"; │ │ import { │ │ Ab as C, │ │ Cb as _, │ │ @@ -158,8 +158,8 @@ │ │ let t = new SpeechSynthesisUtterance; │ │ t.text = e, t.voice = l.getVoices().find(i => n.includes(i.name)) || l.getVoices().find(i => i.default) || null, console.log(o), t.volume = o / 100, l.speak(t) │ │ } │ │ }); │ │ export { │ │ oe as a, J as b, re as c, K as d, Ie as e, ee as f, ve as g, Z as h │ │ }; │ │ -//# sourceMappingURL=chunk-CDTG5YKL.js.map │ │ +//# sourceMappingURL=chunk-6KMYC34R.js.map │ --- assets/public/chunk-QIY3ATD7.js.map ├── +++ assets/public/chunk-FZ6Z4X5W.js.map │┄ Files identical despite different names │ --- assets/public/main-M2FPRGPY.js ├── +++ assets/public/main-VSFTNGRN.js │┄ Files 0% similar despite different names │ ├── js-beautify {} │ │ @@ -50,15 +50,15 @@ │ │ import { │ │ b as eS, │ │ c as LM │ │ } from "./chunk-7MCI5DGR.js"; │ │ import { │ │ a as tS, │ │ b as BM │ │ -} from "./chunk-QIY3ATD7.js"; │ │ +} from "./chunk-FZ6Z4X5W.js"; │ │ import { │ │ a as iS, │ │ b as $M, │ │ c as nS, │ │ d as jM │ │ } from "./chunk-TJBNMRDA.js"; │ │ import { │ │ @@ -66,23 +66,23 @@ │ │ b as cw, │ │ c as nC, │ │ d as cM, │ │ e as aC, │ │ f as pM, │ │ g as bs, │ │ h as Lm │ │ -} from "./chunk-CDTG5YKL.js"; │ │ +} from "./chunk-6KMYC34R.js"; │ │ import { │ │ a as Ll, │ │ b as z0 │ │ } from "./chunk-3UB54IM4.js"; │ │ import { │ │ f as Rr, │ │ g as Sd │ │ -} from "./chunk-7JUHICSP.js"; │ │ +} from "./chunk-H5C5NXL7.js"; │ │ import { │ │ a as rC, │ │ b as dM │ │ } from "./chunk-2MOZFEFW.js"; │ │ import { │ │ a as yd, │ │ b as $C, │ │ @@ -293,15 +293,15 @@ │ │ h as Ao │ │ } from "./chunk-W3EHXDVY.js"; │ │ import { │ │ a as Tn, │ │ b as gM, │ │ k as Do, │ │ l as Ec │ │ -} from "./chunk-GWKOR6NW.js"; │ │ +} from "./chunk-OTRGDQRH.js"; │ │ import { │ │ B as Fm, │ │ C as nM, │ │ D as Zv, │ │ E as oM, │ │ F as eC, │ │ G as rM, │ │ @@ -321,15 +321,15 @@ │ │ r as Dm, │ │ s as Cd, │ │ t as Qv, │ │ u as Xv, │ │ v as Am, │ │ w as Rm, │ │ x as iM │ │ -} from "./chunk-CW5T6SPQ.js"; │ │ +} from "./chunk-2XB3YG6S.js"; │ │ import { │ │ a as So, │ │ b as hc, │ │ c as Ar, │ │ d as cd │ │ } from "./chunk-SEPU4IXF.js"; │ │ import { │ │ @@ -13023,15 +13023,15 @@ │ │ var X1, Z1 = D(() => { │ │ "use strict"; │ │ J1(); │ │ po(); │ │ Q1(); │ │ X1 = [{ │ │ path: "config", │ │ - loadComponent: () => import("./chunk-WBRMXYTW.js").then(i => i.ConfigPageComponent), │ │ + loadComponent: () => import("./chunk-OPG5DMMF.js").then(i => i.ConfigPageComponent), │ │ data: { │ │ page: "config" │ │ }, │ │ canActivate: [Pt] │ │ }, { │ │ path: "search", │ │ loadComponent: () => import("./chunk-JKZKHAFX.js").then(i => i.SearchPageComponent), │ │ @@ -13093,22 +13093,22 @@ │ │ loadComponent: () => import("./chunk-RBIRYWTS.js").then(i => i.QuickHistoryComponent), │ │ data: { │ │ page: "quick-history" │ │ }, │ │ canActivate: [Ur, Pt] │ │ }, { │ │ path: "tag/:id/daily-summary", │ │ - loadComponent: () => import("./chunk-MRWZZVPU.js").then(i => i.DailySummaryComponent), │ │ + loadComponent: () => import("./chunk-X5SIPZ47.js").then(i => i.DailySummaryComponent), │ │ data: { │ │ page: "daily-summary" │ │ }, │ │ canActivate: [Ur, Pt] │ │ }, { │ │ path: "tag/:id/daily-summary/:dayStr", │ │ - loadComponent: () => import("./chunk-MRWZZVPU.js").then(i => i.DailySummaryComponent), │ │ + loadComponent: () => import("./chunk-X5SIPZ47.js").then(i => i.DailySummaryComponent), │ │ data: { │ │ page: "daily-summary" │ │ }, │ │ canActivate: [Ur, Pt] │ │ }, { │ │ path: "tag/:id/metrics", │ │ loadComponent: () => import("./chunk-G6HECC4Q.js").then(i => i.MetricPageComponent), │ │ @@ -13149,41 +13149,41 @@ │ │ loadComponent: () => import("./chunk-G6HECC4Q.js").then(i => i.MetricPageComponent), │ │ data: { │ │ page: "metrics" │ │ }, │ │ canActivate: [Wr, Pt] │ │ }, { │ │ path: "project/:id/daily-summary", │ │ - loadComponent: () => import("./chunk-MRWZZVPU.js").then(i => i.DailySummaryComponent), │ │ + loadComponent: () => import("./chunk-X5SIPZ47.js").then(i => i.DailySummaryComponent), │ │ data: { │ │ page: "daily-summary" │ │ }, │ │ canActivate: [Wr, Pt] │ │ }, { │ │ path: "project/:id/daily-summary/:dayStr", │ │ - loadComponent: () => import("./chunk-MRWZZVPU.js").then(i => i.DailySummaryComponent), │ │ + loadComponent: () => import("./chunk-X5SIPZ47.js").then(i => i.DailySummaryComponent), │ │ data: { │ │ page: "daily-summary" │ │ }, │ │ canActivate: [Wr, Pt] │ │ }, { │ │ path: "active/:subPageType", │ │ canActivate: [pp, Pt], │ │ - loadComponent: () => import("./chunk-WBRMXYTW.js").then(i => i.ConfigPageComponent) │ │ + loadComponent: () => import("./chunk-OPG5DMMF.js").then(i => i.ConfigPageComponent) │ │ }, { │ │ path: "active/:subPageType/:param", │ │ canActivate: [pp, Pt], │ │ - loadComponent: () => import("./chunk-WBRMXYTW.js").then(i => i.ConfigPageComponent) │ │ + loadComponent: () => import("./chunk-OPG5DMMF.js").then(i => i.ConfigPageComponent) │ │ }, { │ │ path: "active", │ │ canActivate: [pp, Pt], │ │ - loadComponent: () => import("./chunk-WBRMXYTW.js").then(i => i.ConfigPageComponent) │ │ + loadComponent: () => import("./chunk-OPG5DMMF.js").then(i => i.ConfigPageComponent) │ │ }, { │ │ path: "plugins/:pluginId/index", │ │ - loadComponent: () => import("./chunk-OITMHVU6.js").then(i => i.PluginIndexComponent), │ │ + loadComponent: () => import("./chunk-5TDSJN67.js").then(i => i.PluginIndexComponent), │ │ data: { │ │ page: "plugin-index" │ │ }, │ │ canActivate: [Pt] │ │ }, { │ │ path: "**", │ │ redirectTo: `tag/${at.id}/tasks` │ │ @@ -23188,8 +23188,8 @@ │ │ ee.log("Time window for completing sync started"), yield Nh(2e4), ee.log("Time window for completing sync ended. Closing app!"), Vf.finish({ │ │ taskId: e │ │ }) │ │ })) │ │ }))) │ │ }); │ │ export default qN(); │ │ -//# sourceMappingURL=main-M2FPRGPY.js.map │ │ +//# sourceMappingURL=main-VSFTNGRN.js.map │ --- assets/public/chunk-MRWZZVPU.js.map ├── +++ assets/public/chunk-X5SIPZ47.js.map │┄ Files identical despite different names │ --- assets/public/main-M2FPRGPY.js.map ├── +++ assets/public/main-VSFTNGRN.js.map │┄ Files identical despite different names │ --- assets/public/chunk-7JUHICSP.js.map ├── +++ assets/public/chunk-H5C5NXL7.js.map │┄ Files identical despite different names