@matter-server/dashboard 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/esm/components/dialogs/acl/acl-actions.d.ts +12 -0
  2. package/dist/esm/components/dialogs/acl/acl-actions.d.ts.map +1 -0
  3. package/dist/esm/components/dialogs/acl/acl-actions.js +56 -0
  4. package/dist/esm/components/dialogs/acl/acl-actions.js.map +6 -0
  5. package/dist/esm/components/dialogs/acl/model.d.ts +2 -2
  6. package/dist/esm/components/dialogs/acl/model.d.ts.map +1 -1
  7. package/dist/esm/components/dialogs/acl/model.js +11 -15
  8. package/dist/esm/components/dialogs/acl/model.js.map +1 -1
  9. package/dist/esm/components/dialogs/acl/node-acl-add-dialog.d.ts +43 -0
  10. package/dist/esm/components/dialogs/acl/node-acl-add-dialog.d.ts.map +1 -0
  11. package/dist/esm/components/dialogs/acl/node-acl-add-dialog.js +353 -0
  12. package/dist/esm/components/dialogs/acl/node-acl-add-dialog.js.map +6 -0
  13. package/dist/esm/components/dialogs/acl/show-node-acl-add-dialog.d.ts +8 -0
  14. package/dist/esm/components/dialogs/acl/show-node-acl-add-dialog.d.ts.map +1 -0
  15. package/dist/esm/components/dialogs/acl/show-node-acl-add-dialog.js +15 -0
  16. package/dist/esm/components/dialogs/acl/show-node-acl-add-dialog.js.map +6 -0
  17. package/dist/esm/components/dialogs/binding/binding-actions.d.ts +17 -0
  18. package/dist/esm/components/dialogs/binding/binding-actions.d.ts.map +1 -0
  19. package/dist/esm/components/dialogs/binding/binding-actions.js +135 -0
  20. package/dist/esm/components/dialogs/binding/binding-actions.js.map +6 -0
  21. package/dist/esm/components/dialogs/binding/model.d.ts +1 -1
  22. package/dist/esm/components/dialogs/binding/model.d.ts.map +1 -1
  23. package/dist/esm/components/dialogs/binding/model.js +8 -3
  24. package/dist/esm/components/dialogs/binding/model.js.map +1 -1
  25. package/dist/esm/components/dialogs/binding/node-binding-dialog.d.ts +16 -24
  26. package/dist/esm/components/dialogs/binding/node-binding-dialog.d.ts.map +1 -1
  27. package/dist/esm/components/dialogs/binding/node-binding-dialog.js +210 -332
  28. package/dist/esm/components/dialogs/binding/node-binding-dialog.js.map +1 -1
  29. package/dist/esm/pages/cluster-commands/clusters/access-control-commands.d.ts +37 -0
  30. package/dist/esm/pages/cluster-commands/clusters/access-control-commands.d.ts.map +1 -0
  31. package/dist/esm/pages/cluster-commands/clusters/access-control-commands.js +387 -0
  32. package/dist/esm/pages/cluster-commands/clusters/access-control-commands.js.map +6 -0
  33. package/dist/esm/pages/cluster-commands/clusters/binding-commands.d.ts +35 -0
  34. package/dist/esm/pages/cluster-commands/clusters/binding-commands.d.ts.map +1 -0
  35. package/dist/esm/pages/cluster-commands/clusters/binding-commands.js +254 -0
  36. package/dist/esm/pages/cluster-commands/clusters/binding-commands.js.map +6 -0
  37. package/dist/esm/pages/cluster-commands/index.d.ts +2 -0
  38. package/dist/esm/pages/cluster-commands/index.d.ts.map +1 -1
  39. package/dist/esm/pages/cluster-commands/index.js +2 -0
  40. package/dist/esm/pages/cluster-commands/index.js.map +1 -1
  41. package/dist/esm/pages/components/node-details.d.ts +0 -1
  42. package/dist/esm/pages/components/node-details.d.ts.map +1 -1
  43. package/dist/esm/pages/components/node-details.js +2 -18
  44. package/dist/esm/pages/components/node-details.js.map +1 -1
  45. package/dist/esm/pages/components/server-details.js +3 -3
  46. package/dist/esm/pages/components/server-details.js.map +1 -1
  47. package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
  48. package/dist/esm/pages/matter-cluster-view.js +2 -1
  49. package/dist/esm/pages/matter-cluster-view.js.map +1 -1
  50. package/dist/esm/pages/matter-endpoint-view.d.ts +3 -3
  51. package/dist/esm/pages/matter-endpoint-view.d.ts.map +1 -1
  52. package/dist/esm/pages/matter-endpoint-view.js +13 -10
  53. package/dist/esm/pages/matter-endpoint-view.js.map +1 -1
  54. package/dist/esm/pages/matter-node-view.js +2 -2
  55. package/dist/esm/pages/matter-node-view.js.map +1 -1
  56. package/dist/esm/pages/network/network-utils.d.ts +1 -5
  57. package/dist/esm/pages/network/network-utils.d.ts.map +1 -1
  58. package/dist/esm/pages/network/network-utils.js +1 -11
  59. package/dist/esm/pages/network/network-utils.js.map +1 -1
  60. package/dist/esm/util/access-control.d.ts +54 -0
  61. package/dist/esm/util/access-control.d.ts.map +1 -0
  62. package/dist/esm/util/access-control.js +100 -0
  63. package/dist/esm/util/access-control.js.map +6 -0
  64. package/dist/esm/util/binding.d.ts +54 -0
  65. package/dist/esm/util/binding.d.ts.map +1 -0
  66. package/dist/esm/util/binding.js +113 -0
  67. package/dist/esm/util/binding.js.map +6 -0
  68. package/dist/esm/util/endpoints.d.ts +9 -0
  69. package/dist/esm/util/endpoints.d.ts.map +1 -0
  70. package/dist/esm/util/endpoints.js +18 -0
  71. package/dist/esm/util/endpoints.js.map +6 -0
  72. package/dist/esm/util/node-name.d.ts +12 -0
  73. package/dist/esm/util/node-name.d.ts.map +1 -0
  74. package/dist/esm/util/node-name.js +15 -0
  75. package/dist/esm/util/node-name.js.map +6 -0
  76. package/dist/web/js/{attribute-write-dialog-W7xpCE2E.js → attribute-write-dialog-CqqdRniU.js} +1 -1
  77. package/dist/web/js/{command-invoke-dialog-BAqAAdJw.js → command-invoke-dialog-BuvBOrdC.js} +1 -1
  78. package/dist/web/js/{commission-node-dialog-BTzCGgdy.js → commission-node-dialog-nVZp3go0.js} +5 -5
  79. package/dist/web/js/{commission-node-existing-B2M2hyDh.js → commission-node-existing-Cx3Ahk2t.js} +2 -2
  80. package/dist/web/js/{commission-node-thread-djdz2dXW.js → commission-node-thread-CI8mWWPs.js} +2 -2
  81. package/dist/web/js/{commission-node-wifi-DxAYNS1A.js → commission-node-wifi-lUX4LK2R.js} +2 -2
  82. package/dist/web/js/{dialog-box-tHvPVxDN.js → dialog-box-bAdbnf-T.js} +1 -1
  83. package/dist/web/js/{fire_event-BleYfTLc.js → fire_event-tWhqPfdz.js} +1 -1
  84. package/dist/web/js/main.js +1 -1
  85. package/dist/web/js/{matter-dashboard-app-CVi_GDky.js → matter-dashboard-app-CONA_608.js} +1485 -390
  86. package/dist/web/js/node-acl-add-dialog-DlR-sF-b.js +320 -0
  87. package/dist/web/js/node-binding-dialog-DhnX_86M.js +267 -0
  88. package/dist/web/js/{node-label-dialog-DVZSjsXU.js → node-label-dialog-T3nPG-Qy.js} +1 -1
  89. package/dist/web/js/{settings-dialog-BG5MgZcO.js → settings-dialog-DrHzJtsi.js} +1 -1
  90. package/package.json +4 -4
  91. package/src/components/dialogs/acl/acl-actions.ts +71 -0
  92. package/src/components/dialogs/acl/model.ts +18 -17
  93. package/src/components/dialogs/acl/node-acl-add-dialog.ts +350 -0
  94. package/src/components/dialogs/acl/show-node-acl-add-dialog.ts +14 -0
  95. package/src/components/dialogs/binding/binding-actions.ts +201 -0
  96. package/src/components/dialogs/binding/model.ts +11 -4
  97. package/src/components/dialogs/binding/node-binding-dialog.ts +221 -399
  98. package/src/pages/cluster-commands/clusters/access-control-commands.ts +407 -0
  99. package/src/pages/cluster-commands/clusters/binding-commands.ts +273 -0
  100. package/src/pages/cluster-commands/index.ts +2 -0
  101. package/src/pages/components/node-details.ts +2 -21
  102. package/src/pages/components/server-details.ts +3 -3
  103. package/src/pages/matter-cluster-view.ts +4 -1
  104. package/src/pages/matter-endpoint-view.ts +16 -10
  105. package/src/pages/matter-node-view.ts +2 -2
  106. package/src/pages/network/network-utils.ts +1 -18
  107. package/src/util/access-control.ts +135 -0
  108. package/src/util/binding.ts +182 -0
  109. package/src/util/endpoints.ts +17 -0
  110. package/src/util/node-name.ts +18 -0
  111. package/dist/web/js/node-binding-dialog-B9IdqHrZ.js +0 -624
@@ -234,7 +234,7 @@ function c$5({
234
234
  }
235
235
 
236
236
  // Material Design Icons v7.4.47
237
- var mdiAccessPoint="M4.93,4.93C3.12,6.74 2,9.24 2,12C2,14.76 3.12,17.26 4.93,19.07L6.34,17.66C4.89,16.22 4,14.22 4,12C4,9.79 4.89,7.78 6.34,6.34L4.93,4.93M19.07,4.93L17.66,6.34C19.11,7.78 20,9.79 20,12C20,14.22 19.11,16.22 17.66,17.66L19.07,19.07C20.88,17.26 22,14.76 22,12C22,9.24 20.88,6.74 19.07,4.93M7.76,7.76C6.67,8.85 6,10.35 6,12C6,13.65 6.67,15.15 7.76,16.24L9.17,14.83C8.45,14.11 8,13.11 8,12C8,10.89 8.45,9.89 9.17,9.17L7.76,7.76M16.24,7.76L14.83,9.17C15.55,9.89 16,10.89 16,12C16,13.11 15.55,14.11 14.83,14.83L16.24,16.24C17.33,15.15 18,13.65 18,12C18,10.35 17.33,8.85 16.24,7.76M12,10A2,2 0 0,0 10,12A2,2 0 0,0 12,14A2,2 0 0,0 14,12A2,2 0 0,0 12,10Z";var mdiAirConditioner="M6.59,0.66C8.93,-1.15 11.47,1.06 12.04,4.5C12.47,4.5 12.89,4.62 13.27,4.84C13.79,4.24 14.25,3.42 14.07,2.5C13.65,0.35 16.06,-1.39 18.35,1.58C20.16,3.92 17.95,6.46 14.5,7.03C14.5,7.46 14.39,7.89 14.16,8.27C14.76,8.78 15.58,9.24 16.5,9.06C18.63,8.64 20.38,11.04 17.41,13.34C15.07,15.15 12.53,12.94 11.96,9.5C11.53,9.5 11.11,9.37 10.74,9.15C10.22,9.75 9.75,10.58 9.93,11.5C10.35,13.64 7.94,15.39 5.65,12.42C3.83,10.07 6.05,7.53 9.5,6.97C9.5,6.54 9.63,6.12 9.85,5.74C9.25,5.23 8.43,4.76 7.5,4.94C5.37,5.36 3.62,2.96 6.59,0.66M5,16H7A2,2 0 0,1 9,18V24H7V22H5V24H3V18A2,2 0 0,1 5,16M5,18V20H7V18H5M12.93,16H15L12.07,24H10L12.93,16M18,16H21V18H18V22H21V24H18A2,2 0 0,1 16,22V18A2,2 0 0,1 18,16Z";var mdiAirFilter="M19,18.31V20A2,2 0 0,1 17,22H7A2,2 0 0,1 5,20V16.3C4.54,16.12 3.95,16 3,16A1,1 0 0,1 2,15A1,1 0 0,1 3,14C3.82,14 4.47,14.08 5,14.21V12.3C4.54,12.12 3.95,12 3,12A1,1 0 0,1 2,11A1,1 0 0,1 3,10C3.82,10 4.47,10.08 5,10.21V8.3C4.54,8.12 3.95,8 3,8A1,1 0 0,1 2,7A1,1 0 0,1 3,6C3.82,6 4.47,6.08 5,6.21V4A2,2 0 0,1 7,2H17A2,2 0 0,1 19,4V6.16C20.78,6.47 21.54,7.13 21.71,7.29C22.1,7.68 22.1,8.32 21.71,8.71C21.32,9.1 20.8,9.09 20.29,8.71V8.71C20.29,8.71 19.25,8 17,8C15.74,8 14.91,8.41 13.95,8.9C12.91,9.41 11.74,10 10,10C9.64,10 9.31,10 9,9.96V7.95C9.3,8 9.63,8 10,8C11.26,8 12.09,7.59 13.05,7.11C14.09,6.59 15.27,6 17,6V4H7V20H17V18C18.5,18 18.97,18.29 19,18.31M17,10C15.27,10 14.09,10.59 13.05,11.11C12.09,11.59 11.26,12 10,12C9.63,12 9.3,12 9,11.95V13.96C9.31,14 9.64,14 10,14C11.74,14 12.91,13.41 13.95,12.9C14.91,12.42 15.74,12 17,12C19.25,12 20.29,12.71 20.29,12.71V12.71C20.8,13.1 21.32,13.1 21.71,12.71C22.1,12.32 22.1,11.69 21.71,11.29C21.5,11.08 20.25,10 17,10M17,14C15.27,14 14.09,14.59 13.05,15.11C12.09,15.59 11.26,16 10,16C9.63,16 9.3,16 9,15.95V17.96C9.31,18 9.64,18 10,18C11.74,18 12.91,17.41 13.95,16.9C14.91,16.42 15.74,16 17,16C19.25,16 20.29,16.71 20.29,16.71V16.71C20.8,17.1 21.32,17.1 21.71,16.71C22.1,16.32 22.1,15.69 21.71,15.29C21.5,15.08 20.25,14 17,14Z";var mdiAirPurifier="M11,9A4,4 0 0,1 15,13A4,4 0 0,1 11,17A4,4 0 0,1 7,13A4,4 0 0,1 11,9M11,11A2,2 0 0,0 9,13A2,2 0 0,0 11,15A2,2 0 0,0 13,13A2,2 0 0,0 11,11M7,4H14A4,4 0 0,1 18,8V9H16V8A2,2 0 0,0 14,6H7A2,2 0 0,0 5,8V20H16V18H18V22H3V8A4,4 0 0,1 7,4M16,11C18.5,11 18.5,9 21,9V11C18.5,11 18.5,13 16,13V11M16,15C18.5,15 18.5,13 21,13V15C18.5,15 18.5,17 16,17V15Z";var mdiAlertCircleOutline="M11,15H13V17H11V15M11,7H13V13H11V7M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20Z";var mdiArrowDown="M11,4H13V16L18.5,10.5L19.92,11.92L12,19.84L4.08,11.92L5.5,10.5L11,16V4Z";var mdiArrowLeft="M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z";var mdiArrowRight="M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z";var mdiArrowUp="M13,20H11V8L5.5,13.5L4.08,12.08L12,4.16L19.92,12.08L18.5,13.5L13,8V20Z";var mdiBell="M21,19V20H3V19L5,17V11C5,7.9 7.03,5.17 10,4.29C10,4.19 10,4.1 10,4A2,2 0 0,1 12,2A2,2 0 0,1 14,4C14,4.1 14,4.19 14,4.29C16.97,5.17 19,7.9 19,11V17L21,19M14,21A2,2 0 0,1 12,23A2,2 0 0,1 10,21";var mdiBlindsHorizontal="M20 19V3H4V19H2V21H22V19H20M16 9H18V11H16V9M14 11H6V9H14V11M18 7H16V5H18V7M14 5V7H6V5H14M6 19V13H14V14.82C13.55 15.14 13.25 15.66 13.25 16.25C13.25 17.22 14.03 18 15 18S16.75 17.22 16.75 16.25C16.75 15.66 16.45 15.13 16 14.82V13H18V19H6Z";var mdiBrightnessAuto="M14.3,16L13.6,14H10.4L9.7,16H7.8L11,7H13L16.2,16H14.3M20,8.69V4H15.31L12,0.69L8.69,4H4V8.69L0.69,12L4,15.31V20H8.69L12,23.31L15.31,20H20V15.31L23.31,12L20,8.69M10.85,12.65H13.15L12,9L10.85,12.65Z";var mdiBrightnessPercent="M20.04,8.71V4H15.34L12,0.69L8.71,4H4V8.71L0.69,12L4,15.34V20.04H8.71L12,23.35L15.34,20.04H20.04V15.34L23.35,12L20.04,8.71M8.83,7.05C9.81,7.05 10.6,7.84 10.6,8.83A1.77,1.77 0 0,1 8.83,10.6C7.84,10.6 7.05,9.81 7.05,8.83C7.05,7.84 7.84,7.05 8.83,7.05M15.22,17C14.24,17 13.45,16.2 13.45,15.22A1.77,1.77 0 0,1 15.22,13.45C16.2,13.45 17,14.24 17,15.22A1.78,1.78 0 0,1 15.22,17M8.5,17.03L7,15.53L15.53,7L17.03,8.5L8.5,17.03Z";var mdiCamera="M4,4H7L9,2H15L17,4H20A2,2 0 0,1 22,6V18A2,2 0 0,1 20,20H4A2,2 0 0,1 2,18V6A2,2 0 0,1 4,4M12,7A5,5 0 0,0 7,12A5,5 0 0,0 12,17A5,5 0 0,0 17,12A5,5 0 0,0 12,7M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9Z";var mdiCast="M1,10V12A9,9 0 0,1 10,21H12C12,14.92 7.07,10 1,10M1,14V16A5,5 0 0,1 6,21H8A7,7 0 0,0 1,14M1,18V21H4A3,3 0 0,0 1,18M21,3H3C1.89,3 1,3.89 1,5V8H3V5H21V19H14V21H21A2,2 0 0,0 23,19V5C23,3.89 22.1,3 21,3Z";var mdiCctv="M6.03 12.03L8.03 15.5L5.5 18.68L2 12.62L6.03 12.03M17 18V15.29C17.88 14.9 18.5 14.03 18.5 13C18.5 12.43 18.3 11.9 17.97 11.5L19.94 10.35C20.95 9.76 21.3 8.47 20.71 7.46L19.33 5.06C18.74 4.05 17.45 3.7 16.44 4.28L8.31 9C7.36 9.53 7.03 10.75 7.58 11.71L9.08 14.31C9.63 15.26 10.86 15.59 11.81 15.04L13.69 13.96C13.94 14.55 14.41 15.03 15 15.29V18C15 19.1 15.9 20 17 20H22V18H17Z";var mdiChatProcessing="M12,3C17.5,3 22,6.58 22,11C22,15.42 17.5,19 12,19C10.76,19 9.57,18.82 8.47,18.5C5.55,21 2,21 2,21C4.33,18.67 4.7,17.1 4.75,16.5C3.05,15.07 2,13.13 2,11C2,6.58 6.5,3 12,3M17,12V10H15V12H17M13,12V10H11V12H13M9,12V10H7V12H9Z";var mdiChevronDown="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z";var mdiChevronRight="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z";var mdiChip="M6,4H18V5H21V7H18V9H21V11H18V13H21V15H18V17H21V19H18V20H6V19H3V17H6V15H3V13H6V11H3V9H6V7H3V5H6V4M11,15V18H12V15H11M13,15V18H14V15H13M15,15V18H16V15H15Z";var mdiCircleMedium="M12,8A4,4 0 0,0 8,12A4,4 0 0,0 12,16A4,4 0 0,0 16,12A4,4 0 0,0 12,8Z";var mdiClose="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z";var mdiCog="M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z";var mdiContentSaveOutline="M17 3H5C3.89 3 3 3.9 3 5V19C3 20.1 3.89 21 5 21H19C20.1 21 21 20.1 21 19V7L17 3M19 19H5V5H16.17L19 7.83V19M12 12C10.34 12 9 13.34 9 15S10.34 18 12 18 15 16.66 15 15 13.66 12 12 12M6 6H15V10H6V6Z";var mdiCrown="M5 16L3 5L8.5 10L12 4L15.5 10L21 5L19 16H5M19 19C19 19.6 18.6 20 18 20H6C5.4 20 5 19.6 5 19V18H19V19Z";var mdiDishwasher="M18,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V4A2,2 0 0,0 18,2M10,4A1,1 0 0,1 11,5A1,1 0 0,1 10,6A1,1 0 0,1 9,5A1,1 0 0,1 10,4M7,4A1,1 0 0,1 8,5A1,1 0 0,1 7,6A1,1 0 0,1 6,5A1,1 0 0,1 7,4M18,20H6V8H18V20M14.67,15.33C14.69,16.03 14.41,16.71 13.91,17.21C12.86,18.26 11.15,18.27 10.09,17.21C9.59,16.71 9.31,16.03 9.33,15.33C9.4,14.62 9.63,13.94 10,13.33C10.37,12.5 10.81,11.73 11.33,11L12,10C13.79,12.59 14.67,14.36 14.67,15.33";var mdiDoorOpen="M12,3C10.89,3 10,3.89 10,5H3V19H2V21H22V19H21V5C21,3.89 20.11,3 19,3H12M12,5H19V19H12V5M5,11H7V13H5V11Z";var mdiDoorbell="M12 10C10.9 10 10 10.9 10 12S10.9 14 12 14 14 13.1 14 12 13.1 10 12 10M16 2H8C6.9 2 6 2.9 6 4V20C6 21.1 6.9 22 8 22H16C17.1 22 18 21.1 18 20V4C18 2.9 17.1 2 16 2M16 20H8V4H16V20Z";var mdiDoorbellVideo="M14 15C14 16.11 13.11 17 12 17S10 16.11 10 15 10.9 13 12 13 14 13.9 14 15M18 4V20C18 21.1 17.11 22 16 22H8C6.9 22 6 21.11 6 20V4C6 2.9 6.9 2 8 2H16C17.11 2 18 2.9 18 4M10.5 7C10.5 7.83 11.17 8.5 12 8.5S13.5 7.83 13.5 7 12.83 5.5 12 5.5 10.5 6.17 10.5 7M16 10H8V20H16V10Z";var mdiEthernet="M7,15H9V18H11V15H13V18H15V15H17V18H19V9H15V6H9V9H5V18H7V15M4.38,3H19.63C20.94,3 22,4.06 22,5.38V19.63A2.37,2.37 0 0,1 19.63,22H4.38C3.06,22 2,20.94 2,19.63V5.38C2,4.06 3.06,3 4.38,3Z";var mdiEvStation="M19.77,7.23L19.78,7.22L16.06,3.5L15,4.56L17.11,6.67C16.17,7.03 15.5,7.93 15.5,9A2.5,2.5 0 0,0 18,11.5C18.36,11.5 18.69,11.42 19,11.29V18.5A1,1 0 0,1 18,19.5A1,1 0 0,1 17,18.5V14A2,2 0 0,0 15,12H14V5A2,2 0 0,0 12,3H6A2,2 0 0,0 4,5V21H14V13.5H15.5V18.5A2.5,2.5 0 0,0 18,21A2.5,2.5 0 0,0 20.5,18.5V9C20.5,8.31 20.22,7.68 19.77,7.23M18,10A1,1 0 0,1 17,9A1,1 0 0,1 18,8A1,1 0 0,1 19,9A1,1 0 0,1 18,10M8,18V13.5H6L10,6V11H12L8,18Z";var mdiEye="M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17M12,4.5C7,4.5 2.73,7.61 1,12C2.73,16.39 7,19.5 12,19.5C17,19.5 21.27,16.39 23,12C21.27,7.61 17,4.5 12,4.5Z";var mdiEyeOff="M11.83,9L15,12.16C15,12.11 15,12.05 15,12A3,3 0 0,0 12,9C11.94,9 11.89,9 11.83,9M7.53,9.8L9.08,11.35C9.03,11.56 9,11.77 9,12A3,3 0 0,0 12,15C12.22,15 12.44,14.97 12.65,14.92L14.2,16.47C13.53,16.8 12.79,17 12,17A5,5 0 0,1 7,12C7,11.21 7.2,10.47 7.53,9.8M2,4.27L4.28,6.55L4.73,7C3.08,8.3 1.78,10 1,12C2.73,16.39 7,19.5 12,19.5C13.55,19.5 15.03,19.2 16.38,18.66L16.81,19.08L19.73,22L21,20.73L3.27,3M12,7A5,5 0 0,1 17,12C17,12.64 16.87,13.26 16.64,13.82L19.57,16.75C21.07,15.5 22.27,13.86 23,12C21.27,7.61 17,4.5 12,4.5C10.6,4.5 9.26,4.75 8,5.2L10.17,7.35C10.74,7.13 11.35,7 12,7Z";var mdiFan="M12,11A1,1 0 0,0 11,12A1,1 0 0,0 12,13A1,1 0 0,0 13,12A1,1 0 0,0 12,11M12.5,2C17,2 17.11,5.57 14.75,6.75C13.76,7.24 13.32,8.29 13.13,9.22C13.61,9.42 14.03,9.73 14.35,10.13C18.05,8.13 22.03,8.92 22.03,12.5C22.03,17 18.46,17.1 17.28,14.73C16.78,13.74 15.72,13.3 14.79,13.11C14.59,13.59 14.28,14 13.88,14.34C15.87,18.03 15.08,22 11.5,22C7,22 6.91,18.42 9.27,17.24C10.25,16.75 10.69,15.71 10.89,14.79C10.4,14.59 9.97,14.27 9.65,13.87C5.96,15.85 2,15.07 2,11.5C2,7 5.56,6.89 6.74,9.26C7.24,10.25 8.29,10.68 9.22,10.87C9.41,10.39 9.73,9.97 10.14,9.65C8.15,5.96 8.94,2 12.5,2Z";var mdiFile="M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z";var mdiFitToScreen="M17 4H20C21.1 4 22 4.9 22 6V8H20V6H17V4M4 8V6H7V4H4C2.9 4 2 4.9 2 6V8H4M20 16V18H17V20H20C21.1 20 22 19.1 22 18V16H20M7 18H4V16H2V18C2 19.1 2.9 20 4 20H7V18M18 8H6V16H18V8Z";var mdiFridge="M7,2H17A2,2 0 0,1 19,4V9H5V4A2,2 0 0,1 7,2M19,19A2,2 0 0,1 17,21V22H15V21H9V22H7V21A2,2 0 0,1 5,19V10H19V19M8,5V7H10V5H8M8,12V15H10V12H8Z";var mdiGauge="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12C20,14.4 19,16.5 17.3,18C15.9,16.7 14,16 12,16C10,16 8.2,16.7 6.7,18C5,16.5 4,14.4 4,12A8,8 0 0,1 12,4M14,5.89C13.62,5.9 13.26,6.15 13.1,6.54L11.81,9.77L11.71,10C11,10.13 10.41,10.6 10.14,11.26C9.73,12.29 10.23,13.45 11.26,13.86C12.29,14.27 13.45,13.77 13.86,12.74C14.12,12.08 14,11.32 13.57,10.76L13.67,10.5L14.96,7.29L14.97,7.26C15.17,6.75 14.92,6.17 14.41,5.96C14.28,5.91 14.15,5.89 14,5.89M10,6A1,1 0 0,0 9,7A1,1 0 0,0 10,8A1,1 0 0,0 11,7A1,1 0 0,0 10,6M7,9A1,1 0 0,0 6,10A1,1 0 0,0 7,11A1,1 0 0,0 8,10A1,1 0 0,0 7,9M17,9A1,1 0 0,0 16,10A1,1 0 0,0 17,11A1,1 0 0,0 18,10A1,1 0 0,0 17,9Z";var mdiGraphOutline="M19.5 17C19.36 17 19.24 17 19.11 17.04L17.5 13.8C17.95 13.35 18.25 12.71 18.25 12C18.25 10.62 17.13 9.5 15.75 9.5C15.61 9.5 15.5 9.5 15.35 9.54L13.74 6.3C14.21 5.84 14.5 5.21 14.5 4.5C14.5 3.12 13.38 2 12 2S9.5 3.12 9.5 4.5C9.5 5.2 9.79 5.84 10.26 6.29L8.65 9.54C8.5 9.5 8.39 9.5 8.25 9.5C6.87 9.5 5.75 10.62 5.75 12C5.75 12.71 6.04 13.34 6.5 13.79L4.89 17.04C4.76 17 4.64 17 4.5 17C3.12 17 2 18.12 2 19.5C2 20.88 3.12 22 4.5 22S7 20.88 7 19.5C7 18.8 6.71 18.16 6.24 17.71L7.86 14.46C8 14.5 8.12 14.5 8.25 14.5C8.38 14.5 8.5 14.5 8.63 14.46L10.26 17.71C9.79 18.16 9.5 18.8 9.5 19.5C9.5 20.88 10.62 22 12 22S14.5 20.88 14.5 19.5C14.5 18.12 13.38 17 12 17C11.87 17 11.74 17 11.61 17.04L10 13.8C10.45 13.35 10.75 12.71 10.75 12C10.75 11.3 10.46 10.67 10 10.21L11.61 6.96C11.74 7 11.87 7 12 7C12.13 7 12.26 7 12.39 6.96L14 10.21C13.54 10.66 13.25 11.3 13.25 12C13.25 13.38 14.37 14.5 15.75 14.5C15.88 14.5 16 14.5 16.13 14.46L17.76 17.71C17.29 18.16 17 18.8 17 19.5C17 20.88 18.12 22 19.5 22S22 20.88 22 19.5C22 18.12 20.88 17 19.5 17M4.5 20.5C3.95 20.5 3.5 20.05 3.5 19.5S3.95 18.5 4.5 18.5 5.5 18.95 5.5 19.5 5.05 20.5 4.5 20.5M13 19.5C13 20.05 12.55 20.5 12 20.5S11 20.05 11 19.5 11.45 18.5 12 18.5 13 18.95 13 19.5M7.25 12C7.25 11.45 7.7 11 8.25 11S9.25 11.45 9.25 12 8.8 13 8.25 13 7.25 12.55 7.25 12M11 4.5C11 3.95 11.45 3.5 12 3.5S13 3.95 13 4.5 12.55 5.5 12 5.5 11 5.05 11 4.5M14.75 12C14.75 11.45 15.2 11 15.75 11S16.75 11.45 16.75 12 16.3 13 15.75 13 14.75 12.55 14.75 12M19.5 20.5C18.95 20.5 18.5 20.05 18.5 19.5S18.95 18.5 19.5 18.5 20.5 18.95 20.5 19.5 20.05 20.5 19.5 20.5Z";var mdiHeatPump="M19 3H5C3.9 3 3 3.9 3 5V19C3 20.1 3.9 21 5 21H19C20.1 21 21 20.1 21 19V5C21 3.9 20.1 3 19 3M12.75 7.08C13.57 7.2 14.32 7.5 14.95 8L12.75 10.19V7.08M11.25 7.08V10.19L9.05 8C9.68 7.5 10.43 7.2 11.25 7.08M8 9.05L10.19 11.25H7.08C7.2 10.43 7.5 9.68 8 9.05M7.08 12.75H10.19L8 14.95C7.5 14.32 7.2 13.57 7.08 12.75M11.25 16.92C10.43 16.8 9.68 16.5 9.05 16L11.25 13.81V16.92M12 13C11.45 13 11 12.55 11 12S11.45 11 12 11 13 11.45 13 12 12.55 13 12 13M12.75 16.92V13.81L14.95 16C14.32 16.5 13.57 16.8 12.75 16.92M16 14.95L13.81 12.75H16.92C16.8 13.57 16.5 14.32 16 14.95M13.81 11.25L16 9.05C16.5 9.69 16.8 10.44 16.92 11.25H13.81Z";var mdiHelp="M10,19H13V22H10V19M12,2C17.35,2.22 19.68,7.62 16.5,11.67C15.67,12.67 14.33,13.33 13.67,14.17C13,15 13,16 13,17H10C10,15.33 10,13.92 10.67,12.92C11.33,11.92 12.67,11.33 13.5,10.67C15.92,8.43 15.32,5.26 12,5A3,3 0 0,0 9,8H6A6,6 0 0,1 12,2Z";var mdiHome="M10,20V14H14V20H19V12H22L12,3L2,12H5V20H10Z";var mdiLeaf="M17,8C8,10 5.9,16.17 3.82,21.34L5.71,22L6.66,19.7C7.14,19.87 7.64,20 8,20C19,20 22,3 22,3C21,5 14,5.25 9,6.25C4,7.25 2,11.5 2,13.5C2,15.5 3.75,17.25 3.75,17.25C7,8 17,8 17,8Z";var mdiLightbulb="M12,2A7,7 0 0,0 5,9C5,11.38 6.19,13.47 8,14.74V17A1,1 0 0,0 9,18H15A1,1 0 0,0 16,17V14.74C17.81,13.47 19,11.38 19,9A7,7 0 0,0 12,2M9,21A1,1 0 0,0 10,22H14A1,1 0 0,0 15,21V20H9V21Z";var mdiLink="M3.9,12C3.9,10.29 5.29,8.9 7,8.9H11V7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H11V15.1H7C5.29,15.1 3.9,13.71 3.9,12M8,13H16V11H8V13M17,7H13V8.9H17C18.71,8.9 20.1,10.29 20.1,12C20.1,13.71 18.71,15.1 17,15.1H13V17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7Z";var mdiLinkVariantOff="M2,5.27L3.28,4L20,20.72L18.73,22L13.9,17.17L11.29,19.78C9.34,21.73 6.17,21.73 4.22,19.78C2.27,17.83 2.27,14.66 4.22,12.71L5.71,11.22C5.7,12.04 5.83,12.86 6.11,13.65L5.64,14.12C4.46,15.29 4.46,17.19 5.64,18.36C6.81,19.54 8.71,19.54 9.88,18.36L12.5,15.76L10.88,14.15C10.87,14.39 10.77,14.64 10.59,14.83C10.2,15.22 9.56,15.22 9.17,14.83C8.12,13.77 7.63,12.37 7.72,11L2,5.27M12.71,4.22C14.66,2.27 17.83,2.27 19.78,4.22C21.73,6.17 21.73,9.34 19.78,11.29L18.29,12.78C18.3,11.96 18.17,11.14 17.89,10.36L18.36,9.88C19.54,8.71 19.54,6.81 18.36,5.64C17.19,4.46 15.29,4.46 14.12,5.64L10.79,8.97L9.38,7.55L12.71,4.22M13.41,9.17C13.8,8.78 14.44,8.78 14.83,9.17C16.2,10.54 16.61,12.5 16.06,14.23L14.28,12.46C14.23,11.78 13.94,11.11 13.41,10.59C13,10.2 13,9.56 13.41,9.17Z";var mdiLoading="M12,4V2A10,10 0 0,0 2,12H4A8,8 0 0,1 12,4Z";var mdiLock="M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z";var mdiLogout="M17 7L15.59 8.41L18.17 11H8V13H18.17L15.59 15.58L17 17L22 12M4 5H12V3H4C2.9 3 2 3.9 2 5V19C2 20.1 2.9 21 4 21H12V19H4V5Z";var mdiMagnifyMinus="M9,2A7,7 0 0,1 16,9C16,10.57 15.5,12 14.61,13.19L15.41,14H16L22,20L20,22L14,16V15.41L13.19,14.61C12,15.5 10.57,16 9,16A7,7 0 0,1 2,9A7,7 0 0,1 9,2M5,8V10H13V8H5Z";var mdiMagnifyPlus="M9,2A7,7 0 0,1 16,9C16,10.57 15.5,12 14.61,13.19L15.41,14H16L22,20L20,22L14,16V15.41L13.19,14.61C12,15.5 10.57,16 9,16A7,7 0 0,1 2,9A7,7 0 0,1 9,2M8,5V8H5V10H8V13H10V10H13V8H10V5H8Z";var mdiMeterElectric="M12 2C7.04 2 3 6.04 3 11C3 14.91 5.5 18.24 9 19.47V22H11V19.94C11.33 20 11.66 20 12 20S12.67 20 13 19.94V22H15V19.47C18.5 18.23 21 14.9 21 11C21 6.04 16.96 2 12 2M14.25 14L11.25 17L9.75 15.5L11 14.25L9.75 13L12.75 10L14.25 11.5L13 12.75L14.25 14M16 9H8V7H16V9Z";var mdiMicrowave="M4,5A2,2 0 0,0 2,7V17A2,2 0 0,0 4,19H20A2,2 0 0,0 22,17V7A2,2 0 0,0 20,5H4M4,7H16V17H4V7M19,7A1,1 0 0,1 20,8A1,1 0 0,1 19,9A1,1 0 0,1 18,8A1,1 0 0,1 19,7M13,9V15H15V9H13M19,11A1,1 0 0,1 20,12A1,1 0 0,1 19,13A1,1 0 0,1 18,12A1,1 0 0,1 19,11Z";var mdiMinus="M19,13H5V11H19V13Z";var mdiMotionSensor="M10,0.2C9,0.2 8.2,1 8.2,2C8.2,3 9,3.8 10,3.8C11,3.8 11.8,3 11.8,2C11.8,1 11,0.2 10,0.2M15.67,1A7.33,7.33 0 0,0 23,8.33V7A6,6 0 0,1 17,1H15.67M18.33,1C18.33,3.58 20.42,5.67 23,5.67V4.33C21.16,4.33 19.67,2.84 19.67,1H18.33M21,1A2,2 0 0,0 23,3V1H21M7.92,4.03C7.75,4.03 7.58,4.06 7.42,4.11L2,5.8V11H3.8V7.33L5.91,6.67L2,22H3.8L6.67,13.89L9,17V22H10.8V15.59L8.31,11.05L9.04,8.18L10.12,10H15V8.2H11.38L9.38,4.87C9.08,4.37 8.54,4.03 7.92,4.03Z";var mdiPause="M14,19H18V5H14M6,19H10V5H6V19Z";var mdiPencil="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z";var mdiPlay="M8,5.14V19.14L19,12.14L8,5.14Z";var mdiPlus="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z";var mdiPowerPlug="M16,7V3H14V7H10V3H8V7H8C7,7 6,8 6,9V14.5L9.5,18V21H14.5V18L18,14.5V9C18,8 17,7 16,7Z";var mdiPump="M2 21V15H3.5C3.18 14.06 3 13.05 3 12C3 7.03 7.03 3 12 3H22V9H20.5C20.82 9.94 21 10.95 21 12C21 16.97 16.97 21 12 21H2M5 12C5 13.28 5.34 14.47 5.94 15.5L9.4 13.5C9.15 13.06 9 12.55 9 12C9 11.35 9.21 10.75 9.56 10.26L6.3 7.93C5.5 9.08 5 10.5 5 12M12 19C14.59 19 16.85 17.59 18.06 15.5L14.6 13.5C14.08 14.4 13.11 15 12 15L11.71 15L11.33 18.97L12 19M12 9C13.21 9 14.26 9.72 14.73 10.76L18.37 9.1C17.27 6.68 14.83 5 12 5V9M12 11C11.45 11 11 11.45 11 12C11 12.55 11.45 13 12 13C12.55 13 13 12.55 13 12C13 11.45 12.55 11 12 11Z";var mdiRefresh="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z";var mdiRemote="M12,0C8.96,0 6.21,1.23 4.22,3.22L5.63,4.63C7.26,3 9.5,2 12,2C14.5,2 16.74,3 18.36,4.64L19.77,3.23C17.79,1.23 15.04,0 12,0M7.05,6.05L8.46,7.46C9.37,6.56 10.62,6 12,6C13.38,6 14.63,6.56 15.54,7.46L16.95,6.05C15.68,4.78 13.93,4 12,4C10.07,4 8.32,4.78 7.05,6.05M12,15A2,2 0 0,1 10,13A2,2 0 0,1 12,11A2,2 0 0,1 14,13A2,2 0 0,1 12,15M15,9H9A1,1 0 0,0 8,10V22A1,1 0 0,0 9,23H15A1,1 0 0,0 16,22V10A1,1 0 0,0 15,9Z";var mdiRobotVacuum="M12,2C14.65,2 17.19,3.06 19.07,4.93L17.65,6.35C16.15,4.85 14.12,4 12,4C9.88,4 7.84,4.84 6.35,6.35L4.93,4.93C6.81,3.06 9.35,2 12,2M3.66,6.5L5.11,7.94C4.39,9.17 4,10.57 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12C20,10.57 19.61,9.17 18.88,7.94L20.34,6.5C21.42,8.12 22,10.04 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12C2,10.04 2.58,8.12 3.66,6.5M12,6A6,6 0 0,1 18,12C18,13.59 17.37,15.12 16.24,16.24L14.83,14.83C14.08,15.58 13.06,16 12,16C10.94,16 9.92,15.58 9.17,14.83L7.76,16.24C6.63,15.12 6,13.59 6,12A6,6 0 0,1 12,6M12,8A1,1 0 0,0 11,9A1,1 0 0,0 12,10A1,1 0 0,0 13,9A1,1 0 0,0 12,8Z";var mdiRouter="M12 2C6.5 2 2 6.5 2 12C2 17.5 6.5 22 12 22C17.5 22 22 17.5 22 12C22 6.5 17.5 2 12 2M12 20C7.58 20 4 16.42 4 12C4 7.58 7.58 4 12 4C16.42 4 20 7.58 20 12C20 16.42 16.42 20 12 20M13 13V16H15L12 19L9 16H11V13M5 13H8V15L11 12L8 9V11H5M11 11V8H9L12 5L15 8H13V11M19 11H16V9L13 12L16 15V13H19";var mdiRouterWireless="M20.2,5.9L21,5.1C19.6,3.7 17.8,3 16,3C14.2,3 12.4,3.7 11,5.1L11.8,5.9C13,4.8 14.5,4.2 16,4.2C17.5,4.2 19,4.8 20.2,5.9M19.3,6.7C18.4,5.8 17.2,5.3 16,5.3C14.8,5.3 13.6,5.8 12.7,6.7L13.5,7.5C14.2,6.8 15.1,6.5 16,6.5C16.9,6.5 17.8,6.8 18.5,7.5L19.3,6.7M19,13H17V9H15V13H5A2,2 0 0,0 3,15V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V15A2,2 0 0,0 19,13M8,18H6V16H8V18M11.5,18H9.5V16H11.5V18M15,18H13V16H15V18Z";var mdiShareVariant="M18,16.08C17.24,16.08 16.56,16.38 16.04,16.85L8.91,12.7C8.96,12.47 9,12.24 9,12C9,11.76 8.96,11.53 8.91,11.3L15.96,7.19C16.5,7.69 17.21,8 18,8A3,3 0 0,0 21,5A3,3 0 0,0 18,2A3,3 0 0,0 15,5C15,5.24 15.04,5.47 15.09,5.7L8.04,9.81C7.5,9.31 6.79,9 6,9A3,3 0 0,0 3,12A3,3 0 0,0 6,15C6.79,15 7.5,14.69 8.04,14.19L15.16,18.34C15.11,18.55 15.08,18.77 15.08,19C15.08,20.61 16.39,21.91 18,21.91C19.61,21.91 20.92,20.61 20.92,19A2.92,2.92 0 0,0 18,16.08Z";var mdiSignalCellular1="M19.5,5.5V18.5H17.5V5.5H19.5M12.5,10.5V18.5H10.5V10.5H12.5M21,4H16V20H21V4M14,9H9V20H14V9M7,14H2V20H7V14Z";var mdiSignalCellular2="M19.5,5.5V18.5H17.5V5.5H19.5M21,4H16V20H21V4M14,9H9V20H14V9M7,14H2V20H7V14Z";var mdiSignalCellular3="M21,4H16V20H21V4M14,9H9V20H14V9M7,14H2V20H7V14Z";var mdiSleep="M23,12H17V10L20.39,6H17V4H23V6L19.62,10H23V12M15,16H9V14L12.39,10H9V8H15V10L11.62,14H15V16M7,20H1V18L4.39,14H1V12H7V14L3.62,18H7V20Z";var mdiSmokeDetector="M12,18A6,6 0 0,0 18,12C18,8.68 15.31,6 12,6C8.68,6 6,8.68 6,12A6,6 0 0,0 12,18M19,3A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H19M8,12A4,4 0 0,1 12,8A4,4 0 0,1 16,12A4,4 0 0,1 12,16A4,4 0 0,1 8,12Z";var mdiSnowflakeAlert="M16.46,9.41L13,7.38V5.12L14.71,3.41L13.29,2L12,3.29L10.71,2L9.29,3.41L11,5.12V7.38L8.5,8.82L6.5,7.69L5.92,5.36L4,5.88L4.47,7.65L2.7,8.12L3.22,10.05L5.55,9.43L7.55,10.56V13.45L5.55,14.58L3.22,13.96L2.7,15.89L4.47,16.36L4,18.12L5.93,18.64L6.55,16.31L8.55,15.18L11,16.62V18.88L9.29,20.59L10.71,22L12,20.71L13.29,22L14.7,20.59L13,18.88V16.62L16.46,14.61M9.5,10.56L12,9.11L14.5,10.56V13.44L12,14.89L9.5,13.44M19,13V7H21V13H19M19,17V15H21V17H19Z";var mdiSolarPower="M11.45,2V5.55L15,3.77L11.45,2M10.45,8L8,10.46L11.75,11.71L10.45,8M2,11.45L3.77,15L5.55,11.45H2M10,2H2V10C2.57,10.17 3.17,10.25 3.77,10.25C7.35,10.26 10.26,7.35 10.27,3.75C10.26,3.16 10.17,2.57 10,2M17,22V16H14L19,7V13H22L17,22Z";var mdiSpeaker="M12,12A3,3 0 0,0 9,15A3,3 0 0,0 12,18A3,3 0 0,0 15,15A3,3 0 0,0 12,12M12,20A5,5 0 0,1 7,15A5,5 0 0,1 12,10A5,5 0 0,1 17,15A5,5 0 0,1 12,20M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8C10.89,8 10,7.1 10,6C10,4.89 10.89,4 12,4M17,2H7C5.89,2 5,2.89 5,4V20A2,2 0 0,0 7,22H17A2,2 0 0,0 19,20V4C19,2.89 18.1,2 17,2Z";var mdiSprinkler="M11 7H13V9H11V7M5 22H9V10H5V22M14 11H16V9H14V11M17 10H19V8H17V10M17 5V7H19V5H17M14 8H16V6H14V8M17 13H19V11H17V13M5 7H5.33L6 9H8L8.67 7H9V6H5V7Z";var mdiStar="M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z";var mdiStove="M6,14H8L11,17H9L6,14M4,4H5V3A1,1 0 0,1 6,2H10A1,1 0 0,1 11,3V4H13V3A1,1 0 0,1 14,2H18A1,1 0 0,1 19,3V4H20A2,2 0 0,1 22,6V19A2,2 0 0,1 20,21V22H17V21H7V22H4V21A2,2 0 0,1 2,19V6A2,2 0 0,1 4,4M18,7A1,1 0 0,1 19,8A1,1 0 0,1 18,9A1,1 0 0,1 17,8A1,1 0 0,1 18,7M14,7A1,1 0 0,1 15,8A1,1 0 0,1 14,9A1,1 0 0,1 13,8A1,1 0 0,1 14,7M20,6H4V10H20V6M4,19H20V12H4V19M6,7A1,1 0 0,1 7,8A1,1 0 0,1 6,9A1,1 0 0,1 5,8A1,1 0 0,1 6,7M13,14H15L18,17H16L13,14Z";var mdiSwapHorizontal="M21,9L17,5V8H10V10H17V13M7,11L3,15L7,19V16H14V14H7V11Z";var mdiTelevision="M21,17H3V5H21M21,3H3A2,2 0 0,0 1,5V17A2,2 0 0,0 3,19H8V21H16V19H21A2,2 0 0,0 23,17V5A2,2 0 0,0 21,3Z";var mdiThermometer="M15 13V5A3 3 0 0 0 9 5V13A5 5 0 1 0 15 13M12 4A1 1 0 0 1 13 5V8H11V5A1 1 0 0 1 12 4Z";var mdiToggleSwitch="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z";var mdiTrashCan="M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M9,8H11V17H9V8M13,8H15V17H13V8Z";var mdiTumbleDryer="M6,2H18A2,2 0 0,1 20,4V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V4A2,2 0 0,1 6,2M7,4A1,1 0 0,0 6,5A1,1 0 0,0 7,6A1,1 0 0,0 8,5A1,1 0 0,0 7,4M10,4A1,1 0 0,0 9,5A1,1 0 0,0 10,6A1,1 0 0,0 11,5A1,1 0 0,0 10,4M12,8A6,6 0 0,0 6,14A6,6 0 0,0 12,20A6,6 0 0,0 18,14A6,6 0 0,0 12,8M8.11,10.5H10C9.76,11.88 10,12.67 10.58,13.29C11.68,14.36 12.16,15.71 11.89,17.5H10C10.24,16.12 10,15.33 9.42,14.71C8.32,13.64 7.85,12.29 8.11,10.5M12.11,10.5H14C13.76,11.88 14,12.67 14.58,13.29C15.68,14.36 16.16,15.71 15.89,17.5H14C14.24,16.12 14,15.33 13.42,14.71C12.32,13.64 11.85,12.29 12.11,10.5Z";var mdiUpdate="M21,10.12H14.22L16.96,7.3C14.23,4.6 9.81,4.5 7.08,7.2C4.35,9.91 4.35,14.28 7.08,17C9.81,19.7 14.23,19.7 16.96,17C18.32,15.65 19,14.08 19,12.1H21C21,14.08 20.12,16.65 18.36,18.39C14.85,21.87 9.15,21.87 5.64,18.39C2.14,14.92 2.11,9.28 5.62,5.81C9.13,2.34 14.76,2.34 18.27,5.81L21,3V10.12M12.5,8V12.25L16,14.33L15.28,15.54L11,13V8H12.5Z";var mdiVideo="M17,10.5V7A1,1 0 0,0 16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5Z";var mdiVideoOutline="M15,8V16H5V8H15M16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5V7A1,1 0 0,0 16,6Z";var mdiVolumeHigh="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z";var mdiVolumeOff="M12,4L9.91,6.09L12,8.18M4.27,3L3,4.27L7.73,9H3V15H7L12,20V13.27L16.25,17.53C15.58,18.04 14.83,18.46 14,18.7V20.77C15.38,20.45 16.63,19.82 17.68,18.96L19.73,21L21,19.73L12,10.73M19,12C19,12.94 18.8,13.82 18.46,14.64L19.97,16.15C20.62,14.91 21,13.5 21,12C21,7.72 18,4.14 14,3.23V5.29C16.89,6.15 19,8.83 19,12M16.5,12C16.5,10.23 15.5,8.71 14,7.97V10.18L16.45,12.63C16.5,12.43 16.5,12.21 16.5,12Z";var mdiWashingMachine="M14.83,11.17C16.39,12.73 16.39,15.27 14.83,16.83C13.27,18.39 10.73,18.39 9.17,16.83L14.83,11.17M6,2H18A2,2 0 0,1 20,4V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V4A2,2 0 0,1 6,2M7,4A1,1 0 0,0 6,5A1,1 0 0,0 7,6A1,1 0 0,0 8,5A1,1 0 0,0 7,4M10,4A1,1 0 0,0 9,5A1,1 0 0,0 10,6A1,1 0 0,0 11,5A1,1 0 0,0 10,4M12,8A6,6 0 0,0 6,14A6,6 0 0,0 12,20A6,6 0 0,0 18,14A6,6 0 0,0 12,8Z";var mdiWater="M12,20A6,6 0 0,1 6,14C6,10 12,3.25 12,3.25C12,3.25 18,10 18,14A6,6 0 0,1 12,20Z";var mdiWaterBoiler="M8 2C6.89 2 6 2.89 6 4V16C6 17.11 6.89 18 8 18H9V20H6V22H9C10.11 22 11 21.11 11 20V18H13V20C13 21.11 13.89 22 15 22H18V20H15V18H16C17.11 18 18 17.11 18 16V4C18 2.89 17.11 2 16 2H8M12 4.97A2 2 0 0 1 14 6.97A2 2 0 0 1 12 8.97A2 2 0 0 1 10 6.97A2 2 0 0 1 12 4.97M10 14.5H14V16H10V14.5Z";var mdiWaterPercent="M12,3.25C12,3.25 6,10 6,14C6,17.32 8.69,20 12,20A6,6 0 0,0 18,14C18,10 12,3.25 12,3.25M14.47,9.97L15.53,11.03L9.53,17.03L8.47,15.97M9.75,10A1.25,1.25 0 0,1 11,11.25A1.25,1.25 0 0,1 9.75,12.5A1.25,1.25 0 0,1 8.5,11.25A1.25,1.25 0 0,1 9.75,10M14.25,14.5A1.25,1.25 0 0,1 15.5,15.75A1.25,1.25 0 0,1 14.25,17A1.25,1.25 0 0,1 13,15.75A1.25,1.25 0 0,1 14.25,14.5Z";var mdiWeatherNight="M17.75,4.09L15.22,6.03L16.13,9.09L13.5,7.28L10.87,9.09L11.78,6.03L9.25,4.09L12.44,4L13.5,1L14.56,4L17.75,4.09M21.25,11L19.61,12.25L20.2,14.23L18.5,13.06L16.8,14.23L17.39,12.25L15.75,11L17.81,10.95L18.5,9L19.19,10.95L21.25,11M18.97,15.95C19.8,15.87 20.69,17.05 20.16,17.8C19.84,18.25 19.5,18.67 19.08,19.07C15.17,23 8.84,23 4.94,19.07C1.03,15.17 1.03,8.83 4.94,4.93C5.34,4.53 5.76,4.17 6.21,3.85C6.96,3.32 8.14,4.21 8.06,5.04C7.79,7.9 8.75,10.87 10.95,13.06C13.14,15.26 16.1,16.22 18.97,15.95M17.33,17.97C14.5,17.81 11.7,16.64 9.53,14.5C7.36,12.31 6.2,9.5 6.04,6.68C3.23,9.82 3.34,14.64 6.35,17.66C9.37,20.67 14.19,20.78 17.33,17.97Z";var mdiWeatherRainy="M6,14.03A1,1 0 0,1 7,15.03C7,15.58 6.55,16.03 6,16.03C3.24,16.03 1,13.79 1,11.03C1,8.27 3.24,6.03 6,6.03C7,3.68 9.3,2.03 12,2.03C15.43,2.03 18.24,4.69 18.5,8.06L19,8.03A4,4 0 0,1 23,12.03C23,14.23 21.21,16.03 19,16.03H18C17.45,16.03 17,15.58 17,15.03C17,14.47 17.45,14.03 18,14.03H19A2,2 0 0,0 21,12.03A2,2 0 0,0 19,10.03H17V9.03C17,6.27 14.76,4.03 12,4.03C9.5,4.03 7.45,5.84 7.06,8.21C6.73,8.09 6.37,8.03 6,8.03A3,3 0 0,0 3,11.03A3,3 0 0,0 6,14.03M12,14.15C12.18,14.39 12.37,14.66 12.56,14.94C13,15.56 14,17.03 14,18C14,19.11 13.1,20 12,20A2,2 0 0,1 10,18C10,17.03 11,15.56 11.44,14.94C11.63,14.66 11.82,14.4 12,14.15M12,11.03L11.5,11.59C11.5,11.59 10.65,12.55 9.79,13.81C8.93,15.06 8,16.56 8,18A4,4 0 0,0 12,22A4,4 0 0,0 16,18C16,16.56 15.07,15.06 14.21,13.81C13.35,12.55 12.5,11.59 12.5,11.59";var mdiWeatherSunny="M12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,2L14.39,5.42C13.65,5.15 12.84,5 12,5C11.16,5 10.35,5.15 9.61,5.42L12,2M3.34,7L7.5,6.65C6.9,7.16 6.36,7.78 5.94,8.5C5.5,9.24 5.25,10 5.11,10.79L3.34,7M3.36,17L5.12,13.23C5.26,14 5.53,14.78 5.95,15.5C6.37,16.24 6.91,16.86 7.5,17.37L3.36,17M20.65,7L18.88,10.79C18.74,10 18.47,9.23 18.05,8.5C17.63,7.78 17.1,7.15 16.5,6.64L20.65,7M20.64,17L16.5,17.36C17.09,16.85 17.62,16.22 18.04,15.5C18.46,14.77 18.73,14 18.87,13.21L20.64,17M12,22L9.59,18.56C10.33,18.83 11.14,19 12,19C12.82,19 13.63,18.83 14.37,18.56L12,22Z";var mdiWifi="M12,21L15.6,16.2C14.6,15.45 13.35,15 12,15C10.65,15 9.4,15.45 8.4,16.2L12,21M12,3C7.95,3 4.21,4.34 1.2,6.6L3,9C5.5,7.12 8.62,6 12,6C15.38,6 18.5,7.12 21,9L22.8,6.6C19.79,4.34 16.05,3 12,3M12,9C9.3,9 6.81,9.89 4.8,11.4L6.6,13.8C8.1,12.67 9.97,12 12,12C14.03,12 15.9,12.67 17.4,13.8L19.2,11.4C17.19,9.89 14.7,9 12,9Z";
237
+ var mdiAccessPoint="M4.93,4.93C3.12,6.74 2,9.24 2,12C2,14.76 3.12,17.26 4.93,19.07L6.34,17.66C4.89,16.22 4,14.22 4,12C4,9.79 4.89,7.78 6.34,6.34L4.93,4.93M19.07,4.93L17.66,6.34C19.11,7.78 20,9.79 20,12C20,14.22 19.11,16.22 17.66,17.66L19.07,19.07C20.88,17.26 22,14.76 22,12C22,9.24 20.88,6.74 19.07,4.93M7.76,7.76C6.67,8.85 6,10.35 6,12C6,13.65 6.67,15.15 7.76,16.24L9.17,14.83C8.45,14.11 8,13.11 8,12C8,10.89 8.45,9.89 9.17,9.17L7.76,7.76M16.24,7.76L14.83,9.17C15.55,9.89 16,10.89 16,12C16,13.11 15.55,14.11 14.83,14.83L16.24,16.24C17.33,15.15 18,13.65 18,12C18,10.35 17.33,8.85 16.24,7.76M12,10A2,2 0 0,0 10,12A2,2 0 0,0 12,14A2,2 0 0,0 14,12A2,2 0 0,0 12,10Z";var mdiAirConditioner="M6.59,0.66C8.93,-1.15 11.47,1.06 12.04,4.5C12.47,4.5 12.89,4.62 13.27,4.84C13.79,4.24 14.25,3.42 14.07,2.5C13.65,0.35 16.06,-1.39 18.35,1.58C20.16,3.92 17.95,6.46 14.5,7.03C14.5,7.46 14.39,7.89 14.16,8.27C14.76,8.78 15.58,9.24 16.5,9.06C18.63,8.64 20.38,11.04 17.41,13.34C15.07,15.15 12.53,12.94 11.96,9.5C11.53,9.5 11.11,9.37 10.74,9.15C10.22,9.75 9.75,10.58 9.93,11.5C10.35,13.64 7.94,15.39 5.65,12.42C3.83,10.07 6.05,7.53 9.5,6.97C9.5,6.54 9.63,6.12 9.85,5.74C9.25,5.23 8.43,4.76 7.5,4.94C5.37,5.36 3.62,2.96 6.59,0.66M5,16H7A2,2 0 0,1 9,18V24H7V22H5V24H3V18A2,2 0 0,1 5,16M5,18V20H7V18H5M12.93,16H15L12.07,24H10L12.93,16M18,16H21V18H18V22H21V24H18A2,2 0 0,1 16,22V18A2,2 0 0,1 18,16Z";var mdiAirFilter="M19,18.31V20A2,2 0 0,1 17,22H7A2,2 0 0,1 5,20V16.3C4.54,16.12 3.95,16 3,16A1,1 0 0,1 2,15A1,1 0 0,1 3,14C3.82,14 4.47,14.08 5,14.21V12.3C4.54,12.12 3.95,12 3,12A1,1 0 0,1 2,11A1,1 0 0,1 3,10C3.82,10 4.47,10.08 5,10.21V8.3C4.54,8.12 3.95,8 3,8A1,1 0 0,1 2,7A1,1 0 0,1 3,6C3.82,6 4.47,6.08 5,6.21V4A2,2 0 0,1 7,2H17A2,2 0 0,1 19,4V6.16C20.78,6.47 21.54,7.13 21.71,7.29C22.1,7.68 22.1,8.32 21.71,8.71C21.32,9.1 20.8,9.09 20.29,8.71V8.71C20.29,8.71 19.25,8 17,8C15.74,8 14.91,8.41 13.95,8.9C12.91,9.41 11.74,10 10,10C9.64,10 9.31,10 9,9.96V7.95C9.3,8 9.63,8 10,8C11.26,8 12.09,7.59 13.05,7.11C14.09,6.59 15.27,6 17,6V4H7V20H17V18C18.5,18 18.97,18.29 19,18.31M17,10C15.27,10 14.09,10.59 13.05,11.11C12.09,11.59 11.26,12 10,12C9.63,12 9.3,12 9,11.95V13.96C9.31,14 9.64,14 10,14C11.74,14 12.91,13.41 13.95,12.9C14.91,12.42 15.74,12 17,12C19.25,12 20.29,12.71 20.29,12.71V12.71C20.8,13.1 21.32,13.1 21.71,12.71C22.1,12.32 22.1,11.69 21.71,11.29C21.5,11.08 20.25,10 17,10M17,14C15.27,14 14.09,14.59 13.05,15.11C12.09,15.59 11.26,16 10,16C9.63,16 9.3,16 9,15.95V17.96C9.31,18 9.64,18 10,18C11.74,18 12.91,17.41 13.95,16.9C14.91,16.42 15.74,16 17,16C19.25,16 20.29,16.71 20.29,16.71V16.71C20.8,17.1 21.32,17.1 21.71,16.71C22.1,16.32 22.1,15.69 21.71,15.29C21.5,15.08 20.25,14 17,14Z";var mdiAirPurifier="M11,9A4,4 0 0,1 15,13A4,4 0 0,1 11,17A4,4 0 0,1 7,13A4,4 0 0,1 11,9M11,11A2,2 0 0,0 9,13A2,2 0 0,0 11,15A2,2 0 0,0 13,13A2,2 0 0,0 11,11M7,4H14A4,4 0 0,1 18,8V9H16V8A2,2 0 0,0 14,6H7A2,2 0 0,0 5,8V20H16V18H18V22H3V8A4,4 0 0,1 7,4M16,11C18.5,11 18.5,9 21,9V11C18.5,11 18.5,13 16,13V11M16,15C18.5,15 18.5,13 21,13V15C18.5,15 18.5,17 16,17V15Z";var mdiAlert="M13 14H11V9H13M13 18H11V16H13M1 21H23L12 2L1 21Z";var mdiAlertCircleOutline="M11,15H13V17H11V15M11,7H13V13H11V7M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20Z";var mdiArrowDown="M11,4H13V16L18.5,10.5L19.92,11.92L12,19.84L4.08,11.92L5.5,10.5L11,16V4Z";var mdiArrowLeft="M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z";var mdiArrowRight="M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z";var mdiArrowUp="M13,20H11V8L5.5,13.5L4.08,12.08L12,4.16L19.92,12.08L18.5,13.5L13,8V20Z";var mdiBell="M21,19V20H3V19L5,17V11C5,7.9 7.03,5.17 10,4.29C10,4.19 10,4.1 10,4A2,2 0 0,1 12,2A2,2 0 0,1 14,4C14,4.1 14,4.19 14,4.29C16.97,5.17 19,7.9 19,11V17L21,19M14,21A2,2 0 0,1 12,23A2,2 0 0,1 10,21";var mdiBlindsHorizontal="M20 19V3H4V19H2V21H22V19H20M16 9H18V11H16V9M14 11H6V9H14V11M18 7H16V5H18V7M14 5V7H6V5H14M6 19V13H14V14.82C13.55 15.14 13.25 15.66 13.25 16.25C13.25 17.22 14.03 18 15 18S16.75 17.22 16.75 16.25C16.75 15.66 16.45 15.13 16 14.82V13H18V19H6Z";var mdiBrightnessAuto="M14.3,16L13.6,14H10.4L9.7,16H7.8L11,7H13L16.2,16H14.3M20,8.69V4H15.31L12,0.69L8.69,4H4V8.69L0.69,12L4,15.31V20H8.69L12,23.31L15.31,20H20V15.31L23.31,12L20,8.69M10.85,12.65H13.15L12,9L10.85,12.65Z";var mdiBrightnessPercent="M20.04,8.71V4H15.34L12,0.69L8.71,4H4V8.71L0.69,12L4,15.34V20.04H8.71L12,23.35L15.34,20.04H20.04V15.34L23.35,12L20.04,8.71M8.83,7.05C9.81,7.05 10.6,7.84 10.6,8.83A1.77,1.77 0 0,1 8.83,10.6C7.84,10.6 7.05,9.81 7.05,8.83C7.05,7.84 7.84,7.05 8.83,7.05M15.22,17C14.24,17 13.45,16.2 13.45,15.22A1.77,1.77 0 0,1 15.22,13.45C16.2,13.45 17,14.24 17,15.22A1.78,1.78 0 0,1 15.22,17M8.5,17.03L7,15.53L15.53,7L17.03,8.5L8.5,17.03Z";var mdiCamera="M4,4H7L9,2H15L17,4H20A2,2 0 0,1 22,6V18A2,2 0 0,1 20,20H4A2,2 0 0,1 2,18V6A2,2 0 0,1 4,4M12,7A5,5 0 0,0 7,12A5,5 0 0,0 12,17A5,5 0 0,0 17,12A5,5 0 0,0 12,7M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9Z";var mdiCast="M1,10V12A9,9 0 0,1 10,21H12C12,14.92 7.07,10 1,10M1,14V16A5,5 0 0,1 6,21H8A7,7 0 0,0 1,14M1,18V21H4A3,3 0 0,0 1,18M21,3H3C1.89,3 1,3.89 1,5V8H3V5H21V19H14V21H21A2,2 0 0,0 23,19V5C23,3.89 22.1,3 21,3Z";var mdiCctv="M6.03 12.03L8.03 15.5L5.5 18.68L2 12.62L6.03 12.03M17 18V15.29C17.88 14.9 18.5 14.03 18.5 13C18.5 12.43 18.3 11.9 17.97 11.5L19.94 10.35C20.95 9.76 21.3 8.47 20.71 7.46L19.33 5.06C18.74 4.05 17.45 3.7 16.44 4.28L8.31 9C7.36 9.53 7.03 10.75 7.58 11.71L9.08 14.31C9.63 15.26 10.86 15.59 11.81 15.04L13.69 13.96C13.94 14.55 14.41 15.03 15 15.29V18C15 19.1 15.9 20 17 20H22V18H17Z";var mdiChatProcessing="M12,3C17.5,3 22,6.58 22,11C22,15.42 17.5,19 12,19C10.76,19 9.57,18.82 8.47,18.5C5.55,21 2,21 2,21C4.33,18.67 4.7,17.1 4.75,16.5C3.05,15.07 2,13.13 2,11C2,6.58 6.5,3 12,3M17,12V10H15V12H17M13,12V10H11V12H13M9,12V10H7V12H9Z";var mdiChevronDown="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z";var mdiChevronRight="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z";var mdiChip="M6,4H18V5H21V7H18V9H21V11H18V13H21V15H18V17H21V19H18V20H6V19H3V17H6V15H3V13H6V11H3V9H6V7H3V5H6V4M11,15V18H12V15H11M13,15V18H14V15H13M15,15V18H16V15H15Z";var mdiCircleMedium="M12,8A4,4 0 0,0 8,12A4,4 0 0,0 12,16A4,4 0 0,0 16,12A4,4 0 0,0 12,8Z";var mdiClose="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z";var mdiCog="M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z";var mdiContentSaveOutline="M17 3H5C3.89 3 3 3.9 3 5V19C3 20.1 3.89 21 5 21H19C20.1 21 21 20.1 21 19V7L17 3M19 19H5V5H16.17L19 7.83V19M12 12C10.34 12 9 13.34 9 15S10.34 18 12 18 15 16.66 15 15 13.66 12 12 12M6 6H15V10H6V6Z";var mdiCrown="M5 16L3 5L8.5 10L12 4L15.5 10L21 5L19 16H5M19 19C19 19.6 18.6 20 18 20H6C5.4 20 5 19.6 5 19V18H19V19Z";var mdiDishwasher="M18,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V4A2,2 0 0,0 18,2M10,4A1,1 0 0,1 11,5A1,1 0 0,1 10,6A1,1 0 0,1 9,5A1,1 0 0,1 10,4M7,4A1,1 0 0,1 8,5A1,1 0 0,1 7,6A1,1 0 0,1 6,5A1,1 0 0,1 7,4M18,20H6V8H18V20M14.67,15.33C14.69,16.03 14.41,16.71 13.91,17.21C12.86,18.26 11.15,18.27 10.09,17.21C9.59,16.71 9.31,16.03 9.33,15.33C9.4,14.62 9.63,13.94 10,13.33C10.37,12.5 10.81,11.73 11.33,11L12,10C13.79,12.59 14.67,14.36 14.67,15.33";var mdiDoorOpen="M12,3C10.89,3 10,3.89 10,5H3V19H2V21H22V19H21V5C21,3.89 20.11,3 19,3H12M12,5H19V19H12V5M5,11H7V13H5V11Z";var mdiDoorbell="M12 10C10.9 10 10 10.9 10 12S10.9 14 12 14 14 13.1 14 12 13.1 10 12 10M16 2H8C6.9 2 6 2.9 6 4V20C6 21.1 6.9 22 8 22H16C17.1 22 18 21.1 18 20V4C18 2.9 17.1 2 16 2M16 20H8V4H16V20Z";var mdiDoorbellVideo="M14 15C14 16.11 13.11 17 12 17S10 16.11 10 15 10.9 13 12 13 14 13.9 14 15M18 4V20C18 21.1 17.11 22 16 22H8C6.9 22 6 21.11 6 20V4C6 2.9 6.9 2 8 2H16C17.11 2 18 2.9 18 4M10.5 7C10.5 7.83 11.17 8.5 12 8.5S13.5 7.83 13.5 7 12.83 5.5 12 5.5 10.5 6.17 10.5 7M16 10H8V20H16V10Z";var mdiEthernet="M7,15H9V18H11V15H13V18H15V15H17V18H19V9H15V6H9V9H5V18H7V15M4.38,3H19.63C20.94,3 22,4.06 22,5.38V19.63A2.37,2.37 0 0,1 19.63,22H4.38C3.06,22 2,20.94 2,19.63V5.38C2,4.06 3.06,3 4.38,3Z";var mdiEvStation="M19.77,7.23L19.78,7.22L16.06,3.5L15,4.56L17.11,6.67C16.17,7.03 15.5,7.93 15.5,9A2.5,2.5 0 0,0 18,11.5C18.36,11.5 18.69,11.42 19,11.29V18.5A1,1 0 0,1 18,19.5A1,1 0 0,1 17,18.5V14A2,2 0 0,0 15,12H14V5A2,2 0 0,0 12,3H6A2,2 0 0,0 4,5V21H14V13.5H15.5V18.5A2.5,2.5 0 0,0 18,21A2.5,2.5 0 0,0 20.5,18.5V9C20.5,8.31 20.22,7.68 19.77,7.23M18,10A1,1 0 0,1 17,9A1,1 0 0,1 18,8A1,1 0 0,1 19,9A1,1 0 0,1 18,10M8,18V13.5H6L10,6V11H12L8,18Z";var mdiEye="M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17M12,4.5C7,4.5 2.73,7.61 1,12C2.73,16.39 7,19.5 12,19.5C17,19.5 21.27,16.39 23,12C21.27,7.61 17,4.5 12,4.5Z";var mdiEyeOff="M11.83,9L15,12.16C15,12.11 15,12.05 15,12A3,3 0 0,0 12,9C11.94,9 11.89,9 11.83,9M7.53,9.8L9.08,11.35C9.03,11.56 9,11.77 9,12A3,3 0 0,0 12,15C12.22,15 12.44,14.97 12.65,14.92L14.2,16.47C13.53,16.8 12.79,17 12,17A5,5 0 0,1 7,12C7,11.21 7.2,10.47 7.53,9.8M2,4.27L4.28,6.55L4.73,7C3.08,8.3 1.78,10 1,12C2.73,16.39 7,19.5 12,19.5C13.55,19.5 15.03,19.2 16.38,18.66L16.81,19.08L19.73,22L21,20.73L3.27,3M12,7A5,5 0 0,1 17,12C17,12.64 16.87,13.26 16.64,13.82L19.57,16.75C21.07,15.5 22.27,13.86 23,12C21.27,7.61 17,4.5 12,4.5C10.6,4.5 9.26,4.75 8,5.2L10.17,7.35C10.74,7.13 11.35,7 12,7Z";var mdiFan="M12,11A1,1 0 0,0 11,12A1,1 0 0,0 12,13A1,1 0 0,0 13,12A1,1 0 0,0 12,11M12.5,2C17,2 17.11,5.57 14.75,6.75C13.76,7.24 13.32,8.29 13.13,9.22C13.61,9.42 14.03,9.73 14.35,10.13C18.05,8.13 22.03,8.92 22.03,12.5C22.03,17 18.46,17.1 17.28,14.73C16.78,13.74 15.72,13.3 14.79,13.11C14.59,13.59 14.28,14 13.88,14.34C15.87,18.03 15.08,22 11.5,22C7,22 6.91,18.42 9.27,17.24C10.25,16.75 10.69,15.71 10.89,14.79C10.4,14.59 9.97,14.27 9.65,13.87C5.96,15.85 2,15.07 2,11.5C2,7 5.56,6.89 6.74,9.26C7.24,10.25 8.29,10.68 9.22,10.87C9.41,10.39 9.73,9.97 10.14,9.65C8.15,5.96 8.94,2 12.5,2Z";var mdiFile="M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z";var mdiFitToScreen="M17 4H20C21.1 4 22 4.9 22 6V8H20V6H17V4M4 8V6H7V4H4C2.9 4 2 4.9 2 6V8H4M20 16V18H17V20H20C21.1 20 22 19.1 22 18V16H20M7 18H4V16H2V18C2 19.1 2.9 20 4 20H7V18M18 8H6V16H18V8Z";var mdiFridge="M7,2H17A2,2 0 0,1 19,4V9H5V4A2,2 0 0,1 7,2M19,19A2,2 0 0,1 17,21V22H15V21H9V22H7V21A2,2 0 0,1 5,19V10H19V19M8,5V7H10V5H8M8,12V15H10V12H8Z";var mdiGauge="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12C20,14.4 19,16.5 17.3,18C15.9,16.7 14,16 12,16C10,16 8.2,16.7 6.7,18C5,16.5 4,14.4 4,12A8,8 0 0,1 12,4M14,5.89C13.62,5.9 13.26,6.15 13.1,6.54L11.81,9.77L11.71,10C11,10.13 10.41,10.6 10.14,11.26C9.73,12.29 10.23,13.45 11.26,13.86C12.29,14.27 13.45,13.77 13.86,12.74C14.12,12.08 14,11.32 13.57,10.76L13.67,10.5L14.96,7.29L14.97,7.26C15.17,6.75 14.92,6.17 14.41,5.96C14.28,5.91 14.15,5.89 14,5.89M10,6A1,1 0 0,0 9,7A1,1 0 0,0 10,8A1,1 0 0,0 11,7A1,1 0 0,0 10,6M7,9A1,1 0 0,0 6,10A1,1 0 0,0 7,11A1,1 0 0,0 8,10A1,1 0 0,0 7,9M17,9A1,1 0 0,0 16,10A1,1 0 0,0 17,11A1,1 0 0,0 18,10A1,1 0 0,0 17,9Z";var mdiGraphOutline="M19.5 17C19.36 17 19.24 17 19.11 17.04L17.5 13.8C17.95 13.35 18.25 12.71 18.25 12C18.25 10.62 17.13 9.5 15.75 9.5C15.61 9.5 15.5 9.5 15.35 9.54L13.74 6.3C14.21 5.84 14.5 5.21 14.5 4.5C14.5 3.12 13.38 2 12 2S9.5 3.12 9.5 4.5C9.5 5.2 9.79 5.84 10.26 6.29L8.65 9.54C8.5 9.5 8.39 9.5 8.25 9.5C6.87 9.5 5.75 10.62 5.75 12C5.75 12.71 6.04 13.34 6.5 13.79L4.89 17.04C4.76 17 4.64 17 4.5 17C3.12 17 2 18.12 2 19.5C2 20.88 3.12 22 4.5 22S7 20.88 7 19.5C7 18.8 6.71 18.16 6.24 17.71L7.86 14.46C8 14.5 8.12 14.5 8.25 14.5C8.38 14.5 8.5 14.5 8.63 14.46L10.26 17.71C9.79 18.16 9.5 18.8 9.5 19.5C9.5 20.88 10.62 22 12 22S14.5 20.88 14.5 19.5C14.5 18.12 13.38 17 12 17C11.87 17 11.74 17 11.61 17.04L10 13.8C10.45 13.35 10.75 12.71 10.75 12C10.75 11.3 10.46 10.67 10 10.21L11.61 6.96C11.74 7 11.87 7 12 7C12.13 7 12.26 7 12.39 6.96L14 10.21C13.54 10.66 13.25 11.3 13.25 12C13.25 13.38 14.37 14.5 15.75 14.5C15.88 14.5 16 14.5 16.13 14.46L17.76 17.71C17.29 18.16 17 18.8 17 19.5C17 20.88 18.12 22 19.5 22S22 20.88 22 19.5C22 18.12 20.88 17 19.5 17M4.5 20.5C3.95 20.5 3.5 20.05 3.5 19.5S3.95 18.5 4.5 18.5 5.5 18.95 5.5 19.5 5.05 20.5 4.5 20.5M13 19.5C13 20.05 12.55 20.5 12 20.5S11 20.05 11 19.5 11.45 18.5 12 18.5 13 18.95 13 19.5M7.25 12C7.25 11.45 7.7 11 8.25 11S9.25 11.45 9.25 12 8.8 13 8.25 13 7.25 12.55 7.25 12M11 4.5C11 3.95 11.45 3.5 12 3.5S13 3.95 13 4.5 12.55 5.5 12 5.5 11 5.05 11 4.5M14.75 12C14.75 11.45 15.2 11 15.75 11S16.75 11.45 16.75 12 16.3 13 15.75 13 14.75 12.55 14.75 12M19.5 20.5C18.95 20.5 18.5 20.05 18.5 19.5S18.95 18.5 19.5 18.5 20.5 18.95 20.5 19.5 20.05 20.5 19.5 20.5Z";var mdiHeatPump="M19 3H5C3.9 3 3 3.9 3 5V19C3 20.1 3.9 21 5 21H19C20.1 21 21 20.1 21 19V5C21 3.9 20.1 3 19 3M12.75 7.08C13.57 7.2 14.32 7.5 14.95 8L12.75 10.19V7.08M11.25 7.08V10.19L9.05 8C9.68 7.5 10.43 7.2 11.25 7.08M8 9.05L10.19 11.25H7.08C7.2 10.43 7.5 9.68 8 9.05M7.08 12.75H10.19L8 14.95C7.5 14.32 7.2 13.57 7.08 12.75M11.25 16.92C10.43 16.8 9.68 16.5 9.05 16L11.25 13.81V16.92M12 13C11.45 13 11 12.55 11 12S11.45 11 12 11 13 11.45 13 12 12.55 13 12 13M12.75 16.92V13.81L14.95 16C14.32 16.5 13.57 16.8 12.75 16.92M16 14.95L13.81 12.75H16.92C16.8 13.57 16.5 14.32 16 14.95M13.81 11.25L16 9.05C16.5 9.69 16.8 10.44 16.92 11.25H13.81Z";var mdiHelp="M10,19H13V22H10V19M12,2C17.35,2.22 19.68,7.62 16.5,11.67C15.67,12.67 14.33,13.33 13.67,14.17C13,15 13,16 13,17H10C10,15.33 10,13.92 10.67,12.92C11.33,11.92 12.67,11.33 13.5,10.67C15.92,8.43 15.32,5.26 12,5A3,3 0 0,0 9,8H6A6,6 0 0,1 12,2Z";var mdiHome="M10,20V14H14V20H19V12H22L12,3L2,12H5V20H10Z";var mdiLeaf="M17,8C8,10 5.9,16.17 3.82,21.34L5.71,22L6.66,19.7C7.14,19.87 7.64,20 8,20C19,20 22,3 22,3C21,5 14,5.25 9,6.25C4,7.25 2,11.5 2,13.5C2,15.5 3.75,17.25 3.75,17.25C7,8 17,8 17,8Z";var mdiLightbulb="M12,2A7,7 0 0,0 5,9C5,11.38 6.19,13.47 8,14.74V17A1,1 0 0,0 9,18H15A1,1 0 0,0 16,17V14.74C17.81,13.47 19,11.38 19,9A7,7 0 0,0 12,2M9,21A1,1 0 0,0 10,22H14A1,1 0 0,0 15,21V20H9V21Z";var mdiLink="M3.9,12C3.9,10.29 5.29,8.9 7,8.9H11V7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H11V15.1H7C5.29,15.1 3.9,13.71 3.9,12M8,13H16V11H8V13M17,7H13V8.9H17C18.71,8.9 20.1,10.29 20.1,12C20.1,13.71 18.71,15.1 17,15.1H13V17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7Z";var mdiLinkVariantOff="M2,5.27L3.28,4L20,20.72L18.73,22L13.9,17.17L11.29,19.78C9.34,21.73 6.17,21.73 4.22,19.78C2.27,17.83 2.27,14.66 4.22,12.71L5.71,11.22C5.7,12.04 5.83,12.86 6.11,13.65L5.64,14.12C4.46,15.29 4.46,17.19 5.64,18.36C6.81,19.54 8.71,19.54 9.88,18.36L12.5,15.76L10.88,14.15C10.87,14.39 10.77,14.64 10.59,14.83C10.2,15.22 9.56,15.22 9.17,14.83C8.12,13.77 7.63,12.37 7.72,11L2,5.27M12.71,4.22C14.66,2.27 17.83,2.27 19.78,4.22C21.73,6.17 21.73,9.34 19.78,11.29L18.29,12.78C18.3,11.96 18.17,11.14 17.89,10.36L18.36,9.88C19.54,8.71 19.54,6.81 18.36,5.64C17.19,4.46 15.29,4.46 14.12,5.64L10.79,8.97L9.38,7.55L12.71,4.22M13.41,9.17C13.8,8.78 14.44,8.78 14.83,9.17C16.2,10.54 16.61,12.5 16.06,14.23L14.28,12.46C14.23,11.78 13.94,11.11 13.41,10.59C13,10.2 13,9.56 13.41,9.17Z";var mdiLoading="M12,4V2A10,10 0 0,0 2,12H4A8,8 0 0,1 12,4Z";var mdiLock="M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z";var mdiLogout="M17 7L15.59 8.41L18.17 11H8V13H18.17L15.59 15.58L17 17L22 12M4 5H12V3H4C2.9 3 2 3.9 2 5V19C2 20.1 2.9 21 4 21H12V19H4V5Z";var mdiMagnifyMinus="M9,2A7,7 0 0,1 16,9C16,10.57 15.5,12 14.61,13.19L15.41,14H16L22,20L20,22L14,16V15.41L13.19,14.61C12,15.5 10.57,16 9,16A7,7 0 0,1 2,9A7,7 0 0,1 9,2M5,8V10H13V8H5Z";var mdiMagnifyPlus="M9,2A7,7 0 0,1 16,9C16,10.57 15.5,12 14.61,13.19L15.41,14H16L22,20L20,22L14,16V15.41L13.19,14.61C12,15.5 10.57,16 9,16A7,7 0 0,1 2,9A7,7 0 0,1 9,2M8,5V8H5V10H8V13H10V10H13V8H10V5H8Z";var mdiMeterElectric="M12 2C7.04 2 3 6.04 3 11C3 14.91 5.5 18.24 9 19.47V22H11V19.94C11.33 20 11.66 20 12 20S12.67 20 13 19.94V22H15V19.47C18.5 18.23 21 14.9 21 11C21 6.04 16.96 2 12 2M14.25 14L11.25 17L9.75 15.5L11 14.25L9.75 13L12.75 10L14.25 11.5L13 12.75L14.25 14M16 9H8V7H16V9Z";var mdiMicrowave="M4,5A2,2 0 0,0 2,7V17A2,2 0 0,0 4,19H20A2,2 0 0,0 22,17V7A2,2 0 0,0 20,5H4M4,7H16V17H4V7M19,7A1,1 0 0,1 20,8A1,1 0 0,1 19,9A1,1 0 0,1 18,8A1,1 0 0,1 19,7M13,9V15H15V9H13M19,11A1,1 0 0,1 20,12A1,1 0 0,1 19,13A1,1 0 0,1 18,12A1,1 0 0,1 19,11Z";var mdiMinus="M19,13H5V11H19V13Z";var mdiMotionSensor="M10,0.2C9,0.2 8.2,1 8.2,2C8.2,3 9,3.8 10,3.8C11,3.8 11.8,3 11.8,2C11.8,1 11,0.2 10,0.2M15.67,1A7.33,7.33 0 0,0 23,8.33V7A6,6 0 0,1 17,1H15.67M18.33,1C18.33,3.58 20.42,5.67 23,5.67V4.33C21.16,4.33 19.67,2.84 19.67,1H18.33M21,1A2,2 0 0,0 23,3V1H21M7.92,4.03C7.75,4.03 7.58,4.06 7.42,4.11L2,5.8V11H3.8V7.33L5.91,6.67L2,22H3.8L6.67,13.89L9,17V22H10.8V15.59L8.31,11.05L9.04,8.18L10.12,10H15V8.2H11.38L9.38,4.87C9.08,4.37 8.54,4.03 7.92,4.03Z";var mdiPause="M14,19H18V5H14M6,19H10V5H6V19Z";var mdiPencil="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z";var mdiPlay="M8,5.14V19.14L19,12.14L8,5.14Z";var mdiPlus="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z";var mdiPowerPlug="M16,7V3H14V7H10V3H8V7H8C7,7 6,8 6,9V14.5L9.5,18V21H14.5V18L18,14.5V9C18,8 17,7 16,7Z";var mdiPump="M2 21V15H3.5C3.18 14.06 3 13.05 3 12C3 7.03 7.03 3 12 3H22V9H20.5C20.82 9.94 21 10.95 21 12C21 16.97 16.97 21 12 21H2M5 12C5 13.28 5.34 14.47 5.94 15.5L9.4 13.5C9.15 13.06 9 12.55 9 12C9 11.35 9.21 10.75 9.56 10.26L6.3 7.93C5.5 9.08 5 10.5 5 12M12 19C14.59 19 16.85 17.59 18.06 15.5L14.6 13.5C14.08 14.4 13.11 15 12 15L11.71 15L11.33 18.97L12 19M12 9C13.21 9 14.26 9.72 14.73 10.76L18.37 9.1C17.27 6.68 14.83 5 12 5V9M12 11C11.45 11 11 11.45 11 12C11 12.55 11.45 13 12 13C12.55 13 13 12.55 13 12C13 11.45 12.55 11 12 11Z";var mdiRefresh="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z";var mdiRemote="M12,0C8.96,0 6.21,1.23 4.22,3.22L5.63,4.63C7.26,3 9.5,2 12,2C14.5,2 16.74,3 18.36,4.64L19.77,3.23C17.79,1.23 15.04,0 12,0M7.05,6.05L8.46,7.46C9.37,6.56 10.62,6 12,6C13.38,6 14.63,6.56 15.54,7.46L16.95,6.05C15.68,4.78 13.93,4 12,4C10.07,4 8.32,4.78 7.05,6.05M12,15A2,2 0 0,1 10,13A2,2 0 0,1 12,11A2,2 0 0,1 14,13A2,2 0 0,1 12,15M15,9H9A1,1 0 0,0 8,10V22A1,1 0 0,0 9,23H15A1,1 0 0,0 16,22V10A1,1 0 0,0 15,9Z";var mdiRobotVacuum="M12,2C14.65,2 17.19,3.06 19.07,4.93L17.65,6.35C16.15,4.85 14.12,4 12,4C9.88,4 7.84,4.84 6.35,6.35L4.93,4.93C6.81,3.06 9.35,2 12,2M3.66,6.5L5.11,7.94C4.39,9.17 4,10.57 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12C20,10.57 19.61,9.17 18.88,7.94L20.34,6.5C21.42,8.12 22,10.04 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12C2,10.04 2.58,8.12 3.66,6.5M12,6A6,6 0 0,1 18,12C18,13.59 17.37,15.12 16.24,16.24L14.83,14.83C14.08,15.58 13.06,16 12,16C10.94,16 9.92,15.58 9.17,14.83L7.76,16.24C6.63,15.12 6,13.59 6,12A6,6 0 0,1 12,6M12,8A1,1 0 0,0 11,9A1,1 0 0,0 12,10A1,1 0 0,0 13,9A1,1 0 0,0 12,8Z";var mdiRouter="M12 2C6.5 2 2 6.5 2 12C2 17.5 6.5 22 12 22C17.5 22 22 17.5 22 12C22 6.5 17.5 2 12 2M12 20C7.58 20 4 16.42 4 12C4 7.58 7.58 4 12 4C16.42 4 20 7.58 20 12C20 16.42 16.42 20 12 20M13 13V16H15L12 19L9 16H11V13M5 13H8V15L11 12L8 9V11H5M11 11V8H9L12 5L15 8H13V11M19 11H16V9L13 12L16 15V13H19";var mdiRouterWireless="M20.2,5.9L21,5.1C19.6,3.7 17.8,3 16,3C14.2,3 12.4,3.7 11,5.1L11.8,5.9C13,4.8 14.5,4.2 16,4.2C17.5,4.2 19,4.8 20.2,5.9M19.3,6.7C18.4,5.8 17.2,5.3 16,5.3C14.8,5.3 13.6,5.8 12.7,6.7L13.5,7.5C14.2,6.8 15.1,6.5 16,6.5C16.9,6.5 17.8,6.8 18.5,7.5L19.3,6.7M19,13H17V9H15V13H5A2,2 0 0,0 3,15V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V15A2,2 0 0,0 19,13M8,18H6V16H8V18M11.5,18H9.5V16H11.5V18M15,18H13V16H15V18Z";var mdiShareVariant="M18,16.08C17.24,16.08 16.56,16.38 16.04,16.85L8.91,12.7C8.96,12.47 9,12.24 9,12C9,11.76 8.96,11.53 8.91,11.3L15.96,7.19C16.5,7.69 17.21,8 18,8A3,3 0 0,0 21,5A3,3 0 0,0 18,2A3,3 0 0,0 15,5C15,5.24 15.04,5.47 15.09,5.7L8.04,9.81C7.5,9.31 6.79,9 6,9A3,3 0 0,0 3,12A3,3 0 0,0 6,15C6.79,15 7.5,14.69 8.04,14.19L15.16,18.34C15.11,18.55 15.08,18.77 15.08,19C15.08,20.61 16.39,21.91 18,21.91C19.61,21.91 20.92,20.61 20.92,19A2.92,2.92 0 0,0 18,16.08Z";var mdiSignalCellular1="M19.5,5.5V18.5H17.5V5.5H19.5M12.5,10.5V18.5H10.5V10.5H12.5M21,4H16V20H21V4M14,9H9V20H14V9M7,14H2V20H7V14Z";var mdiSignalCellular2="M19.5,5.5V18.5H17.5V5.5H19.5M21,4H16V20H21V4M14,9H9V20H14V9M7,14H2V20H7V14Z";var mdiSignalCellular3="M21,4H16V20H21V4M14,9H9V20H14V9M7,14H2V20H7V14Z";var mdiSleep="M23,12H17V10L20.39,6H17V4H23V6L19.62,10H23V12M15,16H9V14L12.39,10H9V8H15V10L11.62,14H15V16M7,20H1V18L4.39,14H1V12H7V14L3.62,18H7V20Z";var mdiSmokeDetector="M12,18A6,6 0 0,0 18,12C18,8.68 15.31,6 12,6C8.68,6 6,8.68 6,12A6,6 0 0,0 12,18M19,3A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H19M8,12A4,4 0 0,1 12,8A4,4 0 0,1 16,12A4,4 0 0,1 12,16A4,4 0 0,1 8,12Z";var mdiSnowflakeAlert="M16.46,9.41L13,7.38V5.12L14.71,3.41L13.29,2L12,3.29L10.71,2L9.29,3.41L11,5.12V7.38L8.5,8.82L6.5,7.69L5.92,5.36L4,5.88L4.47,7.65L2.7,8.12L3.22,10.05L5.55,9.43L7.55,10.56V13.45L5.55,14.58L3.22,13.96L2.7,15.89L4.47,16.36L4,18.12L5.93,18.64L6.55,16.31L8.55,15.18L11,16.62V18.88L9.29,20.59L10.71,22L12,20.71L13.29,22L14.7,20.59L13,18.88V16.62L16.46,14.61M9.5,10.56L12,9.11L14.5,10.56V13.44L12,14.89L9.5,13.44M19,13V7H21V13H19M19,17V15H21V17H19Z";var mdiSolarPower="M11.45,2V5.55L15,3.77L11.45,2M10.45,8L8,10.46L11.75,11.71L10.45,8M2,11.45L3.77,15L5.55,11.45H2M10,2H2V10C2.57,10.17 3.17,10.25 3.77,10.25C7.35,10.26 10.26,7.35 10.27,3.75C10.26,3.16 10.17,2.57 10,2M17,22V16H14L19,7V13H22L17,22Z";var mdiSpeaker="M12,12A3,3 0 0,0 9,15A3,3 0 0,0 12,18A3,3 0 0,0 15,15A3,3 0 0,0 12,12M12,20A5,5 0 0,1 7,15A5,5 0 0,1 12,10A5,5 0 0,1 17,15A5,5 0 0,1 12,20M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8C10.89,8 10,7.1 10,6C10,4.89 10.89,4 12,4M17,2H7C5.89,2 5,2.89 5,4V20A2,2 0 0,0 7,22H17A2,2 0 0,0 19,20V4C19,2.89 18.1,2 17,2Z";var mdiSprinkler="M11 7H13V9H11V7M5 22H9V10H5V22M14 11H16V9H14V11M17 10H19V8H17V10M17 5V7H19V5H17M14 8H16V6H14V8M17 13H19V11H17V13M5 7H5.33L6 9H8L8.67 7H9V6H5V7Z";var mdiStar="M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z";var mdiStove="M6,14H8L11,17H9L6,14M4,4H5V3A1,1 0 0,1 6,2H10A1,1 0 0,1 11,3V4H13V3A1,1 0 0,1 14,2H18A1,1 0 0,1 19,3V4H20A2,2 0 0,1 22,6V19A2,2 0 0,1 20,21V22H17V21H7V22H4V21A2,2 0 0,1 2,19V6A2,2 0 0,1 4,4M18,7A1,1 0 0,1 19,8A1,1 0 0,1 18,9A1,1 0 0,1 17,8A1,1 0 0,1 18,7M14,7A1,1 0 0,1 15,8A1,1 0 0,1 14,9A1,1 0 0,1 13,8A1,1 0 0,1 14,7M20,6H4V10H20V6M4,19H20V12H4V19M6,7A1,1 0 0,1 7,8A1,1 0 0,1 6,9A1,1 0 0,1 5,8A1,1 0 0,1 6,7M13,14H15L18,17H16L13,14Z";var mdiSwapHorizontal="M21,9L17,5V8H10V10H17V13M7,11L3,15L7,19V16H14V14H7V11Z";var mdiTelevision="M21,17H3V5H21M21,3H3A2,2 0 0,0 1,5V17A2,2 0 0,0 3,19H8V21H16V19H21A2,2 0 0,0 23,17V5A2,2 0 0,0 21,3Z";var mdiThermometer="M15 13V5A3 3 0 0 0 9 5V13A5 5 0 1 0 15 13M12 4A1 1 0 0 1 13 5V8H11V5A1 1 0 0 1 12 4Z";var mdiToggleSwitch="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z";var mdiTrashCan="M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M9,8H11V17H9V8M13,8H15V17H13V8Z";var mdiTumbleDryer="M6,2H18A2,2 0 0,1 20,4V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V4A2,2 0 0,1 6,2M7,4A1,1 0 0,0 6,5A1,1 0 0,0 7,6A1,1 0 0,0 8,5A1,1 0 0,0 7,4M10,4A1,1 0 0,0 9,5A1,1 0 0,0 10,6A1,1 0 0,0 11,5A1,1 0 0,0 10,4M12,8A6,6 0 0,0 6,14A6,6 0 0,0 12,20A6,6 0 0,0 18,14A6,6 0 0,0 12,8M8.11,10.5H10C9.76,11.88 10,12.67 10.58,13.29C11.68,14.36 12.16,15.71 11.89,17.5H10C10.24,16.12 10,15.33 9.42,14.71C8.32,13.64 7.85,12.29 8.11,10.5M12.11,10.5H14C13.76,11.88 14,12.67 14.58,13.29C15.68,14.36 16.16,15.71 15.89,17.5H14C14.24,16.12 14,15.33 13.42,14.71C12.32,13.64 11.85,12.29 12.11,10.5Z";var mdiUpdate="M21,10.12H14.22L16.96,7.3C14.23,4.6 9.81,4.5 7.08,7.2C4.35,9.91 4.35,14.28 7.08,17C9.81,19.7 14.23,19.7 16.96,17C18.32,15.65 19,14.08 19,12.1H21C21,14.08 20.12,16.65 18.36,18.39C14.85,21.87 9.15,21.87 5.64,18.39C2.14,14.92 2.11,9.28 5.62,5.81C9.13,2.34 14.76,2.34 18.27,5.81L21,3V10.12M12.5,8V12.25L16,14.33L15.28,15.54L11,13V8H12.5Z";var mdiVideo="M17,10.5V7A1,1 0 0,0 16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5Z";var mdiVideoOutline="M15,8V16H5V8H15M16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5V7A1,1 0 0,0 16,6Z";var mdiVolumeHigh="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z";var mdiVolumeOff="M12,4L9.91,6.09L12,8.18M4.27,3L3,4.27L7.73,9H3V15H7L12,20V13.27L16.25,17.53C15.58,18.04 14.83,18.46 14,18.7V20.77C15.38,20.45 16.63,19.82 17.68,18.96L19.73,21L21,19.73L12,10.73M19,12C19,12.94 18.8,13.82 18.46,14.64L19.97,16.15C20.62,14.91 21,13.5 21,12C21,7.72 18,4.14 14,3.23V5.29C16.89,6.15 19,8.83 19,12M16.5,12C16.5,10.23 15.5,8.71 14,7.97V10.18L16.45,12.63C16.5,12.43 16.5,12.21 16.5,12Z";var mdiWashingMachine="M14.83,11.17C16.39,12.73 16.39,15.27 14.83,16.83C13.27,18.39 10.73,18.39 9.17,16.83L14.83,11.17M6,2H18A2,2 0 0,1 20,4V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V4A2,2 0 0,1 6,2M7,4A1,1 0 0,0 6,5A1,1 0 0,0 7,6A1,1 0 0,0 8,5A1,1 0 0,0 7,4M10,4A1,1 0 0,0 9,5A1,1 0 0,0 10,6A1,1 0 0,0 11,5A1,1 0 0,0 10,4M12,8A6,6 0 0,0 6,14A6,6 0 0,0 12,20A6,6 0 0,0 18,14A6,6 0 0,0 12,8Z";var mdiWater="M12,20A6,6 0 0,1 6,14C6,10 12,3.25 12,3.25C12,3.25 18,10 18,14A6,6 0 0,1 12,20Z";var mdiWaterBoiler="M8 2C6.89 2 6 2.89 6 4V16C6 17.11 6.89 18 8 18H9V20H6V22H9C10.11 22 11 21.11 11 20V18H13V20C13 21.11 13.89 22 15 22H18V20H15V18H16C17.11 18 18 17.11 18 16V4C18 2.89 17.11 2 16 2H8M12 4.97A2 2 0 0 1 14 6.97A2 2 0 0 1 12 8.97A2 2 0 0 1 10 6.97A2 2 0 0 1 12 4.97M10 14.5H14V16H10V14.5Z";var mdiWaterPercent="M12,3.25C12,3.25 6,10 6,14C6,17.32 8.69,20 12,20A6,6 0 0,0 18,14C18,10 12,3.25 12,3.25M14.47,9.97L15.53,11.03L9.53,17.03L8.47,15.97M9.75,10A1.25,1.25 0 0,1 11,11.25A1.25,1.25 0 0,1 9.75,12.5A1.25,1.25 0 0,1 8.5,11.25A1.25,1.25 0 0,1 9.75,10M14.25,14.5A1.25,1.25 0 0,1 15.5,15.75A1.25,1.25 0 0,1 14.25,17A1.25,1.25 0 0,1 13,15.75A1.25,1.25 0 0,1 14.25,14.5Z";var mdiWeatherNight="M17.75,4.09L15.22,6.03L16.13,9.09L13.5,7.28L10.87,9.09L11.78,6.03L9.25,4.09L12.44,4L13.5,1L14.56,4L17.75,4.09M21.25,11L19.61,12.25L20.2,14.23L18.5,13.06L16.8,14.23L17.39,12.25L15.75,11L17.81,10.95L18.5,9L19.19,10.95L21.25,11M18.97,15.95C19.8,15.87 20.69,17.05 20.16,17.8C19.84,18.25 19.5,18.67 19.08,19.07C15.17,23 8.84,23 4.94,19.07C1.03,15.17 1.03,8.83 4.94,4.93C5.34,4.53 5.76,4.17 6.21,3.85C6.96,3.32 8.14,4.21 8.06,5.04C7.79,7.9 8.75,10.87 10.95,13.06C13.14,15.26 16.1,16.22 18.97,15.95M17.33,17.97C14.5,17.81 11.7,16.64 9.53,14.5C7.36,12.31 6.2,9.5 6.04,6.68C3.23,9.82 3.34,14.64 6.35,17.66C9.37,20.67 14.19,20.78 17.33,17.97Z";var mdiWeatherRainy="M6,14.03A1,1 0 0,1 7,15.03C7,15.58 6.55,16.03 6,16.03C3.24,16.03 1,13.79 1,11.03C1,8.27 3.24,6.03 6,6.03C7,3.68 9.3,2.03 12,2.03C15.43,2.03 18.24,4.69 18.5,8.06L19,8.03A4,4 0 0,1 23,12.03C23,14.23 21.21,16.03 19,16.03H18C17.45,16.03 17,15.58 17,15.03C17,14.47 17.45,14.03 18,14.03H19A2,2 0 0,0 21,12.03A2,2 0 0,0 19,10.03H17V9.03C17,6.27 14.76,4.03 12,4.03C9.5,4.03 7.45,5.84 7.06,8.21C6.73,8.09 6.37,8.03 6,8.03A3,3 0 0,0 3,11.03A3,3 0 0,0 6,14.03M12,14.15C12.18,14.39 12.37,14.66 12.56,14.94C13,15.56 14,17.03 14,18C14,19.11 13.1,20 12,20A2,2 0 0,1 10,18C10,17.03 11,15.56 11.44,14.94C11.63,14.66 11.82,14.4 12,14.15M12,11.03L11.5,11.59C11.5,11.59 10.65,12.55 9.79,13.81C8.93,15.06 8,16.56 8,18A4,4 0 0,0 12,22A4,4 0 0,0 16,18C16,16.56 15.07,15.06 14.21,13.81C13.35,12.55 12.5,11.59 12.5,11.59";var mdiWeatherSunny="M12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,2L14.39,5.42C13.65,5.15 12.84,5 12,5C11.16,5 10.35,5.15 9.61,5.42L12,2M3.34,7L7.5,6.65C6.9,7.16 6.36,7.78 5.94,8.5C5.5,9.24 5.25,10 5.11,10.79L3.34,7M3.36,17L5.12,13.23C5.26,14 5.53,14.78 5.95,15.5C6.37,16.24 6.91,16.86 7.5,17.37L3.36,17M20.65,7L18.88,10.79C18.74,10 18.47,9.23 18.05,8.5C17.63,7.78 17.1,7.15 16.5,6.64L20.65,7M20.64,17L16.5,17.36C17.09,16.85 17.62,16.22 18.04,15.5C18.46,14.77 18.73,14 18.87,13.21L20.64,17M12,22L9.59,18.56C10.33,18.83 11.14,19 12,19C12.82,19 13.63,18.83 14.37,18.56L12,22Z";var mdiWifi="M12,21L15.6,16.2C14.6,15.45 13.35,15 12,15C10.65,15 9.4,15.45 8.4,16.2L12,21M12,3C7.95,3 4.21,4.34 1.2,6.6L3,9C5.5,7.12 8.62,6 12,6C15.38,6 18.5,7.12 21,9L22.8,6.6C19.79,4.34 16.05,3 12,3M12,9C9.3,9 6.81,9.89 4.8,11.4L6.6,13.8C8.1,12.67 9.97,12 12,12C14.03,12 15.9,12.67 17.4,13.8L19.2,11.4C17.19,9.89 14.7,9 12,9Z";
238
238
 
239
239
  /**
240
240
  * @license
@@ -1102,12 +1102,12 @@ function n$4(n) {
1102
1102
  const clientContext = n$9("client");
1103
1103
  const tickContext = n$9("client-tick");
1104
1104
 
1105
- var __defProp$m = Object.defineProperty;
1106
- var __getOwnPropDesc$n = Object.getOwnPropertyDescriptor;
1107
- var __decorateClass$p = (decorators, target, key, kind) => {
1108
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$n(target, key) : target;
1105
+ var __defProp$o = Object.defineProperty;
1106
+ var __getOwnPropDesc$p = Object.getOwnPropertyDescriptor;
1107
+ var __decorateClass$r = (decorators, target, key, kind) => {
1108
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$p(target, key) : target;
1109
1109
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1110
- if (kind && result) __defProp$m(target, key, result);
1110
+ if (kind && result) __defProp$o(target, key, result);
1111
1111
  return result;
1112
1112
  };
1113
1113
  let HaSvgIcon = class extends i$4 {
@@ -1153,10 +1153,10 @@ let HaSvgIcon = class extends i$4 {
1153
1153
  `;
1154
1154
  }
1155
1155
  };
1156
- __decorateClass$p([n$5()], HaSvgIcon.prototype, "path", 2);
1157
- __decorateClass$p([n$5()], HaSvgIcon.prototype, "secondaryPath", 2);
1158
- __decorateClass$p([n$5()], HaSvgIcon.prototype, "viewBox", 2);
1159
- HaSvgIcon = __decorateClass$p([t$1("ha-svg-icon")], HaSvgIcon);
1156
+ __decorateClass$r([n$5()], HaSvgIcon.prototype, "path", 2);
1157
+ __decorateClass$r([n$5()], HaSvgIcon.prototype, "secondaryPath", 2);
1158
+ __decorateClass$r([n$5()], HaSvgIcon.prototype, "viewBox", 2);
1159
+ HaSvgIcon = __decorateClass$r([t$1("ha-svg-icon")], HaSvgIcon);
1160
1160
 
1161
1161
  /******************************************************************************
1162
1162
  Copyright (c) Microsoft Corporation.
@@ -4040,7 +4040,7 @@ MdListItem = __decorate([t$1('md-list-item')], MdListItem);
4040
4040
  */
4041
4041
  const showSettingsDialog = async section => {
4042
4042
  var _document$querySelect;
4043
- await import('./settings-dialog-BG5MgZcO.js');
4043
+ await import('./settings-dialog-DrHzJtsi.js');
4044
4044
  const dialog = document.createElement("settings-dialog");
4045
4045
  if (section) dialog.scrollToSection = section;
4046
4046
  (_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
@@ -4134,12 +4134,12 @@ const notFoundStyles = i$7`
4134
4134
  }
4135
4135
  `;
4136
4136
 
4137
- var __defProp$l = Object.defineProperty;
4138
- var __getOwnPropDesc$m = Object.getOwnPropertyDescriptor;
4139
- var __decorateClass$o = (decorators, target, key, kind) => {
4140
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$m(target, key) : target;
4137
+ var __defProp$n = Object.defineProperty;
4138
+ var __getOwnPropDesc$o = Object.getOwnPropertyDescriptor;
4139
+ var __decorateClass$q = (decorators, target, key, kind) => {
4140
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$o(target, key) : target;
4141
4141
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
4142
- if (kind && result) __defProp$l(target, key, result);
4142
+ if (kind && result) __defProp$n(target, key, result);
4143
4143
  return result;
4144
4144
  };
4145
4145
  let DashboardHeader = class extends i$4 {
@@ -4368,26 +4368,26 @@ DashboardHeader.styles = [reducedMotionStyles, i$7`
4368
4368
  outline-offset: 2px;
4369
4369
  }
4370
4370
  `];
4371
- __decorateClass$o([n$5()], DashboardHeader.prototype, "backButton", 2);
4372
- __decorateClass$o([n$5()], DashboardHeader.prototype, "actions", 2);
4373
- __decorateClass$o([n$5()], DashboardHeader.prototype, "activeView", 2);
4374
- __decorateClass$o([n$5({
4371
+ __decorateClass$q([n$5()], DashboardHeader.prototype, "backButton", 2);
4372
+ __decorateClass$q([n$5()], DashboardHeader.prototype, "actions", 2);
4373
+ __decorateClass$q([n$5()], DashboardHeader.prototype, "activeView", 2);
4374
+ __decorateClass$q([n$5({
4375
4375
  type: Boolean
4376
4376
  })], DashboardHeader.prototype, "hasThreadDevices", 2);
4377
- __decorateClass$o([n$5({
4377
+ __decorateClass$q([n$5({
4378
4378
  type: Boolean
4379
4379
  })], DashboardHeader.prototype, "hasWifiDevices", 2);
4380
- __decorateClass$o([c$5({
4380
+ __decorateClass$q([c$5({
4381
4381
  context: clientContext
4382
4382
  })], DashboardHeader.prototype, "client", 2);
4383
- __decorateClass$o([c$5({
4383
+ __decorateClass$q([c$5({
4384
4384
  context: tickContext,
4385
4385
  subscribe: true
4386
4386
  })], DashboardHeader.prototype, "_tick", 2);
4387
- __decorateClass$o([r$3()], DashboardHeader.prototype, "_themePreference", 2);
4388
- __decorateClass$o([r$3()], DashboardHeader.prototype, "_effectiveTheme", 2);
4389
- __decorateClass$o([r$3()], DashboardHeader.prototype, "_devMode", 2);
4390
- DashboardHeader = __decorateClass$o([t$1("dashboard-header")], DashboardHeader);
4387
+ __decorateClass$q([r$3()], DashboardHeader.prototype, "_themePreference", 2);
4388
+ __decorateClass$q([r$3()], DashboardHeader.prototype, "_effectiveTheme", 2);
4389
+ __decorateClass$q([r$3()], DashboardHeader.prototype, "_devMode", 2);
4390
+ DashboardHeader = __decorateClass$q([t$1("dashboard-header")], DashboardHeader);
4391
4391
 
4392
4392
  /**
4393
4393
  * @license
@@ -21796,7 +21796,7 @@ const clusters = {
21796
21796
  * SPDX-License-Identifier: Apache-2.0
21797
21797
  */
21798
21798
  const showDialogBox = async (type, dialogParams) => {
21799
- await import('./dialog-box-tHvPVxDN.js');
21799
+ await import('./dialog-box-bAdbnf-T.js');
21800
21800
  return new Promise(resolve => {
21801
21801
  const dialog = document.createElement("dialog-box");
21802
21802
  dialog.params = dialogParams;
@@ -21815,7 +21815,7 @@ const showPromptDialog = dialogParams => showDialogBox("prompt", dialogParams);
21815
21815
  */
21816
21816
  const showAttributeWriteDialog = async options => {
21817
21817
  var _document$querySelect;
21818
- await import('./attribute-write-dialog-W7xpCE2E.js');
21818
+ await import('./attribute-write-dialog-CqqdRniU.js');
21819
21819
  const dialog = document.createElement("attribute-write-dialog");
21820
21820
  dialog.client = options.client;
21821
21821
  dialog.nodeId = options.nodeId;
@@ -21834,7 +21834,7 @@ const showAttributeWriteDialog = async options => {
21834
21834
  */
21835
21835
  const showCommandInvokeDialog = async options => {
21836
21836
  var _document$querySelect;
21837
- await import('./command-invoke-dialog-BAqAAdJw.js');
21837
+ await import('./command-invoke-dialog-BuvBOrdC.js');
21838
21838
  const dialog = document.createElement("command-invoke-dialog");
21839
21839
  dialog.client = options.client;
21840
21840
  dialog.nodeId = options.nodeId;
@@ -22000,20 +22000,6 @@ let MdTextButton = class MdTextButton extends TextButton {};
22000
22000
  MdTextButton.styles = [styles$m, styles$b];
22001
22001
  MdTextButton = __decorate([t$1('md-text-button')], MdTextButton);
22002
22002
 
22003
- /**
22004
- * @license
22005
- * Copyright 2025-2026 Open Home Foundation
22006
- * SPDX-License-Identifier: Apache-2.0
22007
- */
22008
- const showNodeBindingDialog = async (node, endpoint) => {
22009
- var _document$querySelect;
22010
- await import('./node-binding-dialog-B9IdqHrZ.js');
22011
- const dialog = document.createElement("node-binding-dialog");
22012
- dialog.node = node;
22013
- dialog.endpoint = endpoint;
22014
- (_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
22015
- };
22016
-
22017
22003
  /**
22018
22004
  * @license
22019
22005
  * Copyright 2026 Open Home Foundation
@@ -22021,7 +22007,7 @@ const showNodeBindingDialog = async (node, endpoint) => {
22021
22007
  */
22022
22008
  const showNodeLabelDialog = async (client, node) => {
22023
22009
  var _document$querySelect;
22024
- await import('./node-label-dialog-DVZSjsXU.js');
22010
+ await import('./node-label-dialog-T3nPG-Qy.js');
22025
22011
  const dialog = document.createElement("node-label-dialog");
22026
22012
  dialog.client = client;
22027
22013
  dialog.node = node;
@@ -26388,12 +26374,12 @@ function pickString(obj, key) {
26388
26374
  return typeof v === "string" ? v : null;
26389
26375
  }
26390
26376
 
26391
- var __defProp$k = Object.defineProperty;
26392
- var __getOwnPropDesc$l = Object.getOwnPropertyDescriptor;
26393
- var __decorateClass$n = (decorators, target, key, kind) => {
26394
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$l(target, key) : target;
26377
+ var __defProp$m = Object.defineProperty;
26378
+ var __getOwnPropDesc$n = Object.getOwnPropertyDescriptor;
26379
+ var __decorateClass$p = (decorators, target, key, kind) => {
26380
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$n(target, key) : target;
26395
26381
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
26396
- if (kind && result) __defProp$k(target, key, result);
26382
+ if (kind && result) __defProp$m(target, key, result);
26397
26383
  return result;
26398
26384
  };
26399
26385
  const STREAM_USAGE_LIVE_VIEW = 3;
@@ -27191,34 +27177,34 @@ WebRtcStreamView.styles = i$7`
27191
27177
  }
27192
27178
  }
27193
27179
  `;
27194
- __decorateClass$n([c$5({
27180
+ __decorateClass$p([c$5({
27195
27181
  context: clientContext,
27196
27182
  subscribe: true
27197
27183
  }), n$5({
27198
27184
  attribute: false
27199
27185
  })], WebRtcStreamView.prototype, "client", 2);
27200
- __decorateClass$n([n$5({
27186
+ __decorateClass$p([n$5({
27201
27187
  attribute: false
27202
27188
  })], WebRtcStreamView.prototype, "nodeId", 2);
27203
- __decorateClass$n([n$5({
27189
+ __decorateClass$p([n$5({
27204
27190
  type: Number
27205
27191
  })], WebRtcStreamView.prototype, "endpointId", 2);
27206
- __decorateClass$n([n$5({
27192
+ __decorateClass$p([n$5({
27207
27193
  type: Object
27208
27194
  })], WebRtcStreamView.prototype, "resolution", 2);
27209
- __decorateClass$n([n$5({
27195
+ __decorateClass$p([n$5({
27210
27196
  type: Boolean
27211
27197
  })], WebRtcStreamView.prototype, "watermarkEnabled", 2);
27212
- __decorateClass$n([n$5({
27198
+ __decorateClass$p([n$5({
27213
27199
  type: Boolean
27214
27200
  })], WebRtcStreamView.prototype, "osdEnabled", 2);
27215
- __decorateClass$n([r$3()], WebRtcStreamView.prototype, "_state", 2);
27216
- __decorateClass$n([r$3()], WebRtcStreamView.prototype, "_errorMessage", 2);
27217
- __decorateClass$n([n$5({
27201
+ __decorateClass$p([r$3()], WebRtcStreamView.prototype, "_state", 2);
27202
+ __decorateClass$p([r$3()], WebRtcStreamView.prototype, "_errorMessage", 2);
27203
+ __decorateClass$p([n$5({
27218
27204
  attribute: false
27219
27205
  })], WebRtcStreamView.prototype, "snapshotResolution", 2);
27220
- __decorateClass$n([e$6("video")], WebRtcStreamView.prototype, "_video", 2);
27221
- WebRtcStreamView = __decorateClass$n([t$1("webrtc-stream-view")], WebRtcStreamView);
27206
+ __decorateClass$p([e$6("video")], WebRtcStreamView.prototype, "_video", 2);
27207
+ WebRtcStreamView = __decorateClass$p([t$1("webrtc-stream-view")], WebRtcStreamView);
27222
27208
 
27223
27209
  /**
27224
27210
  * @license
@@ -27364,12 +27350,12 @@ function hasAvsumOnEndpoint(node, endpoint) {
27364
27350
  return Object.keys(node.attributes).some(k => k.startsWith(prefix));
27365
27351
  }
27366
27352
 
27367
- var __defProp$j = Object.defineProperty;
27368
- var __getOwnPropDesc$k = Object.getOwnPropertyDescriptor;
27369
- var __decorateClass$m = (decorators, target, key, kind) => {
27370
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$k(target, key) : target;
27353
+ var __defProp$l = Object.defineProperty;
27354
+ var __getOwnPropDesc$m = Object.getOwnPropertyDescriptor;
27355
+ var __decorateClass$o = (decorators, target, key, kind) => {
27356
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$m(target, key) : target;
27371
27357
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
27372
- if (kind && result) __defProp$j(target, key, result);
27358
+ if (kind && result) __defProp$l(target, key, result);
27373
27359
  return result;
27374
27360
  };
27375
27361
  let AvsumPtzStrip = class extends i$4 {
@@ -27671,36 +27657,36 @@ AvsumPtzStrip.styles = i$7`
27671
27657
  }
27672
27658
  }
27673
27659
  `;
27674
- __decorateClass$m([c$5({
27660
+ __decorateClass$o([c$5({
27675
27661
  context: clientContext,
27676
27662
  subscribe: true
27677
27663
  }), n$5({
27678
27664
  attribute: false
27679
27665
  })], AvsumPtzStrip.prototype, "client", 2);
27680
- __decorateClass$m([n$5({
27666
+ __decorateClass$o([n$5({
27681
27667
  attribute: false
27682
27668
  })], AvsumPtzStrip.prototype, "nodeId", 2);
27683
- __decorateClass$m([n$5({
27669
+ __decorateClass$o([n$5({
27684
27670
  type: Number
27685
27671
  })], AvsumPtzStrip.prototype, "endpointId", 2);
27686
- __decorateClass$m([n$5({
27672
+ __decorateClass$o([n$5({
27687
27673
  type: Number,
27688
27674
  attribute: false
27689
27675
  })], AvsumPtzStrip.prototype, "activeVideoStreamId", 2);
27690
- __decorateClass$m([n$5({
27676
+ __decorateClass$o([n$5({
27691
27677
  type: Object,
27692
27678
  attribute: false
27693
27679
  })], AvsumPtzStrip.prototype, "sensorSize", 2);
27694
- __decorateClass$m([r$3()], AvsumPtzStrip.prototype, "_mode", 2);
27695
- __decorateClass$m([r$3()], AvsumPtzStrip.prototype, "_toast", 2);
27696
- AvsumPtzStrip = __decorateClass$m([t$1("avsum-ptz-strip")], AvsumPtzStrip);
27680
+ __decorateClass$o([r$3()], AvsumPtzStrip.prototype, "_mode", 2);
27681
+ __decorateClass$o([r$3()], AvsumPtzStrip.prototype, "_toast", 2);
27682
+ AvsumPtzStrip = __decorateClass$o([t$1("avsum-ptz-strip")], AvsumPtzStrip);
27697
27683
 
27698
- var __defProp$i = Object.defineProperty;
27699
- var __getOwnPropDesc$j = Object.getOwnPropertyDescriptor;
27700
- var __decorateClass$l = (decorators, target, key, kind) => {
27701
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$j(target, key) : target;
27684
+ var __defProp$k = Object.defineProperty;
27685
+ var __getOwnPropDesc$l = Object.getOwnPropertyDescriptor;
27686
+ var __decorateClass$n = (decorators, target, key, kind) => {
27687
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$l(target, key) : target;
27702
27688
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
27703
- if (kind && result) __defProp$i(target, key, result);
27689
+ if (kind && result) __defProp$k(target, key, result);
27704
27690
  return result;
27705
27691
  };
27706
27692
  const HA_DEFAULT_RESOLUTIONS = [{
@@ -28176,35 +28162,35 @@ CameraOverlay.styles = i$7`
28176
28162
  font-style: normal;
28177
28163
  }
28178
28164
  `;
28179
- __decorateClass$l([c$5({
28165
+ __decorateClass$n([c$5({
28180
28166
  context: clientContext,
28181
28167
  subscribe: true
28182
28168
  }), n$5({
28183
28169
  attribute: false
28184
28170
  })], CameraOverlay.prototype, "client", 2);
28185
- __decorateClass$l([n$5({
28171
+ __decorateClass$n([n$5({
28186
28172
  attribute: false
28187
28173
  })], CameraOverlay.prototype, "nodeId", 2);
28188
- __decorateClass$l([n$5({
28174
+ __decorateClass$n([n$5({
28189
28175
  type: Number
28190
28176
  })], CameraOverlay.prototype, "endpointId", 2);
28191
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_state", 2);
28192
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_errorMessage", 2);
28193
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_snapshotDataUri", 2);
28194
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_snapshotResolution", 2);
28195
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_snapshotBusy", 2);
28196
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_snapshotError", 2);
28197
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_resolutions", 2);
28198
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_selectedResolution", 2);
28199
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_resolutionsLoading", 2);
28200
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_closing", 2);
28201
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_activeVideoStreamId", 2);
28202
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_muted", 2);
28203
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_watermarkEnabled", 2);
28204
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_osdEnabled", 2);
28205
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_snapshotResolutions", 2);
28206
- __decorateClass$l([r$3()], CameraOverlay.prototype, "_selectedSnapshotResolution", 2);
28207
- CameraOverlay = __decorateClass$l([t$1("camera-overlay")], CameraOverlay);
28177
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_state", 2);
28178
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_errorMessage", 2);
28179
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_snapshotDataUri", 2);
28180
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_snapshotResolution", 2);
28181
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_snapshotBusy", 2);
28182
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_snapshotError", 2);
28183
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_resolutions", 2);
28184
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_selectedResolution", 2);
28185
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_resolutionsLoading", 2);
28186
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_closing", 2);
28187
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_activeVideoStreamId", 2);
28188
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_muted", 2);
28189
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_watermarkEnabled", 2);
28190
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_osdEnabled", 2);
28191
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_snapshotResolutions", 2);
28192
+ __decorateClass$n([r$3()], CameraOverlay.prototype, "_selectedSnapshotResolution", 2);
28193
+ CameraOverlay = __decorateClass$n([t$1("camera-overlay")], CameraOverlay);
28208
28194
 
28209
28195
  /**
28210
28196
  * @license
@@ -28558,87 +28544,14 @@ function createWiFiRouterIconDataUrl(isSelected = false) {
28558
28544
  return createIconDataUrl(mdiWifi, color);
28559
28545
  }
28560
28546
 
28561
- /**
28562
- * @license
28563
- * Copyright 2018 Google LLC
28564
- * SPDX-License-Identifier: BSD-3-Clause
28565
- */
28566
- const e = {},
28567
- i = e$4(class extends i$3 {
28568
- constructor() {
28569
- super(...arguments), this.ot = e;
28570
- }
28571
- render(r, t) {
28572
- return t();
28573
- }
28574
- update(t, [s, e]) {
28575
- if (Array.isArray(s)) {
28576
- if (Array.isArray(this.ot) && this.ot.length === s.length && s.every((r, t) => r === this.ot[t])) return E;
28577
- } else if (this.ot === s) return E;
28578
- return this.ot = Array.isArray(s) ? Array.from(s) : s, this.render(s, e);
28579
- }
28580
- });
28581
-
28582
- /**
28583
- * @license
28584
- * Copyright 2025-2026 Open Home Foundation
28585
- * SPDX-License-Identifier: Apache-2.0
28586
- */
28587
- function formatHex(value) {
28588
- let hex = value.toString(16).toUpperCase();
28589
- if (hex.length < 4) {
28590
- hex = hex.padStart(4, "0");
28591
- } else if (hex.length % 2 !== 0) {
28592
- hex = "0" + hex;
28593
- }
28594
- return `0x${hex}`;
28595
- }
28596
- function formatNodeAddress(fabricIndex, nodeId) {
28597
- const fabricPart = fabricIndex !== void 0 ? fabricIndex : "?";
28598
- return `@${fabricPart}:${nodeId.toString(16)}`;
28599
- }
28600
- function getEffectiveFabricIndex(serverFabricIndex, isTestNode) {
28601
- return isTestNode || serverFabricIndex === void 0 ? void 0 : serverFabricIndex;
28602
- }
28603
- function formatNodeAddressFromAny(fabricIndex, nodeId) {
28604
- let numericId;
28605
- if (typeof nodeId === "bigint") {
28606
- numericId = nodeId;
28607
- } else if (typeof nodeId === "number") {
28608
- numericId = BigInt(nodeId);
28609
- } else {
28610
- try {
28611
- numericId = BigInt(nodeId);
28612
- } catch {
28613
- return "";
28614
- }
28615
- }
28616
- return formatNodeAddress(fabricIndex, numericId);
28617
- }
28618
-
28619
28547
  /**
28620
28548
  * @license
28621
28549
  * Copyright 2025-2026 Open Home Foundation
28622
28550
  * SPDX-License-Identifier: Apache-2.0
28623
28551
  */
28624
- const bindingContext = n$9("binding");
28625
-
28626
- var __defProp$h = Object.defineProperty;
28627
- var __getOwnPropDesc$i = Object.getOwnPropertyDescriptor;
28628
- var __decorateClass$k = (decorators, target, key, kind) => {
28629
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$i(target, key) : target;
28630
- for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
28631
- if (kind && result) __defProp$h(target, key, result);
28632
- return result;
28633
- };
28634
- function getUniqueClusters(node, endpoint) {
28635
- return Array.from(new Set(Object.keys(node.attributes).filter(key => key.startsWith(`${endpoint.toString()}/`)).map(key => Number(key.split("/")[1])))).sort((a, b) => {
28636
- return a - b;
28637
- });
28638
- }
28639
28552
  function getEndpointDeviceTypes(node, endpoint) {
28640
28553
  const rawValues = node.attributes[`${endpoint}/29/0`];
28641
- if (!rawValues) return [];
28554
+ if (!rawValues) return new Array();
28642
28555
  return rawValues.map(rawValue => {
28643
28556
  const id = rawValue["0"] ?? rawValue["deviceType"];
28644
28557
  return device_types[id] ?? {
@@ -28648,127 +28561,20 @@ function getEndpointDeviceTypes(node, endpoint) {
28648
28561
  };
28649
28562
  });
28650
28563
  }
28651
- let MatterEndpointView = class extends i$4 {
28652
- constructor() {
28653
- super(...arguments);
28654
- this._tick = 0;
28655
- }
28656
- render() {
28657
- var _this$node;
28658
- if (!this.node || this.endpoint == void 0) {
28659
- return b`
28660
- <dashboard-header title="Not found" backButton="#"></dashboard-header>
28661
- <div class="not-found">
28662
- <ha-svg-icon .path=${mdiAlertCircleOutline}></ha-svg-icon>
28663
- <p>Node or endpoint not found</p>
28664
- <md-outlined-button @click=${this._goBack}>Back</md-outlined-button>
28665
- </div>
28666
- `;
28667
- }
28668
- const fabricIndex = getEffectiveFabricIndex(this.client.serverInfo.fabric_index, isTestNodeId(this.node.node_id));
28669
- const nodeHex = formatNodeAddress(fabricIndex, this.node.node_id);
28670
- return b`
28671
- <dashboard-header
28672
- .title=${`Node ${this.node.node_id} ${nodeHex} | Endpoint ${this.endpoint}`}
28673
- .backButton=${`#node/${this.node.node_id}`}
28674
- ></dashboard-header>
28675
-
28676
- <!-- node details section -->
28677
- <div class="container">
28678
- <node-details .node=${this.node}></node-details>
28679
- </div>
28680
-
28681
- <!-- Endpoint clusters listing -->
28682
- <div class="container">
28683
- <md-list>
28684
- <md-list-item>
28685
- <div slot="headline">
28686
- <b>Clusters on Endpoint ${this.endpoint}</b>
28687
- </div>
28688
- <div slot="supporting-text">
28689
- Device Type(s):
28690
- ${getEndpointDeviceTypes(this.node, this.endpoint).map(deviceType => {
28691
- return deviceType.label;
28692
- }).join(" / ")}
28693
- </div>
28694
- </md-list-item>
28695
- ${i([(_this$node = this.node) === null || _this$node === void 0 ? void 0 : _this$node.attributes.length], () => getUniqueClusters(this.node, this.endpoint).map(cluster => {
28696
- var _clusters$cluster;
28697
- return b`
28698
- <md-list-item
28699
- type="link"
28700
- href=${`#node/${this.node.node_id}/${this.endpoint}/${cluster}`}
28701
- >
28702
- <div slot="headline">${((_clusters$cluster = clusters[cluster]) === null || _clusters$cluster === void 0 ? void 0 : _clusters$cluster.label) ?? "Custom/Unknown Cluster"}</div>
28703
- <div slot="supporting-text">ClusterId ${cluster} (${formatHex(cluster)})</div>
28704
- <ha-svg-icon slot="end" .path=${mdiChevronRight}></ha-svg-icon>
28705
- </md-list-item>
28706
- `;
28707
- }))}
28708
- </md-list>
28709
- </div>
28710
- `;
28711
- }
28712
- _goBack() {
28713
- history.back();
28714
- }
28715
- };
28716
- MatterEndpointView.styles = [notFoundStyles, i$7`
28717
- :host {
28718
- display: block;
28719
- background-color: var(--md-sys-color-background);
28720
- }
28721
-
28722
- .header {
28723
- background-color: var(--md-sys-color-primary);
28724
- color: var(--md-sys-color-on-primary);
28725
- --icon-primary-color: var(--md-sys-color-on-primary);
28726
- font-weight: 400;
28727
- display: flex;
28728
- align-items: center;
28729
- padding-right: 8px;
28730
- height: 48px;
28731
- }
28732
-
28733
- md-icon-button {
28734
- margin-right: 8px;
28735
- }
28736
-
28737
- .flex {
28738
- flex: 1;
28739
- }
28740
-
28741
- .container {
28742
- padding: 16px;
28743
- max-width: 95%;
28744
- margin: 0 auto;
28745
- }
28746
28564
 
28747
- .status {
28748
- color: var(--danger-color);
28749
- font-weight: bold;
28750
- font-size: 0.8em;
28751
- }
28752
- `];
28753
- __decorateClass$k([c$5({
28754
- context: clientContext
28755
- })], MatterEndpointView.prototype, "client", 2);
28756
- __decorateClass$k([c$5({
28757
- context: tickContext,
28758
- subscribe: true
28759
- })], MatterEndpointView.prototype, "_tick", 2);
28760
- __decorateClass$k([n$5()], MatterEndpointView.prototype, "node", 2);
28761
- __decorateClass$k([e$b({
28762
- context: bindingContext
28763
- }), n$5()], MatterEndpointView.prototype, "endpoint", 2);
28764
- MatterEndpointView = __decorateClass$k([t$1("matter-endpoint-view")], MatterEndpointView);
28565
+ /**
28566
+ * @license
28567
+ * Copyright 2025-2026 Open Home Foundation
28568
+ * SPDX-License-Identifier: Apache-2.0
28569
+ */
28570
+ const bindingContext = n$9("binding");
28765
28571
 
28766
- var __defProp$g = Object.defineProperty;
28767
- var __getOwnPropDesc$h = Object.getOwnPropertyDescriptor;
28768
- var __decorateClass$j = (decorators, target, key, kind) => {
28769
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$h(target, key) : target;
28572
+ var __defProp$j = Object.defineProperty;
28573
+ var __getOwnPropDesc$k = Object.getOwnPropertyDescriptor;
28574
+ var __decorateClass$m = (decorators, target, key, kind) => {
28575
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$k(target, key) : target;
28770
28576
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
28771
- if (kind && result) __defProp$g(target, key, result);
28577
+ if (kind && result) __defProp$j(target, key, result);
28772
28578
  return result;
28773
28579
  };
28774
28580
  const UPDATE_STATE_LABELS = {
@@ -28806,7 +28612,6 @@ let NodeDetails = class extends i$4 {
28806
28612
  }
28807
28613
  render() {
28808
28614
  if (!this.node) return b``;
28809
- const bindings = this.node.attributes[this.endpoint + "/30/0"];
28810
28615
  const deviceTypeIds = getEndpointDeviceTypes(this.node, this.endpoint).map(d => d.id);
28811
28616
  const isCamera = deviceTypeIds.includes(322) || deviceTypeIds.includes(323);
28812
28617
  return b`
@@ -28868,13 +28673,6 @@ let NodeDetails = class extends i$4 {
28868
28673
  <ha-svg-icon slot="icon" .path=${mdiVideo}></ha-svg-icon>
28869
28674
  </md-outlined-button>
28870
28675
  ` : A}
28871
- ${bindings ? b`
28872
- <md-outlined-button @click=${handleAsync(() => this._binding())}>
28873
- Binding
28874
- <ha-svg-icon slot="icon" .path=${mdiLink}></ha-svg-icon>
28875
- </md-outlined-button>
28876
- ` : A}
28877
-
28878
28676
  <md-outlined-button @click=${handleAsync(() => this._openCommissioningWindow())}
28879
28677
  >Share<ha-svg-icon slot="icon" .path=${mdiShareVariant}></ha-svg-icon
28880
28678
  ></md-outlined-button>
@@ -28929,13 +28727,6 @@ let NodeDetails = class extends i$4 {
28929
28727
  });
28930
28728
  }
28931
28729
  }
28932
- async _binding() {
28933
- try {
28934
- showNodeBindingDialog(this.node, this.endpoint);
28935
- } catch (err) {
28936
- console.error("Binding error:", err);
28937
- }
28938
- }
28939
28730
  _openCameraOverlay() {
28940
28731
  const overlay = document.createElement("camera-overlay");
28941
28732
  overlay.nodeId = this.node.node_id;
@@ -29072,19 +28863,56 @@ NodeDetails.styles = i$7`
29072
28863
  font-size: 0.8em;
29073
28864
  }
29074
28865
  `;
29075
- __decorateClass$j([c$5({
28866
+ __decorateClass$m([c$5({
29076
28867
  context: clientContext
29077
28868
  })], NodeDetails.prototype, "client", 2);
29078
- __decorateClass$j([c$5({
28869
+ __decorateClass$m([c$5({
29079
28870
  context: tickContext,
29080
28871
  subscribe: true
29081
28872
  })], NodeDetails.prototype, "_tick", 2);
29082
- __decorateClass$j([n$5()], NodeDetails.prototype, "node", 2);
29083
- __decorateClass$j([r$3()], NodeDetails.prototype, "_updateInitiated", 2);
29084
- __decorateClass$j([c$5({
28873
+ __decorateClass$m([n$5()], NodeDetails.prototype, "node", 2);
28874
+ __decorateClass$m([r$3()], NodeDetails.prototype, "_updateInitiated", 2);
28875
+ __decorateClass$m([c$5({
29085
28876
  context: bindingContext
29086
28877
  })], NodeDetails.prototype, "endpoint", 2);
29087
- NodeDetails = __decorateClass$j([t$1("node-details")], NodeDetails);
28878
+ NodeDetails = __decorateClass$m([t$1("node-details")], NodeDetails);
28879
+
28880
+ /**
28881
+ * @license
28882
+ * Copyright 2025-2026 Open Home Foundation
28883
+ * SPDX-License-Identifier: Apache-2.0
28884
+ */
28885
+ function formatHex(value) {
28886
+ let hex = value.toString(16).toUpperCase();
28887
+ if (hex.length < 4) {
28888
+ hex = hex.padStart(4, "0");
28889
+ } else if (hex.length % 2 !== 0) {
28890
+ hex = "0" + hex;
28891
+ }
28892
+ return `0x${hex}`;
28893
+ }
28894
+ function formatNodeAddress(fabricIndex, nodeId) {
28895
+ const fabricPart = fabricIndex !== void 0 ? fabricIndex : "?";
28896
+ return `@${fabricPart}:${nodeId.toString(16)}`;
28897
+ }
28898
+ function getEffectiveFabricIndex(serverFabricIndex, isTestNode) {
28899
+ return isTestNode || serverFabricIndex === void 0 ? void 0 : serverFabricIndex;
28900
+ }
28901
+ function formatNodeAddressFromAny(fabricIndex, nodeId) {
28902
+ let numericId;
28903
+ if (typeof nodeId === "bigint") {
28904
+ numericId = nodeId;
28905
+ } else if (typeof nodeId === "number") {
28906
+ numericId = BigInt(nodeId);
28907
+ } else {
28908
+ try {
28909
+ numericId = BigInt(nodeId);
28910
+ } catch {
28911
+ return "";
28912
+ }
28913
+ }
28914
+ return formatNodeAddress(fabricIndex, numericId);
28915
+ }
29088
28916
 
29089
28917
  /**
29090
28918
  * @license
@@ -29099,12 +28927,12 @@ function getClusterCommandsTag(clusterId) {
29099
28927
  return clusterCommandRegistry.get(clusterId);
29100
28928
  }
29101
28929
 
29102
- var _staticBlock$1;
29103
- var __defProp$f = Object.defineProperty;
29104
- var __decorateClass$i = (decorators, target, key, kind) => {
28930
+ var _staticBlock$3;
28931
+ var __defProp$i = Object.defineProperty;
28932
+ var __decorateClass$l = (decorators, target, key, kind) => {
29105
28933
  var result = void 0 ;
29106
28934
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (decorator(target, key, result) ) || result;
29107
- if (result) __defProp$f(target, key, result);
28935
+ if (result) __defProp$i(target, key, result);
29108
28936
  return result;
29109
28937
  };
29110
28938
  class BaseClusterCommands extends i$4 {
@@ -29124,7 +28952,7 @@ class BaseClusterCommands extends i$4 {
29124
28952
  console.error(`Failed to send command ${command}:`, error);
29125
28953
  }
29126
28954
  }
29127
- static #_ = _staticBlock$1 = () => this.styles = [reducedMotionStyles, i$7`
28955
+ static #_ = _staticBlock$3 = () => this.styles = [reducedMotionStyles, i$7`
29128
28956
  :host {
29129
28957
  display: block;
29130
28958
  color: var(--md-sys-color-on-surface);
@@ -29206,30 +29034,782 @@ class BaseClusterCommands extends i$4 {
29206
29034
  }
29207
29035
  `];
29208
29036
  }
29209
- _staticBlock$1();
29210
- __decorateClass$i([c$5({
29037
+ _staticBlock$3();
29038
+ __decorateClass$l([c$5({
29211
29039
  context: clientContext
29212
29040
  })], BaseClusterCommands.prototype, "client");
29213
- __decorateClass$i([c$5({
29041
+ __decorateClass$l([c$5({
29214
29042
  context: tickContext,
29215
29043
  subscribe: true
29216
29044
  })], BaseClusterCommands.prototype, "_tick");
29217
- __decorateClass$i([n$5({
29045
+ __decorateClass$l([n$5({
29218
29046
  attribute: false
29219
29047
  })], BaseClusterCommands.prototype, "node");
29220
- __decorateClass$i([n$5({
29048
+ __decorateClass$l([n$5({
29221
29049
  type: Number
29222
29050
  })], BaseClusterCommands.prototype, "endpoint");
29223
- __decorateClass$i([n$5({
29051
+ __decorateClass$l([n$5({
29224
29052
  type: Number
29225
29053
  })], BaseClusterCommands.prototype, "cluster");
29226
29054
 
29227
- var __defProp$e = Object.defineProperty;
29228
- var __getOwnPropDesc$g = Object.getOwnPropertyDescriptor;
29229
- var __decorateClass$h = (decorators, target, key, kind) => {
29230
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$g(target, key) : target;
29055
+ var _staticBlock$2, _staticBlock2;
29056
+ /**
29057
+ * @license
29058
+ * Copyright 2025-2026 Open Home Foundation
29059
+ * SPDX-License-Identifier: Apache-2.0
29060
+ */
29061
+ function isRecord$1(value) {
29062
+ return typeof value === "object" && value !== null;
29063
+ }
29064
+ class AccessControlTargetTransformer {
29065
+ static transform(input) {
29066
+ if (!isRecord$1(input)) {
29067
+ throw new Error("Invalid input: expected an object");
29068
+ }
29069
+ const result = {};
29070
+ const keyMapping = AccessControlTargetTransformer.KEY_MAPPING;
29071
+ for (const key in input) {
29072
+ if (key in keyMapping) {
29073
+ const mappedKey = keyMapping[key];
29074
+ if (mappedKey) {
29075
+ const value = input[key];
29076
+ if (value == null) continue;
29077
+ result[mappedKey] = Number(value);
29078
+ }
29079
+ }
29080
+ }
29081
+ return result;
29082
+ }
29083
+ static #_ = _staticBlock$2 = () => this.KEY_MAPPING = {
29084
+ "0": "cluster",
29085
+ "1": "endpoint",
29086
+ "2": "deviceType"
29087
+ };
29088
+ }
29089
+ _staticBlock$2();
29090
+ class AccessControlEntryDataTransformer {
29091
+ static transform(input) {
29092
+ if (!isRecord$1(input)) {
29093
+ throw new Error("Invalid input: expected an object");
29094
+ }
29095
+ const result = {};
29096
+ const keyMapping = AccessControlEntryDataTransformer.KEY_MAPPING;
29097
+ for (const key in input) {
29098
+ if (key in keyMapping) {
29099
+ const mappedKey = keyMapping[key];
29100
+ if (mappedKey) {
29101
+ const value = input[key];
29102
+ if (value == null) continue;
29103
+ if (mappedKey === "subjects") {
29104
+ result.subjects = Array.isArray(value) ? value : void 0;
29105
+ } else if (mappedKey === "targets") {
29106
+ result.targets = Array.isArray(value) ? value.map(val => AccessControlTargetTransformer.transform(val)) : void 0;
29107
+ } else {
29108
+ result[mappedKey] = Number(value);
29109
+ }
29110
+ }
29111
+ }
29112
+ }
29113
+ return result;
29114
+ }
29115
+ static #_ = _staticBlock2 = () => this.KEY_MAPPING = {
29116
+ "1": "privilege",
29117
+ "2": "authMode",
29118
+ "3": "subjects",
29119
+ "4": "targets",
29120
+ "254": "fabricIndex"
29121
+ };
29122
+ }
29123
+ _staticBlock2();
29124
+
29125
+ /**
29126
+ * @license
29127
+ * Copyright 2025-2026 Open Home Foundation
29128
+ * SPDX-License-Identifier: Apache-2.0
29129
+ */
29130
+ var Privilege = /* @__PURE__ */(Privilege2 => {
29131
+ Privilege2[Privilege2["View"] = 1] = "View";
29132
+ Privilege2[Privilege2["ProxyView"] = 2] = "ProxyView";
29133
+ Privilege2[Privilege2["Operate"] = 3] = "Operate";
29134
+ Privilege2[Privilege2["Manage"] = 4] = "Manage";
29135
+ Privilege2[Privilege2["Administer"] = 5] = "Administer";
29136
+ return Privilege2;
29137
+ })(Privilege || {});
29138
+ var AuthMode = /* @__PURE__ */(AuthMode2 => {
29139
+ AuthMode2[AuthMode2["Pase"] = 1] = "Pase";
29140
+ AuthMode2[AuthMode2["Case"] = 2] = "Case";
29141
+ AuthMode2[AuthMode2["Group"] = 3] = "Group";
29142
+ return AuthMode2;
29143
+ })(AuthMode || {});
29144
+ const PRIVILEGE_NAMES = {
29145
+ [1 /* View */]: "View",
29146
+ [2 /* ProxyView */]: "ProxyView",
29147
+ [3 /* Operate */]: "Operate",
29148
+ [4 /* Manage */]: "Manage",
29149
+ [5 /* Administer */]: "Administer"
29150
+ };
29151
+ const AUTH_MODE_NAMES = {
29152
+ [1 /* Pase */]: "PASE",
29153
+ [2 /* Case */]: "CASE",
29154
+ [3 /* Group */]: "Group"
29155
+ };
29156
+ function nodeIdKey(id) {
29157
+ return String(id);
29158
+ }
29159
+ function attributeArray(value) {
29160
+ if (Array.isArray(value)) return value;
29161
+ if (value && typeof value === "object") return Object.values(value);
29162
+ return new Array();
29163
+ }
29164
+ function readAclEntries(node) {
29165
+ return attributeArray(node.attributes["0/31/0"]).map(value => AccessControlEntryDataTransformer.transform(value));
29166
+ }
29167
+ function entriesForFabric(entries, fabricIndex) {
29168
+ if (fabricIndex === void 0) return entries;
29169
+ return entries.filter(e => e.fabricIndex === fabricIndex);
29170
+ }
29171
+ function nodeFabricIndex(node) {
29172
+ const v = node.attributes["0/62/5"];
29173
+ return typeof v === "number" ? v : void 0;
29174
+ }
29175
+ function isWholeNode(entry) {
29176
+ return !entry.targets || entry.targets.length === 0;
29177
+ }
29178
+ function entryMatchesTarget(entry, endpoint, cluster) {
29179
+ if (isWholeNode(entry)) return true;
29180
+ return entry.targets.some(t => {
29181
+ const endpointMatch = t.endpoint == null || t.endpoint === endpoint;
29182
+ const clusterMatch = cluster == null ? t.cluster == null : t.cluster == null || t.cluster === cluster;
29183
+ return endpointMatch && clusterMatch;
29184
+ });
29185
+ }
29186
+ function aclCapacity(node) {
29187
+ const num = (key, fallback) => {
29188
+ const v = node.attributes[key];
29189
+ return typeof v === "number" ? v : fallback;
29190
+ };
29191
+ return {
29192
+ max: num("0/31/4", 0),
29193
+ subjectsMax: num("0/31/2", 0),
29194
+ targetsMax: num("0/31/3", 0)
29195
+ };
29196
+ }
29197
+ function aclEntryKey(entry) {
29198
+ const subjects = (entry.subjects ?? []).map(nodeIdKey).sort();
29199
+ const targets = (entry.targets ?? []).map(t => `${t.endpoint ?? ""}:${t.cluster ?? ""}:${t.deviceType ?? ""}`).sort();
29200
+ return JSON.stringify([entry.fabricIndex, entry.privilege, entry.authMode, subjects, targets]);
29201
+ }
29202
+ function subjectsInclude(entry, nodeId) {
29203
+ const key = nodeIdKey(nodeId);
29204
+ return (entry.subjects ?? []).some(s => nodeIdKey(s) === key);
29205
+ }
29206
+ function isProtectedAdmin(entry, controllerNodeId) {
29207
+ if (controllerNodeId === void 0) return false;
29208
+ return entry.privilege === 5 /* Administer */ && entry.authMode === 2 /* Case */ && subjectsInclude(entry, controllerNodeId);
29209
+ }
29210
+
29211
+ /**
29212
+ * @license
29213
+ * Copyright 2025-2026 Open Home Foundation
29214
+ * SPDX-License-Identifier: Apache-2.0
29215
+ */
29216
+ function toApiAcl$1(e) {
29217
+ var _e$targets;
29218
+ return {
29219
+ privilege: e.privilege,
29220
+ auth_mode: e.authMode,
29221
+ subjects: e.subjects ?? null,
29222
+ targets: ((_e$targets = e.targets) === null || _e$targets === void 0 ? void 0 : _e$targets.map(t => ({
29223
+ cluster: t.cluster ?? null,
29224
+ endpoint: t.endpoint ?? null,
29225
+ device_type: t.deviceType ?? null
29226
+ }))) ?? null
29227
+ };
29228
+ }
29229
+ async function freshOurAcl$1(client, nodeId) {
29230
+ const res = await client.readAttribute(nodeId, ["0/31/0", "0/62/5"]);
29231
+ const all = attributeArray(res["0/31/0"]).map(v => AccessControlEntryDataTransformer.transform(v));
29232
+ const fi = res["0/62/5"];
29233
+ if (typeof fi !== "number") {
29234
+ throw new Error(`Cannot determine the current fabric index (0/62/5) for node ${nodeId}`);
29235
+ }
29236
+ return entriesForFabric(all, fi);
29237
+ }
29238
+ async function addAclEntry(client, nodeId, entry) {
29239
+ const acl = await freshOurAcl$1(client, nodeId);
29240
+ acl.push(entry);
29241
+ await client.setACLEntry(nodeId, acl.map(toApiAcl$1));
29242
+ }
29243
+ async function deleteAclEntry(client, nodeId, key) {
29244
+ const acl = await freshOurAcl$1(client, nodeId);
29245
+ let removed = false;
29246
+ const kept = acl.filter(e => {
29247
+ if (!removed && aclEntryKey(e) === key) {
29248
+ removed = true;
29249
+ return false;
29250
+ }
29251
+ return true;
29252
+ });
29253
+ await client.setACLEntry(nodeId, kept.map(toApiAcl$1));
29254
+ }
29255
+ async function downgradeToOperate(client, nodeId, keys) {
29256
+ const acl = await freshOurAcl$1(client, nodeId);
29257
+ const updated = acl.map(e => keys.has(aclEntryKey(e)) ? {
29258
+ ...e,
29259
+ privilege: Privilege.Operate
29260
+ } : e);
29261
+ await client.setACLEntry(nodeId, updated.map(toApiAcl$1));
29262
+ }
29263
+
29264
+ /**
29265
+ * @license
29266
+ * Copyright 2025-2026 Open Home Foundation
29267
+ * SPDX-License-Identifier: Apache-2.0
29268
+ */
29269
+ const showNodeAclAddDialog = async node => {
29270
+ var _document$querySelect;
29271
+ await import('./node-acl-add-dialog-DlR-sF-b.js');
29272
+ const dialog = document.createElement("node-acl-add-dialog");
29273
+ dialog.node = node;
29274
+ (_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
29275
+ };
29276
+
29277
+ var _staticBlock$1;
29278
+ /**
29279
+ * @license
29280
+ * Copyright 2025-2026 Open Home Foundation
29281
+ * SPDX-License-Identifier: Apache-2.0
29282
+ */
29283
+ function isRecord(value) {
29284
+ return typeof value === "object" && value !== null;
29285
+ }
29286
+ class BindingEntryDataTransformer {
29287
+ static transform(input) {
29288
+ if (!isRecord(input)) {
29289
+ throw new Error("Invalid input: expected an object");
29290
+ }
29291
+ const result = {};
29292
+ const keyMapping = BindingEntryDataTransformer.KEY_MAPPING;
29293
+ for (const key in input) {
29294
+ if (key in keyMapping) {
29295
+ const mappedKey = keyMapping[key];
29296
+ if (mappedKey) {
29297
+ const value = input[key];
29298
+ if (value == null) {
29299
+ continue;
29300
+ }
29301
+ if (mappedKey === "node") {
29302
+ if (typeof value === "number" || typeof value === "bigint") {
29303
+ result.node = value;
29304
+ }
29305
+ } else {
29306
+ result[mappedKey] = Number(value);
29307
+ }
29308
+ }
29309
+ }
29310
+ }
29311
+ return result;
29312
+ }
29313
+ static #_ = _staticBlock$1 = () => this.KEY_MAPPING = {
29314
+ "1": "node",
29315
+ "2": "group",
29316
+ "3": "endpoint",
29317
+ "4": "cluster",
29318
+ "254": "fabricIndex"
29319
+ };
29320
+ }
29321
+ _staticBlock$1();
29322
+
29323
+ /**
29324
+ * @license
29325
+ * Copyright 2025-2026 Open Home Foundation
29326
+ * SPDX-License-Identifier: Apache-2.0
29327
+ */
29328
+ const BINDING_KEY_RE = /^(\d+)\/30\/0$/;
29329
+ function readBindings(node, endpoint) {
29330
+ return attributeArray(node.attributes[`${endpoint}/30/0`]).map(value => BindingEntryDataTransformer.transform(value));
29331
+ }
29332
+ function readAllBindings(node) {
29333
+ const result = new Array();
29334
+ for (const key of Object.keys(node.attributes)) {
29335
+ const m = BINDING_KEY_RE.exec(key);
29336
+ if (!m) continue;
29337
+ const endpoint = Number(m[1]);
29338
+ for (const value of attributeArray(node.attributes[key])) {
29339
+ result.push({
29340
+ endpoint,
29341
+ binding: BindingEntryDataTransformer.transform(value)
29342
+ });
29343
+ }
29344
+ }
29345
+ return result;
29346
+ }
29347
+ function numberList(node, key) {
29348
+ const raw = node.attributes[key];
29349
+ if (!Array.isArray(raw)) return new Array();
29350
+ return raw.map(v => Number(v));
29351
+ }
29352
+ function targetServerClusters(node, endpoint) {
29353
+ return numberList(node, `${endpoint}/29/1`);
29354
+ }
29355
+ function sourceClientClusters(node, endpoint) {
29356
+ return numberList(node, `${endpoint}/29/2`);
29357
+ }
29358
+ function bindableClusters(source, sourceEndpoint, target, targetEndpoint) {
29359
+ const client = new Set(sourceClientClusters(source, sourceEndpoint));
29360
+ const server = targetServerClusters(target, targetEndpoint);
29361
+ const bindable = new Array();
29362
+ const otherTarget = new Array();
29363
+ for (const c of server) {
29364
+ if (client.has(c)) bindable.push(c);else otherTarget.push(c);
29365
+ }
29366
+ return {
29367
+ bindable,
29368
+ otherTarget
29369
+ };
29370
+ }
29371
+ function reverseAclState(sourceNodeId, binding, targetNode) {
29372
+ if (!targetNode || !targetNode.available) return {
29373
+ state: "cannotVerify"
29374
+ };
29375
+ const matching = entriesForFabric(readAclEntries(targetNode), nodeFabricIndex(targetNode)).filter(e => e.authMode === AuthMode.Case && subjectsInclude(e, sourceNodeId) && entryMatchesTarget(e, binding.endpoint ?? -1, binding.cluster));
29376
+ const granting = matching.filter(e => e.privilege >= Privilege.Operate);
29377
+ if (granting.length === 0) return {
29378
+ state: "missing"
29379
+ };
29380
+ if (granting.some(e => e.privilege === Privilege.Operate)) return {
29381
+ state: "present"
29382
+ };
29383
+ return {
29384
+ state: "overPrivileged"
29385
+ };
29386
+ }
29387
+ function detectBindingRelationship(entry, viewedNodeId, allNodes) {
29388
+ if (entry.authMode !== AuthMode.Case) return {
29389
+ kind: "none"
29390
+ };
29391
+ const viewedKey = nodeIdKey(viewedNodeId);
29392
+ for (const subject of entry.subjects ?? []) {
29393
+ const sourceKey = nodeIdKey(subject);
29394
+ const source = allNodes.find(n => nodeIdKey(n.node_id) === sourceKey);
29395
+ if (!source || !source.available) continue;
29396
+ for (const {
29397
+ endpoint,
29398
+ binding
29399
+ } of readAllBindings(source)) {
29400
+ if (binding.node == null) continue;
29401
+ if (nodeIdKey(binding.node) !== viewedKey) continue;
29402
+ if (!entryMatchesTarget(entry, binding.endpoint ?? -1, binding.cluster)) continue;
29403
+ const kind = entry.privilege > Privilege.Operate ? "overPrivileged" : "backs";
29404
+ return {
29405
+ kind,
29406
+ sourceNodeId: source.node_id,
29407
+ sourceEndpoint: endpoint
29408
+ };
29409
+ }
29410
+ }
29411
+ return {
29412
+ kind: "none"
29413
+ };
29414
+ }
29415
+ function targetAclCapacityForBinding(targetNode, sourceNodeId) {
29416
+ const fabricIndex = nodeFabricIndex(targetNode);
29417
+ if (fabricIndex === void 0) return {
29418
+ canAdd: true
29419
+ };
29420
+ const entries = entriesForFabric(readAclEntries(targetNode), fabricIndex);
29421
+ const targetsMaxRaw = targetNode.attributes["0/31/3"];
29422
+ const targetsMax = typeof targetsMaxRaw === "number" && targetsMaxRaw > 0 ? targetsMaxRaw : Number.MAX_SAFE_INTEGER;
29423
+ const reusable = entries.some(e => {
29424
+ var _e$targets;
29425
+ return e.authMode === AuthMode.Case && e.privilege >= Privilege.Operate && subjectsInclude(e, sourceNodeId) && (isWholeNode(e) || (((_e$targets = e.targets) === null || _e$targets === void 0 ? void 0 : _e$targets.length) ?? 0) < targetsMax);
29426
+ });
29427
+ if (reusable) return {
29428
+ canAdd: true
29429
+ };
29430
+ const maxRaw = targetNode.attributes["0/31/4"];
29431
+ const max = typeof maxRaw === "number" ? maxRaw : 0;
29432
+ if (max > 0 && entries.length >= max) {
29433
+ return {
29434
+ canAdd: false,
29435
+ reason: "Target node's access control list is full."
29436
+ };
29437
+ }
29438
+ return {
29439
+ canAdd: true
29440
+ };
29441
+ }
29442
+
29443
+ /**
29444
+ * @license
29445
+ * Copyright 2025-2026 Open Home Foundation
29446
+ * SPDX-License-Identifier: Apache-2.0
29447
+ */
29448
+ function getDeviceName(node) {
29449
+ if (node.nodeLabel) return node.nodeLabel;
29450
+ const productName = node.productName || "Unknown Device";
29451
+ const serialNumber = node.serialNumber;
29452
+ return serialNumber ? `${productName} (${serialNumber})` : productName;
29453
+ }
29454
+
29455
+ var __defProp$h = Object.defineProperty;
29456
+ var __getOwnPropDesc$j = Object.getOwnPropertyDescriptor;
29457
+ var __decorateClass$k = (decorators, target, key, kind) => {
29458
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$j(target, key) : target;
29231
29459
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
29232
- if (kind && result) __defProp$e(target, key, result);
29460
+ if (kind && result) __defProp$h(target, key, result);
29461
+ return result;
29462
+ };
29463
+ const CLUSTER_ID$3 = 31;
29464
+ let AccessControlClusterCommands = class extends BaseClusterCommands {
29465
+ constructor() {
29466
+ super(...arguments);
29467
+ this._loadedKey = "";
29468
+ this._busy = false;
29469
+ }
29470
+ updated(changed) {
29471
+ super.updated(changed);
29472
+ if (changed.has("client") && this.client && !this._unsubscribe) {
29473
+ this._unsubscribe = this.client.addEventListener("nodes_changed", () => this.requestUpdate());
29474
+ }
29475
+ void this._ensureLoaded();
29476
+ }
29477
+ disconnectedCallback() {
29478
+ var _this$_unsubscribe;
29479
+ super.disconnectedCallback();
29480
+ (_this$_unsubscribe = this._unsubscribe) === null || _this$_unsubscribe === void 0 || _this$_unsubscribe.call(this);
29481
+ }
29482
+ /** The acl attribute is fabric-scoped and may be absent from the cache until read. Load it on open. */
29483
+ async _ensureLoaded() {
29484
+ if (!this.client || !this.node || !this.node.available) return;
29485
+ const key = nodeIdKey(this.node.node_id);
29486
+ if (this._loadedKey === key) return;
29487
+ this._loadedKey = key;
29488
+ try {
29489
+ const res = await this.client.readAttribute(this.node.node_id, ["0/31/0", "0/62/5"]);
29490
+ for (const [k, v] of Object.entries(res)) this.node.attributes[k] = v;
29491
+ this.requestUpdate();
29492
+ } catch (err) {
29493
+ this._loadedKey = "";
29494
+ console.error("Failed to load ACL", err);
29495
+ }
29496
+ }
29497
+ get _controllerNodeId() {
29498
+ var _this$client$serverIn;
29499
+ return (_this$client$serverIn = this.client.serverInfo) === null || _this$client$serverIn === void 0 ? void 0 : _this$client$serverIn.controller_node_id;
29500
+ }
29501
+ _entries() {
29502
+ return entriesForFabric(readAclEntries(this.node), nodeFabricIndex(this.node));
29503
+ }
29504
+ _clusterName(id) {
29505
+ var _clusters$id;
29506
+ if (id == null) return "all clusters";
29507
+ return `${((_clusters$id = clusters[id]) === null || _clusters$id === void 0 ? void 0 : _clusters$id.label) ?? "Cluster"} (0x${id.toString(16).padStart(2, "0").toUpperCase()})`;
29508
+ }
29509
+ _privilegeClass(p) {
29510
+ return `pv pv-${p}`;
29511
+ }
29512
+ async _delete(entry) {
29513
+ const isAdmin = entry.privilege === Privilege.Administer && entry.authMode === AuthMode.Case;
29514
+ const unverified = isAdmin && this._controllerNodeId === void 0;
29515
+ const confirmed = await showPromptDialog({
29516
+ title: "Delete ACL entry",
29517
+ text: unverified ? "This is an Administer entry and the controller cannot verify whether it is its own. Deleting the wrong admin entry can lock the controller out of this device. Continue?" : "Remove this access control entry? Devices relying on it will lose the granted access.",
29518
+ confirmText: "Delete"
29519
+ });
29520
+ if (!confirmed) return;
29521
+ this._busy = true;
29522
+ try {
29523
+ await deleteAclEntry(this.client, this.node.node_id, aclEntryKey(entry));
29524
+ } catch (err) {
29525
+ await showAlertDialog({
29526
+ title: "Delete failed",
29527
+ text: err instanceof Error ? err.message : String(err)
29528
+ });
29529
+ } finally {
29530
+ this._busy = false;
29531
+ }
29532
+ }
29533
+ async _fix(keys) {
29534
+ this._busy = true;
29535
+ try {
29536
+ await downgradeToOperate(this.client, this.node.node_id, keys);
29537
+ } catch (err) {
29538
+ await showAlertDialog({
29539
+ title: "Fix failed",
29540
+ text: err instanceof Error ? err.message : String(err)
29541
+ });
29542
+ } finally {
29543
+ this._busy = false;
29544
+ }
29545
+ }
29546
+ async _openAdd() {
29547
+ await showNodeAclAddDialog(this.node);
29548
+ }
29549
+ _renderSubjects(entry) {
29550
+ const subjects = entry.subjects ?? [];
29551
+ if (entry.authMode === AuthMode.Case && subjects.length === 0) {
29552
+ return b`<span class="mut">Any node on fabric</span>`;
29553
+ }
29554
+ if (entry.authMode === AuthMode.Group) {
29555
+ return b`${subjects.map(s => b`<div class="ident">Group ${s.toString()}</div>`)}`;
29556
+ }
29557
+ return b`${subjects.map(s => {
29558
+ const known = this.client.nodes[nodeIdKey(s)];
29559
+ const protectedMe = isProtectedAdmin(entry, this._controllerNodeId) && nodeIdKey(s) === nodeIdKey(this._controllerNodeId);
29560
+ return b`<div class="ident ${protectedMe ? "me" : ""}">
29561
+ ${protectedMe ? "This controller" : known ? getDeviceName(known) : "Unknown node"} ·
29562
+ <span class="nid">${s.toString()}</span><span class="hex">0x${s.toString(16).toUpperCase()}</span>
29563
+ </div>`;
29564
+ })}`;
29565
+ }
29566
+ _renderTargets(entry) {
29567
+ if (isWholeNode(entry)) return b`<span class="mut">Whole node</span>`;
29568
+ return b`${entry.targets.map(t => {
29569
+ if (t.cluster != null) return b`<span class="chip ep">EP ${t.endpoint ?? "*"} · ${this._clusterName(t.cluster)}</span>`;
29570
+ if (t.deviceType != null) return b`<span class="chip ep">EP ${t.endpoint ?? "*"} · device type ${t.deviceType}</span>`;
29571
+ return b`<span class="chip ep">EP ${t.endpoint ?? "*"}</span>`;
29572
+ })}`;
29573
+ }
29574
+ _renderRelationship(rel) {
29575
+ if (rel.kind === "none") return b`<span class="mut">—</span>`;
29576
+ const source = rel.sourceNodeId != null ? this.client.nodes[nodeIdKey(rel.sourceNodeId)] : void 0;
29577
+ const label = source ? getDeviceName(source) : "node";
29578
+ if (rel.kind === "overPrivileged") {
29579
+ return b`<span class="chip bug"
29580
+ ><ha-svg-icon .path=${mdiAlert}></ha-svg-icon> over-privileged binding ACL</span
29581
+ >`;
29582
+ }
29583
+ return b`<span class="chip link"
29584
+ ><ha-svg-icon .path=${mdiLink}></ha-svg-icon> backs binding · ${label} EP${rel.sourceEndpoint}</span
29585
+ >`;
29586
+ }
29587
+ render() {
29588
+ if (!this.node || this.cluster !== CLUSTER_ID$3) return A;
29589
+ const entries = this._entries();
29590
+ const allNodes = Object.values(this.client.nodes);
29591
+ const rels = entries.map(e => detectBindingRelationship(e, this.node.node_id, allNodes));
29592
+ const capacity = aclCapacity(this.node);
29593
+ const full = capacity.max > 0 && entries.length >= capacity.max;
29594
+ const overPrivilegedKeys = /* @__PURE__ */new Set();
29595
+ entries.forEach((e, i) => {
29596
+ if (rels[i].kind === "overPrivileged") overPrivilegedKeys.add(aclEntryKey(e));
29597
+ });
29598
+ return b`
29599
+ <details class="command-panel">
29600
+ <summary>Access Control — ACL Entries (${entries.length})</summary>
29601
+ <div class="command-content">
29602
+ ${overPrivilegedKeys.size >= 2 ? b`<div class="banner">
29603
+ <span
29604
+ >${overPrivilegedKeys.size} binding ACL entries grant Administer where Operate is
29605
+ sufficient.</span
29606
+ >
29607
+ <md-outlined-button
29608
+ ?disabled=${this._busy || !this.node.available}
29609
+ @click=${handleAsync(() => this._fix(overPrivilegedKeys))}
29610
+ >Fix all → Operate</md-outlined-button
29611
+ >
29612
+ </div>` : A}
29613
+ <table class="acl">
29614
+ <thead>
29615
+ <tr>
29616
+ <th>Privilege</th>
29617
+ <th>Auth</th>
29618
+ <th>Subjects</th>
29619
+ <th>Targets</th>
29620
+ <th>Relationship</th>
29621
+ <th></th>
29622
+ </tr>
29623
+ </thead>
29624
+ <tbody>
29625
+ ${entries.map((e, i) => this._row(e, rels[i]))}
29626
+ </tbody>
29627
+ </table>
29628
+ <md-outlined-button
29629
+ ?disabled=${this._busy || full || !this.node.available}
29630
+ title=${full ? "Access control list is full" : ""}
29631
+ @click=${handleAsync(() => this._openAdd())}
29632
+ >Add ACL entry</md-outlined-button
29633
+ >
29634
+ ${full ? b`<span class="mut full-note">List full (${capacity.max} entries)</span>` : A}
29635
+ </div>
29636
+ </details>
29637
+ `;
29638
+ }
29639
+ _row(entry, rel) {
29640
+ const protectedEntry = isProtectedAdmin(entry, this._controllerNodeId);
29641
+ const overPrivileged = rel.kind === "overPrivileged";
29642
+ return b`
29643
+ <tr class=${overPrivileged ? "row-warn" : ""}>
29644
+ <td>
29645
+ <span class=${this._privilegeClass(entry.privilege)}
29646
+ >${PRIVILEGE_NAMES[entry.privilege] ?? entry.privilege} · ${entry.privilege}</span
29647
+ >
29648
+ ${overPrivileged ? b`<div>
29649
+ <md-outlined-button
29650
+ class="fix"
29651
+ ?disabled=${this._busy || !this.node.available}
29652
+ @click=${handleAsync(() => this._fix(/* @__PURE__ */new Set([aclEntryKey(entry)])))}
29653
+ >Fix → Operate</md-outlined-button
29654
+ >
29655
+ </div>` : A}
29656
+ </td>
29657
+ <td>${AUTH_MODE_NAMES[entry.authMode] ?? entry.authMode}</td>
29658
+ <td>${this._renderSubjects(entry)}</td>
29659
+ <td>${this._renderTargets(entry)}</td>
29660
+ <td>${this._renderRelationship(rel)}</td>
29661
+ <td>
29662
+ ${protectedEntry ? b`<ha-svg-icon
29663
+ class="lock"
29664
+ .path=${mdiLock}
29665
+ title="Your controller's administrator entry — deleting it would lock you out."
29666
+ ></ha-svg-icon>` : b`<md-outlined-button
29667
+ class="danger"
29668
+ ?disabled=${this._busy || !this.node.available}
29669
+ @click=${handleAsync(() => this._delete(entry))}
29670
+ >
29671
+ <ha-svg-icon .path=${mdiTrashCan} slot="icon"></ha-svg-icon>delete
29672
+ </md-outlined-button>`}
29673
+ </td>
29674
+ </tr>
29675
+ `;
29676
+ }
29677
+ };
29678
+ AccessControlClusterCommands.styles = [BaseClusterCommands.styles, i$7`
29679
+ .acl {
29680
+ width: 100%;
29681
+ border-collapse: collapse;
29682
+ margin-bottom: 12px;
29683
+ }
29684
+ .acl th {
29685
+ text-align: left;
29686
+ font-size: 11px;
29687
+ text-transform: uppercase;
29688
+ opacity: 0.6;
29689
+ padding: 8px 10px;
29690
+ border-bottom: 1px solid var(--md-sys-color-outline-variant);
29691
+ }
29692
+ .acl td {
29693
+ padding: 10px;
29694
+ border-bottom: 1px solid var(--md-sys-color-outline-variant);
29695
+ vertical-align: middle;
29696
+ }
29697
+ .ident {
29698
+ line-height: 1.4;
29699
+ }
29700
+ .ident.me {
29701
+ color: var(--md-sys-color-primary);
29702
+ font-weight: 600;
29703
+ }
29704
+ .ident .nid {
29705
+ font-weight: 600;
29706
+ }
29707
+ .row-warn td {
29708
+ background: var(--md-sys-color-error-container);
29709
+ box-shadow: inset 3px 0 0 var(--md-sys-color-error);
29710
+ }
29711
+ .pv {
29712
+ display: inline-block;
29713
+ padding: 2px 8px;
29714
+ border-radius: 999px;
29715
+ font-size: 12px;
29716
+ font-weight: 700;
29717
+ }
29718
+ .pv-5 {
29719
+ background: var(--md-sys-color-error-container);
29720
+ color: var(--md-sys-color-on-error-container);
29721
+ }
29722
+ .pv-4 {
29723
+ background: var(--md-sys-color-tertiary-container);
29724
+ color: var(--md-sys-color-on-tertiary-container);
29725
+ }
29726
+ .pv-3 {
29727
+ background: var(--md-sys-color-primary-container);
29728
+ color: var(--md-sys-color-on-primary-container);
29729
+ }
29730
+ .pv-1,
29731
+ .pv-2 {
29732
+ background: var(--md-sys-color-surface-container-highest);
29733
+ color: var(--md-sys-color-on-surface-variant);
29734
+ }
29735
+ .chip {
29736
+ display: inline-flex;
29737
+ align-items: center;
29738
+ gap: 4px;
29739
+ padding: 3px 8px;
29740
+ border-radius: 6px;
29741
+ margin: 2px 4px 2px 0;
29742
+ font-size: inherit;
29743
+ background: var(--md-sys-color-surface-container-high);
29744
+ color: var(--md-sys-color-on-surface);
29745
+ }
29746
+ .chip ha-svg-icon {
29747
+ --mdc-icon-size: 14px;
29748
+ width: 14px;
29749
+ height: 14px;
29750
+ }
29751
+ .chip.ep {
29752
+ background: var(--md-sys-color-secondary-container);
29753
+ color: var(--md-sys-color-on-secondary-container);
29754
+ }
29755
+ .chip.me {
29756
+ background: var(--md-sys-color-tertiary-container);
29757
+ color: var(--md-sys-color-on-tertiary-container);
29758
+ }
29759
+ .chip.link {
29760
+ background: var(--md-sys-color-primary-container);
29761
+ color: var(--md-sys-color-on-primary-container);
29762
+ }
29763
+ .chip.bug {
29764
+ background: var(--md-sys-color-error-container);
29765
+ color: var(--md-sys-color-on-error-container);
29766
+ }
29767
+ .nid {
29768
+ font-weight: 600;
29769
+ }
29770
+ .hex {
29771
+ font-family: var(--monospace-font, monospace);
29772
+ font-size: 10px;
29773
+ opacity: 0.6;
29774
+ margin-left: 4px;
29775
+ }
29776
+ .mut {
29777
+ opacity: 0.6;
29778
+ }
29779
+ .full-note {
29780
+ margin-left: 8px;
29781
+ font-size: 12px;
29782
+ }
29783
+ .banner {
29784
+ display: flex;
29785
+ align-items: center;
29786
+ justify-content: space-between;
29787
+ gap: 12px;
29788
+ padding: 10px 12px;
29789
+ margin-bottom: 12px;
29790
+ border-radius: 8px;
29791
+ background: var(--md-sys-color-error-container);
29792
+ color: var(--md-sys-color-on-error-container);
29793
+ }
29794
+ md-outlined-button.danger {
29795
+ --md-outlined-button-label-text-color: var(--md-sys-color-error);
29796
+ --md-outlined-button-outline-color: var(--md-sys-color-error);
29797
+ }
29798
+ md-outlined-button.fix {
29799
+ margin-top: 4px;
29800
+ --md-outlined-button-container-height: 28px;
29801
+ }
29802
+ `];
29803
+ __decorateClass$k([r$3()], AccessControlClusterCommands.prototype, "_busy", 2);
29804
+ AccessControlClusterCommands = __decorateClass$k([t$1("access-control-cluster-commands")], AccessControlClusterCommands);
29805
+ registerClusterCommands(CLUSTER_ID$3, "access-control-cluster-commands");
29806
+
29807
+ var __defProp$g = Object.defineProperty;
29808
+ var __getOwnPropDesc$i = Object.getOwnPropertyDescriptor;
29809
+ var __decorateClass$j = (decorators, target, key, kind) => {
29810
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$i(target, key) : target;
29811
+ for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
29812
+ if (kind && result) __defProp$g(target, key, result);
29233
29813
  return result;
29234
29814
  };
29235
29815
  let AvsumClusterCommands = class extends BaseClusterCommands {
@@ -29715,9 +30295,9 @@ AvsumClusterCommands.styles = [...(Array.isArray(BaseClusterCommands.styles) ? B
29715
30295
  font-weight: 500;
29716
30296
  }
29717
30297
  `];
29718
- __decorateClass$h([r$3()], AvsumClusterCommands.prototype, "_toast", 2);
29719
- __decorateClass$h([r$3()], AvsumClusterCommands.prototype, "_newPresetName", 2);
29720
- AvsumClusterCommands = __decorateClass$h([t$1("avsum-cluster-commands")], AvsumClusterCommands);
30298
+ __decorateClass$j([r$3()], AvsumClusterCommands.prototype, "_toast", 2);
30299
+ __decorateClass$j([r$3()], AvsumClusterCommands.prototype, "_newPresetName", 2);
30300
+ AvsumClusterCommands = __decorateClass$j([t$1("avsum-cluster-commands")], AvsumClusterCommands);
29721
30301
  registerClusterCommands(AVSUM_CLUSTER_ID, "avsum-cluster-commands");
29722
30302
 
29723
30303
  /**
@@ -30689,12 +31269,12 @@ function writeNodeLabel(client, node, label) {
30689
31269
  return client.writeAttribute(node.node_id, NODE_LABEL_ATTRIBUTE_PATH, label.trim());
30690
31270
  }
30691
31271
 
30692
- var __defProp$d = Object.defineProperty;
30693
- var __getOwnPropDesc$f = Object.getOwnPropertyDescriptor;
30694
- var __decorateClass$g = (decorators, target, key, kind) => {
30695
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$f(target, key) : target;
31272
+ var __defProp$f = Object.defineProperty;
31273
+ var __getOwnPropDesc$h = Object.getOwnPropertyDescriptor;
31274
+ var __decorateClass$i = (decorators, target, key, kind) => {
31275
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$h(target, key) : target;
30696
31276
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
30697
- if (kind && result) __defProp$d(target, key, result);
31277
+ if (kind && result) __defProp$f(target, key, result);
30698
31278
  return result;
30699
31279
  };
30700
31280
  let BasicInformationClusterCommands = class extends BaseClusterCommands {
@@ -30804,11 +31384,378 @@ BasicInformationClusterCommands.styles = [BaseClusterCommands.styles, i$7`
30804
31384
  border-radius: 4px;
30805
31385
  }
30806
31386
  `];
30807
- __decorateClass$g([r$3()], BasicInformationClusterCommands.prototype, "_nodeLabel", 2);
30808
- __decorateClass$g([r$3()], BasicInformationClusterCommands.prototype, "_saving", 2);
30809
- BasicInformationClusterCommands = __decorateClass$g([t$1("basic-information-cluster-commands")], BasicInformationClusterCommands);
31387
+ __decorateClass$i([r$3()], BasicInformationClusterCommands.prototype, "_nodeLabel", 2);
31388
+ __decorateClass$i([r$3()], BasicInformationClusterCommands.prototype, "_saving", 2);
31389
+ BasicInformationClusterCommands = __decorateClass$i([t$1("basic-information-cluster-commands")], BasicInformationClusterCommands);
30810
31390
  registerClusterCommands(NODE_LABEL_CLUSTER_ID, "basic-information-cluster-commands");
30811
31391
 
31392
+ /**
31393
+ * @license
31394
+ * Copyright 2025-2026 Open Home Foundation
31395
+ * SPDX-License-Identifier: Apache-2.0
31396
+ */
31397
+ function toBindingTarget(e) {
31398
+ return {
31399
+ node: e.node ?? null,
31400
+ group: e.group ?? null,
31401
+ endpoint: e.endpoint ?? null,
31402
+ cluster: e.cluster ?? null
31403
+ };
31404
+ }
31405
+ function toApiAcl(e) {
31406
+ var _e$targets;
31407
+ return {
31408
+ privilege: e.privilege,
31409
+ auth_mode: e.authMode,
31410
+ subjects: e.subjects ?? null,
31411
+ targets: ((_e$targets = e.targets) === null || _e$targets === void 0 ? void 0 : _e$targets.map(t => ({
31412
+ cluster: t.cluster ?? null,
31413
+ endpoint: t.endpoint ?? null,
31414
+ device_type: t.deviceType ?? null
31415
+ }))) ?? null
31416
+ };
31417
+ }
31418
+ function requireFabricIndex(res, nodeId) {
31419
+ const fi = res["0/62/5"];
31420
+ if (typeof fi !== "number") {
31421
+ throw new Error(`Cannot determine the current fabric index (0/62/5) for node ${nodeId}`);
31422
+ }
31423
+ return fi;
31424
+ }
31425
+ async function freshOurAcl(client, nodeId) {
31426
+ const res = await client.readAttribute(nodeId, ["0/31/0", "0/62/5"]);
31427
+ const all = attributeArray(res["0/31/0"]).map(v => AccessControlEntryDataTransformer.transform(v));
31428
+ return entriesForFabric(all, requireFabricIndex(res, nodeId));
31429
+ }
31430
+ async function freshOurBindings(client, nodeId, endpoint) {
31431
+ const res = await client.readAttribute(nodeId, [`${endpoint}/30/0`, "0/62/5"]);
31432
+ const all = attributeArray(res[`${endpoint}/30/0`]).map(v => BindingEntryDataTransformer.transform(v));
31433
+ const fabricIndex = requireFabricIndex(res, nodeId);
31434
+ return all.filter(b => b.fabricIndex === fabricIndex);
31435
+ }
31436
+ function hasTarget(e, endpoint, cluster) {
31437
+ return (e.targets ?? []).some(t => t.endpoint === endpoint && t.cluster === cluster);
31438
+ }
31439
+ function aclTargetsMax(client, nodeId) {
31440
+ var _client$nodes$nodeIdK;
31441
+ const raw = (_client$nodes$nodeIdK = client.nodes[nodeIdKey(nodeId)]) === null || _client$nodes$nodeIdK === void 0 ? void 0 : _client$nodes$nodeIdK.attributes["0/31/3"];
31442
+ return typeof raw === "number" && raw > 0 ? raw : Number.MAX_SAFE_INTEGER;
31443
+ }
31444
+ async function ensureBindingAcl(client, sourceNodeId, targetNodeId, targetEndpoint, cluster) {
31445
+ const acl = await freshOurAcl(client, targetNodeId);
31446
+ const alreadyGranted = acl.some(e => e.authMode === AuthMode.Case && e.privilege >= Privilege.Operate && subjectsInclude(e, sourceNodeId) && entryMatchesTarget(e, targetEndpoint, cluster));
31447
+ if (alreadyGranted) return;
31448
+ const targetsMax = aclTargetsMax(client, targetNodeId);
31449
+ const reusable = acl.find(e => {
31450
+ var _e$targets2;
31451
+ return e.authMode === AuthMode.Case && e.privilege >= Privilege.Operate && subjectsInclude(e, sourceNodeId) && (isWholeNode(e) || hasTarget(e, targetEndpoint, cluster) || (((_e$targets2 = e.targets) === null || _e$targets2 === void 0 ? void 0 : _e$targets2.length) ?? 0) < targetsMax);
31452
+ });
31453
+ if (reusable) {
31454
+ if (!isWholeNode(reusable) && !hasTarget(reusable, targetEndpoint, cluster)) {
31455
+ reusable.targets = reusable.targets ?? [];
31456
+ reusable.targets.push({
31457
+ endpoint: targetEndpoint,
31458
+ cluster,
31459
+ deviceType: void 0
31460
+ });
31461
+ }
31462
+ } else {
31463
+ acl.push({
31464
+ privilege: Privilege.Operate,
31465
+ authMode: AuthMode.Case,
31466
+ subjects: [sourceNodeId],
31467
+ targets: [{
31468
+ endpoint: targetEndpoint,
31469
+ cluster,
31470
+ deviceType: void 0
31471
+ }],
31472
+ fabricIndex: 0
31473
+ });
31474
+ }
31475
+ await client.setACLEntry(targetNodeId, acl.map(toApiAcl));
31476
+ }
31477
+ async function fixOverPrivilegedBindingAcl(client, sourceNodeId, targetNodeId, targetEndpoint, cluster) {
31478
+ const acl = await freshOurAcl(client, targetNodeId);
31479
+ const updated = acl.map(e => e.authMode === AuthMode.Case && subjectsInclude(e, sourceNodeId) && e.privilege > Privilege.Operate && entryMatchesTarget(e, targetEndpoint, cluster) ? {
31480
+ ...e,
31481
+ privilege: Privilege.Operate
31482
+ } : e);
31483
+ await client.setACLEntry(targetNodeId, updated.map(toApiAcl));
31484
+ }
31485
+ async function addBinding(client, sourceNode, sourceEndpoint, targetNodeId, targetEndpoint, cluster) {
31486
+ await ensureBindingAcl(client, sourceNode.node_id, targetNodeId, targetEndpoint, cluster);
31487
+ const bindings = await freshOurBindings(client, sourceNode.node_id, sourceEndpoint);
31488
+ const targetKey = nodeIdKey(targetNodeId);
31489
+ const exists = bindings.some(b => b.node != null && nodeIdKey(b.node) === targetKey && b.endpoint === targetEndpoint && b.cluster === cluster);
31490
+ if (exists) return;
31491
+ bindings.push({
31492
+ node: targetNodeId,
31493
+ group: void 0,
31494
+ endpoint: targetEndpoint,
31495
+ cluster,
31496
+ fabricIndex: void 0
31497
+ });
31498
+ await client.setNodeBinding(sourceNode.node_id, sourceEndpoint, bindings.map(toBindingTarget));
31499
+ }
31500
+ async function deleteBindingAtIndex(client, sourceNode, sourceEndpoint, index) {
31501
+ const bindings = await freshOurBindings(client, sourceNode.node_id, sourceEndpoint);
31502
+ const removed = bindings[index];
31503
+ if (!removed) return;
31504
+ const updated = [...bindings.slice(0, index), ...bindings.slice(index + 1)];
31505
+ await client.setNodeBinding(sourceNode.node_id, sourceEndpoint, updated.map(toBindingTarget));
31506
+ if (removed.node == null || removed.endpoint == null) return;
31507
+ const targetEndpoint = removed.endpoint;
31508
+ const removedCluster = removed.cluster;
31509
+ try {
31510
+ const acl = await freshOurAcl(client, removed.node);
31511
+ const kept = acl.map(e => {
31512
+ if (!subjectsInclude(e, sourceNode.node_id) || isWholeNode(e)) return e;
31513
+ const targets = e.targets.filter(t => !(t.endpoint === targetEndpoint && t.cluster === removedCluster));
31514
+ if (targets.length === 0) return void 0;
31515
+ return {
31516
+ ...e,
31517
+ targets
31518
+ };
31519
+ }).filter(e => e !== void 0);
31520
+ await client.setACLEntry(removed.node, kept.map(toApiAcl));
31521
+ } catch (err) {
31522
+ const detail = err instanceof Error ? err.message : String(err);
31523
+ throw new Error(`Binding removed, but cleaning up the access control entry on the target node failed: ${detail}. The target may retain a stale access grant.`);
31524
+ }
31525
+ }
31526
+
31527
+ /**
31528
+ * @license
31529
+ * Copyright 2025-2026 Open Home Foundation
31530
+ * SPDX-License-Identifier: Apache-2.0
31531
+ */
31532
+ const showNodeBindingDialog = async (node, endpoint) => {
31533
+ var _document$querySelect;
31534
+ await import('./node-binding-dialog-DhnX_86M.js');
31535
+ const dialog = document.createElement("node-binding-dialog");
31536
+ dialog.node = node;
31537
+ dialog.endpoint = endpoint;
31538
+ (_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
31539
+ };
31540
+
31541
+ var __defProp$e = Object.defineProperty;
31542
+ var __getOwnPropDesc$g = Object.getOwnPropertyDescriptor;
31543
+ var __decorateClass$h = (decorators, target, key, kind) => {
31544
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$g(target, key) : target;
31545
+ for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
31546
+ if (kind && result) __defProp$e(target, key, result);
31547
+ return result;
31548
+ };
31549
+ const CLUSTER_ID$2 = 30;
31550
+ let BindingClusterCommands = class extends BaseClusterCommands {
31551
+ constructor() {
31552
+ super(...arguments);
31553
+ this._loadedKey = "";
31554
+ this._busy = false;
31555
+ }
31556
+ updated(changed) {
31557
+ super.updated(changed);
31558
+ if (changed.has("client") && this.client && !this._unsubscribe) {
31559
+ this._unsubscribe = this.client.addEventListener("nodes_changed", () => this.requestUpdate());
31560
+ }
31561
+ void this._ensureLoaded();
31562
+ }
31563
+ disconnectedCallback() {
31564
+ var _this$_unsubscribe;
31565
+ super.disconnectedCallback();
31566
+ (_this$_unsubscribe = this._unsubscribe) === null || _this$_unsubscribe === void 0 || _this$_unsubscribe.call(this);
31567
+ }
31568
+ /** Read the (fabric-scoped) binding attribute and each target's ACL into the cache on open. */
31569
+ async _ensureLoaded() {
31570
+ if (!this.client || !this.node || !this.node.available || this.endpoint === void 0) return;
31571
+ const key = `${nodeIdKey(this.node.node_id)}/${this.endpoint}`;
31572
+ if (this._loadedKey === key) return;
31573
+ this._loadedKey = key;
31574
+ try {
31575
+ await this._readInto(this.node.node_id, [`${this.endpoint}/30/0`, "0/62/5"]);
31576
+ const targets = new Set(readBindings(this.node, this.endpoint).map(b => b.node != null ? nodeIdKey(b.node) : void 0).filter(k => k !== void 0));
31577
+ await Promise.all([...targets].map(k => {
31578
+ const target = this.client.nodes[k];
31579
+ return target !== null && target !== void 0 && target.available ? this._readInto(target.node_id, ["0/31/0", "0/62/5"]) : void 0;
31580
+ }));
31581
+ this.requestUpdate();
31582
+ } catch (err) {
31583
+ this._loadedKey = "";
31584
+ console.error("Failed to load binding/ACL data", err);
31585
+ }
31586
+ }
31587
+ async _readInto(nodeId, path) {
31588
+ const res = await this.client.readAttribute(nodeId, path);
31589
+ const node = this.client.nodes[nodeIdKey(nodeId)];
31590
+ if (node) for (const [k, v] of Object.entries(res)) node.attributes[k] = v;
31591
+ }
31592
+ _clusterName(id) {
31593
+ var _clusters$id;
31594
+ if (id == null) return "All clusters";
31595
+ return `${((_clusters$id = clusters[id]) === null || _clusters$id === void 0 ? void 0 : _clusters$id.label) ?? "Cluster"} (0x${id.toString(16).padStart(2, "0").toUpperCase()})`;
31596
+ }
31597
+ _targetNode(nodeId) {
31598
+ if (nodeId == null) return void 0;
31599
+ return this.client.nodes[nodeIdKey(nodeId)];
31600
+ }
31601
+ async _openAdd() {
31602
+ await showNodeBindingDialog(this.node, this.endpoint);
31603
+ }
31604
+ async _run(action, failTitle) {
31605
+ this._busy = true;
31606
+ try {
31607
+ await action();
31608
+ } catch (err) {
31609
+ await showAlertDialog({
31610
+ title: failTitle,
31611
+ text: err instanceof Error ? err.message : String(err)
31612
+ });
31613
+ } finally {
31614
+ this._busy = false;
31615
+ }
31616
+ }
31617
+ async _delete(index) {
31618
+ const confirmed = await showPromptDialog({
31619
+ title: "Remove binding",
31620
+ text: "Remove this binding and clean up the matching access control entry on the target node?",
31621
+ confirmText: "Remove"
31622
+ });
31623
+ if (!confirmed) return;
31624
+ await this._run(() => deleteBindingAtIndex(this.client, this.node, this.endpoint, index), "Delete failed");
31625
+ }
31626
+ async _fixAcl(b, mode) {
31627
+ if (b.node == null || b.endpoint == null) return;
31628
+ await this._run(() => mode === "missing" ? ensureBindingAcl(this.client, this.node.node_id, b.node, b.endpoint, b.cluster) : fixOverPrivilegedBindingAcl(this.client, this.node.node_id, b.node, b.endpoint, b.cluster), "Fix failed");
31629
+ }
31630
+ render() {
31631
+ if (!this.node || this.cluster !== CLUSTER_ID$2) return A;
31632
+ const bindings = readBindings(this.node, this.endpoint);
31633
+ return b`
31634
+ <details class="command-panel">
31635
+ <summary>Bindings (${bindings.length})</summary>
31636
+ <div class="command-content">
31637
+ ${bindings.length === 0 ? b`<div class="empty">No bindings on this endpoint.</div>` : b`<table class="bt">
31638
+ <thead>
31639
+ <tr>
31640
+ <th>Target node</th>
31641
+ <th>Endpoint</th>
31642
+ <th>Cluster</th>
31643
+ <th>ACL on target</th>
31644
+ <th></th>
31645
+ </tr>
31646
+ </thead>
31647
+ <tbody>
31648
+ ${bindings.map((b, i) => this._row(b, i))}
31649
+ </tbody>
31650
+ </table>`}
31651
+ <md-outlined-button
31652
+ ?disabled=${this._busy || !this.node.available}
31653
+ @click=${handleAsync(() => this._openAdd())}
31654
+ >Add binding</md-outlined-button
31655
+ >
31656
+ </div>
31657
+ </details>
31658
+ `;
31659
+ }
31660
+ _row(b$1, index) {
31661
+ const target = this._targetNode(b$1.node);
31662
+ const aclState = b$1.node == null ? "cannotVerify" : reverseAclState(this.node.node_id, b$1, target).state;
31663
+ const name = b$1.group != null ? `Group ${b$1.group}` : target ? getDeviceName(target) : "Unknown node";
31664
+ const deviceType = b$1.endpoint != null && target ? getEndpointDeviceTypes(target, b$1.endpoint)[0] : void 0;
31665
+ const endpointText = b$1.endpoint == null ? "\u2014" : deviceType ? `EP ${b$1.endpoint} \xB7 ${deviceType.label}` : `EP ${b$1.endpoint}`;
31666
+ return b`
31667
+ <tr>
31668
+ <td>
31669
+ <span class="ident"
31670
+ ><b>${name}</b>${b$1.node != null ? b` · <span class="nid">${b$1.node.toString()}</span>` : A}</span
31671
+ >
31672
+ </td>
31673
+ <td>${endpointText}</td>
31674
+ <td>${this._clusterName(b$1.cluster)}</td>
31675
+ <td>${this._aclCell(b$1, aclState)}</td>
31676
+ <td class="actions">
31677
+ <md-outlined-button
31678
+ class="danger"
31679
+ ?disabled=${this._busy || !this.node.available}
31680
+ @click=${handleAsync(() => this._delete(index))}
31681
+ >
31682
+ <ha-svg-icon .path=${mdiTrashCan} slot="icon"></ha-svg-icon>delete
31683
+ </md-outlined-button>
31684
+ </td>
31685
+ </tr>
31686
+ `;
31687
+ }
31688
+ _aclCell(b$1, state2) {
31689
+ if (state2 === "present") return b`<span class="status ok">ACL present</span>`;
31690
+ if (state2 === "cannotVerify") return b`<span class="status mut">can't verify</span>`;
31691
+ const label = state2 === "missing" ? "ACL missing" : "ACL > Operate";
31692
+ const fixLabel = state2 === "missing" ? "Fix ACL" : "Fix \u2192 Operate";
31693
+ return b`
31694
+ <span class="status warn">${label}</span>
31695
+ <md-outlined-button
31696
+ class="fix"
31697
+ ?disabled=${this._busy || !this.node.available}
31698
+ @click=${handleAsync(() => this._fixAcl(b$1, state2))}
31699
+ >${fixLabel}</md-outlined-button
31700
+ >
31701
+ `;
31702
+ }
31703
+ };
31704
+ BindingClusterCommands.styles = [BaseClusterCommands.styles, i$7`
31705
+ .bt {
31706
+ width: 100%;
31707
+ border-collapse: collapse;
31708
+ margin-bottom: 12px;
31709
+ }
31710
+ .bt th {
31711
+ text-align: left;
31712
+ font-size: 11px;
31713
+ text-transform: uppercase;
31714
+ opacity: 0.6;
31715
+ padding: 8px 10px;
31716
+ border-bottom: 1px solid var(--md-sys-color-outline-variant);
31717
+ }
31718
+ .bt td {
31719
+ padding: 10px;
31720
+ border-bottom: 1px solid var(--md-sys-color-outline-variant);
31721
+ vertical-align: middle;
31722
+ }
31723
+ .empty {
31724
+ opacity: 0.6;
31725
+ padding: 8px 0 12px;
31726
+ }
31727
+ .ident .nid {
31728
+ font-weight: 600;
31729
+ }
31730
+ .status {
31731
+ font-size: inherit;
31732
+ }
31733
+ .status.ok {
31734
+ color: var(--md-sys-color-primary);
31735
+ }
31736
+ .status.warn {
31737
+ color: var(--md-sys-color-error);
31738
+ margin-right: 8px;
31739
+ }
31740
+ .status.mut {
31741
+ opacity: 0.6;
31742
+ }
31743
+ .actions {
31744
+ text-align: right;
31745
+ white-space: nowrap;
31746
+ }
31747
+ md-outlined-button.fix {
31748
+ --md-outlined-button-container-height: 28px;
31749
+ }
31750
+ md-outlined-button.danger {
31751
+ --md-outlined-button-label-text-color: var(--md-sys-color-error);
31752
+ --md-outlined-button-outline-color: var(--md-sys-color-error);
31753
+ }
31754
+ `];
31755
+ __decorateClass$h([r$3()], BindingClusterCommands.prototype, "_busy", 2);
31756
+ BindingClusterCommands = __decorateClass$h([t$1("binding-cluster-commands")], BindingClusterCommands);
31757
+ registerClusterCommands(CLUSTER_ID$2, "binding-cluster-commands");
31758
+
30812
31759
  /**
30813
31760
  * @license
30814
31761
  * Copyright 2023 Google LLC
@@ -31275,12 +32222,12 @@ async function play(client, nodeId, endpoint, chimeId) {
31275
32222
  await client.deviceCommand(nodeId, endpoint, CHIME_CLUSTER_ID, "PlayChimeSound", payload);
31276
32223
  }
31277
32224
 
31278
- var __defProp$c = Object.defineProperty;
31279
- var __getOwnPropDesc$e = Object.getOwnPropertyDescriptor;
31280
- var __decorateClass$f = (decorators, target, key, kind) => {
31281
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$e(target, key) : target;
32225
+ var __defProp$d = Object.defineProperty;
32226
+ var __getOwnPropDesc$f = Object.getOwnPropertyDescriptor;
32227
+ var __decorateClass$g = (decorators, target, key, kind) => {
32228
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$f(target, key) : target;
31282
32229
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
31283
- if (kind && result) __defProp$c(target, key, result);
32230
+ if (kind && result) __defProp$d(target, key, result);
31284
32231
  return result;
31285
32232
  };
31286
32233
  let ChimeClusterCommands = class extends BaseClusterCommands {
@@ -31481,17 +32428,17 @@ ChimeClusterCommands.styles = [...(Array.isArray(BaseClusterCommands.styles) ? B
31481
32428
  color: var(--md-sys-color-on-surface-variant);
31482
32429
  }
31483
32430
  `];
31484
- __decorateClass$f([r$3()], ChimeClusterCommands.prototype, "_lastPlayed", 2);
31485
- __decorateClass$f([r$3()], ChimeClusterCommands.prototype, "_playDisabledUntil", 2);
31486
- ChimeClusterCommands = __decorateClass$f([t$1("chime-cluster-commands")], ChimeClusterCommands);
32431
+ __decorateClass$g([r$3()], ChimeClusterCommands.prototype, "_lastPlayed", 2);
32432
+ __decorateClass$g([r$3()], ChimeClusterCommands.prototype, "_playDisabledUntil", 2);
32433
+ ChimeClusterCommands = __decorateClass$g([t$1("chime-cluster-commands")], ChimeClusterCommands);
31487
32434
  registerClusterCommands(CHIME_CLUSTER_ID, "chime-cluster-commands");
31488
32435
 
31489
- var __defProp$b = Object.defineProperty;
31490
- var __getOwnPropDesc$d = Object.getOwnPropertyDescriptor;
31491
- var __decorateClass$e = (decorators, target, key, kind) => {
31492
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$d(target, key) : target;
32436
+ var __defProp$c = Object.defineProperty;
32437
+ var __getOwnPropDesc$e = Object.getOwnPropertyDescriptor;
32438
+ var __decorateClass$f = (decorators, target, key, kind) => {
32439
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$e(target, key) : target;
31493
32440
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
31494
- if (kind && result) __defProp$b(target, key, result);
32441
+ if (kind && result) __defProp$c(target, key, result);
31495
32442
  return result;
31496
32443
  };
31497
32444
  const CLUSTER_ID$1 = 8;
@@ -31595,15 +32542,15 @@ let LevelControlClusterCommands = class extends BaseClusterCommands {
31595
32542
  });
31596
32543
  }
31597
32544
  };
31598
- __decorateClass$e([r$3()], LevelControlClusterCommands.prototype, "_targetLevel", 2);
31599
- __decorateClass$e([r$3()], LevelControlClusterCommands.prototype, "_transitionTime", 2);
31600
- __decorateClass$e([r$3()], LevelControlClusterCommands.prototype, "_executeIfOff", 2);
31601
- LevelControlClusterCommands = __decorateClass$e([t$1("level-control-cluster-commands")], LevelControlClusterCommands);
32545
+ __decorateClass$f([r$3()], LevelControlClusterCommands.prototype, "_targetLevel", 2);
32546
+ __decorateClass$f([r$3()], LevelControlClusterCommands.prototype, "_transitionTime", 2);
32547
+ __decorateClass$f([r$3()], LevelControlClusterCommands.prototype, "_executeIfOff", 2);
32548
+ LevelControlClusterCommands = __decorateClass$f([t$1("level-control-cluster-commands")], LevelControlClusterCommands);
31602
32549
  registerClusterCommands(CLUSTER_ID$1, "level-control-cluster-commands");
31603
32550
 
31604
- var __getOwnPropDesc$c = Object.getOwnPropertyDescriptor;
31605
- var __decorateClass$d = (decorators, target, key, kind) => {
31606
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$c(target, key) : target;
32551
+ var __getOwnPropDesc$d = Object.getOwnPropertyDescriptor;
32552
+ var __decorateClass$e = (decorators, target, key, kind) => {
32553
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$d(target, key) : target;
31607
32554
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (decorator(result)) || result;
31608
32555
  return result;
31609
32556
  };
@@ -31635,15 +32582,15 @@ let OnOffClusterCommands = class extends BaseClusterCommands {
31635
32582
  await this.sendCommand("Toggle");
31636
32583
  }
31637
32584
  };
31638
- OnOffClusterCommands = __decorateClass$d([t$1("on-off-cluster-commands")], OnOffClusterCommands);
32585
+ OnOffClusterCommands = __decorateClass$e([t$1("on-off-cluster-commands")], OnOffClusterCommands);
31639
32586
  registerClusterCommands(CLUSTER_ID, "on-off-cluster-commands");
31640
32587
 
31641
- var __defProp$a = Object.defineProperty;
31642
- var __getOwnPropDesc$b = Object.getOwnPropertyDescriptor;
31643
- var __decorateClass$c = (decorators, target, key, kind) => {
31644
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$b(target, key) : target;
32588
+ var __defProp$b = Object.defineProperty;
32589
+ var __getOwnPropDesc$c = Object.getOwnPropertyDescriptor;
32590
+ var __decorateClass$d = (decorators, target, key, kind) => {
32591
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$c(target, key) : target;
31645
32592
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
31646
- if (kind && result) __defProp$a(target, key, result);
32593
+ if (kind && result) __defProp$b(target, key, result);
31647
32594
  return result;
31648
32595
  };
31649
32596
  const GLOBAL_ATTRIBUTE_MIN = 65520;
@@ -31914,7 +32861,8 @@ let MatterClusterView = class extends i$4 {
31914
32861
  _renderClusterCommands() {
31915
32862
  var _this$node5;
31916
32863
  if (this.cluster === void 0) return b``;
31917
- if (!((_this$node5 = this.node) !== null && _this$node5 !== void 0 && _this$node5.available)) return b``;
32864
+ const RENDER_WHEN_OFFLINE = /* @__PURE__ */new Set([30, 31]);
32865
+ if (!((_this$node5 = this.node) !== null && _this$node5 !== void 0 && _this$node5.available) && !RENDER_WHEN_OFFLINE.has(this.cluster)) return b``;
31918
32866
  const tagName = getClusterCommandsTag(this.cluster);
31919
32867
  if (!tagName) return b``;
31920
32868
  const componentHtml = `<${tagName}></${tagName}>`;
@@ -32166,21 +33114,179 @@ MatterClusterView.styles = [notFoundStyles, i$7`
32166
33114
  border-radius: 3px;
32167
33115
  }
32168
33116
  `];
32169
- __decorateClass$c([c$5({
33117
+ __decorateClass$d([c$5({
32170
33118
  context: clientContext
32171
33119
  })], MatterClusterView.prototype, "client", 2);
32172
- __decorateClass$c([c$5({
33120
+ __decorateClass$d([c$5({
32173
33121
  context: tickContext,
32174
33122
  subscribe: true
32175
33123
  })], MatterClusterView.prototype, "_tick", 2);
32176
- __decorateClass$c([n$5()], MatterClusterView.prototype, "node", 2);
32177
- __decorateClass$c([e$b({
33124
+ __decorateClass$d([n$5()], MatterClusterView.prototype, "node", 2);
33125
+ __decorateClass$d([e$b({
32178
33126
  context: bindingContext
32179
33127
  }), n$5()], MatterClusterView.prototype, "endpoint", 2);
32180
- __decorateClass$c([n$5()], MatterClusterView.prototype, "cluster", 2);
32181
- __decorateClass$c([r$3()], MatterClusterView.prototype, "_devMode", 2);
32182
- __decorateClass$c([r$3()], MatterClusterView.prototype, "_refreshState", 2);
32183
- MatterClusterView = __decorateClass$c([t$1("matter-cluster-view")], MatterClusterView);
33128
+ __decorateClass$d([n$5()], MatterClusterView.prototype, "cluster", 2);
33129
+ __decorateClass$d([r$3()], MatterClusterView.prototype, "_devMode", 2);
33130
+ __decorateClass$d([r$3()], MatterClusterView.prototype, "_refreshState", 2);
33131
+ MatterClusterView = __decorateClass$d([t$1("matter-cluster-view")], MatterClusterView);
33132
+
33133
+ /**
33134
+ * @license
33135
+ * Copyright 2018 Google LLC
33136
+ * SPDX-License-Identifier: BSD-3-Clause
33137
+ */
33138
+ const e = {},
33139
+ i = e$4(class extends i$3 {
33140
+ constructor() {
33141
+ super(...arguments), this.ot = e;
33142
+ }
33143
+ render(r, t) {
33144
+ return t();
33145
+ }
33146
+ update(t, [s, e]) {
33147
+ if (Array.isArray(s)) {
33148
+ if (Array.isArray(this.ot) && this.ot.length === s.length && s.every((r, t) => r === this.ot[t])) return E;
33149
+ } else if (this.ot === s) return E;
33150
+ return this.ot = Array.isArray(s) ? Array.from(s) : s, this.render(s, e);
33151
+ }
33152
+ });
33153
+
33154
+ var __defProp$a = Object.defineProperty;
33155
+ var __getOwnPropDesc$b = Object.getOwnPropertyDescriptor;
33156
+ var __decorateClass$c = (decorators, target, key, kind) => {
33157
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$b(target, key) : target;
33158
+ for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
33159
+ if (kind && result) __defProp$a(target, key, result);
33160
+ return result;
33161
+ };
33162
+ function getUniqueClusters(node, endpoint) {
33163
+ return Array.from(new Set(Object.keys(node.attributes).filter(key => key.startsWith(`${endpoint.toString()}/`)).map(key => Number(key.split("/")[1])))).sort((a, b) => {
33164
+ return a - b;
33165
+ });
33166
+ }
33167
+ let MatterEndpointView = class extends i$4 {
33168
+ constructor() {
33169
+ super(...arguments);
33170
+ this._tick = 0;
33171
+ }
33172
+ render() {
33173
+ var _this$node;
33174
+ if (!this.node || this.endpoint == void 0) {
33175
+ return b`
33176
+ <dashboard-header title="Not found" backButton="#"></dashboard-header>
33177
+ <div class="not-found">
33178
+ <ha-svg-icon .path=${mdiAlertCircleOutline}></ha-svg-icon>
33179
+ <p>Node or endpoint not found</p>
33180
+ <md-outlined-button @click=${this._goBack}>Back</md-outlined-button>
33181
+ </div>
33182
+ `;
33183
+ }
33184
+ const fabricIndex = getEffectiveFabricIndex(this.client.serverInfo.fabric_index, isTestNodeId(this.node.node_id));
33185
+ const nodeHex = formatNodeAddress(fabricIndex, this.node.node_id);
33186
+ return b`
33187
+ <dashboard-header
33188
+ .title=${`Node ${this.node.node_id} ${nodeHex} | Endpoint ${this.endpoint}`}
33189
+ .backButton=${`#node/${this.node.node_id}`}
33190
+ ></dashboard-header>
33191
+
33192
+ <!-- node details section -->
33193
+ <div class="container">
33194
+ <node-details .node=${this.node}></node-details>
33195
+ </div>
33196
+
33197
+ <!-- Binding editor (when this endpoint has a Binding cluster) -->
33198
+ ${getUniqueClusters(this.node, this.endpoint).includes(30) ? b`<div class="container">
33199
+ <binding-cluster-commands
33200
+ .node=${this.node}
33201
+ .endpoint=${this.endpoint}
33202
+ .cluster=${30}
33203
+ ></binding-cluster-commands>
33204
+ </div>` : A}
33205
+
33206
+ <!-- Endpoint clusters listing -->
33207
+ <div class="container">
33208
+ <md-list>
33209
+ <md-list-item>
33210
+ <div slot="headline">
33211
+ <b>Clusters on Endpoint ${this.endpoint}</b>
33212
+ </div>
33213
+ <div slot="supporting-text">
33214
+ Device Type(s):
33215
+ ${getEndpointDeviceTypes(this.node, this.endpoint).map(deviceType => {
33216
+ return deviceType.label;
33217
+ }).join(" / ")}
33218
+ </div>
33219
+ </md-list-item>
33220
+ ${i([(_this$node = this.node) === null || _this$node === void 0 ? void 0 : _this$node.attributes.length], () => getUniqueClusters(this.node, this.endpoint).map(cluster => {
33221
+ var _clusters$cluster;
33222
+ return b`
33223
+ <md-list-item
33224
+ type="link"
33225
+ href=${`#node/${this.node.node_id}/${this.endpoint}/${cluster}`}
33226
+ >
33227
+ <div slot="headline">${((_clusters$cluster = clusters[cluster]) === null || _clusters$cluster === void 0 ? void 0 : _clusters$cluster.label) ?? "Custom/Unknown Cluster"}</div>
33228
+ <div slot="supporting-text">ClusterId ${cluster} (${formatHex(cluster)})</div>
33229
+ <ha-svg-icon slot="end" .path=${mdiChevronRight}></ha-svg-icon>
33230
+ </md-list-item>
33231
+ `;
33232
+ }))}
33233
+ </md-list>
33234
+ </div>
33235
+ `;
33236
+ }
33237
+ _goBack() {
33238
+ history.back();
33239
+ }
33240
+ };
33241
+ MatterEndpointView.styles = [notFoundStyles, i$7`
33242
+ :host {
33243
+ display: block;
33244
+ background-color: var(--md-sys-color-background);
33245
+ }
33246
+
33247
+ .header {
33248
+ background-color: var(--md-sys-color-primary);
33249
+ color: var(--md-sys-color-on-primary);
33250
+ --icon-primary-color: var(--md-sys-color-on-primary);
33251
+ font-weight: 400;
33252
+ display: flex;
33253
+ align-items: center;
33254
+ padding-right: 8px;
33255
+ height: 48px;
33256
+ }
33257
+
33258
+ md-icon-button {
33259
+ margin-right: 8px;
33260
+ }
33261
+
33262
+ .flex {
33263
+ flex: 1;
33264
+ }
33265
+
33266
+ .container {
33267
+ padding: 16px;
33268
+ max-width: 95%;
33269
+ margin: 0 auto;
33270
+ }
33271
+
33272
+ .status {
33273
+ color: var(--danger-color);
33274
+ font-weight: bold;
33275
+ font-size: 0.8em;
33276
+ }
33277
+ `];
33278
+ __decorateClass$c([c$5({
33279
+ context: clientContext
33280
+ })], MatterEndpointView.prototype, "client", 2);
33281
+ __decorateClass$c([c$5({
33282
+ context: tickContext,
33283
+ subscribe: true
33284
+ })], MatterEndpointView.prototype, "_tick", 2);
33285
+ __decorateClass$c([n$5()], MatterEndpointView.prototype, "node", 2);
33286
+ __decorateClass$c([e$b({
33287
+ context: bindingContext
33288
+ }), n$5()], MatterEndpointView.prototype, "endpoint", 2);
33289
+ MatterEndpointView = __decorateClass$c([t$1("matter-endpoint-view")], MatterEndpointView);
32184
33290
 
32185
33291
  var __getOwnPropDesc$a = Object.getOwnPropertyDescriptor;
32186
33292
  var __decorateClass$b = (decorators, target, key, kind) => {
@@ -32658,17 +33764,6 @@ function getSignalColorFromLqi(lqi) {
32658
33764
  function stripMdnsHostname(hostname) {
32659
33765
  return hostname.replace(/\.$/, "").replace(/\.local$/i, "");
32660
33766
  }
32661
- function getDeviceName(node) {
32662
- if (node.nodeLabel) {
32663
- return node.nodeLabel;
32664
- }
32665
- const productName = node.productName || "Unknown Device";
32666
- const serialNumber = node.serialNumber;
32667
- if (serialNumber) {
32668
- return `${productName} (${serialNumber})`;
32669
- }
32670
- return productName;
32671
- }
32672
33767
  function getThreadRoleName(role) {
32673
33768
  switch (role) {
32674
33769
  case 0:
@@ -45512,7 +46607,7 @@ MatterNodeView = __decorateClass$3([t$1("matter-node-view")], MatterNodeView);
45512
46607
  */
45513
46608
  const showCommissionNodeDialog = async () => {
45514
46609
  var _document$querySelect;
45515
- await import('./commission-node-dialog-BTzCGgdy.js');
46610
+ await import('./commission-node-dialog-nVZp3go0.js');
45516
46611
  const dialog = document.createElement("commission-node-dialog");
45517
46612
  (_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
45518
46613
  };
@@ -45564,13 +46659,13 @@ let ServerDetails = class extends i$4 {
45564
46659
  </md-list-item>
45565
46660
  <md-list-item>
45566
46661
  <div slot="supporting-text">
45567
- <div class="left">FabricId: </div>${this.client.serverInfo.fabric_id}
46662
+ <div class="left">Matter Server Version: </div>${this.client.serverInfo.sdk_version}
45568
46663
  </div>
45569
46664
  <div slot="supporting-text">
45570
- <div class="left">Compressed FabricId: </div>${this.client.serverInfo.compressed_fabric_id}
46665
+ <div class="left">FabricId: </div>${this.client.serverInfo.fabric_id}
45571
46666
  </div>
45572
46667
  <div slot="supporting-text">
45573
- <div class="left">SDK Wheels Version: </div>${this.client.serverInfo.sdk_version}
46668
+ <div class="left">Compressed FabricId: </div>${this.client.serverInfo.compressed_fabric_id}
45574
46669
  </div>
45575
46670
  <div slot="supporting-text">
45576
46671
  <div class="left">Schema Version: </div>${this.client.serverInfo.schema_version}
@@ -46070,4 +47165,4 @@ var matterDashboardApp = /*#__PURE__*/Object.freeze({
46070
47165
  __proto__: null
46071
47166
  });
46072
47167
 
46073
- export { A, DevModeService as D, MAX_NODE_LABEL_LENGTH as M, __decorate as _, clientContext as a, i$4 as b, c$5 as c, b as d, e$6 as e, fireAndForget as f, t$1 as g, handleAsync as h, i$7 as i, mdiAccessPoint as j, mdiEyeOff as k, mdiEye as l, mdiWifi as m, n$5 as n, formatHex as o, showPromptDialog as p, mixinDelegatesAria as q, r$3 as r, showAlertDialog as s, tickContext as t, e$3 as u, showSettingsDialog$1 as v, writeNodeLabel as w, matterDashboardApp as x };
47168
+ export { A, mdiClose as B, getDeviceName as C, DevModeService as D, targetAclCapacityForBinding as E, addBinding as F, bindableClusters as G, getEndpointDeviceTypes as H, mixinDelegatesAria as I, e$3 as J, showSettingsDialog$1 as K, matterDashboardApp as L, MAX_NODE_LABEL_LENGTH as M, Privilege as P, __decorate as _, clientContext as a, i$4 as b, c$5 as c, b as d, e$6 as e, fireAndForget as f, t$1 as g, handleAsync as h, i$7 as i, mdiAccessPoint as j, mdiEyeOff as k, mdiEye as l, mdiWifi as m, n$5 as n, formatHex as o, nodeIdKey as p, aclCapacity as q, r$3 as r, showAlertDialog as s, tickContext as t, targetServerClusters as u, clusters as v, writeNodeLabel as w, AuthMode as x, addAclEntry as y, PRIVILEGE_NAMES as z };