From 1e3d86bfab0949468a183ff52c0bc6d036f59a53 Mon Sep 17 00:00:00 2001 From: sleevezipper Date: Sat, 6 Mar 2021 17:53:10 +0100 Subject: [PATCH 1/3] add volume sensor --- UserInterface/Views/AddSensorDialog.axaml.cs | 7 +++ .../InterProcessApi.cs | 3 ++ .../ServiceContractModels.cs | 3 +- .../Data/ConfigurationService.cs | 3 ++ .../Domain/Sensors/CurrentVolumeSensor.cs | 53 +++++++++++++++++++ 5 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 hass-workstation-service/Domain/Sensors/CurrentVolumeSensor.cs diff --git a/UserInterface/Views/AddSensorDialog.axaml.cs b/UserInterface/Views/AddSensorDialog.axaml.cs index 4e85944..1f0f785 100644 --- a/UserInterface/Views/AddSensorDialog.axaml.cs +++ b/UserInterface/Views/AddSensorDialog.axaml.cs @@ -156,6 +156,13 @@ namespace UserInterface.Views item.ShowWindowNameInput = false; item.UpdateInterval = 5; break; + case AvailableSensors.CurrentVolumeSensor: + item.Description = "This sensor returns the volume of currently playing audio."; + item.MoreInfoLink = "https://github.com/sleevezipper/hass-workstation-service#currentvolume"; + item.ShowQueryInput = false; + item.ShowWindowNameInput = false; + item.UpdateInterval = 5; + break; default: item.Description = null; item.MoreInfoLink = null; diff --git a/hass-workstation-service/Communication/InterProcesCommunication/InterProcessApi.cs b/hass-workstation-service/Communication/InterProcesCommunication/InterProcessApi.cs index 95c4a6b..0d54bc2 100644 --- a/hass-workstation-service/Communication/InterProcesCommunication/InterProcessApi.cs +++ b/hass-workstation-service/Communication/InterProcesCommunication/InterProcessApi.cs @@ -147,6 +147,9 @@ namespace hass_workstation_service.Communication.InterProcesCommunication case AvailableSensors.SessionStateSensor: sensorToCreate = new SessionStateSensor(this._publisher, (int)model.UpdateInterval, model.Name); break; + case AvailableSensors.CurrentVolumeSensor: + sensorToCreate = new CurrentVolumeSensor(this._publisher, (int)model.UpdateInterval, model.Name); + break; default: Log.Logger.Error("Unknown sensortype"); break; diff --git a/hass-workstation-service/Communication/InterProcesCommunication/ServiceContractModels.cs b/hass-workstation-service/Communication/InterProcesCommunication/ServiceContractModels.cs index 9f7481a..7c5a7bc 100644 --- a/hass-workstation-service/Communication/InterProcesCommunication/ServiceContractModels.cs +++ b/hass-workstation-service/Communication/InterProcesCommunication/ServiceContractModels.cs @@ -50,7 +50,8 @@ namespace hass_workstation_service.Communication.InterProcesCommunication.Models NamedWindowSensor, LastActiveSensor, LastBootSensor, - SessionStateSensor + SessionStateSensor, + CurrentVolumeSensor } public enum AvailableCommands diff --git a/hass-workstation-service/Data/ConfigurationService.cs b/hass-workstation-service/Data/ConfigurationService.cs index 7c0f61d..8337d35 100644 --- a/hass-workstation-service/Data/ConfigurationService.cs +++ b/hass-workstation-service/Data/ConfigurationService.cs @@ -120,6 +120,9 @@ namespace hass_workstation_service.Data case "SessionStateSensor": sensor = new SessionStateSensor(publisher, configuredSensor.UpdateInterval, configuredSensor.Name, configuredSensor.Id); break; + case "CurrentVolumeSensor": + sensor = new CurrentVolumeSensor(publisher, configuredSensor.UpdateInterval, configuredSensor.Name, configuredSensor.Id); + break; // keep this one last! case "WMIQuerySensor": sensor = new WMIQuerySensor(publisher, configuredSensor.Query, configuredSensor.UpdateInterval, configuredSensor.Name, configuredSensor.Id); diff --git a/hass-workstation-service/Domain/Sensors/CurrentVolumeSensor.cs b/hass-workstation-service/Domain/Sensors/CurrentVolumeSensor.cs new file mode 100644 index 0000000..9201d26 --- /dev/null +++ b/hass-workstation-service/Domain/Sensors/CurrentVolumeSensor.cs @@ -0,0 +1,53 @@ +using CoreAudio; +using hass_workstation_service.Communication; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace hass_workstation_service.Domain.Sensors +{ + public class CurrentVolumeSensor : AbstractSensor + { + + public CurrentVolumeSensor(MqttPublisher publisher, int? updateInterval = null, string name = "CurrentVolume", Guid id = default(Guid)) : base(publisher, name ?? "CurrentVolume", updateInterval ?? 10, id) { } + public override SensorDiscoveryConfigModel GetAutoDiscoveryConfig() + { + return this._autoDiscoveryConfigModel ?? SetAutoDiscoveryConfigModel(new SensorDiscoveryConfigModel() + { + Name = this.Name, + Unique_id = this.Id.ToString(), + Device = this.Publisher.DeviceConfigModel, + State_topic = $"homeassistant/{this.Domain}/{Publisher.DeviceConfigModel.Name}/{this.Name}/state", + Icon = "mdi:volume-medium", + Unit_of_measurement = "%", + Availability_topic = $"homeassistant/{this.Domain}/{Publisher.DeviceConfigModel.Name}/availability" + }); + } + + [DllImport("winmm.dll")] + public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume); + + public override string GetState() + { + MMDeviceEnumerator DevEnum = new MMDeviceEnumerator(); + + var collection = DevEnum.EnumerateAudioEndPoints(EDataFlow.eRender, DEVICE_STATE.DEVICE_STATE_ACTIVE); + + List peaks = new List(); + + + foreach (MMDevice device in collection) + { + peaks.Add(device.AudioMeterInformation.PeakValues[0]); + } + + return Math.Round(peaks.Max() * 100, 0).ToString(CultureInfo.InvariantCulture); + } + + + } +} From 12c8d991f1bf992d4587a38b3a08c8c022e1098e Mon Sep 17 00:00:00 2001 From: sleevezipper Date: Sat, 6 Mar 2021 18:00:53 +0100 Subject: [PATCH 2/3] add CoreAudio library --- .../hass-workstation-service.csproj | 6 ++++++ lib/CoreAudio.dll | Bin 0 -> 74240 bytes lib/readme.txt | 1 + 3 files changed, 7 insertions(+) create mode 100644 lib/CoreAudio.dll create mode 100644 lib/readme.txt diff --git a/hass-workstation-service/hass-workstation-service.csproj b/hass-workstation-service/hass-workstation-service.csproj index 445657e..675b076 100644 --- a/hass-workstation-service/hass-workstation-service.csproj +++ b/hass-workstation-service/hass-workstation-service.csproj @@ -52,4 +52,10 @@ + + + + ..\lib\CoreAudio.dll + + diff --git a/lib/CoreAudio.dll b/lib/CoreAudio.dll new file mode 100644 index 0000000000000000000000000000000000000000..5bc5b3d963e7307b6ffb5f0a16841b1daf08ec9b GIT binary patch literal 74240 zcmeFacYKsp_6K~QXC^a~Nq~feP!h<58WISEjubPQ1c;=ONdnl0kPHwBnV3l^h6sux zHr9f!buB3B>e_Yfy;tnIHdO4ox|X%9yT0FZ?tSh&6VTP{@AH1%Ki=qb=6=sT=iGD8 zt3 zB^eWi7-9(FlDvawAnilC2%kcvaN3l96NCKczs<-8pZ*+T+3_Sw|HnQRBo_YMuvP^7cJh|D*HD|aX?yYdc~Ovll~03)SVMqb*) z{pc;QvU}>yvof?E{D_rTX=V4+tFSWi4wimMH>&r~UZmL+FH>wpy-@#DGdCN~n~rX( zo+%AQ5ja;jMZsd^5QD;_!%$<{GhN*jKT8s0)74FZHO*)mrO|Fm%j}|bq}bBr`u2w( z(AVuf&h2tU5KmX$c~XAdP+6wZ4p`b|I-90;%A9D(VM=Y4n+oN(+-7bP>h(sRf$@u) z2#-gg>j-gxt}sRzS~+c^Q*?n3*HRt1kj(eCBNT19sBM0dBX>BgxS1}=9f5SRtLtM! zI8PmiZrUd!Eg?T8F*U)HiyG%&oSHCjNm@c`!VyxYb<$o}*9Q=Gb$!V6BhbX?X(%iW zA))e9oe}uw%E+r%ZaKRXDPE3lFMB8ZHu}HngTytvNCZ7`p%n^O-deLOmZkb*nU#$= zJH#*8D7S?6Z{r{3rUiBF%D zlXr#|@5kZ@FO<+HoROeiiE>Ga^68T#@?xC>-O{P+EXO0UQ0D=b6&J^q<_EL~VnX>2 z2xM3StUm+!95ZX2VNjq6i9&XXC5ur6OEiioCt8RQbR!Pzn)OKn+9&i>l&Q?rS!T#5 zIrqqR%76-rski4l#7y{v?t-?NfO5DidtHNbF?792W*6zWwm0`Taz}v?S#0ToF&Ye) z;~ZO@NZ1Ak66E=X;v(ZlJotdM%9=N+KgQxl`4qQ-mVnLPpg4Q7PQ-)wU`t%K1A?T+ z2<4MKYyhkRk!P(D=!S?JCOG@r5{53;7UE)U!F06m+R{@Gvfhs0pocz=@~~dm%UdDK zBQDCr)U$7SJ@vS}-=K%VfbuYb+RIxh%OftzLm2lhucscD_Z##u=ujTk5PNy6WO>9z zd6)+FEw85@m-id=Fm6$vFTT8HSsrmw9){z-<@MC#@_vIJ<_DCA_0L|vBV>8RMR^!X z`5Aslyns2>=>~L16Vb)HGXb$+ z45kk=x|SrcXkm_FP8X#k=UZce_6l&tIj)cVG#!zLkVkCljl`x;upcA#;j$}@>nlG^ zhcogN@o79I2z&_4dZ~_qOXVcubY(bl$6#d09x<+;{4^b|gvf4H3^fuJL!T(-Ma8CA z5}Q83ewEmmmZ`4vNtM)d8)iMU2~`ind#4`({RTbE-Y73OzPvTEJmR7}OfCDC*He$n`we=S-BI4y`0`q1dBjC| zm|FHNucscD_Z#%k%TOMAx;>r|Ssrmw9;TLk%j>Df<^2Xdba<49ac(cKO_oPol!vKh z-|~9uae2S0X9_GQw)qBg2sXHwH;Br)$2RF;b6{ohd}Nz|uuaf2&p0h+c2PQVnI1ir zau|#nZ;sBx2!8_^dEil}w0L`nS0lTV;yELGiOKT~3X=29KC=zAyi&kagMBueruMN+ zf2Md8LyPw%@i4hi-RP4lLUWomkH~q3!hw0_LJ047o>BRK`Y-tx|Cjt-|0Vy5eecKfqBams5k$~W*IkJil|1q+|tEO6}8%1j?r&ncBgwM+Qny& z5sqZs@5Il49ltvN#kSJpDXM5x`gAytL{N>$4CrR`WX@z}y(O6-MGs)^;hNi5nV7|V zZw7XY(sX2YjAL!K3#e?p_roHBcwujCA6rMtu|-^rEiAwLj;)@0JhpyGuSVZsPJl@> zcMH6teoh5g9q${&8y$`M*?dG8_ORw34?(kwl+fF5(=FnPI+5<4NXE?QHVAc3qBKjI zU6hX8Zb?%wCds@z{Q+yk5MRC8p#>LurGL?yjpif8S zSZHPB4L2RR|3Hd-nnL;boT@&jsn6-^6a9gFwwjH^O=mYrn+e?{Z1#0-Z|){>q`Fx= zRysOP+_=RK2JK8-L^9K=WbEDu``}nU&cm#6jZQ{Nj*e3FiO5hZBX6GMM}}!mY>sf) zZDm^mvaG>qTkL^jW%+b|^mK|0@~yc>?pc)2Ia*HddE)Yi+w&bF2s=J52ZO~qzC^m4 zi{;n52}L3bxtJimqg_X%L~kyp0`Is%rYjdi-P=)yx<+4uH{GP1PaTF5W*5=CR^2A( z@92Po_%5-#o$@A`8|gC_1KXQ-R4&GvH-g^fJ;KpifSnvEV88e>cZL-<*>On6Av+NF$5}M(k*iL~P`8GEzfENKhGx_0P3n+S}UAz7rR98y)lAI;W9+ zhVtn?c8nIVI*k>hI6Jvo3^A1FJ=ja5?^$-nYJq4Pl5oh9!!3eME-xlW-Gb$0%w-=` ze&=g3l$RjTmI5o0Wrw?!lW79#Fis0c|4ufCsTh$DhBzYu%J^%?z-^0Sy7F#550!6U zsp0tqZ_w}pg8$O+LV`GcRl0v7_y-LyBKVqy7ZV&|TEdqQT%#engR}jw8tx>BCk)E+ zWds*$h-P=TpQYh0f^Tbh1;MdSOZQ5GQ4Oymc(;asCg@JEgs&#JNW*Igp0D9w2)?i3 zwFD=)EZyq}ZqV?0f)8qlAUfOoxGmuu2`<*~CW4n}cr(FIHN1u3RF9>5E5S_~{*~b4 z8s0`QEzuIbo#0^_-a+sR4euoQ4-M}kILmA4-c9g$4eufNtcLdz9Gqkc-$$@f!}|&T zMZ*UOey8Ds1pUdD?n4Am*6?A1FKPG)!R$Vk@S_BqHGGWVO&UH<@ZTCfL2!OwOZQ2F zr)&5W!Phl>n&7B@mhdwKBN{$S@OBM%6Lh3l!p{+`(C~SJf7I{=g70YfBEkGrOBci4 z+1{z)%LMP$@D+lI{Vm~F2?jNMjo^hE{*B;=8oo}jFwN3^gCGts)v$V#;KLfeMX+DG zmHRfqr5f%bxKqP-2!5{Ny9B2Xuyo%ec#MX72|lUe`veDMSi&C=3~Bfw!K*a6 zeoS!AKuh-%f+uMBDZ%G7{ET4cAWQgjf?*9YBRbo!)9{P<+%F0KpmYC0FfiCM^%cQW zHT;_3D;j=7FlUG*{4K%N8vc{uEgF7D@MjIb2kbFVpI~5;#$S6`re*R6QaV$^9|^vx zA*N_&`69_KG|pKdI@%Gm_+bV4U-9`=2*gg2p*zg zUxJrw*pJ{B8m17OIo#4sCAdYy{(!N@p*0j^i2rsk#Wp0jkoIDeXd%VZ2EnSuR9r?tPp87cY^PC!YV_9fU&h*4U06BU;| zkoUn*>xij!E<<_IV@Maf$^Gh5mG-Yob(d$eBYr`bs=j|+icz#5m5W{Oe#@nB>|dAS z7QK>mv5R!#Az~N#KHg>KVll?eB-aF7@`|`vlfh*l!KLzui=`P{E*)Ho9C5L_gUfLQ zm+TW4>o&Mtn!I;GSKz<>DIWc2Xhkq5xW;A5e96JI;EG@byE@Q1Mqc~V=-0As?fXn> zTeQ(ytBvG6)c}+>Ot)v}VnhH!n;*6oX-~g_ z{f%M^;j$Sd?YsjrqTeBRl-Z3_0v_bpEKuE@A`^CU*$y`QxVM6#qjX78Y%vf4OHP)j z%<{=6B*ro`1*k8pRBQMrH5okH`>R3g(rvL+<8 zze#h{bbzB`=PqN}=K`qN-sgzI6rQ;e7w0bh_jm5nQ!fi3 zCoYlypguA-ix5LOACOq~z)dvqp~ll8G1@h5hUx00nK612s@siQAv$z9pVAX3-9<{Q zf`b$!BQvZ($^PpU``D*RG~PbVvQbRVu5R2zY5SPNE&HT`^Bd6LV4o)Bc>6SCN6{#* zZrpZh`-N< zC6Nni?mOUkUG0aB!0RD1&=<#~g|5btZ5X7nPnc@KSJy^p_A2Xrt#j6h^T<-Hm zMZotar$=VtqOZY~7P5--6iQJn0oK6&2fWj1X#j9fqJBIHh7h^UY)}5WNVM zPT!9FYOgDD0nCgWD8uE7%+$4r z{0SL+ckx%h`fbtQ`1GE=t zBZt5wMtdLh0a9{A=2DNsshmUy0_EX2ma?EbOY8DUAYKAtF?Xa0a&FrSg;^2~Smnz# zk9e>#Tid|%1_$*&ejg(<7t@7zI1oJ*CRr+Qt|k1IcXW0Wi@e3%Qay7>76WpGH;11& zBye4@qfM1om?kkzme#f1{ziW@GH1WG-JYmnq6qm+V~`kJDDBgFNqY)8C$N81n*%K) z2siqGgU`1}rbmg9B1_O-6DY}YTw*|`RZfyPixzPF`5doaKGb&x?!J9*R)U-YUiJvz z9?H6p2=0A^4m zUUCVMJBe&3e!0E31W0>y-xK!w9>#*=d%hgx4w9PZdxAc^zVqm#&G$JzhOnk;trF6# z9CherzAP+*zJF7>n@QG}z0&s_CFc1sV~gx+?zOC{x=Cp-R8^_-dZDU1$oyWYs`g#b z3)SpI**;~x(e+B*gLV|uxJ6h_lAl-*|6$N}ho{8n&H6P@Uw8oFi?#gcB<$sv( zaxi>XfY_J(mA_w8jlWgDUsH{~=HIWW#@-RXUsH{|)xTd;jk}iLuc=1en%}Q!ZBANy zp{n*KkzS~(tw|fHiX+Q5`=Yq7@!h@vS=aF;H8&wyml$UZuIuPdVW1Q9O;wb1UC$qV ziti-c7yHJL$2XDg)kLl(LZ-5_W%?&dx7hveAOpLGy^1P#Ksb3J2yM=@Gkjl=_WhI| zf^k&tI~hs4YG*H0Rh8HFLRAf(b-hqkqX$RZPT$cxl4^ZLsEhBeQV_Zm@LfukJR&>E zcOoUqeRo?-uC7|=H}p6=qPI;8j)2=mAi>2b@oZ+54})T)5&S1y6Dd6v%Y%|K!KN* zfEMm+Gp+oZCxvwfdab zOLevOoZm}zwenohOLevGTuACa-Fx0B-xbwpqGzb#u0sP2!};yw)M!@_!NV?*Jvn;? z?@ZNZ=TE<1Q^otD-><1ceev(tR8hX<_iL&EU;6tsRcv?ueoeKQU-tVotyTQ;UZ|?& zdsi=1)w+E}FI3fneI=|s3~&AfeC2|4lH6U7!nT8{eAJ)f z?s|+_L?@dA^IQX$c<~JTdx%eZECbHbGuk3LE?0JTL6s}pUr?Wah}m^344p#0;feZRDLq4`Z>RK3nZA?K*e>;yxr6w4@q_pe zA)Q+a|MSdTlj6`G#j7Lz#eXtJK_D^@Il1#GJNBy6!%&g$Sq*_(C>Ql29<>|BgKD>E z6I|v#B;UVrYdMHv#97UYSI4`V~N@PaoFwLZwXL8_+>lySz>u}@s0$ICv+(qJ@^HXeTEmlhaMYV z_(EhxUIE5$KbWAeM;>GziMK1vQ;0Zn(bisk<15C>MOU=P{BbIz(#+_lK56o+q}|jH z^Byp{vfUpLKco9Y`as_lqWdGs`8dY;1W8+9zapsms6#YE2mJwt z1>-aF%mLlRM-kuRBY%>KUrwP^?&E0Y?yo6pAWIC?qMV;>dIm0G9Vze5eGCed?#rN2 zNNRaQq6eX_M_KS-ME0L#&e{DPeI#^$Pg1e|@B=~FPUJKCH+&{0e5NiG=QHu)^H2DY zK2s_;0gcf8BV`TjCJFYLMY||p`b;U4F@7xr3d(0vv-!-hICxO8A#k>bzhqo%rxZ*q zm^^WEAp%OjG}HoGRE77Kjuzq?eA0W+BZ3|6&8;h=B(V{PI;V{QuP!K(Z_y3>b?K{A*I87vM)@GQI3crDIHsPF!$ZxFIwP7qSEbELPz< z8yAKE{|*Y`2G4}(hl}P`3|B#OQ7SItlRdf!_s50vp*+H9J#q1f!P8vgE2bw5KV@n^ zF%#3KOME!|_E9eJ+K7Yj#h^o&4q`f$>3vMkA5OWi&Yqa>68B^hJ$yJ>JBo7;&mqo9 zbBI1NnrPl2qEBT0IMpRiA3^D+e4-nM6X(XvsWV-oU<%PB@p!6B+>%YXH?qya%n>6_ zf#e$#soWrQ9-crllUee}p_HEQJ`+APuiRYX2d0vIRu<9G zEcx#P$o>ml7Z>|nHkWe8u%FrED1AGZm|93aY)d0+=_851&LBEn5FO9yX-HF)aSMSz z>Q(eRQ`Zg4DlFtQ^^UYLgghdR^RCV%l!!NqNb>FJgpx298n7@lC#%pe`iP;NcV+?Q z^$|IYre+fAhqu~EZ~QDm_|_()zq4c-zQIj-{bo>J2Hr;_G-)`Yfmn?ReLb1bAgte) zz~9sJvhdQ>V5|z1_XC6Q&ZHDNg6QKifB}a4E*b`Hb#hv{a#8j1E)i zd=E)BD)eAKLd^=j$C7J+$d@|;RKk&z2lV40LQ!!MvQosia|m^aOF8eK3hm^)KQrnS zmvi3L3hiQ)TS9tk#g**mcP=V@ow%OS7ZV5_rO=sZ&86ZPg-Wss9j{PBF`-iwI>S%s zbcIG_5ju+yyq=HR7K-x}`Y46a58_5HuZwM_88@@!K^)Hvg&GHwWR7tw=N$>p3dI-$ z(>dy1IfYQJ@igaEDfA4ZR`^mV#u_g$dWz9hd_@2@29Hr}wpG7Jp|AYvhC~h!Jbn+B&9Q*RH;bgRTDCs?7B;vmmaSLpoC>}NX za^6yo{NqNN;X&Tzsjp8xQ9NO!^W@!?^7_=J;wfW*aWUFDan|eDlD?}@#&C%Sa^BOE zB^t~qG*+TaM*XJR(WZbzBRKDcK@yE*WR^%Yn$aPCiN-U!PoV=Cy^<^QW-}_8BT+G< zO~dS{{}_pCIq!}FiR!q1ZyZ4Nd)HXXdCNvo-UkZ(0g)io#CeZoOB7+We6U0vj1HY3 z(RxM)Op)j)Mn4`X(I!U2=1R1g(L3z*2gdP?rl`Da2F)60i7M}F!-1ZR2R@<@UVq1VrCjTa+YjgzEHJ*M8V%gkvpvUEQf&P)TEZw8QDJdlWdqqV5 zV{8FE)Fhh6G;`Kgq+cvJ8B|(+V)|*CGjjM2r1wld*Xa;fbMQnKk_?FLOonyg&+(q<3q%HpUeaC|{z)SS&M51r@Bl<5;OJ-Joyk*~pN{m`DKkO0^dovppP7i{vbjFc{#kQC-yh@$_0F9K z`p}$(paV*(weAXM9kh(ZI?bugJs6yE6N#=IKy>;jqKN~EE*f&MmVAC>2%I~Zx-&wW zKV)hX_!D!97BhW0iPAd<61{y)la~B^QZqP%eMGDBh!*>sb?)wAN1!Jx9Zoc9$`MYA z71ei2Rx9YtRHA>JLA21{nvfyBaU6@i)}wBs_cFbj=^vP0ltTO+Or1_jpOH-T{Juo* zOd{ICoHC~MOgA!poGl;Lk7VkYX0iO=+4A#D2e8efIDI_RWDm)|!@6_1lu<6?OyG1C zQx|h48^oXOC3-8%|C#x1Y~kQO#2?S;2beapWDciaOQhU2>`x8TMy4k+J%{N!rZ+JC ziEH!;(_u_Eu>A}!aSqc-Z2wPO)4go}Go~ZCUh7RNaU;`9n6Bigp2YN6rh{Zz>|vC( zvN#>#vQA{J;cS09%Ma%Cr>ylU`|vr(q>%ZSvwRclwy}H?NAFbT|0HY2b?L+OWcGFk z*WxOsK9;|o`A0Kn2;0eH`XyW5&30xnt!AGWa_%84e?O-`;Pl^_`dRYl1d7ICoclVL zzMB1C&os#Nbf%NpW)hcm6-&O$77k*%jV)~E8f9>9B_yprKVfPV{e0=1DEj%EbEw3d zhY~$xEYbeMi9SA=Xu>R_w-ylX8b~2t6HE3<3b?P}m zbM=6dV-xVz<_RYty?n|kpbh@hK|98t4LWl8d7yhH{|Pj6)}^2o1-n2ujk_9jIn$j? zA7*;RsO!N0nCX-Ln~^>y^LEfravwsC(i}9Ri$JG|Po_K$+AxXevI3%K%p`ht0?~_$ ziLPPJ-9sq-_AsJTXA}L`ETW&J61{yY(TkYAG?>yW4j?*s5YbdFrDi&%ub)h`cqq{i zCK4^rBD!E2(P`|-_gvxxw(#6Q;@4yoUC6m-u>5f)#97go=&780;z&wYu@7bJTL$~N ziai_>pxov;MAva$j>@6*1?<&N{VDw-YhBK{56vLX6-?h{`fsLnbJ;>Z(Y36b!QPH% zKR@7zozB+wGTqJePOjZsOm}j8&S48bu)H&qtQjnM82eD+BTk=jL`N_`Yc!?DPayh< zpQxYt&rhQCbxdz%PbRZh3pjn;7|QLRM|8p2EkPC0x^&*nc1QlhfJfAKB+z$Qa_@>}NpNpiQx(8~Fn0hyGVV#|Wa!m<~56{n?n; zDR<0Upx=)n&Ua(p0qv7Zd!c0BC4Mz#FVg=Q^C9TqT-qu9d(0BTGeZrROFS?Tvxm56AjwqBae;IG==21aI6if-Y3({j z^+|HoZ$2-XsGrj-4N6bubUmjHL7X{E2QjCZ>9hEm)B4TjoNn<_`VQtikx1$5n1315 zSt-Ohk8|g<<@BT^I3!o|>&+D8{?$YDN>G=WR7{?4#a_`R24S!05+i1Gfu1vzqER=B zA~s?M(LZCaXo%aHo{~?TIax%%9!d1c9IE^02M&PETc;1fS>${{5lGAbhIM?MAGZcEGuo$RXp&xQ`amv`HkU4z5D?x0N zNE8&h5VwmI8ak2CZH%@I+B>Bjbt@W9K_d4n>Xnh-VaP zM~(W3&lIXH8gKR$$s@_;R?o2f7FS;}h>`S~&ROZ#skfrMb{F0kW%P(~b!N~d&sQBd zv)Gln-j$~FF33FAl_A15D+9%Gssw-GHrF6=ib8ve2<@;*4idMkyl;%TuEFAdg=$Pf zk1I5U(Q{hw6y)tudDjler6($*$epd8I|j^m4G}&@RHHLpnW9PM8Pm^mWr-GrsP|-v z4uwXHoC~x=A&OF#xLKiL`4=JY2S(E7P~jO( zMVW;Vi3MUAqphCj3KHFAVwFNq4($uXKe2&GwB@7&ou=|$%(}`f6W1$r_-I1A8Oc#x zCcb1OM{$|R;uG<$o@djBz)Gz`9|0XCPEjanK#qH%cu1ifpmOn(LRsm#?g}wwoQ&r* zpi0rAP)qs*ca^wIp%Z|r#TyDenLf?ENThSqZ}q$dR3pk2dOl;0J1CA*=rf>NaTg z#kx_vsu0DxQGBlu#kx@pnjq^=v2GMI6k0c#&=Q5}8Le07v4m}|MsbcpW5(s;eEdp@ z1kJRK;!8%djT%K3zW6Q2?Lw5E4@5KV7io*!O`=GlxdRrtSBN@==Aj+Md4L zy;^KhsCqz)J0i9!^nUtU_mSc(g}%<{cDIXjfMj{cxufDrMq53N87I3t#2$s#19gf4 zcp@Ps&v365c@l~0j1u=cQN(DgIDCdntQTiWcj3`m)xQSPp$A~6{ni(CZ&`SRv zNWRC2eE9(AXO&k3o5zY|yhcKC`5^E)?jZAlXmn6tI!=@_BE4_j$B9}-TRo4V?;bBY z6bhy-1foAj3az5p1Bx9oPn?qZllypazeJq3HBNG?c+DocRbYC>pR{s<7{-W7H#{eZ zi89agBUX}aqFN#`ZmP$#O{`aWL;d5;6U8|yuYOKn&xztbg$_#_;5kWrq$FGVUuB*w zJa|5e^2D^!S)P-{0TQvF+eHbZ(+7E`j`eI8@6tnD<=J-e86zui6W$hx{_JcDzZ?P8ZgG_!9PcPX@E z*d*jVuTaCZ=|CST)W2j7kSL-Owt5a3dX>3dR4a6C0--jAR-;F57dsSc%Lzd5W=2~) zErS;T-KFwQL+{xx-d5m1=LX5^VraE9j`u|%PHKXx)MF| zLUEcx9obiUE)>@*^q*l1k+)l+O&EU{igBf~gy#HfAxXbeOeGwSSYIS|NF=@+bgSng zL0`)6L=YU6X#P2a!$TP9Lk8I`=;j-v7XUZPYTBErQ#fk#A^Ql&!yrc zExFgTQ+%%^X&-r+7_@-B=6&R4qDi5~%uhX+i-#1Np7)h!m-tAb()?oAm10~O>B+Hq zmDt_HR=9s&CB9T>SpN5(tAsBsOIR@DXV0HSi$u78a3x+XcB{O9%c1&KF^g$fNGIaAyqmPko)Y3dZ@T_2aXex+q| zCi1p1qI;R5#2dx+3egz5N$h4s<7i&uP2z1vava?xK4e6mRUz+trAMpU&0^3huC2#C ztQe?BA==&FB9&@f9!Yp)Kx<+QJvX2u@m`sQyvpGniT7(X zZ+L6sgBsmhv@!7^jSBLPO?;TqX6UtKpP2ZlMq7(dPkcN6TWm33v}ZjD|`xHj=Qjs63#pVw&I)LRl? z&?v{hG4Umh>gU{(__9War9GPXszz=7uT1=#M$<;`PJCS>D*bJZ9`3&}agRpVK<^!m z)@Q$+_^w7~_O*%cX|x=E?$zkKK_4c*uhChfzD)d3qgQ}F(&*{g-zR>o(aZQnpHDP; zadfixbB(?lo#FjLqjc2$OO00hA5Hv+MzyaMl!8kOcx z_x@X>e@#Eo`?E$n0t>wKyqWeyk0e|V|4?t1Mzxt6yhAmj^B12+(?`~Ob2K^`bsw(L(CJ&eBQ&}iZ8S=w zlQ42dYqUHLwa1~;2iYYrk3*keo`_lbE)F$}wCAVMl|{_ewaC3zBPxBpM(ai|a&ORxO7GI>r@R*TMvbWSqcx(^ zH)+&0`O3u28XXLDj7Ia)hI)_HD1Y2|bBjjlL(WK&i1rLLj*jCzLjG}oOgdgm(wWBz z8qt}@i5k(F$H^Mena6gG=*;5`jp)o{hemYfah66e=3Sh0wnpy^y(Z~gjb6;VE$IS{ zDDNVTE}imF(xn=GJN~Jpof@SUJe72rMrGq)NV;63<>N!HD>R~WjVm>pHf*~0Dvd@D ztM^{55$&GvjR4grXeGJU=+{hG?!m6(JnKx{LUbnndeRLlkIuy3NxDfRIurkEoZf9Z zkM!=)i1hB#i1hA@)4N~iU7h)9(t{f9%KR$n5sgUi$vC~Ibl%mO|4w>Fqg|P<D7qh*;gadOOMkVpz|o612v*}4%UeDhQ{d)(|Ht6pGFkV;Tn z?|}nn0?7!~K*fR3h=&E6qTb)XD)m);RblMcp=JwRR zzc?oOHopC2ih~9b=Oor5Y6|*S+#G^(@!ki{!Ys?u{w$oFSzbNNx^|nhhsSbFoD3S| zgU=A=P_jI&n9^HDt2A;Sg#V_fhn9nK!MVMNIP~lF4sj~{cUt@$%KaD4#;wwSJu<%~ z_pZGE@A`JW_`mlJE$I8dXp260{==<_wz%EaE^~1%9p5^1H))8)cy>T4(%p&$P zzmV*oOke6#qv-^;VDGnQuqXGU=i^^6;`D?pNJfXFkTg0B0em2Z8eTH~r0QHbJumqUYI!K?21%T3&OKH3j#*utBm-uCQ z#JMAz==t0_PvSS0@%{x%-ZGK22Bi_*)}MT^B1W7REFXrzKVAm9NJWWk&Yaql)4;P3 zNtz<+k6D|}?fVk?3AL|@{`1VNILj#Iw*F-8IQFm)Q+ruMv7n)q@r5pnPA?%p)3^`Z zIMDPt#JxNd-pG;sj@#wCKu-_h6||&f8JR>x#(}p;$g6*iBAZskWSZK7qUYdIK&>z1 zOu4idF~#^9R4*DMcwd{#{esKgSwtM#=U5}c%#&&I;co^}0~|vyGpIw%G0ED| zsl>kpi@hPF&s{~BeMAacinOSdjp!Ao7@K8JQ?88UA};YLu6q~iZi>S>8nXWvpcA9- zal1SUK30$!rq3y|c+7ru0LlL|oBG4ZG_rYZ4$&`pZaD+(Zi+`)QjYfrQ472sZ{tkJ zBF;3f?>Ja6#d)0T=XKUUm#nQXHemm7uEk$-WZL4$5rJPE&oX=t$XI-=u-uLfhz}x$ znav?~VO?{Ivw3wpioN}od)<$CQN$ESV8l5@Cd-tfe~+U*gAts`9HDa!~5yER5~bZ`grEt!=vm4Zjl#?D0&BvBj5h_ z-Ni4hXdiR$Is!e`A&%iOW#{bW`PR}4XNDGwyZM8_|-G$Vm^l#Jp z|Kt4sPMqbAQIpDDh;c@{@QQX3#x)h+5buvGjB6^s zHB5J?sh}==Pj~MWuNVuO0vkkUGW9bpW4egxQl<_3j^&X^av?hTPZ0b5nPkR~c*Z zz;(e`SjBjRDI8qIIzL{#!b4@A{@BfM~#X3i#_(p65{azdc`jglSDvXmsoyKXP z9^)*~WaB*06yqY$bmKD6LB>^}S;n=XKI10Pk;ZMHxyId~|w8(fJw8Yp0y1;lJwA}avwA%OrwAT0rbcsP;9cqwQ%M9{rmGJ{;i}4@OHpAge zME~`GZZ!IUZZ`UZ9%l>$-DYHgp2ik-u!VEDMi;RE7qf>~a_%*pdp&YJ;x=$R;x2GJ z;y&i=G1eiym-(M@`b$oK!!qB)D-V7vfpmp=8mPx4dHe%WpeZKV8N{3{=J=R1(j={1 zleEUM))bbR!7{U1rif)0FsGb3)hxe+B@bo(GUhk2WVMsZt#wkldpNxpX++*lbcUN^ zINMEaTI8k{EOAroEO1kt%iTGMRkeFGXstURbcuT+=%MbZpv&9`fHt`g1YPAW0c~-Y zfws9TK|9~Ze*;mIj(^6E7B;1N6EgAecgZFCgiw*`WI3h>(l zhk|B`F3=I;IM94?C+KAH1n4aB3TQxl47!l{LC_+$uoL%op}y~My3wGt!x4q$5ljP2 z8<`&Cpc1!m`Vvmx&-5LphLds~&Mwj1H;2;!q|fYoKd0YeY9x?M4pTqVKmwK3Ao+O1 z5#_qbhXCHWySuLg?;wWyHZr{r?=fz4>|rWAT$YD)eViWQ=@K9I9pQOWr1mRfP5_)C z{Q}Hc#+*iQO8PZ2XESrQfYaJ<3v(`J&Q5U7>9>-QdW zL?U~V*d;Pj9C$k*wV#hUBfu$28Nr+Y(nq8OINgZ!j+91DZ$bK=lr5aziS$P)J30Lz z(*08(nf+nT z2yk5KBbZafoB%iz(*w*|COLgccPG<5{U|L`h%Os^viPRYvLTe-%yf_MWRchR{!zr) zGxtuCJdkJ+(`8IIOHL8-modGV>3vN1FfA29XBn;yxVmxu1=kI@9>?`Gu5P2wxe3=6 zTqoc<*9bb#$8`y=TX5Zr>p@(v8H=6yW}UOb3_2I#YBm=;Bl!FSt}}6+h3kA=7vg#r zc`xAeC0wuJdL7rNxIV}A4_sg4G8{pt16My>X}ARbZZJ&H8w~HZ)18p(>s{n$@DI!cQeH|_n~_))BBj-&lKO`2me8)4;eMsiEPDhgKQUPiu=XG z;tBDrcu#yQ+{R!d-c7{e#GsW%Pcgfn{&)+ zv)(+|44bRXZu1Z3S?2lX9p-)JBj!uy*XBTn&oRbP=$P&(b_5-VJ61U84yYgQZBp=k zlQitPrtoj-xW?o572jXqVF-K&{T$Fa=@)=*Prn%S{d9WP_H_n5N5gmALFW#@Z;?Uf zX3*{Fw}HN&ei!K18TWy1%6JI0qTngS6yKXdNeS4|x$$d59+a4f9h?`tx+MGtOfr6% zr4N3Or62ZlDfnfdG<<(6L*#-x9%u@_MKKk>_<~=Y!7nEjic)aqgHwm!J*&r_axwON z2P5ZD%;1ONXU9U=F*abQ*oe9;&Wt1ralO9-bXUPqpd)8&0{vp_aiAHKh%Ozz4fI>) zWHBe-e+oFm^G^dUFFYIc%OaxbCds!moyYXW0i>Hd{X9@v%9xQPV_CQeX=(q~BC`4S zg3Cbn4!sKW;hgJ0(}&&ydd6s?znlRu7156`$AbXxJfpeGC@&dg!t z!^jy_;yFVf0`+G<4!X7YSmq52oB%5oPuJ->8=@QO;DvS7w)5zw3*z+8Y zNn3y7JB&S`(%b8Xy^nNw+9#m7C0~MuxJGXzkmQM6;=?)rM7nM8zd$cx`&N96K0?T{ z9_~-xUc>g+XM4amv#Ing?8$QW;jB@8!GDG6)3d3p6UU~5Gimr>(61*C106qW1ZX;Y zD`Rezl?(px{0X3I12aIoN6yuBcz!X`Qc^}ww%R>&7l3aZNRpAcl`8E)f2OfRrzCWG z;Xsd`iyodL4g{rB$pmnUa9@)m{GcYV8=PWXDcE6nz@fdc2lqK%a7sZ3o2h=0x zVNBpxZ$M4R^#R`t>cJ1}^##8S)P!6=@RLD3_4|VF$c5-u{XsU z#M>0Dh_NXmh^r~u5JeNeepCk9j(r_YxkUx&arhT3O>r`8o8lB$#j_IFGcgM<2K@tK zY2y9rLqN|&oJ?^xVq=OwA|9qV2Qe^l2NVW94?lcpiVH+D=*95G#2wrk(5q0sDXvDz zrnnYmn&M8(Nv609zmtUTFk;R(@jho4=)IyF^ghJW#Qc8@=mTO4=!5vKfQfg5PXK*b zoQUW>0&0rK;I)bS&{IKQho`1^1HYPNiZ|h@Dc-_wCYj=GcxsA0@X-|S;+LOHu@`Sz zo8o=^?vp7#fRCp5Q0xT#2*2-SijTz=pr62NQ+xrhP4SiZ3+VUaI?x~R4z4NwC2j&0 z#x01cq=A)o)^KsCT z=xO~BpMmHzpMYX5G6tf}&oOc^%l{4OS-7joLCbyV7zO&3V+`mwjp1j~67i(z+>E)`oy6s0aljw_@)xa6)?cgRc3J|_ zvi-ygTq|*{!qtrH2wbb-XA7=1xLR>VaJAt&5}voi?> zM0PqNH(jLR8ii{*t}dIO>CQs73lf>-i)~4|Kxl==-Nus2=v75QJXbjJK}hrJBVx56?xR)fg`wVpObl=wrz+L}^-MW}G{%qcnuvD8#i zR#{zB6$mZxSC*8Q))Y>&7#wQGtsUUbM(HZ(2=m;gP-vQ%*StOuoH%U?UL>f9GlbY+%EN2J zEhWWxiyog*Bx*|QOKXZbN)>3ZViBs3w4lu;Xj{=@hZM`Q*2ebmns94JOxDiQ8g?e> zRWz)RX-J@DB`om=guf&p>Wj+)RVAeW^8=!!v_2H9E)7skRLDfICLl`Z%_|Mm21Aoe zM6h;#MF_z!v7$oSp^~b_mE~1nR#t`L83dcw?F)VwAXEIXK6IOH!cn_o#TRuq?(pbGH1q;y^xv5Lz| z%4!fLw7K)y6YwOUp~E7gSX)wFzl|OM^j_F|XV|KZsCP zqtL|*N-OIs(FC??Nq>X2Rn^rtZg7FWrnG`uj8m~Fl!j^-P^(fuM)S@u3&Lx=qLuG2 zC$Xjbm9cw>z7s5BdQoNw$ji?>PstYvW^Y@*;#Q$KWfZF6A=*OJqhnU7tp#DrGxQwn&}gON$+51o zGA2#i4B3>l^wH8%hn|K8Dmtr=qoDiV93|m?^+OzpTTO zP!X!|*C5{Is>%V3pc;P&!xN&KD_5x=Otn;LuH`9@+LAgQQJUQ3#7+GT<g^qPAXs%4S4`19HAZ zm`YTtK2W1l0p7*c)>UG4x70&+7{r29UXHGgl`c?r@* zjqq}KFbnz@R+ORx{Mx|gd=3R%LKI27#!t%+DpMJ(uyd^V3e52SazCOO!p@;~UKP#y zH5B>y-8-iEiYf@ny}T%|f|dn1Ue)ELOP~}eAv;Tvs`g{$D6OrbekZ3tFnLIp(%exa zYFD*K)|IYr47bsZ)4WLg0(+Qk(?|&GYE>*x=ExCDiw-uB71cdt^m-;$V+%#dUsHn( zlA1wawPa~!2+_d~ndVShA;46V5;lZ^T0mN^kX>0Rp;{bbjPla?ezc_weT>cfnG)W$ zgo5G5&i3Yx4Z)J2u<-*e4bf;^CiQP#h=RJ$*(RhI&$i%eW=&~rU5(tN;_g!QSX;QX zpv_{4M~aFE+O@8v5~eY0@h(FxngXk94Stv2vPm}%YGKDHq)y|n734V!>3YG$DBI5tz0;kKhSF(~8o*?$u`_07!3f~XH zB&k|n&cYS77FH85G3M1^#N+nEk4b|1L@jPL@JodCr7{YoOQ-}4x%u;!U^+#q6=h3A zT{Z7AC>baZ25Og}S`~Hp1(<50C8ZcKG*PKV&9<+R-IaR`3BX+KQtXlic0V+&E!EZG z8$A2YysEN%saS}?U0XW8swO6Ak2l>h(;Q0GD66b1tBr{Tt#!P#q8jYA4K1DFP)LL; zI$JuL*Mysz8w8&q$b09?NJsOE=EepZ$R!OO4Wg}$KWsfcR2^9tZkL%XzJb$CBwbb= zX=!fUfRm9G%`5AhqhMhp&;QmzYp`KWTT3`v9d5@E60QEVD~mUDXdK)S?Fg?a2t-<1 z!hHS`Etnr}4YxNp3V%yWq|rXsLUJgUgro87;?8JIxGmD&5pMbgiIVo_weX!3`Cg8|D-Ke*tVy)3i*`Vo?^c?udlZe=MUT?yCQHa3sIpcBpcQvIT6aGF)rW=_ z!a70sOyQ35NF(#@>Nr0MldPRbXHE^xh)WNCaYHn0&ufgdwjz!Zl51;2E$EYKgU_aQ z!7z@y+O3eAuSsTLRYU7au;(?mhfA8HZ7mHODq+-OH#9YcpucYhj&UMu!~4%8Tft`P zT(S?x8{1!wwzj`aGDjv_!|FUK-rjz*w88!6S`i6$G<4{yve$Notb3e{HXFySYDHtU zh1)we)YD*&cdraBU)|8L%HnDhJu|5Ms@9&|s@D1Kk=y52Q6w zin1s+Y-r42XPcZlB<(;yibLClYoaF`w6NXbUsn-oiZvV;zlmVLh`$`{!0hRAU4qovlq` zO}JxK1TL*=jp97Hc}?dUIb&hHY6c%&G!BzoN!T{C#pKjfN@GasqEGL`YYlfqu{bm} zv{Ohh_tO}n!6M4w7Cl#paYFlW;LSd~#-3_zZ7~zJuxh51tWfc{& z;=KN$bE&megph7gSyTg+RI@*A9C%HPYtiaLj_H4M`1M-s?sT+u_X@eIC z3$Nq?pd%V+Xj~N*6!+MO2n&=@*19&bIxLFAE1O$Y+V+@Elp)$}kti(=Vt!x&h655c zovpMnrID{VaEQ>n_Q)E=K~Wqa1@VBW72#&}_QrLV5PAUYmDWT+!%Q)(ki^i5Qes_k za|iE7d1o5mOeIycFR}AvUt{h{Ozb)V?}DAn$-$l)Sl{@GB(`Bav!pSmc0)Q%fl+%S zo_cJM!fb<;;dOS{8V_xKLl5cDy!K{n09$zHWv^j;230anvXugYy?(eB&4U@cB~0za zvzL7z#odjz26_V}sISBjKmU{(wmT12+m}nx<-J``(TWBvLhZ7n@=6=WSP_R{Bn~5l zad?g0mVR(y8y;LqYmllkV~=rrWKiJZMzvCa7yDzQ0hIvSPNgu)mSdMM8z)XFbWlU% zYSrI3WE3FT{X|rKLR&XB^-Ddr81SZ%Q{*VrF&yN*0yAwrCR83?+0eK_EyL6g?P_#u zz?i0heN-{G_vBfVwan-s$3j7j4J>)qhE~E*JgjO9>m9EYXjA)NiK1+yx}&`|f`5gt zv$3NSCc}Y-HkrW8zM+F|>q2;nj9E(FXxgTp0yzuC4fc?_Q$%kUxU=PT!5WZi+gpNd z-b%`{cmAGvapRz8rhQkht@YTEYkvGjvnLx>!1^z@mO3x4^@r^%baNxIJcjUQ5HuXbj2-vT9AZrC~j%Z26X- z81YRQxiLj6gA6pZZir>5?E&*UnwK}X;4Idbi~T7bD{=qenNIc;p5Uv)4XY&&{U8Q- zy3u@@Ku^#dYc|q3@r<=}6CO7l^q$eqm9t+gYoB4lonCFu?8B$5wSk5MHb#5~A{sFO zj^h1bapwwbZ!J_AUXSA%+=OGnM1EN-ZrmDLC^@eg?MsQO6)U3Qj;a;=>~d9k<&l+< z6)VI#c}G~=urmHY&zd{sVGm|hS`q@C?bu1>4e z(#sp&dWcd+zwTU{P z2n8BiT8hzP!XMqx+DK?Qp&IO#X>WspNB4np)zG>FW)SS-;!u$%e0kkpY^p+ ztb|_`Yqb2e#ZSc z{?vUCvzOzn6k|^`66svUw3%qr@)r779*OX0C)0Kwxne~N4PflsI@Z!>MMHaZ6+Ww1 zZHVG{y9KX?A;RbZF;3}v#fhz@xWmO^m%L3?w|Q~Z;uBi5qukyKwZ2=h5p0}wT9604 z6;ZhwTUo7Ef>f|k#;`;4%XGC>@&Y zk8ee@hd9`AXR~y_9nZi_6wg?RkYm5GMqmp~>v!u)IqmX%Ot;fw1raM6n4f4v0L<^V z(%q}5Z)oRFtRYS6KBKJF9wPMq=9VTb0iqSpc^X&yTQIXq0X~etV!6I~4HoH8Nn{Nk zUBnF_nk?ChcYQd1}yxic}4XKI9E>#wlmFMHWsH!6`1+u!B zlJH=JYfc+LD;e88(imAuM_2j@nR@fr*2{lUhGzVVFwN?}WTiaP+0=^i_ah*Wpk*;} z<+odpMfQ_N2mEoua%GT`bU+rDX{`+VWW-j3eX`7vGRUV z#ImtJ`!V(X<;pejm^B0aqkOaA7a}{>(e!U?@>m( zr$}sS`+ z=bqWu>~g%`8B)#~SqgKY5e8AO`~9$KXZtnrB3x-@E*&9Yu$rCOrPkWVcpsFQIKT|x zgAO(z#|j_=Iw%1TI_RK-f-ry_Fn}%zWPk_3Knw)YK?fZKBnJWsj3CbURdvryFPE}O z_8~C5J6&D<*I$4A_19m2J-h3hn_KAutTLGS9WKf$>)CAZ2rL!!2&8-LSkJCTtNVvy z@j&6TY()nkl=)!A0i9yGbtG5m<4vq|VsVG7wFlc`Ye{aM=VUXjbOvK!*={RC;m7+g z?VZx;#Tx+!S6(M$7ceP-j^kOq3c%UAba+#?VM9E0k$eNocDkhxgyNH|7>!=Mzz zCD#XsiU{p&q>jibDtsvvKK7PzYi@7uUr(h(d`x^W-4Cy^62+2JtsEfSaKpsZ>2v?WUOkoI{17gZ+6q+{xC^GiT zS6j&KYU}zYBz6N!2RRC|A)_oGgpsyTzaEODkJU@A+oK4?4FhWQPd8;Hr~0P8oLNra z2+6;rk^xWlKr%Q>1@zL2J>15CUJ%+oaBuCf^NPq}dJ_Uf=we&kxOOP#a+TDA zaqTdLfa>s}Jpf}QgfS`$;4oJQP-hQ797~voN89aOSX#6v5YkM=+pX(+`}f5GBbdp- zjLi=A!{n%~XM;Y%!KAQzha>&$!KB!s(rrr%d^l*YC!GjY!34Z`Kb z8TynQ!{yn*%yCQ1D{Uj-I;sNeD7IVhk=tO>sSddtMnGi6O981EvYCw&jA4h2kp((ZOj`T zV8SOK40XZOpP14^lYok_EB&LD>dBi)ft3kqZSO=1~7qtvgb4iZOax4r5MNwW;CPd@wIlTY+_%P zXf(-3SGad-OL@?LgQzbJMqY~|slfnQj2n!vFQ)bP;mKvA@6RNW^(0y7 zkDSu!j8jV=ndFf9UqNOx1EZ*yzHY3qx25f4|2>~}8Op)C+3dbVBX!c0eGv&uJ0|jB zpe-2(9GA-=IY!UZ$@=jppjl)jl~!emAa+BoZ^9<8w?#IR7#sJSJNqw<0!7V(>Z5WB zH)UG*Q58@Tj_4Acb>7q293{!*crrljD?ABYCP}d}C{vPNCLw+M-6JgcDL3+!GTZ)} zO0&k+G%81XJsHBK`N6K zPG3x=mg&ggxswHKL8iGzDt!|gZ9F#$tizTxUslA2CsLk|US>}+)ePC&4Gs=kH**F_ z?#ao4;%}^C7b0FP;L8ShJ%iRXhmbSatSz!Le;EsJdqCx0*33_V{qg3_L5G-ryrpr( zdo~cd$%pQXaI(Fs+5N!+Zgg~zu6m}ip4m%1-Soc4 zNq8jBFKNiuIBPg%F^Qe00}wKN0twSwqM1cDyEheNe^u<%Wvh5oG?5&Zr2geS?0A+> zFcz71og^FdD1+1p{GK+&5Uyc(t?yImxbjwx@7Elk-1zGw2g5x%O@!WUHb@THX< ze8p=Y?lHcqvZ-LZB))#s#258-d@m^x-vnynyD1uADquRk)fMV&p_h#mT7{9Vbu4=r}1AV>3yq2%Bl3&J|Pd zB&8zsNm438pCqLs^hr`GLZ2k1BJ@d8Dng$mrQ-C-E1)%(Jo$xD3JRkX7Dg#5j8a?} zrKB)Q9MwH;pN?A4ETmr`DHUa(IEpPQcaLYEIF|M?LXN!g^!j?&4dgDxP#P zhE~yz*^p;|R>(%U2RO&rI!4s&5xQs#EIf0Zt-{53wM2VGN}kdI%tLG+DRPwV0>cBo zDN+xC>jPF=HUxFHDiOk@76kA~p75?T{3@_RV9=t85EGY+c$`sSPC{JFr<{49k0G`Q zrBwLe1Pn+rQ;)w7%pL) zIgw>S*_lY$6S*VLE}lro5j;iUh$WoyBy&toDJSM=IIluX%8*(h(=|bjd@z=zL^%&< zXguKmDoVa62^Z=4k4cHWFX|dTzY1<1hbIH^snfJdEY~b|)U1cg9r;K^*}33~a!v$A zwxL5xJ~*eWq{JD=5@pWWEb6EUiQ^-YfU;Cs*B*x_O_Yh8CmWSho~K`@>?mug6Qncb z>ES84B2TP?l*HpuqCQbdAzWGSq-H)mPb?`9n!sB8xRhA$Xc1W(Y3Ur4K@*&^wr-~7 z$+YnOTEIA34iJO3$PxcGc(9=btk)Lk&?1f2J6gJ-KK(jnC+&lWR7i0s@rS46flJz7 z)|%0>dw5E0894G`{zmob;VIGTQq~42J)WG{A7J~)a-%=91+=seCvnJXbpaN zN^G~;BC!5BxX2URL)vVXCR+fuT&z#*J32y_T=>}rvqfb)#Wt9&Gd|%7sEv!7NlWYi zPip3-pcH^>SsrY2V9)Y(?C6=myY z39i^Hh(XE6Gxdor)u?@XcsWsvsNc*TIb~mk{e+<%Cydgd6=Nvzsn4{L)M)CE2A){| zJz%jX!J5ZD1T{?7;0<7rCfiwRFKaN%NcJzJyk+|~T#=BHWN+Z{`@SrbV)~h+^mzSD zxpE_O$M&w6+!Zqpme!>xp4g%klRMUoN2MgSm1iefsAJTE7D~_%y>QlY2WNJuxHh4W ztr~ULMx4?zHJ5dd{U_PuW=*9f9kq1qp|k&avUfPT>XxU(vU^lY>^srQ zN;|<+X^CiOm=mt?QO9Hp#JcE!cUmUaU$!K)*|gjzbI02Hs60__>=jT7lm%1e)36uK zQlRy<0skyHv9)IpiZYjNusqvH=9BB3`OyY(*vF;IemHG1|4Yj(L)t3#8!}Fq_o1aD zC0b|7=CgPTAuY<)MCzlh`NLaZ_F$wHr}bs}w6aZ5&h&{eN{%hikS7DOAQ#j@+GFO9 z_Kl-5&So-Cl(@9MvJI9J*8wNZOfDRiv7KZ3O@y#*VPB3pq#PN`6sZg)o{c%FM?;=i z-W&@tAJi&RqO48)vyEfxK?~1*CpDA$N*!enp6v!hWB5ZM5w>hi_+-n;(OpwewLwjm zjvNnVaw4CUrfhjeb4UMh%*oL#+d2(*juzRPvmK*MhH|1EU{543rw3DFx`J^^PJTCj?(w4A6{EHTQdBXaB^l=>&-)Plb)^kx%xYU3ufpoMT+ zO;Vu*X?-nF>I^7J80SUWBb2D)>>YIg?ZAJM5+z;?CF)Kwlvpz!l@jHMPYmLsW>O}U z;Fgf{P~t5}atqRs5^n>K<+OqS4y5hD&k+!=$f);4K_rHv3Drve=^NuJ?HpM)}}b`Nk9#7a|}ou=K$f82=KMA%Vir+HxVW=2;C9ShrsRPe;?-v9U;FR z;4rj-^Qg9Q?+E&&`YjRn2-Jvi0GGRHUc!YpWO!Wn*{jOaB4Cct%MyXU8Ybd1&cxp91&W<;f z`sUOV_3cu^!OA)s#BA-{`cqS&sXcuRVL?3JUx11 zrUcjo9_D8eYi1tK{LI))sfuWo@u_kJPN}vsIaNMitv!oV*J{r$)OvphF6YmHq5f;~ z2RiTw$m{h!e**HlfV@%f^Cuv02*{iDK7Ru8rhwe4_xTf$TLSV{z0aS3yj7Vh*ZY_1 z{a3)v`Dz7+93vZ*$^>}py#ZEdMU=Peef~t0w*};#dY?Z5c}GCrt@rs8kaq>-cD>J^ zfZP_4_v(HA1mrydxl`}+Cm?qOO3Ka8f>8vu=6`dy?eFZCs3#geA827ya6CMyax`?PgEe9iFpC|Yj|fVu-P=XUGQ37 zKo-Ey`xSZrv{L!tFV6n*r|Q2wJC3Rd<)BlhGe(ENamYs*=V_$lQ*?NGD2_jdGehSL z9UO+JjL*{fJe@f@H9B=VXX%`y^8}qQ(D@xYJnd}!i*y=vaLv(a&{=}RgFA6T8k})D zP+njt<4Xu0@6qAmX*}}~jz9u$JO~j^gU%8iAeNpel}le7pRD(-vB~;5Tno4w8p9H-|=XE-7(0P;2EjlC} z)6=E%Hl26qyi4aco%iV60h&k8cj@%t^ggBUeZW_7UB)S^Bd++sXtd=UJ!^0C{4@wgT9N>vzwN@Kh_LjWuFu9A! zAM{M*GDUt{2EQY3@5emmBv`5T83x3F4px82G4xFB^f-0K3a`imqL8+e;Ous4ITO!sq=IELr zb64Q>?vgh$BBP)POO;vaN6D7z*C^t8@4w~kZl#Jc>U{|P$FB?vRU*a9bWn&8)JMX7 z6#y7|0Q#$v7;jLZw7}M;8%o-7m}#I#@ILB6ZRZTVcj)a&5%(xYfKrA&kfbh9cgQm6 zqt@UFMPJ_~x8Idad`N!Q=xB5-Iu{suuKu#5aZ%o$!mZZ7EA+2IsnvTQlSLZ(ig<#D zICvDdPtpuro(2zq()g2$dr0E^1W+LMBXY7-siaw4lF(PEqfmiqHdTyBy1>?eU70Jh z7^oTI35l>!s#6Stok;K0PL%mM@hFNH!ITX(sDdb!IY2XymU%ABLfc?K@GAr1VoL3H z7QT?ulL0VQXP~C2_8>a9fP9jAy+1D#pBD^H&rpHqs{E%?PgjA%Ebvai`RW;|(e=K^ z%v95yAxp$&81gIQ%uUZtlPaslSVa0#N-)^=uKKcxE2Qpb?=J)}~5 ze(wClTA414fLiah+6yx?wf?IjyMWKkHpV2p|LPpzP$NKvr_A8F z8K_F_c|i&mk1)zPEfiFLuq5Te4viH0%dC~iDGd8RP|K(!1AZRY~Y4>f%fF!}(cIM8=~g3sWPuznN$Piqx>VuG&is3_ zgdWpc`3rw?(87BjdxIB`#qmOiCE%eig+B*JH80|HF1&*zzMuY7`jw}z-7pq)P?$Y8 z_)up0KCSqy@@z?&9=w>R;0#`63a>=-3mS@2!)eimW@wALzGy6(j)LQQl?i=OThtWA zE-Bg|;$rp|+we8ZKRE3iRK+SOUmnI9ywsH)Z*qF1X>=;Z2fLKtFX5DOS8Hwgep}UD zy`x%N{-)a6(mLvz}Pz^%Ewk<~sJ;#uk zVH78t>Dy{z8%@=6faxV>tVWjY`i8GNzL7{wH}*o^0=YQ0P1Q1OP4y$t)RV;Ud@YQ9 z(?hqHg~mTJ95*dHNRmJeT`N$n&;bX{AXW|2aY82uG(968$FA=iW~6Gi@2i%*si~nC zI%?#_O*amm#Pv}Kr0F(8H?+K_YMXkjT2^4FVHBFG9mIB^n^tJz7*>Jlw~e-?*&dSH zvQZKOm6(>@ zG2OPgrP{isA$6;zwl)n*wKUE3{4KM+v1Lk3BhXw+a}yP3-=YWt-BW$nb5+x5x_%gI zvF|n0)Dr_`kXWi6Mvzj|h}9sl9Mz6>v*|VC&blKEH6^+Bt+_VgkntsTlIY} zFrqlno6S(tjEtt2Xqv7z4Gnn@BOgd%q(-_K>WKy#QHtpqy5$F+t;S*CAV*-)bHY$f z012uL~+Lq-z zsuwt#YTAZt8$r`*dTEX#%`kMQiSWpQltMdH{aDjfTwdau$O29%7O8J}j_Yqh={#F& zp)}iDs^4}ED5ADy_!@p~sGs1|@iu&2^N{ey7D{HrQhm@tw(y;Qd&6!y25K=eJUchN&GR7z58@Auz=;gU4kBBoj#`BJh|+cwAXzcW6{%~g1I;$0ByzMU z&3ohpaTq(6nz$@Yucg66#EGhVb_9D6#ipL>ydH&q5L*#61Vw7KP1HEu^;GDX?RWtQ zhp91XTA?1W0=tF-T{3lF4Ls;{;%Y$@>U!cuvE(yEEp9fEBiAs&XA>NIO;lygjeJ`R z6F+iN%mk@~hzrZ$LgzJ*3!*qyO<_Jfe}zmH`1Y10hqA@$4PwO zc7qfX`S4v9pB3B4y9RZKxlB+H$czu(k|fnS*9`*S4>VPWtRN+;sd{1Lsz&74R^$hM z=%nTDSb7{AS_qmJ2>Yy?VPL{mTTl|$4MQzW-E*VFwtSW*X<7*?u%X*3YPaPk5Q-TC zQ~rJRYir+EN-L{u>3X=HcT39iUz8S>81!+*;`eZUgs_iB!T{p*LhkRISK=%G@@Ieb zCG+UaAHDj6G3OWE@BA%kL|?gv?^PTeUR!DLG`quV*%w+5ukmDt{zkCvJPoE-}VOmnAtDv!u z^pC~L)R4>5WvVHY;4dHNq;x0`N`~bY3ONRl-68U{i_( Date: Sat, 6 Mar 2021 22:21:19 +0100 Subject: [PATCH 3/3] add current volume sensor to readme --- README.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3e4c6a2..7501a04 100644 --- a/README.md +++ b/README.md @@ -133,13 +133,24 @@ This sensor returns the current session state. It has the following possible sta |InUse|A user is currently logged in.| |Unknown|Something went wrong while getting the status.| +### CurrentVolume + +This sensor returns the volume of the currently playing audio. So if you're listening to music and you pause, this sensor will return 0 (or at least a very low value). + +|State|Explanation| +|---|---| +|Locked|All user sessions are locked.| +|LoggedOff|No users are logged in.| +|InUse|A user is currently logged in.| +|Unknown|Something went wrong while getting the status.| + ### Dummy This sensor spits out a random number every second. Useful for testing, maybe you'll find some other use for it. ## Commands -Commands can be used to trigger certain things on the client. For each command, a switch will be available in Home Assistant. Turning on the switch fires the command on the client and it will turn the switch off when it's done. Turning it off will cancel thje running command. +Commands can be used to trigger certain things on the client. For each command, a switch will be available in Home Assistant. Turning on the switch fires the command on the client and it will turn the switch off when it's done. Turning it off will cancel the running command. ### ShutdownCommand @@ -162,3 +173,11 @@ This command allows you to run any Windows Commands. The command will be run in |Rundll32.exe user32.dll,LockWorkStation|This locks the current session.| |shutdown /s /t 300|Shuts the PC down after 5 minutes (300 seconds).| |C:\path\to\your\batchfile.bat|Run the specified batch file.| + +## Credits + +This project depends on work done by others and they should at least get a mention. Please note that this list is not complete yet. + +### [CoreAudio](https://github.com/morphx666/CoreAudio) + +CoreAudio was used to check the current volume of playing audio.