uhome-1.3/0000775000175000017500000000000012566733451012670 5ustar kirklandkirklanduhome-1.3/ChangeLog0000664000175000017500000000730312566733451014445 0ustar kirklandkirklanduhome (1.3) released; urgency=medium * usr/bin/nest-update: - define PKG * README, usr/bin/nest-away, usr/share/man/man1/nest-home.1: - use requests module, login must be POST not GET - use yaml for ~/.uhome/nest.yaml for username/password * debian/control: - depend on python-yaml and python-requests -- Dustin Kirkland Fri, 30 Jan 2015 21:03:10 +0100 uhome (1.2-0ubuntu1) vivid; urgency=medium * === added directory snappy, === added directory snappy/bin, === added directory snappy/meta, snappy/Makefile, snappy/meta/package.yaml, snappy/meta/readme.md, usr/bin/uhome, usr/share/uhome/uhome.svg: - add initial packaging for snappy * snappy/Makefile, usr/bin/uhome, usr/bin/uhome-nest-update, usr/share/man/man1/uhome-nest-update.1: - update makefile to include svg - add a uhome-nest-update utility and manpage - speedup the uhome script by limiting pings to wait at most 1 second - iterate over the tries back and forth across devices * snappy/Makefile, snappy/meta/package.yaml, usr/bin/uhome, usr/bin/uhome-nest-update => usr/bin/nest-update, usr/share/man/man1/uhome-nest-update.1 => usr/share/man/man1/nest- update.1: - rename to nest-update - ensure we have all of the binaries we need in the .snap - use the snap data path - add some useful error messages -- Dustin Kirkland Fri, 30 Jan 2015 21:03:08 +0100 uhome (1.1-0ubuntu1) vivid; urgency=medium * debian/control: - add python dependency -- Dustin Kirkland Wed, 31 Dec 2014 00:57:39 -0600 uhome (1.0-0ubuntu1) vivid; urgency=medium * === added directory debian, === added directory debian/source, debian/compat, debian/control, debian/copyright, debian/install, debian/rules, debian/source/format, README, uhome: - initial commit * === added directory etc, === added directory etc/uhome, === added directory usr, === added directory usr/bin, debian/install, debian/postinst, etc/uhome/addresses, uhome => usr/bin/uhome: - create cronjob, install usr and etc - add user uhome for cronjob - parameterize script * debian/postrm, usr/bin/uhome: - set -e on script * === added directory etc/cron.d, === added directory var, === added directory var/lib, === added directory var/lib/uhome, debian/control, debian/postinst, debian/postrm (properties changed: - x to +x), etc/cron.d/uhome, README, usr/bin/uhome: - add cronjob, add uhome user for cronjob, support uhome and non-uhome user, track state in state file * etc/uhome/addresses, usr/bin/uhome: - drop support for mac address; doesn't seem to work very well; android devices I tested don't respond to broadcast ping * etc/cron.d/uhome, === removed directory etc/cron.d: - remove cronojob, afterall * === added directory usr/share, === added directory usr/share/uhome, usr/share/uhome/uhome_14.png, usr/share/uhome/uhome_192.png, usr/share/uhome/uhome_64.png, usr/share/uhome/uhome.png: - add a simple logo * === added symlink usr/bin/nest-home, === target is unest-away, usr/bin/nest-away: - add scripts that can set a nest as home or away, as a sample use case of uhome * README: - update doc * === added directory usr/share/man, === added directory usr/share/man/man1, === added symlink usr/share/man/man1/nest- away.1, === target is unest-home.1, usr/bin/uhome, usr/share/man/man1/nest-home.1, usr/share/man/man1/uhome.1: - add manpages * etc/uhome/addresses, === removed directory etc, === removed directory etc/uhome, usr/bin/uhome: drop the etc/ conffile -- Dustin Kirkland Wed, 31 Dec 2014 00:52:01 -0600 uhome-1.3/var/0000775000175000017500000000000012450011475013443 5ustar kirklandkirklanduhome-1.3/var/lib/0000775000175000017500000000000012450011475014211 5ustar kirklandkirklanduhome-1.3/var/lib/uhome/0000775000175000017500000000000012450011475015326 5ustar kirklandkirklanduhome-1.3/usr/0000775000175000017500000000000012450035127013464 5ustar kirklandkirklanduhome-1.3/usr/share/0000775000175000017500000000000012450713455014575 5ustar kirklandkirklanduhome-1.3/usr/share/uhome/0000775000175000017500000000000012461771141015710 5ustar kirklandkirklanduhome-1.3/usr/share/uhome/uhome_64.png0000664000175000017500000001030312450035142020031 0ustar kirklandkirklandPNG  IHDR@@iqzTXtRaw profile type exifxڝi >q!7Qzga(EI$@&Cr.ym8['j%8r=9ۍY~qBg^ڷw?La[}?>RJ]Dn4,Eܙܳkܧٝ TOT?2nuo]JAO7ySn/?GSd^~3磧j^n}†|2ij"/򼗯}Nf;?{+ζ/~ɒ{O:wM Z57捳-Xsx=B/+%7,? q'&D+_x]h~<އ//eEK5Px/4"eL[}) j2֏'g=쫂 YH;|TsژK:+55LiG9f;:r^9[ZSʲ6QMlCt5.|ХKWdعth2}Ǩ>vd66n[<7yrzl2k.v٘|z̅I.hg/ r%+gۦaocJx"G[LjFw6e4FuBH1.5ZݑWZ |y] N.-̆٭iғoӐ|"rl?< _2:ʾhsFSfa#F$n2".,: A\$5칊Ęvrzd?L1/cUl~֩}9+[C`܄Q*nÞRw@^3Hj IJ(M-W6$ -`-]uC`keJFɡ ,-J"ڞDtaNӧ^u#{$E@JֺS3̹Z؅'d}`@c6J"M|XBi{Uĸ7CZ;$mz"@ULJq-uFFwF}# [73^Yy@ 1!oNxUG#G 6,2rحmccEdCV7#O24TWLķ?H+ B}*Q63+y c x' @!)) ˲ky<rrr  1#̕ ++ (//bAjj_k䔦nO"w^,[ zf999exX /^CDGGh4nCѠwjV+:::0߁Xj***zj˗{$G%)))| T*I]]q^x3"餿8Nr-Ojjj&Ǐ'iiid``,aY<}Ǔ7ozNHMMmΟ=RDBB:;;7,;#i|Bp@8, >?\.=.MӐH$*?RtFOW L @{{;T*FGGǞ]/_KmkkZǞEEEd2M0BƒB8ݎxT'[ƲlIIEǁ㸱QUUeYzL07n@nn.jkkp8jšC<_#B%p8p -- ϟ?[v122ׯ_#;;˽{iQQQR9t%00OFLL عs' D lܸ$ ku%## QD"v=gUE,X`3[~0::/hAAA^6 VUxati^ځ=B__k.L&*v؁(/WxӧO<3'BǓY9#pah4l(--ÇM6!44|>NvGssOѳ(߿ }l\. 4MC (p70jg wxYv{m|it4 d2ٔ+<ڶ\3g`߾}{. {>( |>BK,0X|9 B #?غu+6oތ_l6bA(  T*0H$ųz̧G=_O|;.G=\8œ Ms][COI5>VRɥɻ.eHxoE.1I3*q"e9N|;.|F{=/%lj߃< O7_goywY?o=^GY;9E~|> AX& '=KNg~Ayer[s_.Yx]\><߿?xo$< 5Hp`Y3'y9gXXgIWe_Dv2=Hy4x1!-2ߥEL-CD}C{UhIJ)5}Xsi/ mc/c? >%TyG8#\`3m7ǻYL"ZI}X6UKL_<c\>{Y] q/O ҋOHQ:e:Fga;UP@%TJ2~Wke >yShzyQNUz+ܚu%&GJm=e#sBYuYr4M({9>K)lvT@BEfD//R|eDU:S΍ V ӛ6a ^Ymb@G4v:6mmOAք(H)  0VEac xQsڰ?%>.*I(7uw[VCV}VGϨiϲ6l*9yA:6YwDr\ Y'A]go.$G׎H 7]z0vma8$ 92$Hf=p}\h"p Yp.2`ꝧ &0uV@J誊cIhTeiHS:Ǒ'z;Üsz`A-fi(<_2*W6T|O!/FDYGhk%}5ܝDu/Ri|ְkLFkc2+Eff~=:|*]91i9uU%>oXm~L`UڐfL憠+cP*$H#̫ھ7r.}r: ~6gڮ`RE4!S̽RX5rLA}13.|m8ցS;U\)[u{n0줌^Få)/P#f4uO&{=jgN@o`BEV0lEΘ/*{E gRaa]qǷ?1S'YnD70.:O[yy{( ,ZO uFjZ8QCGhkZBNB>e%!~HxݕMs4cͩ}sk;Se`Eݪק ɘ7z~9\y[2Qriwn4 LJhH_ 6?xUzF29FeIKLVP׀kD&*{ -rSBi6bӠ,8<\_^vrL(X@YRi*H94:;l"ڇúrT_pb{T$bTF;j}3J2alJ7y{$}ɭpX5B7'1$ ޸bz P"u]wy ~!8pXwaY-ɽÙ6 Cx!xvN҂LR<\ɍb 6gn޹YYCR;GHXt7;#9gkMk:UW Y`=ZOA0A & X8 1|5,©.`/ؚ†4{.iFB?^DI K.lG!t墠&Sio4Z)d&41g烖`OwCGzIS`|_it\ =ج5GkDN5G"Ce?t<Nz7)uTez`@#fJLi{AGidxx%b~4AkW[¢!U=j fD) t!4 ؉tT5i6W̴S0R–a ̂xҢ>zA ki%OPrƝ𐾥#$3D J3-}5cXB : ׾E5&wQR-EgqMH%!6,5LL`=#3LHx# " !tj-w8qk?<` UyGUh*"9f$}Tlyv[\G)CȠAIe6&3  r+,t^kŔHVdL\.@f:<gCLg `ho6p0q5ehck)WApf@TξժLT>`Qfea ( :ӞYCTft t:J+@Nwn y3.PH݅M:!@0;cKDonRu:]^*T$5ܺ.h^ eDKAZ̨}9ȹBaW@J) Bh{ `t٨P FܖF _h`/CZ:|قDŽɅ(GBޡM :fZ>[3r"Px0 oVwncfnTcvSlAmCVUFar2VndWw ;C3m&tp(F/8v p>1Q3X\1xRubȉVy68zzI'fMk@m_/t>Ix.J+:tzj ؜_Ƭ3a51cK1vT&ÃV"a>ڦi6ΨJ$2e`\'}Z;pp-`&PUH@n'6[ubM ~Aan_7#8Ƿ $ΰ]q*7dk`v݃,ѷQ̨xA1Š"riiLHCO0R76b;T1x íȆWL ҥ=S(~"pF}:8{ÙVaM7ٻA,D=ۉ );G]sŦ(D%~!ptȡ(67G}ӈFqe=_} Ŀ|Q*ɗaS\Ąf(rcCbc벒Sdr(Ɔ~Q^^Np4?* JD"1cn:8j$u3lذ999PT 0`RSSѻwo@b,XPѣ<.\}JIZ屎;ZK.lϞ=uh<{.?~>>V}#о}{,^wţGrA.S{lK6?f?ݻwYϞ= m b2_W֫W/&qLPk6Z l6/W2D ,`, &&zNEEݻ `0Y׮]-C___T*Vm6{.;v,Ŗ ԩSÇ)Cd%NV۷cܹx8Cpp0mۆӧѱqdff"** 2 {E||ի~zTWW#dŸgテl'VZ5k˫EP(Ddd$1rHD"T*#)) ?5O$5t:޽| n߾ i&$&&LYqx7iӦ~-CV?ǧ~Ǐ8"++ 'OT*ܡC )) 08y$f̘gRx=fYUUU߿?J%FѤiΆP(tR_yǑ#G`4?~#33j"cǎE~~>g2 111DPP={6rrrP[[K7y&g d2L> $ >Co߾(//ˑL"_f?qqq8y$f3\\\d0p@bPHKK… QRRB08vbccq5<ooo]K,B, 44٘2e R)Z-vڅYfΝ;m:MڦCAAQTTv튴4A&qs& 'N@TT6!j`ƍXd-<<9990a$I ˗/g}/hkqݑcaΝHHHhV/`7n1___`vVSJЩS'l޼Rg4? 111tR.k"''III-j_VM:88B+Wb͚5|2bcc_V+gϰ~zXeee@nn.Fmm-^ݹsfBAAAJJJJh"CRA,׿e.ߑH$o~lǡ K,Ajj*jjjH[1w"11;wN&MLt֍z D" \fϞ=CJJ -[2x9f9s&?\9s`ȮO`Rĉ-5DHLL?*2DBшoƲnyxyyaժUXb<<<(8t[nEBB%CtQ̜9W\ rkBBe$&&汍'V^+V@Py|w7|c"@V#==Ru/mqprrٳ0p-$$$/N#JZ ֭Cee%"##c1h0uT(Jǡ .͛_9h"c쀦h,'hB! <{DR-[r)͛5k^o"033lo RqA"@"77gFQQ'w} ??|R)4 1{lܻwϦjDޘSNŨQ 92DAAAȀ/ P[[6mBϞ=m"CdsHOOO ~;}Xv-~<ٳ1cN:eq+SIquuł qFˁ~oyIL6 YYYx뭷q~G̛7-z @4PvԨQ-uaڵ ֍@ @~T*-"33ӲsGsgHYy5Mff&f̘a9o߾}s @~~~HNNƢElٽ̙3͖!" .Drr%Ct ͒!"E&!**  |}g2h3oܸ"##-K!Y^^ttGzhXVVk߾E ~6<ϳ 0 qeE``d!!!a۶mc-/ڵkwޱ<Ν;`;H4Ν;gZKyve8uؑ޽hTf3y&{X,f1GGGJJJ_ŋYxxkر#۷ooA/%%%,**988X5juUXkY^,tԉBA=8txKך 0sL[N_p!֬Y DVý8<-nܸ#FD" 1fL<˖-Å R" zYCY?<<9r$#Laʔ)ppp^Ǒ#Gk՜!c fBÆ Cnn."##O4\ 007oҥK Je0I0rrrгgO ~P(Xhmۆ`c^WD"o2 HKKCΝ͎D"G}jIT*żynݺ? E/޹s'j5&N4p}W^-"aS.]`Ŋy^e"k3Z IjoPߒ{zm   H   H   H   H   H   H h$QWWq `wwUhU899Y}F^!Tjjuuu=$jZϟ?!ww P]]MC/ #z=JKK)zHyQ1"4d"|} A$}"ЩS'9 ("Xz Yudٳg(H8tL\rA$BѠyӧiD'~~~ zɄ}"?a< q H 42h4ē'O(H#,, ]vmg"33JIկ4 2LP*/a2(HA(b̘1 ?[z5v @Ez»)++ FH]v6mYUUUXjf̘ .Лb>N>ME\kh efرvJN2}|| a4h|j#&`())V#J1bt֭5UH ~J$&Y-CiPM? mQIENDB`uhome-1.3/usr/share/uhome/uhome_14.png0000664000175000017500000000215312450035142020030 0ustar kirklandkirklandPNG  IHDRH-kzTXtRaw profile type exifxڝT[! 9z 80@Unu=BB6aoĠ)fMVnؔx7w 7T,>źB?+GzSsyq"{㨞 /"[-9X'EIls)QhDaf,$FgS a ߡr_5Wң|Glad_W]a»촞V=;_ $<_oQ֚BjGaA*;r N g$[ޱv'1Ž+ J;,T+f޸~܅vHhIsxwjC=p/0m (~<}2 Rw#q ,33)v.mLolÓNb'ejU*5\J<% U2HNf`$ZK#)ו$?FCʰ Ƚ]u}d+w!6JGlkj,YsΜ,\RU7I:lxO8GDcEw~3Y esBIT|dIDAT(ϕj*EBAqf=)澸w}lED4) $ #ш V$I~FnnCDfs image/svg+xml uhome-1.3/usr/share/uhome/uhome.png0000664000175000017500000010440612450035142017530 0ustar kirklandkirklandPNG  IHDR zTXtRaw profile type exifxڝk)F*f sf={\x=>Uzm%^:tKO~Pi^;u<ǿ>a =O|@Ӧ=׊>l~Np?hVsI)oɻ.Kx(oR>WTv)Dj8u@7ߩďAO?_ϻ`.12n@~~vyzWT@¾6?L{7?^ʏ'!nlsdO:qILn5ᆛ[W=%S;]%,c.{;B׬K"-QVB>9orBwkzO2ڸa}3GG+9K"" bܴAR+/u)jgܹji2d.neU<5߽6^xbĸA93ܬLUxzg3>ѼG4+ڪ1ղ]Fޝe[gZgE-;s:kq摎 ckg_ @N_3Hж eԹv}k$j&?4v|¹qj=(5v~D3V]:/1T BM;&s+l0bI쇨l-z|,.ϕԄ3!N; x r3۩Nmlr;sl`Z>4g8 `w"s{bnshKVܖq~ZW)Rwx՜/A]셷 դ#QѫzU [9h5;!x%<I;8 Tf`9sttNY_nX/&irO>9殧(FkjNv K\@ޖL,r,; +Ft7AO u0-H(փ)v7TT5qW8*L! q>@*C  Af>hxKh U):uhI&2Pw:^brlmܐg- @`q1,H vrpXZbh bڮ~#ola$y6Cm%F.%8kȱǮ|)g6d0`=YFEf8oRXpmB)p a`"xEzAvȵ|p tsΰc xlna,Y;HqPsQ> R+2 't!sP.2` egvJN<ܑ\ 4dDb)hCK1[$kE<AJ&sW"r>D'e2~;,)-HG5Ę]|P.DăGY_7@vp݁|q_@Pѥpفy)w?NrI4 Rˈ& )lHꋆyigT'&tn. XM9uI>Y GDj{^oJ :ы CK1Y1_h{m@ ).33qkDhE@F B0Z ,saƉ`\WXrt59%xMe12czH#lb5ډz~M) ܯ|2*îh1&4P"9NkMl 6r 1ϟgkѥZjۨ{g)ODri8 Q5:͢Hc( Pd߂pai&y P;,\F_ !ii' "Ǜҗ:NuZx$z|pPIiho >zƈ "K j,o'4P >it5 M;o8ޣ5(PҠuzy'<M?D:g0)xoWIW`Y桡D -F{33 U@@W/(TY Ha!@fH BTi"ź \)ГS&Iuq1sq~?~%'1X%1X(/^nCϞ=}vp:Q 7p:xW0tP|x\.Ξ=q!;;Ν,+`tò,TV cƌAE%"K"(??رcn:x^ 4p8狷UUX"QF@uhKD DD%ܽ{7RRRe0 瓥0b)޶˰0#GDDDDD DDŜ}ζm0f|p:p:0 CR:UæiuСC9 6"b$"*,˒l6n܈ÇPU~_nĹ)*?nJ'"b$"*Du+V!C0`Yu)F?hwމٳgu D`IDT\;wK,Abb",˂i0 C?qjm_er0oʨi~?<ƍtYJ*xWѣGE)~;_DDŁ@Dʼnt:9s& !pvRJD^x MдiS\.ڵ arN𿕓z eʔA&Md1v#""K"PU^Gq99&8Tz<nݺXp!ڴi#G/ϲ,x<<ݻqyxzYۍ nݺq1 5=܋ҥK?FXX `$"K"Eu\.|'1bVZ%t_+T庮]vHKK}n9"\*:uA8rA^| :ru]$"b$"*|M5 o&TU 9-my;zĉq]w)ky߈8q+CT{ɿK8pjP_(`t"*ҡR7bȑطoi?W+AXoV ȏmn_w)_{5\.{ /n~NQQsQ Xp!\.\sP)64n/֭O1>ػw/G6Cմ?v:p\s=dԨQO"b$"5Do[PYԲ} (hڴ)VXJ*abĿsaDGGߗpi:Q_UV>}:ի =DtSJp"鉩;wƶm&qd1t:^{ *U pO^}UtQz*mۆ.]wޑ,(j*DEEaϞ=rZ>jg^vcȑX`n yʔ)Kbذa}d>"dpw^K.咈nܼ+bjI#.,Bk4MhӧcĈ8uUġ:톮PN?xGPreرp\2<o &?<Cu<0 㪯#"W*{p|>U%EvQ4 eʔۘ~VRR͛_Wt8xM6a۶m8qU+qѿ[УGtܙOMgϞСCb ڽF- ǃ˗/Gĉ#ヒcbG~~~@;PRxWU={6T 1XibΝ5jߏӧOcQfMj 뮻8G:T߿Gƺu[" ׋v!%%׿)Cep_`„ Xv-\._^X %.'ɓq}]ws""LO:gywp\擄וqܱcƍzKk>~;v,jժuըÇ1~x,Yup'zhժU1%"b/x ]/xJqQǃJ*|/Y_cǎŧ~О1u3 HIIAzCpRRR0g~]uŘ1c%'%Q+'#G`ܸqa𕸻ۅͲ,{煌~k VXx߿T[Ֆ>\B$&&bʔ)xE}Cٲeo>9sF~.CZåKyfh#<Z.vX̜9{k/g((r0vX;'O %"& [O\o8 YA;;y$^xdff]s=7Fff&|AYvXUa駟FDD۷ò,(rՆ&<,, 8vNڵk5ID1IQJ~{C4[N/t:ux7$%%anlI?ƴiPF 5JHcc)Z:tD`Y.Fv퐟U$ƚ5kd#"D$TΜ9SNʼn'B 5i @xx8Lٌ भ4hjԨAԩS4 ^N>qȑ#HOO/E䉈D5M.U4հo *Xi0orDbiŋ`:u -Bҥ9zIDMn!}/(RԈ!j|> ==ϟTNp/l|zѤI,Y:tbo.h֬,Yz ^ɛZ׋իW#22lID`ID7UTǎCnݰxbCQ=(a"//< 233ѬY3ysÎN~̘1111|rZRNn۶ ݺuΝ;e#J%P(saڵ2] bC1}tl.E;1yd >i0kKԝN'>a͚5}$"K"!ĮdӉm۶aРAؼy3TUr bc1cj׮P 8_ *Uĉ1qD)SFK ~. 9,Eu 1XQbZuՈǎ;4 eʔѣ1k,TXQӤk#ªbԨQHMME͚5\?|p\8|0 ɓ'#77W$"^ND:T^|˖-?3gr \ \4QZ5 2S F ldz_~(_<&M/ROw;|>h˗/#99Nˆ#Pzu$"?JQ"-- DNN4MHBRdy睘4i IˉOҥ 222#|ۺCQ\.ddd`Ȑ!8|p~9993f Ǝ+JBݡ (v7j#f<|>{1dggm۶p\2\c0 ǃ5k֠[nسg=1Xoݻ7Ν+Srվyyx饗ТE ^$;SD]6-[ QpiY^/n7v؁㭷zK"b$޽{7v"G)Ë]vq=ߦ"j-[HII졿]^ܹ3-[p"b$_OL_o۶ ڵî][XglXrOB\OQQ >˖-zE:s 1cJD`ID(`S^D9s`رA'|]tƍQzuYZ/^Č3Э[7ъ,K$''cԨQ8~x=H;Nh4QlYX}恽Yfظq#׿^UH>kj*<8y$^%NLZ}bƌ8s挜.ltuŪUбcGhf6lKsu]ήc\>o۶ mڴ9, ԩS¢Ep%Q-1-BeӦM-Zq´i0tP!G'\:޽=z͛eL^1X!W_}hYFZUUܹ3fϞ/WA~~UA*Z;0Pre;&MBXX>"p!!K.5k,(녦i0 3gʥD`ID%5kGv !Bĉ1l0.?NEB~~>x ̛7[Რ)v+W"66_}@1XQ988s ƌѣG#??8J)B>?̝;111rax<|{dt H~am Ų ˅w}8jI`ID%ӧs23E7,[ O>$|>. ijժBbb"J*%z/??,˂4 G۶mqF'b$ÓO>7iN:b׸D|r4jir#9x0n8̙3aaa2H.~siDEE!335.,8ڵkx |G4M 2C͚5%?% ظq#*VxU,CRRYq_nڶm/=ڷoӧO%"K"*bҲ,8NO>8ydȝ :bՈEXXl հaChٲcz?ou6mSO=}ppz qu 0arrrd) if͚ظq#:vȵ;/F>}`F@;ȋݻw]vxw( LӔ#D`ID7!іɓݻ7ΝsX0xǷahܸ1VZ-[0J%G5 /`r #FE7|}bŊ7"b$o&4M_޽{c|rtQ%MgyC=0I%(+Tre 6 s*KN.׉Z@RRO UUYnb:QQܹ M( >w84 ò,iii%\<,x<۷/222PNCUՐ=71v~㑜'N@4'b$7A{\UPYti >;:Q0EQdǎ1{l<gpS<^/\.Ο?SbԨQؿ?\.ʼn,FJEQz/cO ˲F)C(|R ƌɓ'bŊ0 S+^/Zjsy, iM=qMӠ( ? JD D, ٳ;w. C ??]4 5kĉ$;ѵnx^4n/FΝxd WTU[lAtt4v\%"K"#^N'N> &`ذax"4M *D˲Pvmdeew޲|  #""-B~P\em%TU_|6m`˖-\K`ID3gΠ_~>} XJȾ;prBO>$t](%*,c?~<ʕ+˲B>>}~im/2^/,%ގ=z k׮O7XQ<Xn~YW_XNAl2TX Ma.E7]T\t~/_|6mݻw }[(111X|9"""Sϵ6m`۶mBd0~3̙32%J»el%C]Bϙ<1brrr:BlT 6 ** nn[o6lk\۟~_}t5k@4,D'N ..fBNNxRXTNaAXv-Zn-/D71>j(̘1˗ Ǿc\=zC Azzz Q IDAT,W_}cŸx"TU jP 2 ͛7ŋˋ5 \YY|y]6CKsò,\.;v ƍØ1cpʩq"K" an7v؁`Æ ~L" DY6M]vŬYиqcyeMQYK.D&MMBn?u]BNNNaÆ?4M&b$"SUUl۶  ¿龂3CR0h ^zzQI7]9Zlt4k >O%b?>\.D`ITb5d+ &&}nU>m(Be*Uɓ'F|ܬC74]bUU-{*֭[bΝۈ^/]w8z "toбר| #<<arMM<ŋҥK:I˲i>CDEEa˖-"b$*QrrrX\tI^l Oio? eY,}HK0P\9̟?T,%t=>H\>k,J~ ÇGJJPp8P^=_O=Lӄ锝v UUMرc1}tTR%d]˂¥E׮]/1XGA.]xbA,(H?t:xGyf4jH֯$*+7E~ݻwիeq$p)رcqiX"KoϞ=?~;N_pdx[Qoj֬ { [nEÆ C Rl1c{9:tHS"b$*67D֭7߄P_`UC /rRvwb֭hݺunc)޽]z,vp`ٲeԩ?rk5bƜ9s0n8[oŊ++_+eO>QQQذaTUe!u"K0 8NXI&aȐ!͕!*E7Ub刉AXX,~ʕɓ1i$U^?EL\.rDD DE烪8s T@4!>bN. ^ʕ+B4^D;˗/A!33z fq1}~)$''#99Y.-8%Qzr7`7oΟ?FepTUiӦXt){챀 &Q`90MѣиqcUC4`ڴiӧ*%%CunرXrlAz@ۚ4M躎#==5iJ"Q  ##ZB^^ UEAn|̝;W_}pI`ItJMӰuV <۶m鄢(W l F35MC߾}1c ԫW>5*92iY4iٳg#22>iBQBk]pt:j*$$$ߗ̄ ~z~l( lgrŊ1l0L6 5kքco"f0 ԩSG޽~2ԮqJMo"..oU띉膆JχltŅ~mk֬&L@2e`C%QTUiX",Xxr-WPeD+MӰw^DGGcŊ7D _<D ÁsaѢEHLL붮[l,U)בN" ;255UVq19YXӧO'rrrгgO*U%oɓ?~<*wP uŪU)G[Dw"4M$$$`Μ9;ڤR\"55Xf1~p)Z@/pQT"KߟiѩS']V .h?m6DDDIDveQFxѢEUAK@fe˖GسgOk,~Sbl۶mh׮>裀i`bC('a-[wpmaѣ8]ס( {=t7o5h7 `ҥ֭F!7aaa7nOMxP~GJBFFyY@]E zō7|̟?1X@)?N<C O?rVJxDv"K#o&ktjT iիfΜ{GNqƅK1^z9s&{9z7K1Ӡ( 6oތA7ސ_u`IDWJ1a 0;wEP  KСC1{lԨQC$KNjժ!==aK`4MÇ~c22\RI&D!Bix嗑\h4fP0 TZĨQdeox0m4TP8q v]~?\.<#77zBxx8P%/^ŋ#>>^.,TڧMDZϣW^r#D7'ȑ#QJL27u*.^⧟~QB\*):s Lx\.9zYXoعpBKvC( t]G^0w\4l0`MeASapvc5jN<K D%ѣG'0 ӳP)B>u֡y,DEXҼys\͚5Rpi_>:<ϟ޽{<`IT){gϞXt)\.^ Mь֭[cӦM~aqHAN:Xf t%eYzp\شi:uꄝ;wt"b$*D猷z ]v;UU_8سgO_+VA%*DhP,Y$yyF]ס( >3t+WSD DŐ烦iFϞ=_鬂Z5MA1gn֦$*4Mرc!{p^Xx9r ¤IF@"Kb0 \.L4 C?P`cn˲$#F@XX9vO>xeMZqL4  SuI DEAP 2e rssVQJz={",,,/vᥗ^B&MxdP.N'.] SN8w,N`ITn999ٳ'222p9zPoqQx}@kֺS"nݺ{{ǩqb$**DhT۷oG\\6l jT#::3f@e$*yR[nvL:IIIrߵF.ŲUUsNcˉ,nP)F^}U <o64M iB4 4sADD5D%yP\9L2'ND pi&n7 :zP%cp*4MX#GıcdW fZ *`?~ CDυŹdĈ(_}qqqX"PѾ!8pEdddO>2T;xq8[;Ǐ D|~4{k*CkۢHIIArr2?PI D7g"55rQkk'naРA0 C"" p8dH,X=\jSL];w. C%ԩSHLLĄ x`&L J1e%?Fq"k|AKEԃ K4an76n܈Ν;?A%Kѣ/^,GS^iݺ5֬Y&MȶmDDKԶY&,Y%43&piY߽{7}Ylٲe$N;wDNuVv={Ċ+PV_\DDEʹTRHKKCZZUВ9J,?tu%AW\䴒ypqN' @rr2222P\9T"8 0WF2e dKɾ̙3HJJ°a I&b$~3uT$$$81OⱽeYp\ˆ#xx`7*ڵk 6vrC}mwy… D.]'Kߊ8*Cbĉ8ydZ~\`_F ⋈AXXGwv8xǰzj4kLV2QpŊ<^mڴ?.=`I[;._^z!##ϟk :9n^> ,YH/儈`wУGYfZm 7DrF$K1T*ÇGΆ Y~2'n ׋~h޼9!R;'OFRR,uKEQk.bݺu207*-˂a?3f0MDjՐT)SCUk, n}`&D Dwزe e\YX4 qqq5k\$"-3<~m?cW^Att4kTb$;{,I&ɵ>"mF0oO$"%>uŒ%KЫW/RheR,w\رcڴi;v 1XcЩS'dggCUU.:bExebJ"* DG+b;v,nwtA%,˒;˿;ik׮zKbmϞ=xꩧoimw(bi޽;-[~_?""*+u\. #oCU(eNNƮb`I%8n޼mڴp´ߝ i_S*|>U#"*:w7x+W'yQcǢo߾1N TNYYYի:2T*'$:N躎yaȑ(]4,֭[q}NapiKmlҥĩSإ,xw͊`̘13f N8rzA5*MDٲefcڵhӦ Ð5s޼y3y|嗲>0% b2//}̙3#k 4 uUо}{y%"*?cΜ9n7?q!%%ǎi `I7?1mY֭[b绪Dpʖ-$L>5jԀiQID%6\ڵìYz(x lڴILӼj;:tUp4MhLDt7OLL ֯_J*@@iPaH `t,1Xҍ >[9#=Pib7oW\OID?jٲ%~mԩS' x $:u*z~I1X(s$'Ι3(_<(oAضm) W0 k׮Edd$'Kw i,z~[ۍիWo߾$" EDD`Ŋѣ\$dsi1n&oߎ:web?}Pi"""at6'"_w~VNdyuW*%++VYL,醰+ ]`ʕhٲ<o6M+WFbb"f͚*U-n11k,٦S`I M]ax1w\5* I4ѴiSdddy0 Kq^` O?Tn:yb *EEժU1zhL<+Vap\6llRP;c]_۷/>%K],aQRSS1l0\UUX"H,QQѧO-[V$ UX<6MeA4|'ر#lŕb$  .GaPu?cɒ%޽O<ڵkB-v:hٲ%^{5ԯ__֯$"\ߡC꫸;y] 2 RL6 #F=ƹ(+m֬j׮-~7 {ƚ5kPzuDDTt4io4irS(~at"++ 8p;N D' Á~vϗ]tD ˲0yd̜9e˖A#"*jժ7x,K*6jiet;w|< D?S٭Z[o-[JC=lܸ(UQ1PB,X 20\K߶, ~)w5k]T ]EUD<([,ʔ)J*QfY*TdԬYǏٳgxWRh?qq`I$O4JB C%Q!v{/_G*U <<yyy뀘>WU'NqQR%731iߏnݺaŊu,D['b^\ya@UU\pQQQ¥Kx`,$Si_~Xx1j׮km, .  /XK"""*DVZaƍxBdA>zr89rD~1XQ #Bczi&<0]VBTT>S,[zj4MմZocDEE_TUAe$""*<<SNŤIrZQr}Ȁ傮g$""Ȳ,)SBժUxǏGrr2ƌM%K"""*Ii Cݱ`4j | 1<}3f_~|2N']2XQI#z;Nl-_\eeeF {O Mi~;wԲeTQQ>Le%a 1.i;=cܲ,𶎁4&L7x=qSc8:`]qm[mw(.-˒eYz'tW詧r%L$ַ WaaaBz5m4=CĪq#3ݳgO͙3Ggր-Y+MXb1jͪo~ڵK@K]#կtQG ϧ<ԤP(O?TUUU矻dyĜ1Ԥ/X555:=S)iUױXL@@t뭷o'| ? ,@+,,T,Yg˗3t7CoKo\ڶ-qTPPK/V}}=* )HNЃ> AIYԅ=() ט1c׿)q+|dd͘1ٔw& ڸqƌ\T+3٣G͞=[{ީ֞L$|ںu.B-Z P O]tEZz+qmGd1uKsxuuNh'.{= s9Gk֬n^e髯Ғ%K4vXܹSzˮa͐y 27_U+WYgx<.>:bز,EQwӹ瞫{=ceW4-j 'ŋK.Q<wG4;ҼOҸq/8E&,g۶|Mr-ڹs{3tSw@ĥgaΑG9swۋKq +誫Қ5kdY{v9˴2hͺ?݈55,)yÓis>7on3֢qd۶ ꫯjƌZdb~l.HQ9uT=*,,T"kWo@j~@ƥY~j޼y*..V<w߯[KMMM*,,Իᆱ뮻N@ @\t -3n޼YW^y{9*uG3tn۶j:ݛt/~m۶N:$ 4Ho>SJ3}o7m[PHv3<]vW߾}[dgN;7͛uE^PAAAQiB4H( i„ :t{v)Ӄ4f駟oO]5uwkԩںu+QIXv믿_ڰaBb^QdRcƌяcVA}XB{ H$dY^A}m[dR`P>?|\To'YUjTwyz=S!p߯s9G~o3D@2QMMM3ޠL}7k(+VN7²e6mҘ1cﶸj ɒɤ.R͙3G8dd(ujڴil}'˲8.7.Fk={o)ShܹׯߞKT{y0UW]UVgϞ?2}v]r%[|qF,qcXy睧->:jiH$ҬYTTTdd2^zIǏ֭[=fxꔸ7:ɤ 5vX}ٳg^\Z~_t{ӴfҬ$1cQ @|~\zǻץRsՇ~mXz駟ք ܑJs Q۶uu馛n"*{xUTTȶm|> c˲Oj̘1zWe8/7H7QOꫯ;4Ϥ67R̙3UTToraÆ)^8 BnxS>+;LC k #2Gm~~kƌzUPPOIܡPHx\`P3g̙3էOVCp8aÆ_~_]vոC0G} 6W^:\n KeYZvfΜ~[mEe,SϞ=unP^Jry>G~hӦM/ %H㨰P۶m+D"N8A=zP<&,M|>^Z3g7ɽRo oT[ӧO 7ܠ=z܌K3(5tPvaz뭷(-ťm*((Pccy޽[G}훳#yIzG4c N-:o> Ú>}nF'f ӱ-[W2+.SW۶`0(۶K/O>q},gx?#6m>C7*Sc/۶_R]wyFUPP~[3fГO>Nk{ji*Hl駟{Ws aVZS>sG!S{g+[nEUUUJY_jƌ~;w6oq˲d۶'s= #J`tC=.L;vP\z;E]P(DXfe˖iڴiڱc" &>#Əϳ|5vX}'nDvƸ7,M\VVVj:z0+s=cǎfrR_X l~}g)@_ݝl+. tg7(۶rzz꥓N:I|}v8W^$|x/*ڰ4Qc-\P ,Pcc;l f2C… 5nܸf >PHwu뭷҇~״xKL&UPPKڹsN8'2+DeCC-X@_BxCި<4|7=ȣ>ZG}i֭{sƸ?]A555^PCC 7;`8p7* Q Y2`E"]y***j6>qk\ׯȯ3F,?qzwe۶[-܀rJyYdܥeY뮻t7qc[0RXXաQ__ԕ/|>o7, UV3ltkxcZ;Lꫯʕ+5pfZSȥF3dחM/F4պuk׮vм׺uti M2=ӟTO< և fj#,y)oo|aÆqTRROo6U9 tbf; -d2#>vC ,;,,fYc,T8 w_NHXmjkQKN ,ވ%a XKpDz|aIXSeX\@4qF.YSiXuXmbr K²MmX|%a~X5Ri’;eneY%7 挽[ KF,)}ٜ ϋTZZ CXڶ," G)++˹)ygT[[ >mxL o K@Xb K6H40b @Xv(,e! OSG$,e[K²aZdU8a.qxlhGlU2laɑexJ&{Ms#a4:zi ǛJvq K2ͰlB߳,;$,ˎ\@F,@>`*<ͰE&,@c2 Xp²UXe&Ot3c^X~SdRmqAY%qL&@˹g,-R(8HiAA,֭[eY~ e͈Lwe"׎;t}__X&LC4@Xf Y&*nݪj=jjjr?W_%\ &;䬜YӝG:~6mڤJE"555P Bѣ6oެoQH!sĻ2,>O/*++vZA~555)*)* i׮]zǛ;@frG(H q3Q&ˎT{We2eikڴiz7 ̯ɤ6oެ>Lx >GX-'»KsCqZJ&Lp25H)H(L/Ԇ ?2i>Lx }NJb9휉YS>OhT˗/ӵ{nf7[ĥ}]nǎzꩧrJYFdRgqF':#24ò ;bq͛7OW\qb,˒mF){ѽ 2'vܩnMG֚5k3kC=c,͕&27[SS*++U]]->̻/-x㓩p2y?״h"D"[_cǎկks!,uIJ3n4ϧm۶ .ҥKMk3 @v3[~Z|hv yF5k&O?\>_eio԰L'lۖeYڲe***f͚Y@v3|y晽ᦎL|>b1==z^yw,,e*< zt駟v ogcvi Mh5/&MOPcrehk2u{e۶VZ)SSi?yIDATY,D%4eY,k6}3ex㍺馛$,inr_c Zt~__woi;D%vy1-`k۶m?&O>@@@mm/d/V:#h\`n+ߙ>[f, ;#msc P<W$e]{N@3]»0,5t4*-Ү]T]]oQ_|@S>c!5L#DM$ ~ԩS{"3AX'o4n.nG2qm6r-={lvl-*\&IfwqB!iʔ)Zp;<"JXvF,^XzCM7ݤ HT|>;V',4 W_kٳi0L=@l٢J-[L=zP<ow)H@'NԊ+T\\9 8_|*,,TMML|g-a:|47† tk͚5ѣQH Ji3={Ԕ)S|rw]Ӗ!~ BEQ***nݺNEY9֋T8z'5a *((ݻ[jgfAsC=u:NXvCXv%/qe۶.-YD;wtho;EQ=Zw q)o/ضP(.H< X,:#9___Jp 7d o(,/X0eYOukʕFm'dKtwc& @CVt}iҤI ť9Fڶm;[ݩ°l녖<ЫW/kܸqZnEQbZvm*..ng@YT|qiܹ5kQ"P pdR~_w?  -H&I֬Bmͩpib7/O?Iw65kO={gxu7֭ު?P@],>٦3|>~im߾]fR0T޽[}4 3H$awJ~kQiY,˒m ú馛4}tF!*@[a~]ve߿,X^ziOhySimѰY߱qFUVVT۷ow{좰lŵm[>ύʖF;ַt7K/m"L{;ѣGkРA7oV^}mtGhT`Pw۩a4w-),Z\BK'xo>Zץ^+Q y.{.]kFp=?.5~;3FXfMAbV?z,ϖ3't/^ % d۶r-:Cq9C\Kr𶾃h93B!quYZz:,ʕӜL}̶W^y~Cu| `P|AM>ݕh.5aiV|wǁ@@x\sUTTgGoGկtGn`.B&,A,Pͧn|ncTUUŴ7~;Vׯא!CH$L}撰Bme+HwZj&MDTo>,Kz֭[?_m3~cVXt!SҶmqZj uQQuulV"P0kK/oiӧBEM=1SN<38;Q 2E23f(h&-e4y<>1bz^efumO[3#̾={ĉb 6b쇙Y|1Ѩ,r:2 t. .… u'*H cy7y:8lVaar<d۶riĈJ$bHׅꪫ`};ߑmޕDc4'Eiڴi۷H$ix#p***As9G7tlfsU u!h…:#zjzH$T\\|;ꪫ L&5tPz!=8p O>Y{;LTldNꑤ)S.멧Rcc=\s9Ϛ3: UTT4wQleZoygn<2@]h˲8Nf@03{ug9K eSPh ,@XK ,@X%K ,%Ka %@Xa  ,@Xa  ,@X%K ,%Ka %Ka  ,@Xa  ,@XK ,@X%Ka %Ka %@Xa  ,@XK ,@X%K ,%Ka %@Xa  ,@X@%K;@`a d.p8s_S}}=/,@XKr֭[@ 7 ,ata Sp#)x@Xݬҗ'HLK;f:bȋ ,X2b ,tK@r9K%N%YYYYN~]XKbӦM\a t\rx%Нrut8UXJRmm-/0 #@>|xN~],:E}}= x%Нru/K,%Эr9K@X(W@Xexgy%]ᰊrc:@X(G-׮] ,2}LKVWWz^da t\x@X&7Ix@Xݪ$guq#KO3j ,’a9@7<@X6Çoż@X>jf@X&$Ba s+V`Z8%AHK]-F-Y%²S3j %V^^_ٳyF_#@X0.1j %²׫K]T΋uŜ%/xTUU %2iҤZ׮]ka +t$M<Ue:\3%>yd^t ,t|La t$UUU%Beee}͓'OV]]/>:SMK{1byЙp^N\a 㨥$թ@g)//ϻED ͞4Lp,IVqqqơ@dza `E"S;&B[o2 U]]*.F";Hee΅DTTTąc ,RFBKD"EAV)))QYYJKKUVVb. @X&/kkkU]]M`"#ib2sa@&*++SmmU]]+VpQ>|JKKKLWWWFHD\tfYZZEK555ڵkUSSM6qa3Y\\$@Ú4iULd%H(fMM֮] 2[IIIbKrK'RG!KȬڵkU[[EYl(>a *Y:G&yƣ7" H%d6f]]]kpd! @΅76T[[sĢw > ,:D1Af2)Ioy]uZ2 , Cy,.K ,%Ka %Ka  ,@Xa  ,@XK ,@X%Ka %Ka %@Xa  ,@XD|>c{4aؖM @ޟk9#Ijhh#<7|SD @GpڲekIR2۷oʕ+ ie)k݄%a 8v ޷AX~#F~`yAiޯ[K]qf7Wh~mnXفRPvρUi+,,8J3k'x',;p8:J~t87ei0`aIXv&IzرcH$ܽ {P,9'*))Q2ta٩ƌq%f L&8Կ?^x;²KZ'x~È%ݣGz2dnv|ɒ *dHرC˖-{nwZ< 2eY38C#GԿ˿pqKt[s @Xa  ,@XK*$GX"IENDB`uhome-1.3/usr/share/man/0000775000175000017500000000000012450713455015350 5ustar kirklandkirklanduhome-1.3/usr/share/man/man1/0000775000175000017500000000000012566714011016201 5ustar kirklandkirklanduhome-1.3/usr/share/man/man1/uhome.10000664000175000017500000000320512450715154017401 0ustar kirklandkirkland.TH uhome 1 "31 December 2014" uhome "uhome" .SH NAME uhome \- tests whether or not you're home, based on device presence .SH SYNOPSIS \fBuhome\fP [-f|--file FILE] [-q|--quiet] [-t|--tries TRIES] .SH OPTIONS -f, --file FILE filename containing list of IP addresses to test, one per line, default is \fI~/.uhome/addresses\fP -q, --quiet Suppress all output -t, --tries TRIES Number of times to ping each IP address, default is 3 .SH DESCRIPTION This utility will iterate over a list of IP addresses in FILE (default \fI~/.uhome/addresses\fP), and \fBping\fP(8) each one of them up to TRIES times. If any one of those responds successfully, then you're deemed "home" and \fBuhome\fP exits successfully, with 0. Otherwise, you must not be home, and \fBuhome\fP exits with 1. .SH EXAMPLES Look up your phone's IP address, either on your router, or in your Phone -> Settings -> About Phone -> Status -> IP Address. Add one or more of these to \fI~/.uhome/addresses\fP. Run: $ uhome uhome → Yep! $ uhome uhome → Nope! Couple this with some logic: $ uhome && nest-home || nest-away Put this in a cronjob: */5 * * * * uhome && nest-home || nest-away .SH SEE ALSO \fBping\fP(8), \fBnest-home\fP(1), \fBnest-away\fP(1), \fBcron\fP(8) .SH AUTHOR This manpage and the utility were written by Dustin Kirkland for Ubuntu systems (but may be used by others). Permission is granted to copy, distribute and/or modify this document and the utility under the terms of the Apache2 License. The complete text of the Apache2 License can be found in \fI/usr/share/common-licenses/Apache-2.0\fP on Debian/Ubuntu systems. uhome-1.3/usr/share/man/man1/nest-update.10000664000175000017500000000200412462741607020516 0ustar kirklandkirkland.TH nest-update 1 "30 January 2015" uhome "uhome" .SH NAME nest-update\- tests whether or not you're home, based on device presence, and then updates your Nest .SH SYNOPSIS \fBuhome-nest-update\fP .SH DESCRIPTION This utility will use the \fBuhome\fP(1) command to test if you're home or not, and update your Nest accordingly. Note that you will need to configure your NEST_USERNAME and NEST_PASSWORD in \fI~/.uhome/uhomerc\fP. Optionally, you can also set a NEST_EMAIL variable, and you'll receive email notices when this utility updates your Nest. .SH SEE ALSO \fBuhome\fP(1), \fBnest-home\fP(1), \fBnest-away\fP(1) .SH AUTHOR This manpage and the utility were written by Dustin Kirkland for Ubuntu systems (but may be used by others). Permission is granted to copy, distribute and/or modify this document and the utility under the terms of the Apache2 License. The complete text of the Apache2 License can be found in \fI/usr/share/common-licenses/Apache-2.0\fP on Debian/Ubuntu systems. uhome-1.3/usr/share/man/man1/nest-home.10000664000175000017500000000227612566714011020171 0ustar kirklandkirkland.TH nest-home 1 "31 December 2014" uhome "uhome" .SH NAME nest-home \- sets your Nest to note that you're currently at home nest-away \- sets your Nest to note that you're currently away from home .SH SYNOPSIS \fBnest-home\fP \fBnest-away\fP .SH OPTIONS Note that the environment variables \fBNEST_USERNAME\fP and \fBNEST_PASSWORD\fP must be set. .SH DESCRIPTION This utility will set update your Nest's "away" setting, noting that you're either home or away, depending on how you invoke it. .SH FILES You need to set up a file at \fI~/.uhome/nest.yaml\fP with your Nest credentials: $ cat ~/.uhome/nest.yaml username: "your-email@example.com" password: "1-2-3-4-5" .SH EXAMPLES $ nest-away Nest updated --> away=True $ nest-home Nest updated --> away=False .SH SEE ALSO \fBuhome\fP(1) .SH AUTHOR This manpage and the utility were written by Dustin Kirkland for Ubuntu systems (but may be used by others). Permission is granted to copy, distribute and/or modify this document and the utility under the terms of the Apache2 License. The complete text of the Apache2 License can be found in \fI/usr/share/common-licenses/Apache-2.0\fP on Debian/Ubuntu systems. uhome-1.3/usr/share/man/man1/nest-away.10000777000175000017500000000000012450715734022154 2nest-home.1ustar kirklandkirklanduhome-1.3/usr/bin/0000775000175000017500000000000012566713407014250 5ustar kirklandkirklanduhome-1.3/usr/bin/nest-away.sh0000775000175000017500000000163412566707122016520 0ustar kirklandkirkland#!/bin/sh set -x # Establish our temporary working directory tmpdir=$(mktemp -d) # Login and get the transport_url and userid curl -s -o $tmpdir/1 -X POST https://home.nest.com/user/login --data @${HOME}/.uhome/nest_username --data @${HOME}/.uhome/nest_password cat $tmpdir/1 | python -m json.tool transport_url=$(cat $tmpdir/1 | sed -e "s/.*\"transport_url\":\"//" -e "s/\".*//") userid=$(cat $tmpdir/1 | sed -e "s/.*\"userid\":\"//" -e "s/\".*//") access_token=$(cat $tmpdir/1 | sed -e "s/expires_in.*//" -e "s/.*\"access_token\":\"//" -e "s/\".*//") printf "auth=%s" > $tmpdir/auth # Get the structure id curl -v -o $tmpdir/2 -G -H "Authorization: Basic $access_token" -H "X-nl-user-id: $userid" -H "X-nl-protocol-version: 1" -A "Nest/2.1.3 CFNetwork/548.0.4" $transport_url/v3/mobile/user.$userid cat $tmpdir/2 | json structure_id=$(cat $tmpdir/2 | sed -e "s/.*\"structure_id\":\"//" -e "s/\".*//") currently_away uhome-1.3/usr/bin/nest-away0000775000175000017500000000436712566712431016114 0ustar kirklandkirkland#!/usr/bin/python # # nest-home, nest-away # # Copyright 2014 Dustin Kirkland # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os import requests import time import urllib import urllib2 import sys import json import yaml # login with open(os.path.expanduser("~") + "/.uhome/nest.yaml", "r") as stream: credentials = yaml.load(stream) #headers = {"user-agent": "Nest/1.1.0.10 CFNetwork/548.0.4", "X-nl-protocol-version": "1"} headers = {"X-nl-protocol-version": "1"} response = requests.post("https://home.nest.com/user/login", credentials) response = json.loads(response.content) transport_url = response["urls"]["transport_url"] userid = response["userid"] headers["Authorization"] = "Basic " + response["access_token"] headers["X-nl-user-id"] = userid # get structure id request = urllib2.Request(transport_url + "/v3/mobile/user." + userid, headers=headers) response = urllib2.urlopen(request).read() response = json.loads(response) structure_id = response["structure"].keys()[0] # set away, if necessary currently_away = response["structure"][structure_id]["away"] if "away" in sys.argv[0] and not currently_away: data = '{"away_timestamp":' + str(time.time()) + ',"away":true,"away_setter":0}' new_away = "True" elif not "away" in sys.argv[0] and currently_away: data = '{"away_timestamp":' + str(time.time()) + ',"away":false,"away_setter":0}' new_away = "False" else: data = "" new_away = str(currently_away) if data: structure_url = transport_url + "/v2/put/structure" "." + structure_id request = urllib2.Request(structure_url, data, headers) try: urllib2.urlopen(request).read() except urllib2.URLError: print "Put operation failed" print "Nest updated --> away=" + new_away else: print "No need to update Nest --> away=" + new_away uhome-1.3/usr/bin/uhome0000775000175000017500000000364012462761575015322 0ustar kirklandkirkland#!/bin/sh # # uhome # # Copyright 2014 Dustin Kirkland # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -e PKG="uhome" [ -n "$SNAPP_APP_USER_DATA_PATH" ] && DATADIR="$SNAPP_APP_USER_DATA_PATH" || DATADIR="$HOME/.$PKG/" STATE="$DATADIR/state" mkdir -p $(dirname "$STATE") FILE="$DATADIR/addresses" touch "$FILE" TRIES=10 QUIET=0 while [ ! -z "$1" ]; do case "${1}" in -f|--file) FILE="$2" shift 2 ;; -q|--quiet) QUIET="1" shift 1 ;; -t|--tries) TRIES="$2" shift 2 ;; *) echo "Unknown options [$1]" 1>&2 exit 1 ;; esac done is_ip() { echo "$1" | grep -qs "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$" >/dev/null 2>&1 } test_addr() { local addr="$1" local i=0 local ip=0 if is_ip "$addr"; then ip="$addr" else echo "ERROR: Invalid address in configuration file [$addr]" 1>&2 exit 1 fi ping -q -W 1 -c 1 "$addr" >/dev/null 2>&1 && return false } set_state() { local state="$1" case "$state" in 0) [ "$QUIET" = "1" ] || echo "$PKG → Yep!" echo 0 >"$STATE" exit 0 ;; 1) [ "$QUIET" = "1" ] || echo "$PKG → Nope!" echo 1 >"$STATE" exit 1 ;; esac } addrs=$(cat "$FILE" | grep -v "^#") || true if [ -z "$addrs" ]; then echo "ERROR: Please add one or more IP addresses to [$FILE]" 2>&1 exit 1 fi for i in $(seq 1 $TRIES); do for addr in $addrs; do test_addr "$addr" && set_state 0 || continue done done set_state 1 uhome-1.3/usr/bin/nest-update0000775000175000017500000000264512535615215016430 0ustar kirklandkirkland#!/bin/sh # # uhome-nest-update # # Copyright 2015 Dustin Kirkland # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. PKG=uhome [ -d "$SNAPP_APP_USER_DATA_PATH" ] && DATADIR="$SNAPP_APP_USER_DATA_PATH" || DATADIR="$HOME/.$PKG/" if [ ! -e "$DATADIR/uhomerc" ]; then echo > "$DATADIR/uhomerc" <&2 exit 1 fi date before=$(cat "$DATADIR/state") uhome now=$(cat "$DATADIR/state") if [ "$before" = "0" ] && [ "$now" = "1" ]; then date | mail -s "Bon voyage" $NEST_EMAIL echo "Bon voyage" nest-away elif [ "$before" = "1" ] && [ "$now" = "0" ]; then date | mail -s "Welcome home" $NEST_EMAIL echo "Welcome home" nest-home fi date uhome-1.3/usr/bin/nest-away.broke0000775000175000017500000000450712535615212017204 0ustar kirklandkirkland#!/usr/bin/python3 # # nest-home, nest-away # # Copyright 2014 Dustin Kirkland # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os import time import urllib import urllib.parse import urllib.request import sys import json # login username = os.environ.get("NEST_USERNAME", "") password = os.environ.get("NEST_PASSWORD", "") #headers = {"user-agent": "Nest/1.1.0.10 CFNetwork/548.0.4", "X-nl-protocol-version": "1"} headers = {"X-nl-protocol-version": "1"} data = urllib.parse.urlencode({"username": username, "password": password}) response = urllib.request.urlopen("https://home.nest.com/user/login", data.encode('utf8'), headers) response = json.loads(response) transport_url = response["urls"]["transport_url"] userid = response["userid"] headers["Authorization"] = "Basic " + response["access_token"] headers["X-nl-user-id"] = userid # get structure id request = urllib.request(transport_url + "/v2/mobile/user." + userid, headers=headers) response = urllib.urlopen(request).read() response = json.loads(response) structure_id = response["structure"].keys()[0] # set away, if necessary currently_away = response["structure"][structure_id]["away"] if "away" in sys.argv[0] and not currently_away: data = '{"away_timestamp":' + str(time.time()) + ',"away":true,"away_setter":0}' new_away = "True" elif not "away" in sys.argv[0] and currently_away: data = '{"away_timestamp":' + str(time.time()) + ',"away":false,"away_setter":0}' new_away = "False" else: data = "" new_away = str(currently_away) if data: structure_url = transport_url + "/v2/put/structure" "." + structure_id request = urllib.request(structure_url, data, headers) try: urllib.urlopen(request).read() except urllib.URLError: print("Put operation failed") print("Nest updated --> away=" + new_away) else: print("No need to update Nest --> away=" + new_away) uhome-1.3/usr/bin/nest-home0000777000175000017500000000000012450627577017724 2nest-awayustar kirklandkirklanduhome-1.3/usr/bin/.nest-away.sh.swp0000644000175000017500000003000012566707126017372 0ustar kirklandkirklandb0VIM 7.4RU'=kirklandx250/local/media/src/uhome/uhome/usr/bin/nest-away.shutf-8 3210#"! Utpad d : s d ssssssscurrently_awaystructure_id=$(cat $tmpdir/2 | sed -e "s/.*\"structure_id\":\"//" -e "s/\".*//")cat $tmpdir/2 | jsoncurl -v -o $tmpdir/2 -G -H "Authorization: Basic $access_token" -H "X-nl-user-id: $userid" -H "X-nl-protocol-version: 1" -A "Nest/2.1.3 CFNetwork/548.0.4" $transport_url/v3/mobile/user.$userid# Get the structure idprintf "auth=%s" > $tmpdir/authaccess_token=$(cat $tmpdir/1 | sed -e "s/expires_in.*//" -e "s/.*\"access_token\":\"//" -e "s/\".*//")userid=$(cat $tmpdir/1 | sed -e "s/.*\"userid\":\"//" -e "s/\".*//")transport_url=$(cat $tmpdir/1 | sed -e "s/.*\"transport_url\":\"//" -e "s/\".*//")cat $tmpdir/1 | python -m json.toolcurl -s -o $tmpdir/1 -X POST https://home.nest.com/user/login --data @${HOME}/.uhome/nest_username --data @${HOME}/.uhome/nest_password# Login and get the transport_url and useridtmpdir=$(mktemp -d)# Establish our temporary working directoryset -x#!/bin/shuhome-1.3/snappy/0000775000175000017500000000000012462743240014172 5ustar kirklandkirklanduhome-1.3/snappy/meta/0000775000175000017500000000000012462743240015120 5ustar kirklandkirklanduhome-1.3/snappy/meta/uhome.svg0000664000175000017500000013032612461771141016763 0ustar kirklandkirkland image/svg+xml uhome-1.3/snappy/meta/readme.md0000664000175000017500000000044612450713366016706 0ustar kirklandkirklanduHome is: - a stand alone executable - looks for a configurable list of 1-N devices on a network - identified by IP address - if any one of those is found on the network, then it immediately exits 0, otherwise it exits 1 - very simple and useful in conjunction with home automation tools uhome-1.3/snappy/meta/package.yaml0000664000175000017500000000030612462743240017376 0ustar kirklandkirklandname: uhome version: 1.2 vendor: Dustin Kirkland icon: meta/uhome.svg binaries: - name: bin/uhome - name: bin/nest-update - name: bin/nest-home - name: bin/nest-away uhome-1.3/snappy/bin/0000775000175000017500000000000012462743240014742 5ustar kirklandkirklanduhome-1.3/snappy/bin/uhome0000775000175000017500000000364012462741541016012 0ustar kirklandkirkland#!/bin/sh # # uhome # # Copyright 2014 Dustin Kirkland # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -e PKG="uhome" [ -n "$SNAPP_APP_USER_DATA_PATH" ] && DATADIR="$SNAPP_APP_USER_DATA_PATH" || DATADIR="$HOME/.$PKG/" STATE="$DATADIR/state" mkdir -p $(dirname "$STATE") FILE="$DATADIR/addresses" touch "$FILE" TRIES=10 QUIET=0 while [ ! -z "$1" ]; do case "${1}" in -f|--file) FILE="$2" shift 2 ;; -q|--quiet) QUIET="1" shift 1 ;; -t|--tries) TRIES="$2" shift 2 ;; *) echo "Unknown options [$1]" 1>&2 exit 1 ;; esac done is_ip() { echo "$1" | grep -qs "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$" >/dev/null 2>&1 } test_addr() { local addr="$1" local i=0 local ip=0 if is_ip "$addr"; then ip="$addr" else echo "ERROR: Invalid address in configuration file [$addr]" 1>&2 exit 1 fi ping -q -W 1 -c 1 "$addr" >/dev/null 2>&1 && return false } set_state() { local state="$1" case "$state" in 0) [ "$QUIET" = "1" ] || echo "$PKG → Yep!" echo 0 >"$STATE" exit 0 ;; 1) [ "$QUIET" = "1" ] || echo "$PKG → Nope!" echo 1 >"$STATE" exit 1 ;; esac } addrs=$(cat "$FILE" | grep -v "^#") || true if [ -z "$addrs" ]; then echo "ERROR: Please add one or more IP addresses to [$FILE]" 2>&1 exit 1 fi for i in $(seq 1 $TRIES); do for addr in $addrs; do test_addr "$addr" && set_state 0 || continue done done set_state 1 uhome-1.3/snappy/bin/nest-update0000775000175000017500000000263312462741317017130 0ustar kirklandkirkland#!/bin/sh # # uhome-nest-update # # Copyright 2015 Dustin Kirkland # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. [ -d "$SNAPP_APP_USER_DATA_PATH" ] && DATADIR="$SNAPP_APP_USER_DATA_PATH" || DATADIR="$HOME/.$PKG/" if [ ! -e "$DATADIR/uhomerc" ]; then echo > "$DATADIR/uhomerc" <&2 exit 1 fi date before=$(cat "$DATADIR/state") uhome now=$(cat "$DATADIR/state") if [ "$before" = "0" ] && [ "$now" = "1" ]; then date | mail -s "Bon voyage" $NEST_EMAIL echo "Bon voyage" nest-away elif [ "$before" = "1" ] && [ "$now" = "0" ]; then date | mail -s "Welcome home" $NEST_EMAIL echo "Welcome home" nest-home fi date uhome-1.3/snappy/bin/nest-home0000775000175000017500000000447312450713034016572 0ustar kirklandkirkland#!/usr/bin/python # # nest-home, nest-away # # Copyright 2014 Dustin Kirkland # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os import time import urllib import urllib2 import sys import json # login username = os.environ.get("NEST_USERNAME", "") password = os.environ.get("NEST_PASSWORD", "") #headers = {"user-agent": "Nest/1.1.0.10 CFNetwork/548.0.4", "X-nl-protocol-version": "1"} headers = {"X-nl-protocol-version": "1"} data = urllib.urlencode({"username": username, "password": password}) request = urllib2.Request("https://home.nest.com/user/login", data, headers) response = urllib2.urlopen(request).read() response = json.loads(response) transport_url = response["urls"]["transport_url"] userid = response["userid"] headers["Authorization"] = "Basic " + response["access_token"] headers["X-nl-user-id"] = userid # get structure id request = urllib2.Request(transport_url + "/v2/mobile/user." + userid, headers=headers) response = urllib2.urlopen(request).read() response = json.loads(response) structure_id = response["structure"].keys()[0] # set away, if necessary currently_away = response["structure"][structure_id]["away"] if "away" in sys.argv[0] and not currently_away: data = '{"away_timestamp":' + str(time.time()) + ',"away":true,"away_setter":0}' new_away = "True" elif not "away" in sys.argv[0] and currently_away: data = '{"away_timestamp":' + str(time.time()) + ',"away":false,"away_setter":0}' new_away = "False" else: data = "" new_away = str(currently_away) if data: structure_url = transport_url + "/v2/put/structure" "." + structure_id request = urllib2.Request(structure_url, data, headers) try: urllib2.urlopen(request).read() except urllib2.URLError: print "Put operation failed" print "Nest updated --> away=" + new_away else: print "No need to update Nest --> away=" + new_away uhome-1.3/snappy/bin/nest-away0000775000175000017500000000447312450713034016603 0ustar kirklandkirkland#!/usr/bin/python # # nest-home, nest-away # # Copyright 2014 Dustin Kirkland # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os import time import urllib import urllib2 import sys import json # login username = os.environ.get("NEST_USERNAME", "") password = os.environ.get("NEST_PASSWORD", "") #headers = {"user-agent": "Nest/1.1.0.10 CFNetwork/548.0.4", "X-nl-protocol-version": "1"} headers = {"X-nl-protocol-version": "1"} data = urllib.urlencode({"username": username, "password": password}) request = urllib2.Request("https://home.nest.com/user/login", data, headers) response = urllib2.urlopen(request).read() response = json.loads(response) transport_url = response["urls"]["transport_url"] userid = response["userid"] headers["Authorization"] = "Basic " + response["access_token"] headers["X-nl-user-id"] = userid # get structure id request = urllib2.Request(transport_url + "/v2/mobile/user." + userid, headers=headers) response = urllib2.urlopen(request).read() response = json.loads(response) structure_id = response["structure"].keys()[0] # set away, if necessary currently_away = response["structure"][structure_id]["away"] if "away" in sys.argv[0] and not currently_away: data = '{"away_timestamp":' + str(time.time()) + ',"away":true,"away_setter":0}' new_away = "True" elif not "away" in sys.argv[0] and currently_away: data = '{"away_timestamp":' + str(time.time()) + ',"away":false,"away_setter":0}' new_away = "False" else: data = "" new_away = str(currently_away) if data: structure_url = transport_url + "/v2/put/structure" "." + structure_id request = urllib2.Request(structure_url, data, headers) try: urllib2.urlopen(request).read() except urllib2.URLError: print "Put operation failed" print "Nest updated --> away=" + new_away else: print "No need to update Nest --> away=" + new_away uhome-1.3/snappy/uhome_1.2_all.snap0000664000175000017500000011005412462743240017403 0ustar kirklandkirkland! debian-binary 1422640800 0 0 100644 4 ` 2.0 _click-binary 1422640800 0 0 100644 4 ` 0.4 control.tar.gz 1422640800 0 0 100644 905 ` Tcontrol.tarXˎ6Z_lbdAfѢ hWiÐIE=;5 01 佼<գ#2:J]`Z2H!0OU) K& D<;nAk51O? AG#V=8pZ^6dZ^M\z׮_˦kHi7MG=iƽG/wdv' xUq'6pUsLAug5Gް,bٿbJzkkG/޾LdSXX\+_}+fm7&(>FgڦDO7qS)MHs+wzOjF ~(^oB>c( data.tar.gz 1422640800 0 0 100644 35745 ` Tdata.tarF%Oq#>`lTL) /WJKHA $2^{;ɯ 'y Hw yzGo_j_'MJ6cFOm?7"87O$ooO?# ?D􇟿Y47Wߔc?&p:uKk?eu[KxVThtߎ'NooB]ߎ ~_(|`~_5~Xpqr}M/7-Mǯw~ׯ@~_>=0|:~sM #,e~oÿϾ ۳tuե .` U}Qwr%3Ÿޟ^wNE~Zݲ?h9̟Z0A_OYL>a'"Xz N/?vHkmmI3l<Sl=߿Xʗ|o?w]0b\)@Dwg4o[q 鞃^! a޵~4pUr5㊺T\ICNABx瀲~Li h.q|xw/ai/YrtY=׋qyP Æ$I\hXkݮbimx\3Od#+A?uAj |ݿ~|FgaJ1& 5 7weS8D;z0ʬ{ i?JAp"*Z/%-}Vdl)\TpShZkCWM%OgŦv'')km~ҭ!uyl7*u \ S啘2n\ߴAy4&ޔt-IpS.by'K6ڛz;^nXfrJdLa3j yYZSj/櫌Z%E |W}dv4r!9S,:t*HKw1 Mc9oMD%G.e؋LnQD+ ÛGtU|9"t=F]yV#m=O<klI?Q<81ɏ'YunR>d<->^do/IHo&j;Bĩ_>N ov'ehogh48H6N1a9PW-Kc@|%;:Op}y:xz+Lxfs.sJ7uOn~ +UZ0iBǕ9uћUq%W\z;~=.2><[bI0vRE>EC b_sg CS*I&XpWdTSE*p8ZYW'S?yMjC۩j b0WgyvgF4g1]{,~VwƊJPVqu8MS'ER"?mldp/ L!nFsR`Nș[ȗ51Zj.ʇa2ё7*o$;_k¢hz}8ҕL".g0ZGgs5˙ .yB dA3}<@oԗP^ei֟33\s4pJb-'5ρ._6:%Dn|X+J'Y& ƏBׇ[ij|fI*ByvKdo{Е{[q `"eK r! U|}^ s~HK ^&J 26lM&u_L>"g_*I1YUUpBwWVܳw]M4%RDݍd,J XSC?viaiWdJJeetl C"}6j} NS;\ؓÿN:5094 9=Q k(9砅;F^{'C1Yɣcd@OҬc!1(H`.׾w;+dɫBw7fZSN|/K fp zb)S~VͬE s)N |Ktr5J0S~Ad5Qٶ̽.>Y"6hP*EV2fW4M}f+Ԧd7]ɸAVx$Ԫ@w`).뫦kWǹO&M "6ǻ+6Fw]}<=b{n϶(bʉbM8ĀH+WJ|׎+E M(DNu)ة(/ K[^yY>=7+dWbqeU}n/1)IhE&2*]n {N΀u.`X>>)U؄ dyaOgܐɿiX%2|< "D&?e4[8uȿR`dR`(?"{zr1J}Q9B>G(ϣ{TWTqz82svkoɥN͝bwe A`fH⬴pE %0}!KDա,j]6GPXč+Hۣ䂢9m9`He{FBE>FnĨ>c2x@b#_}jZ<\Ku"Sz*cB0u3sGMpr{".vӨ{v h`R4͋۫qt-$y:uR([;d'(z^Z`$|R}\}ɶ-o ϊD^ $2$rbLfX9S:ëyդT]'S$Hr挪lRIH6TK =]€@-$i*SCһ4ҕU3㲲 :NrU(Eksca$WtyL8l[cT^(h>%:Zzf#Ώ. K]mM:)srt_tU2gқD c6u6KwEɄJ P:5?(9Bi"Mx9a. _R*Vmng6no~A)!10|r8t s}_QC&w31P +ҏ0bwN.o;*%WM?h: Ȣ(G~9:tbTSj[0H`p$W:u F4jx1dݟa .Ѓ(T 667U%4f/s"I˻wN?">Dk,lO3uVOݧر 7>O`ys_Q=Tק 93 @\m i>EXJLan\2j-Hl3Vp9g#U@W2]Az~})2ty%Fġy>۴;: _Rb8ihz1 @-bIQSBO񊌴I$ڱ%JiL ,&Li4@)F|m7O4L츱` C3БY#?b.}$9S>z#1<нE,Ck9+:DbģU6};ͦ7  AAfwIBP@[ϥaOw4L?u8aYK$ , fgeYe86A8d fȗ H~r]n2NRi})?]xL] tѬU;b+=yj{L#lYvD֜StFae|V9}hԨ+:M=u$wρ" .e v#&Պh"|ЍM`K$߆3|"'W@JavzMQU2W2NP&cO P=0+ɜ3[]fKm-Oai& ȹi۪`)XicM vyo ¸F: !_' đ/#u}$ʃnZ /C#tr\ھS(@| r$0#EO!䋴:/ϋ:Nyr\bQa!O-0 d@҅7+{AQfw-q>>w &YufO+rSɜqWG+)(0CQL/ƀۻ R<79kls퇤7Ӹ t.f&2dF١ny ~˾l x|FŹz /ҭdUl02gf(lP"GjV_iWKU[#?򌁺-Á.W1"=>Bү dpm^a6l)h`<`q½29]*'8)qن8` qo &[ah؍F/beN;$MV4@yQ.JE<^mř=˯zS(I"oق5Xk #m.­)?|'xGHdK]`$y_/  ^t{z{D-.'+{Y4'qe߰$k.ƚ蚾>tu_,ʤTN"iѮPgV }0T'Z tى^ xi]2#>BͅzQ uŏ4JV t͵ck_mwxW&~-qūPҹP«W=;B#&{%Ϋ4Uno{ׄѮr5{v& ۽j,)vu6rssQ ԯqdz8I=~TڑST C^ѷx+SpU4 ddjKJ4Q]lSrŅ#8W6&'iʭ9od%~ 8ue*u7EBs2vlrkXcf_=(ث` xam+OMe:й&_^ +i3:@է;܁_iu7fMzo cA5@ 'N|J;/JOwizȞDr{K?*̿PC("t,-09fwRP:neg÷Y}L4V~5KaQNBhųКa>Dlo&Ǧez0UK{gN/t5 k _>$*aN}KU2=4ё$lwmZ?QLyBC;ow 遯{+`RJ(" ɒܭןkz)M ҸJ)mw>@G {$`P )xNCD6ׂyԩ^>ЃAŜ% ɍ.7H;5y!7{q$?$$v:C[Z}>/F$>8|A٪I>nTlt!yDr=  r,ȅܯ2¾eC?vMB<+םr} Ztrfg XY5ջ R #AG͓`p4C)60Hh0cXz$=rr~BRaaxHaC/кB1{ԑOSaz GW=޻DV{QGEꗞUc0C#x=2'V™稸zZvq}w2\}"/^ubwCF4gF}74^69~ҵjʘ99\K*7=te#ap^:{A᛭ƞ3렭7"Ev2~s缊ɪ֭!qf|sT7 ѥ0W䦆S~tqɪ !;(xvbä?5\ Chdrd\y*1Zz%2Ȣ_9AҊ?f{|Ew 2I_8CWct.R>/": [\ng+oy*8b͆< ;$yGZ|׋ Bfrg/3g~juch(l@s;=vOb:"GCV}JC]U y'=gW`f"T3du,C/Ta}+3,bs1%]Py54: ˻{BQe=#[as>!s3{cN :d\Iyqcн"K^_90ռeE7wk9?\5/J? X& (Qu 5W4AO؋7o=Ri TwSxKF=N29Pi} k)|ΤP%ݓs܌8NsfS_Ҩ܁a?Eo\8DVu%$bx(>wZӯygKAW.Q_~ "V[ Ww h>빼Ol'$Yŕ p*O~"[|\/Me#y&|mWrgM5ﰁ0rRgQjU.e?jiO ]`,+2]B;.&_?y~S62KQ;Gț-4%k𮈚+!ƹVV64Z8jB-ѳJ(O$U}<"rS Ml;߉`8Da#eF崡]kM KUj`)64p_}~{A.$?"t$t=ۂFDí.\l|sJEB#jnB"^92VZ`oOv|,)lNAlc!4vGR'4O4V}~9n\#/N-ŗqS`s+H;} k Fe".aPsdF̃}DncquCP( ȇa-A7ΕBDX ߾ ]-~L|t(osjAP'^`-| ϴZaŁT\&BWSQG!%4ITht7Z˵9U/@Zloqv^R ו["m:zCc5AGQTPD9KKUwkB_ZG9V~WȤZ<_.F[vܨ|L6`TT4jn`BM=)G 3c"ţLHl#XY{pݓV?2Df!% @iLj)~HT$8'B ǶDQ2&]hX+Lˈ!i* 6& = rylJ],>d/yrC&:WEgU|vDwpXz; id^F `3( ^ &WWbL&wR\78=IRŸƱ9j,@nB#M.\<Aۏ5K wVϊr"Bbn0Gbdmtv w6Oڎl嫈B G DeZ™;}Rqw&1¢v<?)fp);˹CoiIU5X]P_oUNZ|o|Wi [ҊǾCcE? \^$'^FѠ+~CZP<6}󼛼,y.҅`/\g[1]ZWX[foax㣯VI>?j u%{atlh|U.Y@9 #MN#srU)Ai,A8Wtj٣˙N@> cƌ o"t>լ8Y&rU4̟JM}|5qV7i`QZKvGֳO쯡eɅ,QhMޯS@4*6#ш'[N_}@3VFȪM()47Xt 1OjXK#ʒ!PuOPRW$J7RzP1yWt,2N˳R.O&@?{fe|s-{c{3?\qت>ط ^[&f*dxDbB:˃'w5-]:E Fl"LFMRf> ̙W6a62[ cNS襻d2"Hph п6bZ!!.Hgll %'{\O_#rlYR^F/nQOt}Sa6xŠCZk:='!ӫk2*2A#ι "?ڳC(ޡ_j]#Nu-yًQheq*+ xD}/Ǧ!*]5 I"ʆS>=+ӕpQ=,RpOtTh L_m0P%f/52TuhHp{ʰ4\5 79`lE/I|Ui/A\G15f+*}ܫm]6zh ⨻;3tnt^WȑQʏb- DFq=2~G:$ },0W88]W+ztw c#pgnP+~wF[_V!#11rٺo(pwzysLw^ iR0+ @fl -圏/ }.͈4~#`r+j;R+!J!cdN[9jIѤ?荦/r+&.*?\HqApBU w58@/^A@C'bg鉉u n$:00%ddy( 1hآGi9a&Ygo;X}ϮǖJ~u@%in+&2x]\@=^}}+a7A/Y LJ!܇a=`kf}b䍛NIN oZN@ Z9[\')"w, egTxCh_GҎ/ =}ҢqƱd p=:GdԗB7"sPY豗XLŬِw :ZSO\c}wpi$)j=4&R>o8ʴQ:#sf1Z:>eE:*^|ևg&mˁ/ ӦqZpZ#Cc@ь*-z| ];(pko{Vxj-@{|voD0A}-$ۑ|]}vTQӱl/qc1g8Wau0Ɗ9_A[2O@(ќ&1L"̼B|_.]:tÓ+3altZZ^#18ӞA)P뫽(T1?[-u:üH2 US b$49no+#`N<֘ȠCkTG#MW,,Z~d`@6DXޓ7CRa#t!ZT2T0\9IFX]f}ŌA1Yo| t5}n<+<_tF'l '=NS , OLTܭql]?!jٍFz|D7=O[  Ȅ; |x;A 9q>Kչ(6Bԇwd먞$qURA[3?AQE2Cx/DNj)W2eOY!nh 􂬖eᕳG:c>ϥ|YJ?.*pҌ{?#}3K-sfrߖq_k%?A0\, QIedž[Nlb iNh2Gzۆ䑑}],WG >@;z:%;D=شz X@< `#y8}}su9n/M=Wӷ= P ΕG ?qd A$+SIH6C|c6{o^rf> ޾1'G5yxA?Ė=^sgY@'-NӐa_v5Sh_:\. }=#6֑e9j8C0*"TL*\y!2QMSKcAYcdޞk၍CuT`@YWzvMl0l'Ŷ{ia ]:;4ך׮zU kll 5*n TU g?PQFQ El|Hm.Olhڅx{Iv'1b84%UyÕKQ\yyYYA=o*|x+u|> 6bL{fxX尰BVmp_*~@2rR-` P $ %u\JldŁr6R)ۨېИ@p*Y7fMFצ˿=HRהzշM.5@buPb&M$qy!}W*o?D( xhjL`+ ("!Ds6eY_3Z>w%fy9yxĔ^7yg_YQHɮr;7:bk'QGaL%3 fop;4Wi 6 Qwsq>J'cr@i$=0|Fw/L b~ᗭc>p@0!*[XzsͿlۅU\Ճ6Tpls) +@.d5:Dnp<- {K= .s:0B}4EmJ=y;| &""||{wh `o!gDUoS8pze5YeDɀvv#pVҡml;rWy[G}0x7W~y#M\8n,wb;lLN CsG]_I-b|͞ n8ZՀwe{G}^Ed?uM 0)raƶ&LXizEFƼrK30g!bl~SX4R>L&)a.!cV)zYO7V, YE >pW=3~aʄWpq% Bq)l@ ".,p~C.,ΰszYV'WM'-i"],*1S8r(@J̽#nk|}@]SЀ|ؒkUz6 hĚiI_Gjzf'zKꅅcԘ גukwXZ>_m SAU Z7₿[o LNI(B1ztk9r|GO_=[q#dPzChDJFJMY"Ѡ$ܣhb"epm[@k=Fjǧ!h%ـ܄{{xD`hQY]BJŋ <Dc*LØ4>.=4F~.\q+胶g'b/~Pf#]教x7d}ՄG<{zR5|i@|/@.fa\q袂˯pAi;lBh. p)>!S{z{H;ٖN` ܞ ;r=G7ahUgSڢ ;r\'MZՠT*WjUMnС·)a{!QO45hBua+w [n`0RJy-ph 2f[l<Xʚt,&3@?+цEp^;ߍ<(4u-f@˗V|D/MBU\esm|Կ=J_u U1VXfSwV>oV?.-msyQ^|EȬGs:Zgۜ4B=0-+J Nڮm u[`wSYE:@*l8x=b?YA`?Η 8~{B}mΜ?/ a5XL@xQPLDNrJҭFUe&N0;i^V_ <rr+ ~]uNct.{K8Z^B*=A\sCѢ jGo|!ZU[rPRӨb.( 0hPfv*#o A{P&Xf22`Ti`XW6*O0-˅]4 0*yS]eB_z9yDk7mɋ[p#USlt`O Plfy> ]do$+jcxUo: ,H^ Vx aEO4j}ߐ8샶/Jh|e: %,frdI;gn:_ofDc#d[LjQ$ k9>mR@|K Hry2aH"살tZ3\|C"}(yI,wn|uQӺ̂j3$9b'PxĞ5F<>O|]bߦL~E|<4_i]˲)7ˏ#wۖDmg{DCQ\!OĈ C?CF_#<&h;g Be =:Gv)rߐ^u`XM~aX)TR:iE`c CvxߩDªJ{NVJQ8e#h ~JMtO` eٶh~WVOa'zzy1ѧ*}2|1YY;M5?L\Ï:IX|Vg(g##%+g 1pM8X2򵦺F\"¢9nvR "\zߊw2lO[ Âc{ 2e$#tSp^_DQo0YaWЇپ-N*BcONw6elR+ҴPNl Y4e,Bl8ZeaW7&[f][.OYE} mC%2 T-~?&ҏlAŝ./©ljr7af{Boa[ {2 n%gHHoqc_t`{B!mI=>>  ݚc8wy[;78έd1r@t"a&P?;f/f @U5о7C!Pwn,  Av_}Kx70f_~6$t/xtojF%SPVzoݤ\gC'{UhV /q$'V=FD|5E۶%<)p\?Vs_2oO$1{dꏧf7䞛+;^O,,RƃkZp]3>$ C=a cY/ozQ޽՝4>;3 ]UDX*>p8 =]-fNllkV,NWY&ē0"ʀo~9˾-*J?6ZQ]F7 \ Ou:bk#:G7I=S×#T#,5qrIhMjUƤ\&(jEgх7p!vri9",%ic)g@e2? ٠Z3@%5a{]| \캶mp[a܂E?*zV~0?̎~ٰǐV73Rn0(?T "*L8;4+閗>{}l6%&,')f vF#eqb@ڟDQ$41nH2J<7uÍg}ywn4e2KЗ<v:_ϕ;\PJTNy߿Y vS:~Vu͗`)syVfAN1n5U ~r13`-mgֈ B“}>b0|ᾤSG ~?p;M 2ڕ/Rp"Z%0cU3db׵Zoy^<3%QDǦ!hP%ġ >׿DzÍʷ txO.i,6/mV2 ?8d_f{jVdevrit*Xm9w٣s]uqo?_ d}AyoY s.i|^'+Txt-JPT/5ӬhsOQ8Z#l v8kO%ϑI*z( BZ-[`Ó{0/lz NV|[qrT}'dteh]"y҂n`5oq2jۼ8-0M+}`Eb~ @q*4kaeq@q^`TRpˤdym[$qz"{dYxȠ7MuϷrCއ8lw~OOetIy^n( cOrӺ8\=c;T|P,GAo羟B_BmbCF}qX*%` ޥ9ik .ɗE <#@EM C1.Ǽ獜˰=_rB155Hփ%awxd /eZgIA`۔`a 6M^xQ6@l">ОTl)԰! >$H|:DBc)ݨ5 {d61`ĵ3t F@PE7a߸<їDޢT_}8-|D= ǯqle5)o{UH/ھ.;hhI$iq pRw`=0 @({4#lY4xGovC/[uiHdJH#kv% aTH؂)r1awo1a8b,gbn/߭ $q;CԍL 0~ 5+!e$2qMiH?3@C@^Qp1ezu#D:S?:u<|0 Gv2Z݊0bgtq55K +f&iȩ9ȁ_?y0OW>hTbVw_Gk~[)p9%7bLiDԜ~5ަ79FJMJ~E1D5WfgUz4'JЕWuZis\yޱ( Zfϛ}:3xIwTwd80@N]ߝq]cwvihMo /~o#x?b)4+vIf*ʝkB}^s^ +|ټW /(tyP%~'; G<#/ i,$/g@~`o웈M%9Y~d T>D>ͩhQ Jv .U>)^ݾB/ 7K"@/~'=T)̼g(ߠr*={ߛ)Oa!p#A@'D߲tu:UbQ]K 99Ս -tϴJyŌ\嫏_C:Johͼ&.;؀ܒvlCS p*Ed"Хc4@Bx/`9/dёS HVC1pxR/Zŧl G!3YU4}p+`@97q״MX,Ǽb?Dod#91=StG>(hpV31`&/6%!3#&9t_/#4D@LVmTp7v_=,ʹsS?36f-oɦE=޿})f?k € E΋-YNډgCf{pOtb5FlMvBH+e6: Q~(0:RpSp-ҋrd69/,,=f#74ɏOt<3iė. 520YfYQ2G2ǒ#|CSE#Nn2"KVoXe?O} Qk= [GM=hO bQ|Ôm,N}vM{[,1!˕mQrbtltAʃAHǥ"&IҿJ[+E!施P8 _aKKh5b' -Hfq{*YKg{uK^i^\K0db_L+X,?ݖu}'=.L~X}Ͽx0z|oH#L"d2Ri &%%C ,fI9dX]6u?,Alp&2LCTB%Yr-hNF: C8)<"L_:ꗌwyۑ@onB-q~[ 4@'p`D gS Gcϙ؄|@eMB9ʝk$ݱzpȷRmgg1+;PNN:˯L ?tS,$яHa3]apKZ0dxw gnj3tvK(D.:{ q"@8,y|VC>(Z~KVDw^TK%ˣ+F" n2cyVw9yfZ@~m ͛X8;6څk+Yڧ@O 9 ]>rG>|ڥ=,!;XK׾1/˶5b7Q4Sm{g$ɳყ^;sӱ{lv  sgގiJVjn BAOTuy0 rzw٨v$EDQU5=vpr # @X׃5Y>x) U=;"uRALO"YldToL߇cH!ˋ^ܩk"tG].6| x՛%~vIi$ X7fJY|F7lAߔvSsּC43mhG\ y ~jd>kKPQu0 Hn^=k<)@AH8Y.k^n a#o!;#԰"lDHSc:ΆJ Rŏ%)/iYg{ppx}║لֱL"ؤU]3#p2,ULҩj ~;q{r<~3 LP_tXq6`2=>$ Z/8cYHA7}5a#,)n6V1>Ӕ'56fZu5گad (p{8_+HGhxFu2G5/9_B@d9`t@;C|n9&T0>['ON&ɏ<L?N2XAuBe-xoM(Qw8i;p yԚ=D2VϞasQs<#_`a?펶͚<h%ge{f-$3l>hܒ1-{?gx1Pis⩨y֍Ld/ Tɔ¥i>@'E׫RpFmRtN{9Sg?M˵Rf\-eԆ;T;{<6ݐ;rrmмf=5(/-1M+E ^oىUe8M0k d]Mi_D0z[# *.s#CUխMyANjveMHX|&ʫ34LʯgE97"`K k^07-5t1/h/%aGC)n"ygSZΰ$w`ɥTE$Bx"&bCT Zߡ/=NY*nBL^yAg|Hĺ?Zl]0b,h7fgjh{ԙH@2%WkWKzCh],'P*#-szXQcaYKW>#sv6b꺮\Ckwt/|LnO5S3b8szXMR`9`d<<A7uBnۅC+X{3܈T ТrߏJ,RBr x<#Z}0" Ͳ 4C)\Lw<MND_~me]>~P3 f1#l $k}!6s>!ci,$/}Gr 0)$ L~@հӳK U{&`<~n__!8 i~! ^*迺\_]w.At }kɂ ?A_OX俸4ֹÒPzr|~ٮjٶEfbJj]mWzTFR|[@Q*EYhNbٯ 'Ea3\W wYڠ"Oap}G)֠n$\_[D'A2D@}UqJ$9f~X%6 S?3\ʃՀ£Wnu%Txp }MZT_d=֏ S=cLln餲_綬St2=9lQQZa^ DeeYDD!3[jLʴ'4p¨";ͭ]m̸6W@dNvK ;>cAPbM;EjIޙM SաnZ v=xZ*EMP: n%ZH]i]㼓J4B5H f*~vs]\r}Y'Y !m>@ r[YLKEYOXZFu nr* ěvX3++쫳FI- f=iEt4zqpM~86!]lρaB(N%P1ok3f7RfAsւގ8i mM n½[̂٨p_5<U-?;D6:>.ʍh2[BlE4.Z]c qL V1xpEW* ;l+`V#?Toxe{ƲNk~h Ad~W:7M&NU(^0blAQئ=ћ gE+5f凖׬? lg?o'ktM CE[+Ri{|w+!LbGȀ^߂<T՞q,nCt[R#J;!75/фP-[kDSβWN{IdJG~H %6C1ҕ!$[6kh(gY$l >ԐL6ƙbpc9s|%F3FChyqge?Wè:h8H[%_s(*n|oBܙѢZx@s '=K6hncF̪s:Dy5Taf 2q=&e:_@/Jy@XOFhҵY ӯV+ܠ . a7Bn9pk1T(Ň[f ?wh*\׳]kbڍIf!>6H XVFu۱Tn*c4[p3.c4.d͐^hL[ b赛2]yawP hAj;4 [ѱh6 |Gu6DmuTvS tZ*dϛG&jfȚaW*0 /?-1jL ϡ*#Ӊ"#\{q30E5WKnf\Np{ۭ%TKäws6Xs;4ܔ8md=)#N>6]l)$ -$pyXss0^9~ХJSsIrz ݽiL閴DMyo@9uPvVRFݬĭ1&1V{U)̡Zs 8ZyM)sיۊ[BK-ā>OrtXM=% 8L+]N6jTfeBm3p*ɵD_oftmk^XZ'JiCFyR^\z6;z攋[;*!zX&1E]]ݖ2{&3 KEPp^XtajEۜd.%YL61+M5?t?ĺWq] ݚد!ݰuhFXl[ߨJ"&+5AAgpy1l7=j-m@KC.3fjkU[%"Z)u\sK{((%k0'h&&-.ўDe )f[8t9n+sTg7EƳH'6>/=iVF2s𧾎6Mś i)?w8 |{dð/,T_g][\بv,% ! {gz퍢ko٬*_sQ:SOϲɦ@wy:W{"r\EOP3AecV_ǃ^V:j~_|yѷڞZ\GQ붗P(k0qYV!ӥ{( JZuj]gֹyN{ >;zE.HB#%.&RH[eALli7EX,6irl\wr/I=w.,Yzi;F\(ӿP>^3y/< SΗF H HoE_J1*J"ˀ2?w^*UpM|M|Mz^=? ,sÒ#:?nB#7jB^DBBre9i4ÏH@Ku5hs$ ]]xHh}[=#(E:74qVMqzI;'u/ ob:FYPLHt4u H:jLz"э xf&CܜiR(T8%q(>qL'\#9A'w Ɏ_p 1~rБea@` }CVt0iz{#p7,C@O^kcEj,AA ;;*U:'oWR?࿩$?܄0&-|O~ 8O?=k z}#!M4~Col [|u 1n}DuRD5@"EL;&G0=%uHZWWnoQo<`›pm[$(((('~RC[{$5um׋]OżH7`}U=$IX˿!$ ?>y I~d^~C{Ehqo#ADF}@QFt2wA'tv[ZYĕr%o!o5<䡖F |L CM+u'ʥBTM(P >" $9ݣ?<+̿mg2 ]J'ݫkMMIE_S78R y2Uj`'1;@1OGJȎ@/h_]xZɜ)vꯞI 'I" @UjG@\#crbrBxoI4y҇קK5VKZxI شǫȂz8|y 6!0AENt5ܽxn4k/H4us=zMRj^$e0_ G `64e,#덾A6]d+Pb[׹/4Ϲݟ2Gy_HCp5O7O!x >oTW|v|PC0tYh4H<Re,=TO_H87_ಎc \?@䞂zOާi<;cxOq;puuLz)LM A)2󬡪i` "6Snt:PH˂ةƾ$-CR>Oo%Yo?3==gm# osHaDxMB#5HmNZOχ!,z:]GsΪueo _:)?>P7`k77Po0w<]R"#>~K\F:50Fu~Glk b@8Kn m> dS.?IRm|.:U?sWQ|-:GG+`[?\py+O; y{L)yd#[xOȴl$DKo)C2LE뿷ϴI_1'o?z7]'uT5w ApbpqzVqb.Vg+Y/%e珞 _^:z%%i2eO aGX ˥ _Hi^Isg)c5|ZR<HKJO$z6l`%O|yӢF} ~p d: {RʻGFf%].ewYj@e&>EY.QTyCjĕ擷*>ҹWp(4u~wx{?goяW0